🐙

[Bug #21168] メソッドの引数にブロック構文がある場合で Prism と parse.y に差異があるバグ報告

に公開

[Bug #21168] Prism doesn't require argument parentheses (in some cases) when a block is present but parse.y does

  • 次のように『メソッドの引数にブロック構文がある場合』に『 Prism ではシンタックスエラーでない』が『 parse.y だとシンタックスエラーになる』というバグ報告
foo(
  bar baz do
  end
)
$ ruby -c --parser=prism test.rb
Syntax OK
$ ruby -c --parser=parse.y test.rb
ruby: test.rb:2: syntax error, unexpected 'do' for block, expecting ')' (SyntaxError)
  bar baz do
          ^~
  • 以下のようなコードの場合は Prism parse.y ともに一貫してシンタックスエラーにはならない
# Syntax OK
foo(
  bar(baz do
  end)
)

# Syntax OK
foo(
  (bar baz do
  end)
)

# Syntax OK
foo(
  bar baz {

  }
)

# Syntax OK
bar baz do
end
  • また、逆に以下のコードは Prism parse.y ともに一貫してシンタックスエラーになる
# Syntax Error
[
  foo bar do
  end,
]

# Syntax Error
foo || bar baz do
end
  • bar baz do end 単体ではエラーにならないが、これが引数に含まれているとエラーになるみたいですね
  • 個人的にヒア bar baz do end 単体でエラーにならないなら引数に含まれていてもエラーにならないほうが一貫性があり自然な気がしますが
  • matz としては『 parse.y の挙動に準じたい』みたいですねー
GitHubで編集を提案

Discussion