From: "zverok (Victor Shepelev)" Date: 2021-12-13T09:11:33+00:00 Subject: [ruby-core:106632] [Ruby master Bug#18396] An unexpected "hash value omission" syntax error when without parentheses call expr follows Issue #18396 has been updated by zverok (Victor Shepelev). The current state of things is indeed quite confusing (Wrote a small blog post on it: https://zverok.github.io/blog/2021-12-08-value-omission-debug.html). As far as I can understand, the kind of old code that would be affected should look like this: ```ruby method_call foo: bar ``` While using parenthesis in non-DSL method calls is the most common style currently, it is not the only one. For example, Seattle.rb's style (minitest) have optional parenthesis Also, I suspect there could be a frequently/sometimes used style at least when using Rails DSL: ```ruby validate :something, if: -> {condition } # ...when `condition` grows longer, I suspect _some_ codebases might do this: validate :something, if: -> {condition } ``` Another parenthesis-less DSLs are assertions (of the same minitest and other "testunit"-alike frameworks). The worst thing here, I can't think of a way of catching this incompatibility automatically, just after updating on 3.2 _some_ code might break, and in a quite subtle way (for example, DSL methods receiving something _accidentally available_ in current scope), or in a baffling one like ` undefined local variable or method 'if'` ��� ugh what. As an alternative, I was thinking maybe prohibit methods with keyword argument omission **and** parenthesis omission? E.g. make this: ```ruby p x: 1, y: 1 # valid p x:, y: 1 # valid p x: 1, y: # invalid, ambiguity! p(x: 1, y:) # valid ``` ---------------------------------------- Bug #18396: An unexpected "hash value omission" syntax error when without parentheses call expr follows https://bugs.ruby-lang.org/issues/18396#change-95305 * 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: