From 67c574736912003c377218153f9d3b9c0c96a17b Mon Sep 17 00:00:00 2001 From: nobu Date: Mon, 31 Dec 2018 15:00:37 +0000 Subject: Method reference operator Introduce the new operator for method reference, `.:`. [Feature #12125] [Feature #13581] [EXPERIMENTAL] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66667 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- parse.y | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) (limited to 'parse.y') diff --git a/parse.y b/parse.y index 09afa6bedd..cf00b60b72 100644 --- a/parse.y +++ b/parse.y @@ -886,6 +886,7 @@ static void token_info_warn(struct parser_params *p, const char *token, token_in %token tRSHFT RUBY_TOKEN(RSHFT) ">>" %token tANDDOT RUBY_TOKEN(ANDDOT) "&." %token tCOLON2 RUBY_TOKEN(COLON2) "::" +%token tMETHREF RUBY_TOKEN(METHREF) ".:" %token tCOLON3 ":: at EXPR_BEG" %token tOP_ASGN /* +=, -= etc. */ %token tASSOC "=>" @@ -2710,6 +2711,13 @@ primary : literal /*% %*/ /*% ripper: retry! %*/ } + | primary_value tMETHREF operation2 + { + /*%%%*/ + $$ = NEW_METHREF($1, $3, &@$); + /*% %*/ + /*% ripper: methref!($1, $3) %*/ + } ; primary_value : primary @@ -8060,12 +8068,30 @@ parser_yylex(struct parser_params *p) case '.': SET_LEX_STATE(EXPR_BEG); - if ((c = nextc(p)) == '.') { + switch (c = nextc(p)) { + case '.': if ((c = nextc(p)) == '.') { return tDOT3; } pushback(p, c); return tDOT2; + case ':': + switch (c = nextc(p)) { + default: + if (!parser_is_identchar(p)) break; + /* fallthru */ + case '!': case '%': case '&': case '*': case '+': + case '-': case '/': case '<': case '=': case '>': + case '[': case '^': case '`': case '|': case '~': + pushback(p, c); + SET_LEX_STATE(EXPR_DOT); + return tMETHREF; + case -1: + break; + } + pushback(p, c); + c = ':'; + break; } pushback(p, c); if (c != -1 && ISDIGIT(c)) { -- cgit v1.2.3