From 14931f833df8e81b5acb4d0ef1db14740574e488 Mon Sep 17 00:00:00 2001 From: Vince Broz Date: Fri, 16 Oct 2026 14:41:40 -0400 Subject: [PATCH 1/3] Add Parser::Builders::Default#value signature Builders::Default#value(token) returns token[0], the value half of a [value, range] token pair. Subclasses of the default builder call it, so type it generically over the value. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01GgkyXKEZWpEFXo6ceA5MSw --- gems/parser/3.2/_test/test.rb | 7 +++++++ gems/parser/3.2/_test/test.rbs | 3 +++ gems/parser/3.2/parser.rbs | 8 ++++++++ 3 files changed, 18 insertions(+) create mode 100644 gems/parser/3.2/_test/test.rbs diff --git a/gems/parser/3.2/_test/test.rb b/gems/parser/3.2/_test/test.rb index c41269383..2e322c3d9 100644 --- a/gems/parser/3.2/_test/test.rb +++ b/gems/parser/3.2/_test/test.rb @@ -75,3 +75,10 @@ node.loc.begin node.loc.end end + +class TestBuilder < Parser::Builders::Default + def token_value + value(["foo", nil]).upcase + end +end +TestBuilder.new.token_value diff --git a/gems/parser/3.2/_test/test.rbs b/gems/parser/3.2/_test/test.rbs new file mode 100644 index 000000000..ecb16fadc --- /dev/null +++ b/gems/parser/3.2/_test/test.rbs @@ -0,0 +1,3 @@ +class TestBuilder < Parser::Builders::Default + def token_value: () -> String +end diff --git a/gems/parser/3.2/parser.rbs b/gems/parser/3.2/parser.rbs index 7f7aea348..734789d29 100644 --- a/gems/parser/3.2/parser.rbs +++ b/gems/parser/3.2/parser.rbs @@ -50,6 +50,14 @@ module Parser end end + module Builders + class Default + private + + def value: [T] ([T, untyped] token) -> T + end + end + module Source class Range attr_reader source_buffer: Buffer From c38935532db0c6fc0774844cf330f84f879d159c Mon Sep 17 00:00:00 2001 From: Vince Broz Date: Fri, 16 Oct 2026 16:45:06 -0400 Subject: [PATCH 2/3] Add Builders::Default#string_value and #loc string_value(token) returns the String half of a token pair. loc(token) returns the Range half, or nil when the token or its value is nil. Both are private helpers that builder subclasses call. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01GgkyXKEZWpEFXo6ceA5MSw --- gems/parser/3.2/_test/test.rb | 11 +++++++++++ gems/parser/3.2/_test/test.rbs | 2 ++ gems/parser/3.2/parser.rbs | 2 ++ 3 files changed, 15 insertions(+) diff --git a/gems/parser/3.2/_test/test.rb b/gems/parser/3.2/_test/test.rb index 2e322c3d9..ce654c156 100644 --- a/gems/parser/3.2/_test/test.rb +++ b/gems/parser/3.2/_test/test.rb @@ -80,5 +80,16 @@ class TestBuilder < Parser::Builders::Default def token_value value(["foo", nil]).upcase end + + def token_string_value + string_value(["foo", nil]).upcase + end + + def token_loc(range) + loc(["foo", range])&.source + loc(nil)&.source + end end TestBuilder.new.token_value +TestBuilder.new.token_string_value +TestBuilder.new.token_loc(range) diff --git a/gems/parser/3.2/_test/test.rbs b/gems/parser/3.2/_test/test.rbs index ecb16fadc..5d5cf36a1 100644 --- a/gems/parser/3.2/_test/test.rbs +++ b/gems/parser/3.2/_test/test.rbs @@ -1,3 +1,5 @@ class TestBuilder < Parser::Builders::Default def token_value: () -> String + def token_string_value: () -> String + def token_loc: (Parser::Source::Range range) -> String? end diff --git a/gems/parser/3.2/parser.rbs b/gems/parser/3.2/parser.rbs index 734789d29..cd48962f1 100644 --- a/gems/parser/3.2/parser.rbs +++ b/gems/parser/3.2/parser.rbs @@ -55,6 +55,8 @@ module Parser private def value: [T] ([T, untyped] token) -> T + def string_value: ([String, untyped] token) -> String + def loc: ([untyped, Source::Range?]? token) -> Source::Range? end end From bc8083c9b2dbda44ae4da67faa44377a99b98a77 Mon Sep 17 00:00:00 2001 From: Vince Broz Date: Fri, 16 Oct 2026 16:53:11 -0400 Subject: [PATCH 3/3] parser: Type Builders::Default token ranges The lexer builds every token as [value, range(s, e)], so a token's second element is always a Parser::Source::Range. Replace the untyped slots in value, string_value and loc, and pass a real range in the tests. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01GgkyXKEZWpEFXo6ceA5MSw --- gems/parser/3.2/_test/test.rb | 12 ++++++------ gems/parser/3.2/_test/test.rbs | 4 ++-- gems/parser/3.2/parser.rbs | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/gems/parser/3.2/_test/test.rb b/gems/parser/3.2/_test/test.rb index ce654c156..7564e0930 100644 --- a/gems/parser/3.2/_test/test.rb +++ b/gems/parser/3.2/_test/test.rb @@ -77,12 +77,12 @@ end class TestBuilder < Parser::Builders::Default - def token_value - value(["foo", nil]).upcase + def token_value(range) + value(["foo", range]).upcase end - def token_string_value - string_value(["foo", nil]).upcase + def token_string_value(range) + string_value(["foo", range]).upcase end def token_loc(range) @@ -90,6 +90,6 @@ def token_loc(range) loc(nil)&.source end end -TestBuilder.new.token_value -TestBuilder.new.token_string_value +TestBuilder.new.token_value(range) +TestBuilder.new.token_string_value(range) TestBuilder.new.token_loc(range) diff --git a/gems/parser/3.2/_test/test.rbs b/gems/parser/3.2/_test/test.rbs index 5d5cf36a1..b3f0fae4b 100644 --- a/gems/parser/3.2/_test/test.rbs +++ b/gems/parser/3.2/_test/test.rbs @@ -1,5 +1,5 @@ class TestBuilder < Parser::Builders::Default - def token_value: () -> String - def token_string_value: () -> String + def token_value: (Parser::Source::Range range) -> String + def token_string_value: (Parser::Source::Range range) -> String def token_loc: (Parser::Source::Range range) -> String? end diff --git a/gems/parser/3.2/parser.rbs b/gems/parser/3.2/parser.rbs index cd48962f1..b402116a2 100644 --- a/gems/parser/3.2/parser.rbs +++ b/gems/parser/3.2/parser.rbs @@ -54,9 +54,9 @@ module Parser class Default private - def value: [T] ([T, untyped] token) -> T - def string_value: ([String, untyped] token) -> String - def loc: ([untyped, Source::Range?]? token) -> Source::Range? + def value: [T] ([T, Source::Range] token) -> T + def string_value: ([String, Source::Range] token) -> String + def loc: ([top, Source::Range]? token) -> Source::Range? end end