From: "mame (Yusuke Endoh)" Date: 2021-12-13T16:02:23+00:00 Subject: [ruby-core:106638] [Ruby master Bug#18396] An unexpected "hash value omission" syntax error when without parentheses call expr follows Issue #18396 has been updated by mame (Yusuke Endoh). I think this patch will change the meaning of `p x:` as matz said. ```diff diff --git a/parse.y b/parse.y index 0ff3ddbb4e..d92decfc1c 100644 --- a/parse.y +++ b/parse.y @@ -9290,7 +9290,7 @@ parser_yylex(struct parser_params *p) p->token_seen = token_seen; c = (IS_lex_state(EXPR_BEG|EXPR_CLASS|EXPR_FNAME|EXPR_DOT) && !IS_lex_state(EXPR_LABELED)); - if (c || IS_lex_state_all(EXPR_ARG|EXPR_LABELED)) { + if (c || (IS_lex_state_all(EXPR_ARG|EXPR_LABELED) && p->lex.paren_nest)) { if (!fallthru) { dispatch_scan_event(p, tIGNORED_NL); } ``` Example: ``` x = 1 p x: 2 #=> {:x=>2} # before the patch #=> {:x=>1} # after the patch ``` If the expression is within parentheses, the behavior is be changed. ``` x = 1 p(x: 2 ) #=> {:x=>2} # not changed ``` Before introducing this change, we definitely need to prepare migration path. The following patch will keep the current behavior and print a warning against code that will be changed. This can be used to estimate the impact of the compatibility. ```diff diff --git a/parse.y b/parse.y index 0ff3ddbb4e..73deae8627 100644 --- a/parse.y +++ b/parse.y @@ -9291,6 +9291,9 @@ parser_yylex(struct parser_params *p) c = (IS_lex_state(EXPR_BEG|EXPR_CLASS|EXPR_FNAME|EXPR_DOT) && !IS_lex_state(EXPR_LABELED)); if (c || IS_lex_state_all(EXPR_ARG|EXPR_LABELED)) { + if (IS_lex_state_all(EXPR_ARG|EXPR_LABELED) && !p->lex.paren_nest) { + rb_warn0("keyword label followed by newline without parentheses will be changed in Ruby 3.3"); + } if (!fallthru) { dispatch_scan_event(p, tIGNORED_NL); } ``` ---------------------------------------- Bug #18396: An unexpected "hash value omission" syntax error when without parentheses call expr follows https://bugs.ruby-lang.org/issues/18396#change-95310 * Author: koic (Koichi ITO) * Status: Open * Priority: Normal * ruby -v: ruby 3.1.0dev (2021-12-07T23:18:11Z master 4a3e7984bf) [x86_64-darwin19] * Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN ---------------------------------------- ## Summary I encountered an unexpected "hash value omission" syntax error when parentheses call expression follows: ```ruby % cat example.rb foo key: foo arg ``` ```console % ruby -cv /tmp/b.rb ruby 3.1.0dev (2021-12-07T23:18:11Z master 4a3e7984bf) [x86_64-darwin19] example.rb:2: syntax error, unexpected local variable or method, expecting `do' or '{' or '(' foo arg ``` ## Additional Information The following is a traditional usage. ```ruby # No errors. foo key: key foo arg ``` A syntax error is unexpectedly raised when hash value omission argument without parentheses is followed by a method call without parentheses. ```ruby # No errors is expected, but syntax error is raised. foo key: foo arg ``` No error occurs if any of the calls have parentheses. ```ruby # No errors. foo(key:) foo arg ``` ```ruby # Also no errors. foo key: foo(arg) ``` No error occurs when calling alone. ```ruby # No errors. foo key: ``` I encountered this error while trying to apply hash value omission to RSpec code of a real-world application (proprietary) . But this is a new Ruby 3.1 syntax and may not be supported yet. Thank you. -- https://bugs.ruby-lang.org/ Unsubscribe: