diff --git a/lib/parser/builders/default.rb b/lib/parser/builders/default.rb index 860d84e84..5e3cd59be 100644 --- a/lib/parser/builders/default.rb +++ b/lib/parser/builders/default.rb @@ -1239,8 +1239,10 @@ def unless_guard(unless_t, unless_body) def match_var(name_t) name = value(name_t).to_sym + name_l = loc(name_t) - check_duplicate_pattern_variable(name, loc(name_t)) + check_lvar_name(name, name_l) + check_duplicate_pattern_variable(name, name_l) @parser.static_env.declare(name) n(:match_var, [ name ], @@ -1253,6 +1255,7 @@ def match_hash_var(name_t) expr_l = loc(name_t) name_l = expr_l.adjust(end_pos: -1) + check_lvar_name(name, name_l) check_duplicate_pattern_variable(name, name_l) @parser.static_env.declare(name) @@ -1293,6 +1296,9 @@ def match_hash_var_from_str(begin_t, strings, end_t) Source::Map::Variable.new(name_l, expr_l)) when :begin match_hash_var_from_str(begin_t, string.children, end_t) + else + # we only can get here if there is an interpolation, e.g., ``in "#{ a }":` + diagnostic :error, :pm_interp_in_var_name, nil, loc(begin_t).join(loc(end_t)) end end diff --git a/test/test_parser.rb b/test/test_parser.rb index 5fc1e5111..64f631f6b 100644 --- a/test/test_parser.rb +++ b/test/test_parser.rb @@ -8934,6 +8934,22 @@ def test_pattern_matching_hash_with_string_interpolation_keys %q{ ~~~~~~~ location}, SINCE_2_7 ) + + assert_diagnoses( + [:error, :pm_interp_in_var_name], + %q{case a; in "#{a}": 1; end}, + %q{ ~~~~~~~ location}, + SINCE_2_7 + ) + end + + def test_pattern_matching_invalid_lvar_name + assert_diagnoses( + [:error, :lvar_name, { name: :a? }], + %q{case a; in a?:; end}, + %q{ ~~ location}, + SINCE_2_7 + ) end def test_pattern_matching_keyword_variable