From c1da46307e095822407f92ee7e7b37040c0c27dc Mon Sep 17 00:00:00 2001 From: Ilya Bylich Date: Fri, 22 May 2020 19:09:57 +0300 Subject: [PATCH] + ruby28.y: support rescue modifier in endless method def. This commit tracks upstream commit ruby/ruby@d7d0d01. --- lib/parser/ruby28.y | 34 ++++++++++++++++++++++++++++++++++ test/test_parser.rb | 25 +++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/lib/parser/ruby28.y b/lib/parser/ruby28.y index 50ef37a92..5f1ac18ec 100644 --- a/lib/parser/ruby28.y +++ b/lib/parser/ruby28.y @@ -869,6 +869,23 @@ rule result = @builder.def_endless_method(*val[0], val[1], val[2], val[3]) + @lexer.cmdarg.pop + @lexer.cond.pop + @static_env.unextend + @context.pop + @current_arg_stack.pop + } + | defn_head f_paren_args tEQL arg kRESCUE_MOD arg + { + rescue_body = @builder.rescue_body(val[4], + nil, nil, nil, + nil, val[5]) + + method_body = @builder.begin_body(val[3], [ rescue_body ]) + + result = @builder.def_endless_method(*val[0], + val[1], val[2], method_body) + @lexer.cmdarg.pop @lexer.cond.pop @static_env.unextend @@ -880,6 +897,23 @@ rule result = @builder.def_endless_singleton(*val[0], val[1], val[2], val[3]) + @lexer.cmdarg.pop + @lexer.cond.pop + @static_env.unextend + @context.pop + @current_arg_stack.pop + } + | defs_head f_paren_args tEQL arg kRESCUE_MOD arg + { + rescue_body = @builder.rescue_body(val[4], + nil, nil, nil, + nil, val[5]) + + method_body = @builder.begin_body(val[3], [ rescue_body ]) + + result = @builder.def_endless_singleton(*val[0], + val[1], val[2], method_body) + @lexer.cmdarg.pop @lexer.cond.pop @static_env.unextend diff --git a/test/test_parser.rb b/test/test_parser.rb index 239a5d716..a9e717425 100644 --- a/test/test_parser.rb +++ b/test/test_parser.rb @@ -9520,6 +9520,31 @@ def test_endless_method_without_brackets ) end + def test_endless_method_with_rescue_mod + assert_parses( + s(:def_e, :m, + s(:args), + s(:rescue, + s(:int, 1), + s(:resbody, nil, nil, + s(:int, 2)), nil)), + %q{def m() = 1 rescue 2}, + %q{}, + SINCE_2_8) + + assert_parses( + s(:defs_e, + s(:self), :m, + s(:args), + s(:rescue, + s(:int, 1), + s(:resbody, nil, nil, + s(:int, 2)), nil)), + %q{def self.m() = 1 rescue 2}, + %q{}, + SINCE_2_8) + end + def test_rasgn assert_parses( s(:rasgn,