Bug #22020
Updated by Eregon (Benoit Daloze) 5 months ago
```ruby
begin
foo(1, 2, kw: :arg) { 42 }
rescue => e
pp RubyVM::AbstractSyntaxTree.of e.backtrace_locations[0]
end
```
```
$ ruby --parser=parse.y rubyvm_ast_node_id_loc.rb
(FCALL@2:2-2:21 :foo
(LIST@2:6-2:20 (INTEGER@2:6-2:7 1) (INTEGER@2:9-2:10 2)
(HASH@2:12-2:20 (LIST@2:12-2:20 (SYM@2:12-2:15 :kw) (SYM@2:16-2:20 :arg) nil)) nil))
```
That covers `foo(1, 2, kw: :arg)` so all arguments except the block argument, which looks inconsistent.
I believe it should be:
```
$ ruby --parser=parse.y rubyvm_ast_node_id_loc.rb
(ITER@2:2-2:28
(FCALL@2:2-2:21 :foo
(LIST@2:6-2:20 (INTEGER@2:6-2:7 1) (INTEGER@2:9-2:10 2)
(HASH@2:12-2:20 (LIST@2:12-2:20 (SYM@2:12-2:15 :kw) (SYM@2:16-2:20 :arg) nil)) nil))
(SCOPE@2:22-2:28 tbl: [] args: nil body: (INTEGER@2:24-2:26 42)))
```
which covers `foo(1, 2, kw: :arg) { 42 }`.
PR: https://github.com/ruby/ruby/pull/16836