ADR-0024 Phase F (full) step 1: walker-driven highlighting
Replaces the lex()-driven `base_runs` span builder in `input_render.rs` with `walker::highlight_runs`. The new walker-side `dsl::walker::highlight` module returns per-byte `HighlightClass` assignments for every token shape in the source: - For commands the walker engages on, `WalkResult::per_byte_class` is the authoritative source (keyword / identifier / number / string / punct / flag). - Trailing junk past a partial match — and inputs the walker doesn't engage on at all (no registered entry word) — fall through to a byte-shape scanner over `lex_helpers` so unknown command words, stray punctuation, and unterminated strings still highlight sensibly. `Theme::highlight_class_color` is the walker-side analogue of `token_color(&TokenKind)`; the renderer reads `walker::highlight_runs` output and looks up colours through it. `token_color` and the `lex()` pre-pass remain in place for now — the lexer module is still consumed by usage rendering and completion until the remaining Phase F steps land. `HighlightClass`'s and `WalkResult::per_byte_class`'s `#[allow(dead_code)]` annotations come off — they're now part of the production highlight path. Tests: - 16 new tests under `dsl::walker::highlight` cover end-to-end walks, byte-shape fallbacks (unknown commands, bare flags, numbers, punctuation), UTF-8 codepoint advance, and trailing- token handling after partial walks. - Existing `input_render` tests pass unchanged. - 860 total tests passing (727 lib + 133 integration), 1 ignored. Clippy clean with `nursery` lints + `-D warnings`.
This commit is contained in:
@@ -18,6 +18,7 @@
|
||||
|
||||
use ratatui::style::Color;
|
||||
|
||||
use crate::dsl::grammar::HighlightClass;
|
||||
use crate::dsl::lexer::TokenKind;
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
@@ -121,6 +122,25 @@ impl Theme {
|
||||
TokenKind::Error(_) => self.tok_error,
|
||||
}
|
||||
}
|
||||
|
||||
/// Map a walker `HighlightClass` to its display colour
|
||||
/// (ADR-0024 §architecture, Phase F). This is the walker-side
|
||||
/// equivalent of `token_color` — the renderer consumes
|
||||
/// `walker::highlight_runs` output, which produces
|
||||
/// `HighlightClass` per byte range, and looks up colours
|
||||
/// through this method.
|
||||
#[must_use]
|
||||
pub const fn highlight_class_color(&self, class: HighlightClass) -> Color {
|
||||
match class {
|
||||
HighlightClass::Keyword => self.tok_keyword,
|
||||
HighlightClass::Identifier => self.tok_identifier,
|
||||
HighlightClass::Number => self.tok_number,
|
||||
HighlightClass::String => self.tok_string,
|
||||
HighlightClass::Punct => self.tok_punct,
|
||||
HighlightClass::Flag => self.tok_flag,
|
||||
HighlightClass::Error => self.tok_error,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for Theme {
|
||||
|
||||
Reference in New Issue
Block a user