summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authorusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-04-22 05:51:15 +0000
committerusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-04-22 05:51:15 +0000
commit3df0e54b3b75e8e3625eae8ddb3934504153a9db (patch)
treeae533eef829846b89825d1cab0abad36bee17e0f /parse.y
parent22a97cbf830ff18042a8b59df8eaa03ab29bbc30 (diff)
merge revision(s) 53834,53835,53836: [Backport #12073]
parse.y: simplify local ID condition * parse.y (tokenize_ident, parse_ident): ident in tokenize_ident() can be a local id only when called from parse_ident(), but never from parse_gvar() and parse_atmark(). * parse.y (parse_ident): allow keyword arguments just after a method where the same name local variable is defined. [ruby-core:73816] [Bug#12073] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_2@54676 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y16
1 files changed, 10 insertions, 6 deletions
diff --git a/parse.y b/parse.y
index 32ca4c8be9..a5da75fa80 100644
--- a/parse.y
+++ b/parse.y
@@ -7589,16 +7589,14 @@ tokadd_ident(struct parser_params *parser, int c)
return 0;
}
-static void
+static ID
tokenize_ident(struct parser_params *parser, const enum lex_state_e last_state)
{
ID ident = TOK_INTERN();
set_yylval_name(ident);
- if (!IS_lex_state_for(last_state, EXPR_DOT|EXPR_FNAME) &&
- is_local_id(ident) && lvar_defined(ident)) {
- lex_state = EXPR_END;
- }
+
+ return ident;
}
static int
@@ -7764,6 +7762,7 @@ parse_ident(struct parser_params *parser, int c, int cmd_state)
int result = 0;
int mb = ENC_CODERANGE_7BIT;
const enum lex_state_e last_state = lex_state;
+ ID ident;
do {
if (!ISASCII(c)) mb = ENC_CODERANGE_UNKNOWN;
@@ -7863,7 +7862,12 @@ parse_ident(struct parser_params *parser, int c, int cmd_state)
lex_state = EXPR_END;
}
- tokenize_ident(parser, last_state);
+ ident = tokenize_ident(parser, last_state);
+ if (!IS_lex_state_for(last_state, EXPR_DOT|EXPR_FNAME) &&
+ (result == tIDENTIFIER) && /* not EXPR_FNAME, not attrasgn */
+ lvar_defined(ident)) {
+ lex_state = EXPR_END|EXPR_LABEL;
+ }
return result;
}