hypergumbo-lang-rust-analyzer
SCIP-backed Rust analyzer for hypergumbo.
This optional package integrates rust-analyzer scip output into hypergumbo,
providing precise type-resolved symbols and call edges for Rust workspaces
beyond what the tree-sitter rust.py analyzer can recover. It is designed
as an opt-in alternative to rust.py, not a replacement.
Status
Shipped end-to-end. Activate with the --backend rust-analyzer root flag
(also settable via HYPERGUMBO_RUST_ANALYZER=1). Install with
pipx install 'hypergumbo[rust-analyzer]', or
pipx inject hypergumbo hypergumbo-lang-rust-analyzer when hypergumbo is
already installed.
When --backend rust-analyzer is requested but the integration package or
the rust-analyzer binary is missing/broken (the binary is smoke-tested
with rust-analyzer --version), the CLI exits non-zero with a pointer to
the install or to rustup component add rust-analyzer, rather than
silently falling through to the tree-sitter rust.py analyzer.
Why SCIP, not LSP
Rust-analyzer emits SCIP with a single shot of rust-analyzer scip instead
of requiring a long-lived LSP session. SCIP is slower than tree-sitter
(~10× at every realistic size per WI-zakub), so this backend is opt-in and
falls through to rust.py when unavailable or not requested.
Stable-ID parity: a helper exists; parity does not hold in production
reassign_rust_stable_ids asks
hypergumbo_lang_mainstream.rust_scip.compute_rust_stable_id_from_source for
the rust.py id of each SCIP function, and the helper reproduces rust.py's
id byte for byte when given the item's span. Production never gives it
that: rust-analyzer's Definition occurrence is the identifier token (line 14
for a method whose body runs 14–17), the helper requires both endpoints to
match, so it abstains for every multi-line item and the SCIP symbol keeps its
sha256(moniker) id. Measured on aardvark-dns (INV-dolud, 2026-09-18): 0 of
52 functions emitted by both arms share a stable_id. The two arms carry
independent identities today, and a consumer joining on stable_id sees two
records for one function. Whether they should share one — and what a dedup
would then do — is WI-gojum's parked question (ADR-0012 Steps 2–3); until it
is ruled, the helper is readiness, not a contract. An earlier version of this
section said "so cross-pass dedup works"; it did not, and no cross-pass dedup
has ever been written.
Upstream shim
Symbol / edge emission builds on hypergumbo_core.scip.*:
scip_index_to_symbols—Documentwalk →Symbolobjects.scip_index_to_edges—SymbolInformation.relationships→Edges.scip_index_to_call_edges— non-DefinitionOccurrence→referencesedges, attributed to the innermost Definition whoseenclosing_range(the item; rust-analyzer populates it on every Definition) contains the reference. Until INV-mofiv the shim used the Definition'srange, which for rust-analyzer is the identifier token, so every edge was sourced from the file's module namespace and none from a function.
Rust-analyzer's Relationship set is empty (per WI-zakub), so the primary
edge source here is scip_index_to_call_edges.
What is not emitted
- Function-local bindings. rust-analyzer emits a SCIP
local <n>symbol for everylet, parameter and pattern binding, numbered per document. None becomes a hypergumboSymboland no edge may point at one (WI-jikok / INV-kukiz, ruled 2026-09-18). The id is a document-scoped index, solocal 0is a different binding in every file: minted, they were 75% of this backend's nodes at a 39.7%stable_idcollision rate, and 329 of the 455 edges pointing at them resolved across files. Every other hypergumbo backend leaves locals out of the map for the same reason — a binding no other file can name is not part of a behavior map. - Calls into dependencies and the standard library. A SCIP symbol with no
in-workspace definition resolves to
Noneand the edge is dropped rather than dangling into anexternal_symbolboundary node (WI-gojum sub-component 1, parked).
Release files for hypergumbo-lang-rust-analyzer 8.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| hypergumbo_lang_rust_analyzer-8.1.0.tar.gz | 154.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| hypergumbo_lang_rust_analyzer-8.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 181.9 kB
Release files / hypergumbo_lang_rust_analyzer-8.1.0.tar.gz
| Download URL | hypergumbo_lang_rust_analyzer-8.1.0.tar.gz |
|---|---|
| Size | 154.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ec7140abf3f4ae22ed7bbc410e5613986ccc09301a67fcefe7160543cd6afa9d
|
|
BLAKE2b-256 checksum How to use checksums |
494bbc9a1409e96c132fe650fd6c5eba984bd5e09f600191cec3d9656bbdb333
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|
Release files / hypergumbo_lang_rust_analyzer-8.1.0-py3-none-any.whl
| Download URL | hypergumbo_lang_rust_analyzer-8.1.0-py3-none-any.whl |
|---|---|
| Size | 27.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d3abfbeb648fddfdeca45ef7af228e08c3b9cc22e7aff69a52c36de554b5eee6
|
|
BLAKE2b-256 checksum How to use checksums |
8321a7862a6fa1d77dd6970af6d9c36aa133dee57fe8b23d8a177c3779a9ef3e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|