Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 6 additions & 23 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
Index a codebase once, address every symbol by a short code,
and read only the function you actually need.

[Install](#install) · [Commands](#commands) · [Languages](#languages) · [Claude Code](#claude-code) · [Numbers](#numbers)
[Install](#install) · [Commands](#commands) · [Claude Code](#claude-code) · [Numbers](#numbers) · [Limits](#what-the-call-graph-does-not-know)

</div>

Expand Down Expand Up @@ -45,6 +45,8 @@ orvix init

Node 20 or later. Pure JavaScript and WebAssembly — nothing to compile.

Indexes TypeScript, TSX, JavaScript, Python, Go, Rust, Java, C#, C++ and C.

## Commands

| Command | What it does |
Expand Down Expand Up @@ -100,28 +102,6 @@ Both compressions are on by default. To turn one off without touching your agent
decided to make, so `orvix who-calls` before a signature change still depends on the instruction
block. Compression is mechanical; navigation is a recommendation.

## Languages

TypeScript · TSX · JavaScript · Python · Go · Rust · Java · C# · C++ · C

`map`, `show` and `find` behave the same in all of them. **The call graph does not**, and it is
worth knowing before you lean on it. Each row is a real project, indexed end to end:

| Project | Language | Files | Calls resolved | Refused as ambiguous |
|---|---|---|---|---|
| curl/curl | C | 1 068 | **42%** | **2%** |
| JamesNK/Newtonsoft.Json | C# | 945 | 27% | 59% |
| fmtlib/fmt | C++ | 77 | 27% | 30% |
| google/gson | Java | 264 | 25% | 33% |

The rest of each row is calls into the standard library, which resolve to nothing by design.

The split is not about the language being hard — it is about where calls go. C has free functions
with project-unique names, exactly what a syntactic resolver can follow, and it gives the densest
graph here. C#, C++ and Java send most calls through a receiver on a typed object, and `x.Get(…)`
cannot be attributed without knowing the type of `x`. Refusing to guess is the rule working: a
wrong edge is worse than a missing one.

## Numbers

Every figure comes from a command in this repository, measured on Orvix's own source — 75 files,
Expand Down Expand Up @@ -197,6 +177,9 @@ unique exported name — never across a language family.
own side of it.
- **Type references are not call edges**, so an interface reports no callers. Ranking compensates
by biasing toward exported symbols.
- **A call through a receiver on a typed object cannot be attributed** — `x.Get(…)` needs the type
of `x`. This makes the graph thinner in Java, C# and C++, where most calls take that form, than
in C, Go or TypeScript. `map`, `show` and `find` are unaffected.
- Import following is implemented for ECMAScript module paths; the other languages rely on
same-file scope and project-unique names.

Expand Down
Loading