Skip to content

v1.108.302 — Nothing we could say about Rust

Choose a tag to compare

@jgravelle jgravelle released this 27 Aug 13:55
· 33 commits to main since this release

Nothing we could say about Rust. Rust had 20 tracker mentions and zero measurement, while the README talked about 70+ languages. Racket has had a fidelity harness since 1.108.298; the language people actually ask about had none.

benchmarks/rust_fidelity/ — scored against Rust's own parser

Same asymmetric shape as the Racket harness: extra and wrong_span gated at 0, missing reported and broken out by kind so a gap has a name instead of being a shortfall. Target ripgrep pinned by commit SHA, 110 files, 0 parse failures either side: 95.8% coverage, 44 fully clean files. missing (156) is entirely module and macro, both deliberate omissions with stated reasons.

CI gates the same two buckets against frozen oracle data, so it runs with no Rust toolchain and no network.

The ceiling is lower than Racket's, and the README says so. syn parses; it does not expand. Racket's oracle expands, so syntax-original? separates macro-introduced names from human-typed ones. Nothing here can: an item produced by a macro_rules! invocation is invisible to the oracle and to jCodeMunch, unscored in both directions. A green run is not evidence about macro-generated code.

Three Rust definition classes that yielded no symbol — PARSER_GENERATION 4 → 5

Found by the harness on its first run:

  • union Foo { .. } was absent from RUST_SPEC entirely — no symbol, not even the name.
  • A trait method with a signature and no default body is a function_signature_item, a different node type from function_item. The half of a trait an implementor must provide was the half we could not find.
  • A const/static inside a function body was excluded by the locals gate — which was already letting nested fns through, so it was a node-type rule wearing a scope rule's name.

3474 → 3514 symbols on ripgrep, coverage 95.0% → 95.8%, unexplained gaps three kinds → none.

The generation bump is the clearest case that counter has had. Unlike a new file extension, where coverage arrives through discovery, every .rs file in an existing index was already parsed at generation 4 with the old symbol set — and incremental never re-reads unchanged content.

schema_driven fails closed on a table under an undeclared key — #555, @RascoApps

The existing guard raises when a table has rows but no declared column was populated. It is structurally blind to a disagreement about the key: the lookup returns [], no rows exist, and the check never runs. That is how search_ast served an empty table for every language and preset.

The check runs inside encode, on post-transform data, so schemas that pre-flatten a nested shape need no exemption at all.

Also

  • .mts and .cts indexed as nothing — TypeScript's ESM and CommonJS module extensions sat in the reindex hook's watched set and in no extension-to-language map.
  • racket_definition_forms (@otherjoel) — declare a Racket project's own defining macros so what they bind becomes searchable.

Tests

8517 passed, 13 skipped, 0 failed. 3.13 reproduce: 8511 passed, 19 skipped, 0 errors — the same 8530 total. All eight CI matrix jobs green.