aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-10-05 01:53:22 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-10-05 01:53:22 +0000
commiteb978ade5fdc990c628af0c74c80871bba5fa074 (patch)
tree6f30424a14fc6d481ad7407a04eaa5854cd4da25
parenta0aaee71a002f13092927ceb6c8edb03dde6871c (diff)
downloadruby-eb978ade5fdc990c628af0c74c80871bba5fa074.tar.gz
parse.y: fix KWD2EID
* parse.y (KWD2EID): should respect the previous callback result for keywords. [ruby-core:83106] [Bug #13971] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60120 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--parse.y21
-rw-r--r--test/ripper/test_sexp.rb9
2 files changed, 18 insertions, 12 deletions
diff --git a/parse.y b/parse.y
index 586e5a78ce..2ce4134df9 100644
--- a/parse.y
+++ b/parse.y
@@ -678,10 +678,7 @@ static void ripper_error_gen(struct parser_params *parser);
#define ID2VAL(id) STATIC_ID2SYM(id)
#define TOKEN2VAL(t) ID2VAL(TOKEN2ID(t))
-#define KWD2EID(t) \
- ripper_new_yylval(keyword_##t, \
- ID2SYM(#t[0]=='_' ? rb_intern("_"#t) : rb_intern(#t)), \
- 0)
+#define KWD2EID(t, v) ripper_new_yylval(keyword_##t, get_value(v), 0)
#define arg_new() dispatch0(args_new)
#define arg_add(l,a) dispatch2(args_add, (l), (a))
@@ -738,7 +735,7 @@ static VALUE parser_heredoc_dedent(struct parser_params*,VALUE);
#else
#define ID2VAL(id) ((VALUE)(id))
#define TOKEN2VAL(t) ID2VAL(t)
-#define KWD2EID(t) keyword_##t
+#define KWD2EID(t, v) keyword_##t
#endif /* RIPPER */
#ifndef RIPPER
@@ -4107,13 +4104,13 @@ user_variable : tIDENTIFIER
| tCVAR
;
-keyword_variable: keyword_nil {$$ = KWD2EID(nil);}
- | keyword_self {$$ = KWD2EID(self);}
- | keyword_true {$$ = KWD2EID(true);}
- | keyword_false {$$ = KWD2EID(false);}
- | keyword__FILE__ {$$ = KWD2EID(_FILE__);}
- | keyword__LINE__ {$$ = KWD2EID(_LINE__);}
- | keyword__ENCODING__ {$$ = KWD2EID(_ENCODING__);}
+keyword_variable: keyword_nil {$$ = KWD2EID(nil, $1);}
+ | keyword_self {$$ = KWD2EID(self, $1);}
+ | keyword_true {$$ = KWD2EID(true, $1);}
+ | keyword_false {$$ = KWD2EID(false, $1);}
+ | keyword__FILE__ {$$ = KWD2EID(_FILE__, $1);}
+ | keyword__LINE__ {$$ = KWD2EID(_LINE__, $1);}
+ | keyword__ENCODING__ {$$ = KWD2EID(_ENCODING__, $1);}
;
var_ref : user_variable
diff --git a/test/ripper/test_sexp.rb b/test/ripper/test_sexp.rb
index bbab398922..253b198442 100644
--- a/test/ripper/test_sexp.rb
+++ b/test/ripper/test_sexp.rb
@@ -87,6 +87,15 @@ eot
assert_equal("<<", fname)
end
+ def test_defs_fname
+ sexp = Ripper.sexp("def self.t; end")
+ _, recv, _, (type, fname) = search_sexp(:defs, sexp)
+ assert_equal(:var_ref, recv[0], recv)
+ assert_equal([:@kw, "self", [1, 4]], recv[1], recv)
+ assert_equal(:@ident, type)
+ assert_equal("t", fname)
+ end
+
def search_sexp(sym, sexp)
return sexp if !sexp or sexp[0] == sym
sexp.find do |e|