From 96adadce844c554b3bd736b47e2fcaa2dcdddb3d Mon Sep 17 00:00:00 2001 From: Ilya Bylich Date: Wed, 8 Jan 2020 14:52:18 +0300 Subject: [PATCH] - lexer.rl: fix paren_nest for curly braces (#646) --- lib/parser/lexer.rl | 6 +++++- test/parse_helper.rb | 3 +++ test/test_parser.rb | 12 ++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/parser/lexer.rl b/lib/parser/lexer.rl index a310723e3..b3e8a2f46 100644 --- a/lib/parser/lexer.rl +++ b/lib/parser/lexer.rl @@ -1064,7 +1064,6 @@ class Parser::Lexer emit(:tRCURLY, '}'.freeze, p - 1, p) @cond.lexpop @cmdarg.lexpop - @paren_nest -= 1 else emit(:tSTRING_DEND, '}'.freeze, p - 1, p) end @@ -1079,6 +1078,8 @@ class Parser::Lexer fbreak; end end + + @paren_nest -= 1 }; action extend_interp_code { @@ -2165,6 +2166,9 @@ class Parser::Lexer emit_do end end + if tok == '{'.freeze + @paren_nest += 1 + end @command_start = true fnext expr_value; fbreak; diff --git a/test/parse_helper.rb b/test/parse_helper.rb index 3e5e96a13..e89adb6a6 100644 --- a/test/parse_helper.rb +++ b/test/parse_helper.rb @@ -127,6 +127,9 @@ def try_parsing(ast, code, parser, source_maps, version) assert parser.instance_eval { @lexer }.cmdarg.empty?, "(#{version}) expected cmdarg to be empty after parsing" + + assert_equal 0, parser.instance_eval { @lexer.instance_eval { @paren_nest } }, + "(#{version}) expected paren_nest to be 0 after parsing" end # Use like this: diff --git a/test/test_parser.rb b/test/test_parser.rb index a8a20d9b4..ef70b1998 100644 --- a/test/test_parser.rb +++ b/test/test_parser.rb @@ -9294,4 +9294,16 @@ def test_pattern_matching_required_parentheses_for_in_match %{ ^^ location}, SINCE_2_7) end + + def test_parser_bug_645 + assert_parses( + s(:block, + s(:lambda), + s(:args, + s(:optarg, :arg, + s(:hash))), nil), + '-> (arg={}) {}', + %{}, + SINCE_1_9) + end end