Skip to content

fix: align TokenView text semantics - #167

Merged
tinovyatkin merged 1 commit into
mainfrom
codex/fix-issue-122-token-text
Jul 23, 2026
Merged

fix: align TokenView text semantics#167
tinovyatkin merged 1 commit into
mainfrom
codex/fix-issue-122-token-text

Conversation

@tinovyatkin

@tinovyatkin tinovyatkin commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Closes #122.

Summary

  • make inherent TokenView::text() return Option<&str>, matching the Token trait for concrete and generic receivers
  • add explicit TokenView::text_or_empty() for display, CST, generated semantic, and parity paths that intentionally collapse missing text
  • migrate runtime/codegen consumers, regenerate the self-hosted frontend, and update the conformance template
  • document the breaking migration and cover the None versus empty-string distinction with a regression test

Root cause

Rust method resolution preferred the inherent TokenView::text() -> &str over Token::text() -> Option<&str>. The same method call therefore changed type and semantics based only on whether the receiver was concrete or generic, and the inherent method silently collapsed missing text to "".

Impact

This is a breaking pre-1.0 API correction. Concrete TokenView::text() calls now handle Option<&str> exactly like generic Token calls. Callers that deliberately want the prior lossy behavior can use text_or_empty().

Validation

  • cargo test --locked --all-targets --all-features (266 + 3 + 595 + 22 passed)
  • cargo clippy --locked --all-targets --all-features -- -D warnings
  • RUSTDOCFLAGS='-D warnings' cargo doc --locked --all-features --no-deps
  • tools/grammar-frontend/update-stage0.sh --update (Stage 1 and Stage 2 byte-identical; frontend corpus checks passed)
  • cargo run --release --quiet --bin antlr4-runtime-testsuite (357 passed, 0 failed, 0 skipped)
  • Kotlin parity (9/9 parse trees match)
  • JavaScript parity (6/6 token streams and parse trees match)
  • TypeScript parity (5/5 token streams and parse trees match)

Summary by CodeRabbit

  • New Features

    • Token text access now distinguishes between available text and missing text.
    • Added a convenience option that returns an empty string when token text is unavailable.
  • Bug Fixes

    • Token display, parsing, token streams, and generated outputs now handle missing token text consistently.
    • Updated tokenization and parser behavior for end-of-file, empty, and non-ASCII tokens.
  • Tests

    • Expanded and updated coverage for optional token text across lexer, parser, and parity scenarios.

Copilot AI review requested due to automatic review settings July 23, 2026 07:56
@gemini-code-assist

Copy link
Copy Markdown
Contributor

Caution

The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased.

@coderabbitai

coderabbitai Bot commented Jul 23, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Changes

The PR changes TokenView::text() to return Option<&str>, adds text_or_empty() for string fallback behavior, and updates runtime consumers, generated helpers, lexer/parser tests, conformance templates, and parity dumpers accordingly.

Token text API migration

Layer / File(s) Summary
TokenView text contract
src/token.rs
TokenView::text() now preserves missing text as None, while formatting and AsRef<str> use text_or_empty().
Runtime text consumers
src/token_stream.rs, src/parser.rs, .conformance-review/*, src/bin/antlr4-rust-gen.rs, third_party/antlr-v4-grammar/*
Token concatenation, parser boundary handling, generated helpers, conformance output, and regenerated grammar sources use the updated text semantics.
Lexer and ATN validation
src/atn/*, src/lexer.rs, src/bin_support/grammar/*
Lexer snapshots, hooks, token mappings, and assertions use optional-aware comparisons or empty-string extraction.
Parity dumper integration
tests/javascript-parity/*, tests/typescript-parity/*
Token output uses text_or_empty(), and predicate matching compares against Some(expected).

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 56.25% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The PR implements the requested fix by making TokenView::text return Option<&str> and adding text_or_empty().
Out of Scope Changes check ✅ Passed The changes stay aligned with the stated migration, test updates, and regeneration work, with no clear unrelated additions.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the main change: aligning TokenView text semantics with the Token trait.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/fix-issue-122-token-text

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@tinovyatkin

Copy link
Copy Markdown
Contributor Author

@codex review

@tinovyatkin
tinovyatkin marked this pull request as ready for review July 23, 2026 07:56
@github-actions

Copy link
Copy Markdown

Copy/Paste Detection

Found 71 duplication(s) across 14 changed Rust file(s) (threshold: 100 tokens).

Show duplications

Found a 66 line (387 tokens) duplication in the following files:

  • Starting at line 24 of tests/javascript-parity/dumper/src/main.rs
  • Starting at line 24 of tests/typescript-parity/dumper/src/main.rs
use javascript_parser_base::JavaScriptParserBase;

fn dump_tree<S: AsRef<str>>(
    out: &mut dyn Write,
    tree: Node<'_>,
    rule_names: &[S],
    depth: usize,
) -> io::Result<()> {
    let pad = "  ".repeat(depth);
    match tree.kind() {
        NodeKind::Rule => {
            let rule = tree.as_rule().expect("rule node kind checked");
            let name = rule_names
                .get(rule.rule_index())
                .map_or("<?>", AsRef::as_ref);
            writeln!(
                out,
                "{pad}Rule({name}, children={})",
                rule.child_count()
            )?;
            for child in rule.children() {
                dump_tree(out, child, rule_names, depth + 1)?;
            }
        }
        NodeKind::Terminal => writeln!(
            out,
            "{pad}Term({:?})",
            tree.as_terminal().expect("terminal node kind checked").text()
        )?,
        NodeKind::Error => writeln!(
            out,
            "{pad}Err({:?})",
            tree.as_error().expect("error node kind checked").text()
        )?,
    }
    Ok(())
}

fn main() -> ExitCode {
    let mut args = env::args().skip(1);
    let mut input: Option<PathBuf> = None;
    let mut tokens_only = false;
    while let Some(arg) = args.next() {
        match arg.as_str() {
            "--input" => input = args.next().map(PathBuf::from),
            "--tokens" => tokens_only = true,
            other => {
                eprintln!("unknown argument: {other}");
                return ExitCode::from(2);
            }
        }
    }
    let Some(input) = input else {
        eprintln!("missing --input <path>");
        return ExitCode::from(2);
    };
    let source = match fs::read_to_string(&input) {
        Ok(source) => source,
        Err(error) => {
            eprintln!("failed to read {}: {error}", input.display());
            return ExitCode::FAILURE;
        }
    };

    if tokens_only {
        let lexer = JavaScriptLexer::with_typed_hooks(
```rust

---

Found a 54 line (320 tokens) duplication in the following files:
* Starting at line 606 of src/atn/lexer.rs
* Starting at line 677 of src/atn/lexer.rs

```rust
    atn: &LexerAtn,
    hooks: &mut H,
    mut generated_action: A,
    mut generated_predicate: P,
    unknown_policy: UnknownSemanticPolicy,
    mut accept_adjuster: E,
) -> Result<TokenId, TokenStoreError>
where
    I: CharStream,
    H: SemanticHooks,
    A: FnMut(&mut BaseLexer<I>, LexerCustomAction) -> bool,
    P: FnMut(&BaseLexer<I>, LexerPredicate) -> Option<bool>,
    E: FnMut(&mut BaseLexer<I>, i32, usize),
{
    let hooks = RefCell::new(hooks);
    let token = next_token_with_hooks_impl(
        lexer,
        sink,
        atn,
        &mut |lexer, action| {
            if !generated_action(lexer, action)
                && !dispatch_lexer_action_hook(&hooks, lexer, action)
                && unknown_policy == UnknownSemanticPolicy::Error
                && let (Ok(rule), Ok(index)) = (
                    usize::try_from(action.rule_index()),
                    usize::try_from(action.action_index()),
                )
            {
                lexer.record_semantic_error(true, rule, index);
            }
        },
        &mut |lexer, predicate| {
            generated_predicate(lexer, predicate)
                .or_else(|| dispatch_lexer_predicate_hook(&hooks, lexer, predicate))
                .unwrap_or_else(|| match unknown_policy {
                    UnknownSemanticPolicy::AssumeTrue => true,
                    UnknownSemanticPolicy::AssumeFalse => false,
                    UnknownSemanticPolicy::Error => {
                        lexer.record_semantic_error(
                            false,
                            predicate.rule_index(),
                            predicate.pred_index(),
                        );
                        false
                    }
                })
        },
        &mut |lexer| dispatch_lexer_before_token_hook(&hooks, lexer),
        &mut accept_adjuster,
        &mut |lexer, accept_position| {
            dispatch_lexer_after_accept_hook(&hooks, lexer, accept_position);
        },
        LexerMatchStrategy {
            compiled: None,

Found a 44 line (265 tokens) duplication in the following files:

  • Starting at line 11 of tests/javascript-parity/dumper/src/javascript_parser_base.rs
  • Starting at line 11 of tests/typescript-parity/dumper/src/typescript_parser_base.rs
impl JavaScriptParserBase {
    fn raw_token<S>(ctx: &mut ParserSemCtx<'_, S>, index: usize) -> Option<(i32, i32, String)>
    where
        S: TokenSource,
    {
        ctx.token_at(index).map(|token| {
            (
                token.channel(),
                token.token_type(),
                token.text_or_empty().to_owned(),
            )
        })
    }

    fn has_line_terminator_ahead<S>(ctx: &mut ParserSemCtx<'_, S>) -> bool
    where
        S: TokenSource,
    {
        let current = ctx.input_index();
        let Some(previous) = current.checked_sub(1) else {
            return false;
        };
        let Some((channel, mut token_type, mut text)) = Self::raw_token(ctx, previous) else {
            return false;
        };
        if channel != HIDDEN_CHANNEL {
            return false;
        }
        if token_type == LINE_TERMINATOR {
            return true;
        }
        if token_type == WHITE_SPACES {
            let Some(before_whitespace) = previous.checked_sub(1) else {
                return false;
            };
            let Some((_, next_type, next_text)) = Self::raw_token(ctx, before_whitespace) else {
                return false;
            };
            token_type = next_type;
            text = next_text;
        }
        token_type == LINE_TERMINATOR
            || (token_type == MULTI_LINE_COMMENT && (text.contains('\r') || text.contains('\n')))
    }
```rust

---

Found a 44 line (264 tokens) duplication in the following files:
* Starting at line 13437 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 14436 of src/bin_support/grammar/generated/antlr_v4_parser.rs

```rust
                                let __child = self.parse_generated_rule_38_dispatch(0, false).map_err(GeneratedRuleError::into_error);
                                self.base.discard_invoking_state(__invoking_marker);
                                let __child = __child?;
                                self.base.add_parse_child(&mut __ctx, __child);
                            }
                            2 => {
                                break;
                            }
                            _ => return Err(self.base.no_viable_alternative_error(__decision_start)),
                        }
                    }
                }
                2 => {
                }
                _ => return Err(self.base.no_viable_alternative_error(__decision_start)),
            }
            Ok(())
        })();
        match __result {
            Ok(()) => {
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
            Err(__error) => {
                if let Some(__error) = __sync_error {
                    if allow_fallback {
                        self.base.exit_rule();
                        self.base.restore_generated_diagnostics(__generated_diagnostic_marker);
                        self.base.record_generated_syntax_error();
                        return Err(GeneratedRuleError::Fatal(__error));
                    }
                    self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                    let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                    return Ok(__tree);
                }
                self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
        }
    }

    #[allow(dead_code)]
    fn parse_generated_rule_38_dispatch(&mut self, precedence: i32, allow_fallback: bool) -> Result<antlr4_runtime::ParseTree, GeneratedRuleError> {

Found a 40 line (257 tokens) duplication in the following files:

  • Starting at line 14742 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 16824 of src/bin_support/grammar/generated/antlr_v4_parser.rs
                            let __child = self.parse_generated_rule_47_dispatch(0, false).map_err(GeneratedRuleError::into_error);
                            self.base.discard_invoking_state(__invoking_marker);
                            let __child = __child?;
                            self.base.add_parse_child(&mut __ctx, __child);
                        }
                        2 => {
                        }
                        _ => return Err(self.base.no_viable_alternative_error(__decision_start)),
                    }
                }
                _ => return Err(self.base.no_viable_alternative_error(__decision_start)),
            }
            Ok(())
        })();
        match __result {
            Ok(()) => {
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
            Err(__error) => {
                if let Some(__error) = __sync_error {
                    if allow_fallback {
                        self.base.exit_rule();
                        self.base.restore_generated_diagnostics(__generated_diagnostic_marker);
                        self.base.record_generated_syntax_error();
                        return Err(GeneratedRuleError::Fatal(__error));
                    }
                    self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                    let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                    return Ok(__tree);
                }
                self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
        }
    }

    #[allow(dead_code)]
    fn parse_generated_rule_47_dispatch(&mut self, precedence: i32, allow_fallback: bool) -> Result<antlr4_runtime::ParseTree, GeneratedRuleError> {
```rust

---

Found a 39 line (254 tokens) duplication in the following files:
* Starting at line 13690 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 15499 of src/bin_support/grammar/generated/antlr_v4_parser.rs

```rust
                            let __match = self.base.match_token_recovering(63, 416, atn())?;
                            __consumed_eof |= __match.consumed_eof();
                            for __child in __match.into_child_iter() { self.base.add_parse_child(&mut __ctx, __child); }
                        }
                        2 => {
                        }
                        _ => return Err(self.base.no_viable_alternative_error(__decision_start)),
                    }
                }
                _ => return Err(self.base.no_viable_alternative_error(__decision_start)),
            }
            Ok(())
        })();
        match __result {
            Ok(()) => {
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
            Err(__error) => {
                if let Some(__error) = __sync_error {
                    if allow_fallback {
                        self.base.exit_rule();
                        self.base.restore_generated_diagnostics(__generated_diagnostic_marker);
                        self.base.record_generated_syntax_error();
                        return Err(GeneratedRuleError::Fatal(__error));
                    }
                    self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                    let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                    return Ok(__tree);
                }
                self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
        }
    }

    #[allow(dead_code)]
    fn parse_generated_rule_39_dispatch(&mut self, precedence: i32, allow_fallback: bool) -> Result<antlr4_runtime::ParseTree, GeneratedRuleError> {

Found a 37 line (250 tokens) duplication in the following files:

  • Starting at line 15013 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 17095 of src/bin_support/grammar/generated/antlr_v4_parser.rs
                            let __match = self.base.match_token_recovering(11, 505, atn())?;
                            __consumed_eof |= __match.consumed_eof();
                            for __child in __match.into_child_iter() { self.base.add_parse_child(&mut __ctx, __child); }
                        }
                        _ => return Err(self.base.no_viable_alternative_error(__decision_start)),
                    }
                }
                _ => return Err(self.base.no_viable_alternative_error(__decision_start)),
            }
            Ok(())
        })();
        match __result {
            Ok(()) => {
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
            Err(__error) => {
                if let Some(__error) = __sync_error {
                    if allow_fallback {
                        self.base.exit_rule();
                        self.base.restore_generated_diagnostics(__generated_diagnostic_marker);
                        self.base.record_generated_syntax_error();
                        return Err(GeneratedRuleError::Fatal(__error));
                    }
                    self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                    let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                    return Ok(__tree);
                }
                self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
        }
    }

    #[allow(dead_code)]
    fn parse_generated_rule_49_dispatch(&mut self, precedence: i32, allow_fallback: bool) -> Result<antlr4_runtime::ParseTree, GeneratedRuleError> {
```rust

---

Found a 38 line (248 tokens) duplication in the following files:
* Starting at line 15837 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 16584 of src/bin_support/grammar/generated/antlr_v4_parser.rs

```rust
                    let __invoking_marker = self.base.push_invoking_state(549isize);
                    let __child = self.parse_generated_rule_63_dispatch(0, false).map_err(GeneratedRuleError::into_error);
                    self.base.discard_invoking_state(__invoking_marker);
                    let __child = __child?;
                    self.base.add_parse_child(&mut __ctx, __child);
                }
                2 => {
                }
                _ => return Err(self.base.no_viable_alternative_error(__decision_start)),
            }
            Ok(())
        })();
        match __result {
            Ok(()) => {
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
            Err(__error) => {
                if let Some(__error) = __sync_error {
                    if allow_fallback {
                        self.base.exit_rule();
                        self.base.restore_generated_diagnostics(__generated_diagnostic_marker);
                        self.base.record_generated_syntax_error();
                        return Err(GeneratedRuleError::Fatal(__error));
                    }
                    self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                    let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                    return Ok(__tree);
                }
                self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
        }
    }

    #[allow(dead_code)]
    fn parse_generated_rule_56_dispatch(&mut self, precedence: i32, allow_fallback: bool) -> Result<antlr4_runtime::ParseTree, GeneratedRuleError> {

Found a 36 line (244 tokens) duplication in the following files:

  • Starting at line 15630 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 15747 of src/bin_support/grammar/generated/antlr_v4_parser.rs
                    let __invoking_marker = self.base.push_invoking_state(539isize);
                    let __child = self.parse_generated_rule_55_dispatch(0, false).map_err(GeneratedRuleError::into_error);
                    self.base.discard_invoking_state(__invoking_marker);
                    let __child = __child?;
                    self.base.add_parse_child(&mut __ctx, __child);
                }
                _ => return Err(self.base.no_viable_alternative_error(__decision_start)),
            }
            Ok(())
        })();
        match __result {
            Ok(()) => {
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
            Err(__error) => {
                if let Some(__error) = __sync_error {
                    if allow_fallback {
                        self.base.exit_rule();
                        self.base.restore_generated_diagnostics(__generated_diagnostic_marker);
                        self.base.record_generated_syntax_error();
                        return Err(GeneratedRuleError::Fatal(__error));
                    }
                    self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                    let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                    return Ok(__tree);
                }
                self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
        }
    }

    #[allow(dead_code)]
    fn parse_generated_rule_54_dispatch(&mut self, precedence: i32, allow_fallback: bool) -> Result<antlr4_runtime::ParseTree, GeneratedRuleError> {
```rust

---

Found a 39 line (243 tokens) duplication in the following files:
* Starting at line 11328 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 11422 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 12373 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 12577 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 12771 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 13165 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 13848 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 14253 of src/bin_support/grammar/generated/antlr_v4_parser.rs

```rust
                        let __child = self.parse_generated_rule_33_dispatch(0, false).map_err(GeneratedRuleError::into_error);
                        self.base.discard_invoking_state(__invoking_marker);
                        let __child = __child?;
                        self.base.add_parse_child(&mut __ctx, __child);
                    }
                    2 => {
                        break;
                    }
                    _ => return Err(self.base.no_viable_alternative_error(__decision_start)),
                }
            }
            Ok(())
        })();
        match __result {
            Ok(()) => {
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
            Err(__error) => {
                if let Some(__error) = __sync_error {
                    if allow_fallback {
                        self.base.exit_rule();
                        self.base.restore_generated_diagnostics(__generated_diagnostic_marker);
                        self.base.record_generated_syntax_error();
                        return Err(GeneratedRuleError::Fatal(__error));
                    }
                    self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                    let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                    return Ok(__tree);
                }
                self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
        }
    }

    #[allow(dead_code)]
    fn parse_generated_rule_17_dispatch(&mut self, precedence: i32, allow_fallback: bool) -> Result<antlr4_runtime::ParseTree, GeneratedRuleError> {

Found a 37 line (240 tokens) duplication in the following files:

  • Starting at line 12014 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 12870 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 15216 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 15838 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 16585 of src/bin_support/grammar/generated/antlr_v4_parser.rs
                    let __child = self.parse_generated_rule_22_dispatch(0, false).map_err(GeneratedRuleError::into_error);
                    self.base.discard_invoking_state(__invoking_marker);
                    let __child = __child?;
                    self.base.add_parse_child(&mut __ctx, __child);
                }
                2 => {
                }
                _ => return Err(self.base.no_viable_alternative_error(__decision_start)),
            }
            Ok(())
        })();
        match __result {
            Ok(()) => {
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
            Err(__error) => {
                if let Some(__error) = __sync_error {
                    if allow_fallback {
                        self.base.exit_rule();
                        self.base.restore_generated_diagnostics(__generated_diagnostic_marker);
                        self.base.record_generated_syntax_error();
                        return Err(GeneratedRuleError::Fatal(__error));
                    }
                    self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                    let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                    return Ok(__tree);
                }
                self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
        }
    }

    #[allow(dead_code)]
    fn parse_generated_rule_21_dispatch(&mut self, precedence: i32, allow_fallback: bool) -> Result<antlr4_runtime::ParseTree, GeneratedRuleError> {
```rust

---

Found a 35 line (236 tokens) duplication in the following files:
* Starting at line 10015 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 10551 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 11527 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 12222 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 13957 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 15124 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 15631 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 15748 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 15940 of src/bin_support/grammar/generated/antlr_v4_parser.rs

```rust
                    let __child = self.parse_generated_rule_12_dispatch(0, false).map_err(GeneratedRuleError::into_error);
                    self.base.discard_invoking_state(__invoking_marker);
                    let __child = __child?;
                    self.base.add_parse_child(&mut __ctx, __child);
                }
                _ => return Err(self.base.no_viable_alternative_error(__decision_start)),
            }
            Ok(())
        })();
        match __result {
            Ok(()) => {
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
            Err(__error) => {
                if let Some(__error) = __sync_error {
                    if allow_fallback {
                        self.base.exit_rule();
                        self.base.restore_generated_diagnostics(__generated_diagnostic_marker);
                        self.base.record_generated_syntax_error();
                        return Err(GeneratedRuleError::Fatal(__error));
                    }
                    self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                    let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                    return Ok(__tree);
                }
                self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
        }
    }

    #[allow(dead_code)]
    fn parse_generated_rule_4_dispatch(&mut self, precedence: i32, allow_fallback: bool) -> Result<antlr4_runtime::ParseTree, GeneratedRuleError> {

Found a 36 line (235 tokens) duplication in the following files:

  • Starting at line 11328 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 17240 of src/bin_support/grammar/generated/antlr_v4_parser.rs
                        let __child = self.parse_generated_rule_33_dispatch(0, false).map_err(GeneratedRuleError::into_error);
                        self.base.discard_invoking_state(__invoking_marker);
                        let __child = __child?;
                        self.base.add_parse_child(&mut __ctx, __child);
                    }
                    2 => {
                        break;
                    }
                    _ => return Err(self.base.no_viable_alternative_error(__decision_start)),
                }
            }
            Ok(())
        })();
        match __result {
            Ok(()) => {
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
            Err(__error) => {
                if let Some(__error) = __sync_error {
                    if allow_fallback {
                        self.base.exit_rule();
                        self.base.restore_generated_diagnostics(__generated_diagnostic_marker);
                        self.base.record_generated_syntax_error();
                        return Err(GeneratedRuleError::Fatal(__error));
                    }
                    self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                    let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                    return Ok(__tree);
                }
                self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
        }
    }
```rust

---

Found a 34 line (233 tokens) duplication in the following files:
* Starting at line 9891 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 10342 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 11099 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 14057 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 14156 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 16252 of src/bin_support/grammar/generated/antlr_v4_parser.rs

```rust
                    let __match = self.base.match_token_recovering(43, 160, atn())?;
                    __consumed_eof |= __match.consumed_eof();
                    for __child in __match.into_child_iter() { self.base.add_parse_child(&mut __ctx, __child); }
                }
                _ => return Err(self.base.no_viable_alternative_error(__decision_start)),
            }
            Ok(())
        })();
        match __result {
            Ok(()) => {
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
            Err(__error) => {
                if let Some(__error) = __sync_error {
                    if allow_fallback {
                        self.base.exit_rule();
                        self.base.restore_generated_diagnostics(__generated_diagnostic_marker);
                        self.base.record_generated_syntax_error();
                        return Err(GeneratedRuleError::Fatal(__error));
                    }
                    self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                    let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                    return Ok(__tree);
                }
                self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
        }
    }

    #[allow(dead_code)]
    fn parse_generated_rule_3_dispatch(&mut self, precedence: i32, allow_fallback: bool) -> Result<antlr4_runtime::ParseTree, GeneratedRuleError> {

Found a 33 line (227 tokens) duplication in the following files:

  • Starting at line 10995 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 12073 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 12123 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 12484 of src/bin_support/grammar/generated/antlr_v4_parser.rs
            let __invoking_marker = self.base.push_invoking_state(244isize);
            let __child = self.parse_generated_rule_14_dispatch(0, false).map_err(GeneratedRuleError::into_error);
            self.base.discard_invoking_state(__invoking_marker);
            let __child = __child?;
            self.base.add_parse_child(&mut __ctx, __child);
            Ok(())
        })();
        match __result {
            Ok(()) => {
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
            Err(__error) => {
                if let Some(__error) = __sync_error {
                    if allow_fallback {
                        self.base.exit_rule();
                        self.base.restore_generated_diagnostics(__generated_diagnostic_marker);
                        self.base.record_generated_syntax_error();
                        return Err(GeneratedRuleError::Fatal(__error));
                    }
                    self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                    let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                    return Ok(__tree);
                }
                self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
        }
    }

    #[allow(dead_code)]
    fn parse_generated_rule_13_dispatch(&mut self, precedence: i32, allow_fallback: bool) -> Result<antlr4_runtime::ParseTree, GeneratedRuleError> {
```rust

---

Found a 33 line (227 tokens) duplication in the following files:
* Starting at line 12274 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 12429 of src/bin_support/grammar/generated/antlr_v4_parser.rs

```rust
            let __invoking_marker = self.base.push_invoking_state(329isize);
            let __child = self.parse_generated_rule_15_dispatch(0, false).map_err(GeneratedRuleError::into_error);
            self.base.discard_invoking_state(__invoking_marker);
            let __child = __child?;
            self.base.add_parse_child(&mut __ctx, __child);
            Ok(())
        })();
        match __result {
            Ok(()) => {
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
            Err(__error) => {
                if let Some(__error) = __sync_error {
                    if allow_fallback {
                        self.base.exit_rule();
                        self.base.restore_generated_diagnostics(__generated_diagnostic_marker);
                        self.base.record_generated_syntax_error();
                        return Err(GeneratedRuleError::Fatal(__error));
                    }
                    self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                    let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                    return Ok(__tree);
                }
                self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
        }
    }

    #[allow(dead_code)]
    fn parse_generated_rule_25_dispatch(&mut self, precedence: i32, allow_fallback: bool) -> Result<antlr4_runtime::ParseTree, GeneratedRuleError> {

Found a 32 line (219 tokens) duplication in the following files:

  • Starting at line 10176 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 10996 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 11878 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 12074 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 12124 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 12275 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 12430 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 12485 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 12676 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 13070 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 15268 of src/bin_support/grammar/generated/antlr_v4_parser.rs
            let __child = self.parse_generated_rule_6_dispatch(0, false).map_err(GeneratedRuleError::into_error);
            self.base.discard_invoking_state(__invoking_marker);
            let __child = __child?;
            self.base.add_parse_child(&mut __ctx, __child);
            Ok(())
        })();
        match __result {
            Ok(()) => {
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
            Err(__error) => {
                if let Some(__error) = __sync_error {
                    if allow_fallback {
                        self.base.exit_rule();
                        self.base.restore_generated_diagnostics(__generated_diagnostic_marker);
                        self.base.record_generated_syntax_error();
                        return Err(GeneratedRuleError::Fatal(__error));
                    }
                    self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                    let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                    return Ok(__tree);
                }
                self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
        }
    }

    #[allow(dead_code)]
    fn parse_generated_rule_6_dispatch(&mut self, precedence: i32, allow_fallback: bool) -> Result<antlr4_runtime::ParseTree, GeneratedRuleError> {
```rust

---

Found a 31 line (216 tokens) duplication in the following files:
* Starting at line 9730 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 9785 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 10122 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 10453 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 10650 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 10745 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 11147 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 11231 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 12630 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 13024 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 13751 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 14859 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 16052 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 16452 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 16642 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 16941 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 17146 of src/bin_support/grammar/generated/antlr_v4_parser.rs

```rust
            let __match = self.base.match_token_recovering(-1, 149, atn())?;
            __consumed_eof |= __match.consumed_eof();
            for __child in __match.into_child_iter() { self.base.add_parse_child(&mut __ctx, __child); }
            Ok(())
        })();
        match __result {
            Ok(()) => {
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
            Err(__error) => {
                if let Some(__error) = __sync_error {
                    if allow_fallback {
                        self.base.exit_rule();
                        self.base.restore_generated_diagnostics(__generated_diagnostic_marker);
                        self.base.record_generated_syntax_error();
                        return Err(GeneratedRuleError::Fatal(__error));
                    }
                    self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                    let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                    return Ok(__tree);
                }
                self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
        }
    }

    #[allow(dead_code)]
    fn parse_generated_rule_1_dispatch(&mut self, precedence: i32, allow_fallback: bool) -> Result<antlr4_runtime::ParseTree, GeneratedRuleError> {

Found a 36 line (216 tokens) duplication in the following files:

  • Starting at line 13693 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 14746 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 15502 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 16828 of src/bin_support/grammar/generated/antlr_v4_parser.rs
                        }
                        2 => {
                        }
                        _ => return Err(self.base.no_viable_alternative_error(__decision_start)),
                    }
                }
                _ => return Err(self.base.no_viable_alternative_error(__decision_start)),
            }
            Ok(())
        })();
        match __result {
            Ok(()) => {
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
            Err(__error) => {
                if let Some(__error) = __sync_error {
                    if allow_fallback {
                        self.base.exit_rule();
                        self.base.restore_generated_diagnostics(__generated_diagnostic_marker);
                        self.base.record_generated_syntax_error();
                        return Err(GeneratedRuleError::Fatal(__error));
                    }
                    self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                    let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                    return Ok(__tree);
                }
                self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
        }
    }

    #[allow(dead_code)]
    fn parse_generated_rule_39_dispatch(&mut self, precedence: i32, allow_fallback: bool) -> Result<antlr4_runtime::ParseTree, GeneratedRuleError> {
```rust

---

Found a 34 line (212 tokens) duplication in the following files:
* Starting at line 13695 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 15016 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 15504 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 16830 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 17098 of src/bin_support/grammar/generated/antlr_v4_parser.rs

```rust
                        }
                        _ => return Err(self.base.no_viable_alternative_error(__decision_start)),
                    }
                }
                _ => return Err(self.base.no_viable_alternative_error(__decision_start)),
            }
            Ok(())
        })();
        match __result {
            Ok(()) => {
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
            Err(__error) => {
                if let Some(__error) = __sync_error {
                    if allow_fallback {
                        self.base.exit_rule();
                        self.base.restore_generated_diagnostics(__generated_diagnostic_marker);
                        self.base.record_generated_syntax_error();
                        return Err(GeneratedRuleError::Fatal(__error));
                    }
                    self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                    let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                    return Ok(__tree);
                }
                self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
        }
    }

    #[allow(dead_code)]
    fn parse_generated_rule_39_dispatch(&mut self, precedence: i32, allow_fallback: bool) -> Result<antlr4_runtime::ParseTree, GeneratedRuleError> {

Found a 34 line (212 tokens) duplication in the following files:

  • Starting at line 14748 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 15016 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 17098 of src/bin_support/grammar/generated/antlr_v4_parser.rs
                        }
                        _ => return Err(self.base.no_viable_alternative_error(__decision_start)),
                    }
                }
                _ => return Err(self.base.no_viable_alternative_error(__decision_start)),
            }
            Ok(())
        })();
        match __result {
            Ok(()) => {
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
            Err(__error) => {
                if let Some(__error) = __sync_error {
                    if allow_fallback {
                        self.base.exit_rule();
                        self.base.restore_generated_diagnostics(__generated_diagnostic_marker);
                        self.base.record_generated_syntax_error();
                        return Err(GeneratedRuleError::Fatal(__error));
                    }
                    self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                    let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                    return Ok(__tree);
                }
                self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
        }
    }

    #[allow(dead_code)]
    fn parse_generated_rule_47_dispatch(&mut self, precedence: i32, allow_fallback: bool) -> Result<antlr4_runtime::ParseTree, GeneratedRuleError> {
```rust

---

Found a 34 line (200 tokens) duplication in the following files:
* Starting at line 10889 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 13306 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 13447 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 14446 of src/bin_support/grammar/generated/antlr_v4_parser.rs

```rust
                    for __child in __match.into_child_iter() { self.base.add_parse_child(&mut __ctx, __child); }
                }
                2 => {
                }
                _ => return Err(self.base.no_viable_alternative_error(__decision_start)),
            }
            Ok(())
        })();
        match __result {
            Ok(()) => {
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
            Err(__error) => {
                if let Some(__error) = __sync_error {
                    if allow_fallback {
                        self.base.exit_rule();
                        self.base.restore_generated_diagnostics(__generated_diagnostic_marker);
                        self.base.record_generated_syntax_error();
                        return Err(GeneratedRuleError::Fatal(__error));
                    }
                    self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                    let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                    return Ok(__tree);
                }
                self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
        }
    }

    #[allow(dead_code)]
    fn parse_generated_rule_12_dispatch(&mut self, precedence: i32, allow_fallback: bool) -> Result<antlr4_runtime::ParseTree, GeneratedRuleError> {

Found a 33 line (199 tokens) duplication in the following files:

  • Starting at line 10890 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 12018 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 12874 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 13307 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 13448 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 14447 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 15220 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 15842 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 16589 of src/bin_support/grammar/generated/antlr_v4_parser.rs
                }
                2 => {
                }
                _ => return Err(self.base.no_viable_alternative_error(__decision_start)),
            }
            Ok(())
        })();
        match __result {
            Ok(()) => {
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
            Err(__error) => {
                if let Some(__error) = __sync_error {
                    if allow_fallback {
                        self.base.exit_rule();
                        self.base.restore_generated_diagnostics(__generated_diagnostic_marker);
                        self.base.record_generated_syntax_error();
                        return Err(GeneratedRuleError::Fatal(__error));
                    }
                    self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                    let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                    return Ok(__tree);
                }
                self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
        }
    }

    #[allow(dead_code)]
    fn parse_generated_rule_12_dispatch(&mut self, precedence: i32, allow_fallback: bool) -> Result<antlr4_runtime::ParseTree, GeneratedRuleError> {
```rust

---

Found a 32 line (196 tokens) duplication in the following files:
* Starting at line 9893 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 13697 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 14059 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 14158 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 14750 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 15018 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 15506 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 16254 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 16832 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 17100 of src/bin_support/grammar/generated/antlr_v4_parser.rs

```rust
                    for __child in __match.into_child_iter() { self.base.add_parse_child(&mut __ctx, __child); }
                }
                _ => return Err(self.base.no_viable_alternative_error(__decision_start)),
            }
            Ok(())
        })();
        match __result {
            Ok(()) => {
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
            Err(__error) => {
                if let Some(__error) = __sync_error {
                    if allow_fallback {
                        self.base.exit_rule();
                        self.base.restore_generated_diagnostics(__generated_diagnostic_marker);
                        self.base.record_generated_syntax_error();
                        return Err(GeneratedRuleError::Fatal(__error));
                    }
                    self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                    let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                    return Ok(__tree);
                }
                self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
        }
    }

    #[allow(dead_code)]
    fn parse_generated_rule_3_dispatch(&mut self, precedence: i32, allow_fallback: bool) -> Result<antlr4_runtime::ParseTree, GeneratedRuleError> {

Found a 32 line (196 tokens) duplication in the following files:

  • Starting at line 10344 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 13697 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 14750 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 15018 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 15506 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 16832 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 17100 of src/bin_support/grammar/generated/antlr_v4_parser.rs
                    for __child in __match.into_child_iter() { self.base.add_parse_child(&mut __ctx, __child); }
                }
                _ => return Err(self.base.no_viable_alternative_error(__decision_start)),
            }
            Ok(())
        })();
        match __result {
            Ok(()) => {
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
            Err(__error) => {
                if let Some(__error) = __sync_error {
                    if allow_fallback {
                        self.base.exit_rule();
                        self.base.restore_generated_diagnostics(__generated_diagnostic_marker);
                        self.base.record_generated_syntax_error();
                        return Err(GeneratedRuleError::Fatal(__error));
                    }
                    self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                    let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                    return Ok(__tree);
                }
                self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
        }
    }

    #[allow(dead_code)]
    fn parse_generated_rule_7_dispatch(&mut self, precedence: i32, allow_fallback: bool) -> Result<antlr4_runtime::ParseTree, GeneratedRuleError> {
```rust

---

Found a 32 line (196 tokens) duplication in the following files:
* Starting at line 11101 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 13697 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 14750 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 15018 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 15506 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 16832 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 17100 of src/bin_support/grammar/generated/antlr_v4_parser.rs

```rust
                    for __child in __match.into_child_iter() { self.base.add_parse_child(&mut __ctx, __child); }
                }
                _ => return Err(self.base.no_viable_alternative_error(__decision_start)),
            }
            Ok(())
        })();
        match __result {
            Ok(()) => {
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
            Err(__error) => {
                if let Some(__error) = __sync_error {
                    if allow_fallback {
                        self.base.exit_rule();
                        self.base.restore_generated_diagnostics(__generated_diagnostic_marker);
                        self.base.record_generated_syntax_error();
                        return Err(GeneratedRuleError::Fatal(__error));
                    }
                    self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                    let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                    return Ok(__tree);
                }
                self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
        }
    }

    #[allow(dead_code)]
    fn parse_generated_rule_14_dispatch(&mut self, precedence: i32, allow_fallback: bool) -> Result<antlr4_runtime::ParseTree, GeneratedRuleError> {

Found a 31 line (195 tokens) duplication in the following files:

  • Starting at line 9894 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 10019 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 10345 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 10555 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 10892 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 11102 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 11531 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 12020 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 12226 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 12876 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 13309 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 13450 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 13698 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 13961 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 14060 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 14159 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 14449 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 14751 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 15019 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 15128 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 15222 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 15507 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 15635 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 15752 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 15844 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 15944 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 16255 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 16591 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 16833 of src/bin_support/grammar/generated/antlr_v4_parser.rs
  • Starting at line 17101 of src/bin_support/grammar/generated/antlr_v4_parser.rs
                }
                _ => return Err(self.base.no_viable_alternative_error(__decision_start)),
            }
            Ok(())
        })();
        match __result {
            Ok(()) => {
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
            Err(__error) => {
                if let Some(__error) = __sync_error {
                    if allow_fallback {
                        self.base.exit_rule();
                        self.base.restore_generated_diagnostics(__generated_diagnostic_marker);
                        self.base.record_generated_syntax_error();
                        return Err(GeneratedRuleError::Fatal(__error));
                    }
                    self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                    let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                    return Ok(__tree);
                }
                self.base.recover_generated_rule(&mut __ctx, atn(), __error);
                let __tree = self.base.finish_rule(__ctx, __consumed_eof);
                Ok(__tree)
            }
        }
    }

    #[allow(dead_code)]
    fn parse_generated_rule_3_dispatch(&mut self, precedence: i32, allow_fallback: bool) -> Result<antlr4_runtime::ParseTree, GeneratedRuleError> {
```rust

---

Found a 22 line (179 tokens) duplication in the following files:
* Starting at line 783 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 913 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 1035 of src/bin_support/grammar/generated/antlr_v4_parser.rs
* Starting at line 1155 of src/bin_support/grammar/generate

_(report truncated; full output in workflow logs)_

@claude

claude Bot commented Jul 23, 2026

Copy link
Copy Markdown

Claude finished @tinovyatkin's task in 15m 10s —— View job


Code Review: Align TokenView text semantics

  • Gather context (diff, CLAUDE.md files, PR summary)
  • Review for bugs & logic errors
  • Review for CLAUDE.md compliance
  • Validate candidate findings
  • Post consolidated review

Verdict: LGTM — no blocking issues found. This is a clean, well-scoped API correction. Four independent review passes (2× bug-hunting, 2× CLAUDE.md compliance) plus my own checks all converged on no bugs and no CLAUDE.md violations. cargo clippy --locked --all-targets --all-features -D warnings and cargo test --locked pass at HEAD.

The core change is exactly right: TokenView::text() now returns Option<&'a str> (matching Token::text()), and the new text_or_empty() = self.text().unwrap_or("") preserves the old lossy behavior for callers that want it. The 'a (store-tied) lifetime is correctly retained.

What I verified (the real risk areas)

  • Template/codegen resolve to the inherent method. .conformance-review/Rust.test.stg calls node.symbol().text_or_empty(). That compiles only because symbol() returns a concrete TokenView (confirmed at src/tree.rs:888/923 and generated antlr_v4_parser.rs:579/602), which has the new inherent text_or_empty(). Same for antlr4-rust-gen.rs, where token is the element of an Option<TokenView> from start()/lt().
  • Every production site that must keep ""-on-missing uses text_or_empty()token_stream.rs text_range/text_all, the caller-follow boundary check at parser.rs:11685, Display, AsRef<str>, and the JS/TS dumper paths. Behavior preserved.
  • JS/TS semantic predicates (token.text() == Some(expected)) are equivalent to the old text() == expected for source-backed tokens (always Some); they only diverge in the unreachable None-vs-expected=="" case.
  • .map.and_then test migrations (token.rs:928, token_stream.rs:635, parser.rs:16645/16684) are consistent with their assertions, and all updated assert_eq! sites correctly expect Some(...).
  • Regenerated antlr_v4_parser.rs matches the codegen source change (the 68 mechanical text()text_or_empty() sites), and self-hosted.sha256 matches the regenerated file. #[rustfmt::skip] fixture blocks in src/atn/lexer_dfa.rs are untouched.

Non-blocking observations (for awareness, no change required)

  1. TokenView's custom Debug and PartialEq shift semantics invisibly. Both route through the inherent self.text(), so with this PR Debug now prints text: Some("x") / text: None (was text: "x" / text: ""), and Eq now distinguishes None from Some(""). This isn't visible in the diff (the call sites are textually unchanged) and is harmless for real source-backed tokens — arguably more correct — but you may want a one-line note or a small test pinning the equality/Debug edge, given the PR is explicitly about this None-vs-"" distinction. src/token.rs#L603-L625
  2. Copy/paste-detection CI noise (71 duplications) is essentially all pre-existing: the generated antlr_v4_parser.rs rule-dispatch boilerplate and the JS/TS parity dumpers were already near-identical. This PR doesn't meaningfully add to it — no action needed here.

Nice touch adding token_view_text_matches_token_trait_semantics to lock in the None vs empty-string distinction against both concrete and generic receivers, and documenting the breaking change in docs/migration.md.

@tinovyatkin

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 23, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@github-actions

Copy link
Copy Markdown

📊 Source Code Metrics (this PR vs main)

File Cyclomatic Cognitive Functions LLOC MI
src/token.rs 178 (main: 175) 🔴 44 ⚪ 91 (main: 88) 🔴 189 (main: 182) 🔴 0 ⚪
src/bin_support/grammar/lexer_adaptor.rs 39 ⚪ 24 ⚪ 13 ⚪ 43 ⚪ 17.92 (main: 17.93) 🔴

Generated by mehen v1.6.0 — the code quality watcher.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Keep it up!

Reviewed commit: 9be8c80ab5

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@tinovyatkin tinovyatkin changed the title [codex] Align TokenView text semantics fix: align TokenView text semantics Jul 23, 2026
@tinovyatkin
tinovyatkin merged commit c56a8c4 into main Jul 23, 2026
13 checks passed
@tinovyatkin
tinovyatkin deleted the codex/fix-issue-122-token-text branch July 23, 2026 08:16
@ophiarch ophiarch Bot mentioned this pull request Jul 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

TokenView::text() (-> &str) silently shadows Token::text() (-> Option<&str>)

2 participants