diff options
author | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-04-22 05:51:15 +0000 |
---|---|---|
committer | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-04-22 05:51:15 +0000 |
commit | 3df0e54b3b75e8e3625eae8ddb3934504153a9db (patch) | |
tree | ae533eef829846b89825d1cab0abad36bee17e0f /parse.y | |
parent | 22a97cbf830ff18042a8b59df8eaa03ab29bbc30 (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.y | 16 |
1 files changed, 10 insertions, 6 deletions
@@ -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; } |