The static owner is currently considered the correct one: our oracles are static analyzers based on compiler frontend technology, that generally do not provide insights of runtime resolved calls since they are focused on compilation, hence code correctness.
Adding runtime-target resolution will be likely done with dedicated edge types, that the agent could query separately. As of now, the information is typically few navigation steps away anyway: retrieving type hierarchy can point the agent to the set of candidates for runtime resolution.
Adding dedicated edges should ease navigation, bringing more token cost reduction.
We ran an analysis of all the traces of the agents which have built SemSitter, and found out that 42% of the raw text searches could be fully replaced by semantic navigation.
This could increase to up to 89% if we consider the cases where semantic navigation would not provide the final answer, but would narrow the search scope, still providing token consumption reduction benefits.
As long as generated code is made into files (Immutables, AutoValue, MapStruct, ...), SemSitter would pick those up and integrate into the semantic graph. Many solutions, however, such as Lombok and .NET generators, don't do that.
In such cases the graph would be a bit imprecise (e.g. missing generated methods), but it would still help with navigation (because types are typically there, and made explicit at the call site via imports, so inferable) and would still likely provide a better experience than grep in most real scenarios.
Regarding dynamic dispatch: we plan on enriching the graph with dedicated edges, taking advantage of the technology used in our symbolic execution engines.
Where grep is not easily replaceable is navigating through commands output, logs, build artifacts, etc.
Your coding agent reads the same 600 lines 400 times. In a large codebase, a shell-based agent can only move one way: grep. This article shows how Sonar Vortex uses SemSitter™, our semantic navigation engine, to cut that waste. cc: @sonar_research https://t.co/KA7CNGeukE
Hi! I am the author of the article, working at @Sonar_Research and leading the development of SemSitter at @SonarSource.
Recall per token is the right metric, and we measure a proxy for it per edge kind and per language against independent type-resolving oracles. Cross-file indirection is the core case SemSitter addresses, solving symbols via fast heuristics across large repositories.
As long as generated code is materialized as files in the repo, SemSitter will index those on the fly, and resolve their semantics, and retroactively the semantics of other files depending on them.
Regarding dynamic dispatch: we currently resolve to the static receiver/owner, not a runtime target. However the symbolic execution engine used in our static analyzer have dynamic dispatch resolution, and we may soon bring such a technology into SemSitter.