New location tracking Location, SpanManager#46
Conversation
ehwan
commented
Jun 17, 2026
- New location system that is not depending on proc_macro2
- Added unit tests
- Fixed deterministic & nondeterministic context stack calculation bug
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
Code Review
This pull request refactors the location tracking system across the codebase to use a new Location and SpanManager infrastructure instead of raw proc_macro2::Span or SpanPair. This change allows mapping byte ranges back to spans for more precise error reporting. Deterministic and non-deterministic parser contexts have been updated to pass Location directly rather than wrapping it in an Option, and error types now hold a non-optional Location. Additionally, the lexer, parser, grammar, and pattern modules have been updated to use Located<T> and Location. A minor issue was found in rusty_lr_core/src/parser/nondeterministic/context.rs where a doc comment is duplicated on consecutive lines.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
There was a problem hiding this comment.
Pull request overview
This PR refactors RustyLR’s location tracking to use a new Location + SpanManager mechanism (index ranges into a collected span table) instead of the previous SpanPair approach, and updates parsing/error-reporting/codegen paths accordingly. It also adjusts deterministic/nondeterministic parser contexts to compute default locations more consistently (including EOF) and adds unit tests validating error recovery + EOF location behavior in the JSON example.
Changes:
- Replace
%location SpanPairwith%location Locationand introduceparser::location::{Location, Located, SpanManager}for mapping locations to spans/byte ranges. - Update grammar parsing, pattern/terminal-set handling, error types, and code emission to use
Location/Located<T>throughout. - Fix context/tag-stack truncation logic and add bootstrap/test coverage (including JSON example unit tests).
Reviewed changes
Copilot reviewed 31 out of 32 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| scripts/diff/json.rs | Regenerated JSON diff output reflecting new literal/terminal-set printing and userdata location capture. |
| scripts/diff/calculator.rs | Regenerated calculator diff output; includes tag-stack handling fixes. |
| scripts/diff/calculator_u8.rs | Regenerated u8 calculator diff output; includes naming + tag-stack truncation fixes. |
| scripts/bootstrap_test.sh | Runs cargo test during bootstrap comparisons to validate generated output builds/tests. |
| rusty_lr_parser/src/utils.rs | Switch helper utilities to the new Location/SpanManager-based identifier construction. |
| rusty_lr_parser/src/token.rs | Replace proc-macro spans with Location and make mapto location-aware (Located<String>). |
| rusty_lr_parser/src/terminalset.rs | Convert terminal-set AST to use Located<T> + Location for error reporting and ranges. |
| rusty_lr_parser/src/terminal_info.rs | Make terminal identifiers string-based and store precedence with Located<usize>. |
| rusty_lr_parser/src/pattern.rs | Update pattern lowering to use Location and typed literals (Byte/Char/String/...). |
| rusty_lr_parser/src/parser/span_pair.rs | Removed old SpanPair location mechanism. |
| rusty_lr_parser/src/parser/parser.rs | Update grammar parser rules/tokens to emit Location + typed literals. |
| rusty_lr_parser/src/parser/mod.rs | Register new location module; drop span_pair module. |
| rusty_lr_parser/src/parser/location.rs | New location system (Location, Located<T>, SpanManager) + unit tests. |
| rusty_lr_parser/src/parser/lexer.rs | Collect spans into SpanManager and feed Location instead of SpanPair. |
| rusty_lr_parser/src/parser/args.rs | Update grammar-arg structures to store Location/Located<T>; refine precedence/literal handling. |
| rusty_lr_parser/src/nonterminal_info.rs | Store nonterminal names and rule metadata using Location/Located. |
| rusty_lr_parser/src/lib.rs | Re-export Location for external consumers. |
| rusty_lr_parser/src/error.rs | Refactor errors to use Location and emit diagnostics via SpanManager. |
| rusty_lr_parser/src/emit.rs | Emit generated code using correct spans derived from SpanManager locations. |
| rusty_lr_parser/Cargo.toml | Enable proc-macro2 span-locations feature to support byte-range mapping. |
| rusty_lr_derive/src/lib.rs | Thread SpanManager through error emission in the proc-macro entrypoint. |
| rusty_lr_core/src/rule.rs | Minor doc formatting change. |
| rusty_lr_core/src/parser/nondeterministic/error.rs | Make parse error location non-optional. |
| rusty_lr_core/src/parser/nondeterministic/context.rs | Compute default locations (incl. EOF) from stacks and align stack behavior. |
| rusty_lr_core/src/parser/deterministic/error.rs | Make parse error location non-optional. |
| rusty_lr_core/src/parser/deterministic/context.rs | Compute default locations from stacks and always push locations (incl. EOF). |
| rusty_lr_buildscript/src/utils.rs | Remove old byte-range helpers now superseded by SpanManager. |
| rusty_lr_buildscript/src/lib.rs | Switch diagnostics to use SpanManager for byte-range extraction from Location. |
| example/json/src/parser.rs | Use userdata to capture recovered error locations instead of printing. |
| example/json/src/main.rs | Pass userdata through parsing and add unit tests for success, recovery location, and EOF location. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>