I think this is parse.y issue.
The lineno of NODE_RESCUE is 1 correctly with begin ... rescue ... end
pattern.
$ cat a.rb
begin
raise
rescue
raise ""
end
$ ./miniruby -v --dump=parsetree a.rb|grep -e "NODE.*line"
# @ NODE_SCOPE (line: 6)
# @ NODE_PRELUDE (line: 6)
# | @ NODE_RESCUE (line: 1)
# | | @ NODE_VCALL (line: 2)
# | | @ NODE_RESBODY (line: 4)
# | | | @ NODE_FCALL (line: 4)
# | | | @ NODE_ARRAY (line: 4)
# | | | | @ NODE_STR (line: 4)
But the lineno of NODE_RESCUE is 2 with def ... rescue ... end
pattern.
$ cat b.rb
def foo
raise
rescue
raise ""
end
$ ./miniruby -v --dump=parsetree b.rb|grep -e "NODE.*line"
# @ NODE_SCOPE (line: 6)
# @ NODE_PRELUDE (line: 6)
# | @ NODE_DEFN (line: 1)
# | @ NODE_SCOPE (line: 5)
# | | @ NODE_ARGS (line: 1)
# | @ NODE_RESCUE (line: 2)
# | | @ NODE_VCALL (line: 2)
# | | @ NODE_RESBODY (line: 4)
# | | | @ NODE_FCALL (line: 4)
# | | | @ NODE_ARRAY (line: 4)
# | | | | @ NODE_STR (line: 4)
NODE_RESCUE and NODE_ENSURE of "k_begin bodystmt k_end" are given special treatment in parse.y.
https://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/parse.y?revision=58466&view=markup#l2466
How about do likewise for "k_def fname f_arglist bodystmt k_end"?
https://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/parse.y?revision=58466&view=markup#l2793