summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authornagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-05-18 15:36:58 +0000
committernagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-05-18 15:36:58 +0000
commit4e71ea3a1ae284b6ba2d0ef210666c491f24e1c9 (patch)
tree93097361d46b7265dd6cdfd17149532cf1d89d17 /parse.y
parenta9006d3af053afd1d93caa5dfb609a4f9b3c41d5 (diff)
merge revision(s) r45405,r45408: [Backport #9669] [Backport #9740]
* parse.y (lex_state_e, parser_params, f_arglist, parser_yylex): separate EXPR_LABELARG from EXPR_BEG and let newline significant, so that required keyword argument can place at the end of argument list without parentheses. [ruby-core:61658] [Bug #9669] * parse.y (parser_yylex): only a newline after label should be significant. [ruby-core:61658] [Bug #9669] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_1@46005 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y22
1 files changed, 17 insertions, 5 deletions
diff --git a/parse.y b/parse.y
index fdc3e0cf9b..2a0e25a2b2 100644
--- a/parse.y
+++ b/parse.y
@@ -74,6 +74,7 @@ enum lex_state_bits {
EXPR_DOT_bit, /* right after `.' or `::', no reserved words. */
EXPR_CLASS_bit, /* immediate after `class', no here document. */
EXPR_VALUE_bit, /* alike EXPR_BEG but label is disallowed. */
+ EXPR_LABELARG_bit, /* ignore significant, +/- is a sign. */
EXPR_MAX_STATE
};
/* examine combinations */
@@ -90,7 +91,8 @@ enum lex_state_e {
DEF_EXPR(DOT),
DEF_EXPR(CLASS),
DEF_EXPR(VALUE),
- EXPR_BEG_ANY = (EXPR_BEG | EXPR_VALUE | EXPR_MID | EXPR_CLASS),
+ DEF_EXPR(LABELARG),
+ EXPR_BEG_ANY = (EXPR_BEG | EXPR_VALUE | EXPR_MID | EXPR_CLASS | EXPR_LABELARG),
EXPR_ARG_ANY = (EXPR_ARG | EXPR_CMDARG),
EXPR_END_ANY = (EXPR_END | EXPR_ENDARG | EXPR_ENDFN)
};
@@ -244,6 +246,7 @@ struct parser_params {
int parser_brace_nest;
int parser_compile_for_eval;
VALUE parser_cur_mid;
+ int parser_in_kwarg;
int parser_in_defined;
char *parser_tokenbuf;
int parser_tokidx;
@@ -4409,9 +4412,14 @@ f_arglist : '(' f_args rparen
lex_state = EXPR_BEG;
command_start = TRUE;
}
- | f_args term
+ | {
+ $<num>$ = parser->parser_in_kwarg;
+ parser->parser_in_kwarg = 1;
+ }
+ f_args term
{
- $$ = $1;
+ parser->parser_in_kwarg = $<num>1;
+ $$ = $2;
lex_state = EXPR_BEG;
command_start = TRUE;
}
@@ -7012,13 +7020,16 @@ parser_yylex(struct parser_params *parser)
#endif
/* fall through */
case '\n':
- if (IS_lex_state(EXPR_BEG | EXPR_VALUE | EXPR_CLASS | EXPR_FNAME | EXPR_DOT)) {
+ if (IS_lex_state(EXPR_BEG | EXPR_VALUE | EXPR_CLASS | EXPR_FNAME | EXPR_DOT | EXPR_LABELARG)) {
#ifdef RIPPER
if (!fallthru) {
ripper_dispatch_scan_event(parser, tIGNORED_NL);
}
fallthru = FALSE;
#endif
+ if (IS_lex_state(EXPR_LABELARG) && parser->parser_in_kwarg) {
+ goto normal_newline;
+ }
goto retry;
}
while ((c = nextc())) {
@@ -8150,7 +8161,7 @@ parser_yylex(struct parser_params *parser)
if (IS_LABEL_POSSIBLE()) {
if (IS_LABEL_SUFFIX(0)) {
- lex_state = EXPR_BEG;
+ lex_state = EXPR_LABELARG;
nextc();
set_yylval_name(TOK_INTERN(!ENC_SINGLE(mb)));
return tLABEL;
@@ -10846,6 +10857,7 @@ parser_initialize(struct parser_params *parser)
parser->parser_in_single = 0;
parser->parser_in_def = 0;
parser->parser_in_defined = 0;
+ parser->parser_in_kwarg = 0;
parser->parser_compile_for_eval = 0;
parser->parser_cur_mid = 0;
parser->parser_tokenbuf = NULL;