summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--parse.y17
-rw-r--r--test/ripper/test_lexer.rb31
2 files changed, 28 insertions, 20 deletions
diff --git a/parse.y b/parse.y
index 477580f181..b3f07c33c2 100644
--- a/parse.y
+++ b/parse.y
@@ -654,7 +654,11 @@ RUBY_SYMBOL_EXPORT_END
static void error_duplicate_pattern_variable(struct parser_params *p, ID id, const YYLTYPE *loc);
static void error_duplicate_pattern_key(struct parser_params *p, ID id, const YYLTYPE *loc);
static void parser_token_value_print(struct parser_params *p, enum yytokentype type, const YYSTYPE *valp);
+#ifndef RIPPER
static ID formal_argument(struct parser_params*, ID);
+#else
+static ID formal_argument(struct parser_params*, VALUE);
+#endif
static ID shadowing_lvar(struct parser_params*,ID);
static void new_bv(struct parser_params*,ID);
@@ -5187,7 +5191,7 @@ f_bad_arg : tCONSTANT
f_norm_arg : f_bad_arg
| tIDENTIFIER
{
- formal_argument(p, get_id($1));
+ formal_argument(p, $1);
p->max_numparam = ORDINAL_PARAM;
$$ = $1;
}
@@ -5248,9 +5252,8 @@ f_arg : f_arg_item
f_label : tLABEL
{
- ID id = get_id($1);
- arg_var(p, formal_argument(p, id));
- p->cur_arg = id;
+ arg_var(p, formal_argument(p, $1));
+ p->cur_arg = get_id($1);
p->max_numparam = ORDINAL_PARAM;
$$ = $1;
}
@@ -7855,9 +7858,13 @@ arg_ambiguous(struct parser_params *p, char c)
}
static ID
+#ifndef RIPPER
formal_argument(struct parser_params *p, ID lhs)
+#else
+formal_argument(struct parser_params *p, VALUE lhs)
+#endif
{
- switch (id_type(lhs)) {
+ switch (id_type(get_id(lhs))) {
case ID_LOCAL:
break;
#ifndef RIPPER
diff --git a/test/ripper/test_lexer.rb b/test/ripper/test_lexer.rb
index 910048b28c..f8e751da53 100644
--- a/test/ripper/test_lexer.rb
+++ b/test/ripper/test_lexer.rb
@@ -146,18 +146,19 @@ class TestRipper::Lexer < Test::Unit::TestCase
assert_equal [[1, 17], :on_embexpr_end, "}", state(:EXPR_ARG)], token
end
- BAD_CODE = {
- parse_error: ['def req(true) end', %r[unexpected `true'], 'true'],
- assign_error: ['begin; nil = 1; end', %r[assign to nil], 'nil'],
- alias_error: ['begin; alias $x $1; end', %r[number variables], '$1'],
- class_name_error: ['class bad; end', %r[class/module name], 'bad'],
- param_error: ['def req(@a) end', %r[formal argument.*instance], '@a'],
- }
+ BAD_CODE = [
+ [:parse_error, 'def req(true) end', %r[unexpected `true'], 'true'],
+ [:assign_error, 'begin; nil = 1; end', %r[assign to nil], 'nil'],
+ [:alias_error, 'begin; alias $x $1; end', %r[number variables], '$1'],
+ [:class_name_error, 'class bad; end', %r[class/module name], 'bad'],
+ [:param_error, 'def req(@a) end', %r[formal argument.*instance], '@a'],
+ [:param_error, 'def req(a?:) end', %r[formal argument must.*local], 'a?'],
+ ]
def test_raise_errors_keyword
all_assertions do |all|
- BAD_CODE.each do |err, (code, message)|
- all.for(err) do
+ BAD_CODE.each do |(err, code, message)|
+ all.for([err, code]) do
assert_raise_with_message(SyntaxError, message) { Ripper.tokenize(code, raise_errors: true) }
end
end
@@ -166,8 +167,8 @@ class TestRipper::Lexer < Test::Unit::TestCase
def test_tokenize_with_syntax_error
all_assertions do |all|
- BAD_CODE.each do |err, (code)|
- all.for(err) do
+ BAD_CODE.each do |(err, code)|
+ all.for([err, code]) do
assert_equal "end", Ripper.tokenize(code).last
end
end
@@ -176,8 +177,8 @@ class TestRipper::Lexer < Test::Unit::TestCase
def test_lex_with_syntax_error
all_assertions do |all|
- BAD_CODE.each do |err, (code)|
- all.for(err) do
+ BAD_CODE.each do |(err, code)|
+ all.for([err, code]) do
assert_equal [[1, code.size-3], :on_kw, "end", state(:EXPR_END)], Ripper.lex(code).last
end
end
@@ -186,8 +187,8 @@ class TestRipper::Lexer < Test::Unit::TestCase
def test_lexer_scan_with_syntax_error
all_assertions do |all|
- BAD_CODE.each do |err, (code, message, token)|
- all.for(err) do
+ BAD_CODE.each do |(err, code, message, token)|
+ all.for([err, code]) do
lexer = Ripper::Lexer.new(code)
elems = lexer.scan
assert_predicate lexer, :error?