From 0544dd33dffb85d1d7434b3ed9e42e49aa262479 Mon Sep 17 00:00:00 2001 From: Ilya Bylich Date: Fri, 3 Apr 2020 21:58:26 +0300 Subject: [PATCH] + ruby27.y: allow newlines inside braced pattern. (#664) This commit tracks upstream commits ruby/ruby@f5c904c and ruby/ruby@c8d0bf0 that have been cherry-picked in 2.7.1 (ruby/ruby@004c298 and ruby/ruby@44f7e38) --- lib/parser/ruby27.y | 11 ++++++-- test/test_parser.rb | 61 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 2 deletions(-) diff --git a/lib/parser/ruby27.y b/lib/parser/ruby27.y index 97af5e103..d6f662e28 100644 --- a/lib/parser/ruby27.y +++ b/lib/parser/ruby27.y @@ -1877,13 +1877,16 @@ opt_block_args_tail: | tLBRACE { @pattern_hash_keys.push + result = @lexer.in_kwarg + @lexer.in_kwarg = false } - p_kwargs tRCURLY + p_kwargs rbrace { @pattern_hash_keys.pop + @lexer.in_kwarg = val[1] result = @builder.hash_pattern(val[0], val[2], val[3]) } - | tLBRACE tRCURLY + | tLBRACE rbrace { result = @builder.hash_pattern(val[0], [], val[1]) } @@ -2902,6 +2905,10 @@ keyword_variable: kNIL { result = val[1] } + rbrace: opt_nl tRCURLY + { + result = val[1] + } trailer: | tNL | tCOMMA term: tSEMI diff --git a/test/test_parser.rb b/test/test_parser.rb index 06ae5b540..d940dbb62 100644 --- a/test/test_parser.rb +++ b/test/test_parser.rb @@ -8758,6 +8758,67 @@ def test_pattern_matching_hash %q{in a: 1, _a:, ** then true}, %q{ ~~~~~~~~~~~~~ expression (in_pattern.hash_pattern)} ) + + assert_parses_pattern_match( + s(:in_pattern, + s(:hash_pattern, + s(:pair, + s(:sym, :a), + s(:int, 1))), nil, + s(:false)), + %q{ + in {a: 1 + } + false + }, + %q{} + ) + + + assert_parses_pattern_match( + s(:in_pattern, + s(:hash_pattern, + s(:pair, + s(:sym, :a), + s(:int, 2))), nil, + s(:false)), + %q{ + in {a: + 2} + false + }, + %q{} + ) + + assert_parses_pattern_match( + s(:in_pattern, + s(:hash_pattern, + s(:pair, + s(:sym, :a), + s(:hash_pattern, + s(:match_var, :b))), + s(:match_var, :c)), nil, + s(:send, nil, :p, + s(:lvar, :c))), + %q{ + in a: {b:}, c: + p c + }, + %q{} + ) + + assert_parses_pattern_match( + s(:in_pattern, + s(:hash_pattern, + s(:match_var, :a)), nil, + s(:true)), + %q{ + in {a: + } + true + }, + %q{} + ) end def test_pattern_matching_hash_with_string_keys