From 16683e220810dae8041ec01cfc7571e585312203 Mon Sep 17 00:00:00 2001 From: Alexander Momchilov Date: Tue, 31 Mar 2026 22:26:49 -0400 Subject: [PATCH] Support bare `:` as keyword for `true` --- snapshots/booleans.txt | 10 ++++++---- src/prism.c | 5 +++-- test/prism/fixtures/booleans.txt | 2 ++ test/prism/ruby/parser_test.rb | 3 +++ test/prism/ruby/ripper_test.rb | 3 +++ test/prism/ruby/ruby_parser_test.rb | 3 +++ 6 files changed, 20 insertions(+), 6 deletions(-) diff --git a/snapshots/booleans.txt b/snapshots/booleans.txt index 47ce80217a..42edda679d 100644 --- a/snapshots/booleans.txt +++ b/snapshots/booleans.txt @@ -1,11 +1,13 @@ -@ ProgramNode (location: (1,0)-(3,4)) +@ ProgramNode (location: (1,0)-(5,1)) ├── flags: ∅ ├── locals: [] └── statements: - @ StatementsNode (location: (1,0)-(3,4)) + @ StatementsNode (location: (1,0)-(5,1)) ├── flags: ∅ - └── body: (length: 2) + └── body: (length: 3) ├── @ FalseNode (location: (1,0)-(1,5)) │ └── flags: newline, static_literal - └── @ TrueNode (location: (3,0)-(3,4)) + ├── @ TrueNode (location: (3,0)-(3,4)) + │ └── flags: newline, static_literal + └── @ TrueNode (location: (5,0)-(5,1)) └── flags: newline, static_literal diff --git a/src/prism.c b/src/prism.c index 72c49da6f2..7df7b11116 100644 --- a/src/prism.c +++ b/src/prism.c @@ -6889,7 +6889,7 @@ pm_symbol_node_to_string_node(pm_parser_t *parser, pm_symbol_node_t *node) { */ static pm_true_node_t * pm_true_node_create(pm_parser_t *parser, const pm_token_t *token) { - assert(token->type == PM_TOKEN_KEYWORD_TRUE); + assert(token->type == PM_TOKEN_KEYWORD_TRUE || token->type == PM_TOKEN_COLON); return pm_true_node_new( parser->arena, @@ -11009,7 +11009,7 @@ parser_lex(pm_parser_t *parser) { LEX(PM_TOKEN_COLON_COLON); } - if (lex_state_end_p(parser) || pm_char_is_whitespace(peek(parser)) || peek(parser) == '#') { + if (lex_state_end_p(parser) || pm_char_is_whitespace(peek(parser)) || peek(parser) == '#' || peek(parser) == '\0') { lex_state_set(parser, PM_LEX_STATE_BEG); LEX(PM_TOKEN_COLON); } @@ -19989,6 +19989,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, u case PM_TOKEN_KEYWORD_SELF: parser_lex(parser); return UP(pm_self_node_create(parser, &parser->previous)); + case PM_TOKEN_COLON: case PM_TOKEN_KEYWORD_TRUE: parser_lex(parser); return UP(pm_true_node_create(parser, &parser->previous)); diff --git a/test/prism/fixtures/booleans.txt b/test/prism/fixtures/booleans.txt index d9417254b6..bef7a9540d 100644 --- a/test/prism/fixtures/booleans.txt +++ b/test/prism/fixtures/booleans.txt @@ -1,3 +1,5 @@ false true + +: diff --git a/test/prism/ruby/parser_test.rb b/test/prism/ruby/parser_test.rb index ad9fa0c92c..29dd2572e3 100644 --- a/test/prism/ruby/parser_test.rb +++ b/test/prism/ruby/parser_test.rb @@ -68,6 +68,9 @@ class ParserTest < TestCase # https://bugs.ruby-lang.org/issues/21168#note-5 "command_method_call_2.txt", + + # Contains standalone `:` keyword (not supported by parser gem). + "booleans.txt", ] # These files contain code that is being parsed incorrectly by the parser diff --git a/test/prism/ruby/ripper_test.rb b/test/prism/ruby/ripper_test.rb index 7274454e1b..946be84deb 100644 --- a/test/prism/ruby/ripper_test.rb +++ b/test/prism/ruby/ripper_test.rb @@ -44,6 +44,9 @@ class RipperTest < TestCase ] end + # CRuby doesn't support standalone `:` as a keyword (equivalent to `true`). + incorrect << "booleans.txt" + # https://bugs.ruby-lang.org/issues/21669 incorrect << "4.1/void_value.txt" # https://bugs.ruby-lang.org/issues/19107 diff --git a/test/prism/ruby/ruby_parser_test.rb b/test/prism/ruby/ruby_parser_test.rb index bc89bdae72..14284c300a 100644 --- a/test/prism/ruby/ruby_parser_test.rb +++ b/test/prism/ruby/ruby_parser_test.rb @@ -88,6 +88,9 @@ class RubyParserTest < TestCase # https://bugs.ruby-lang.org/issues/21168#note-5 "command_method_call_2.txt", + + # Contains standalone `:` keyword (not supported by ruby_parser). + "booleans.txt", ] Fixture.each_for_version(version: "3.3", except: failures) do |fixture|