summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-02-12 03:15:34 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-02-12 03:15:34 +0000
commit549a3b74c49537ec7b7e9cc82e17803ded1ca3da (patch)
tree6375b9d6a836036e30596b9b9f405e8f9688c7ce /parse.y
parent01134984ef51c4dfc7aebf4f3a371de9c8ddcce5 (diff)
ripper: fix %-op on_operator_ambiguous
* parse.y (ambiguous_operator): separate token and string representation of operators, to fix %-operator argument. in a warning message, needs to be escaped by '%' but the symbol should not be. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57606 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y38
1 files changed, 16 insertions, 22 deletions
diff --git a/parse.y b/parse.y
index c3234e5bd7..653e444af9 100644
--- a/parse.y
+++ b/parse.y
@@ -7221,16 +7221,18 @@ parser_prepare(struct parser_params *parser)
#define IS_AFTER_OPERATOR() IS_lex_state(EXPR_FNAME | EXPR_DOT)
#ifndef RIPPER
-#define ambiguous_operator(op, syn) ( \
+#define ambiguous_operator(tok, op, syn) ( \
rb_warning0("`"op"' after local variable or literal is interpreted as binary operator"), \
rb_warning0("even though it seems like "syn""))
#else
-#define ambiguous_operator(op, syn) dispatch2(operator_ambiguous, ripper_intern(op), rb_str_new_cstr(syn))
+#define ambiguous_operator(tok, op, syn) \
+ dispatch2(operator_ambiguous, TOKEN2VAL(tok), rb_str_new_cstr(syn))
#endif
-#define warn_balanced(op, syn) ((void) \
+#define warn_balanced(tok, op, syn) ((void) \
(!IS_lex_state_for(last_state, EXPR_CLASS|EXPR_DOT|EXPR_FNAME|EXPR_ENDFN) && \
space_seen && !ISSPACE(c) && \
- (ambiguous_operator(op, syn), 0)))
+ (ambiguous_operator(tok, op, syn), 0)), \
+ (tok))
static VALUE
parse_rational(struct parser_params *parser, char *str, int len, int seen_point)
@@ -7662,8 +7664,7 @@ parse_percent(struct parser_params *parser, const int space_seen, const enum lex
}
SET_LEX_STATE(IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG);
pushback(c);
- warn_balanced("%%", "string literal");
- return '%';
+ return warn_balanced('%', "%%", "string literal");
}
static int
@@ -8108,8 +8109,7 @@ parser_yylex(struct parser_params *parser)
c = tDSTAR;
}
else {
- warn_balanced("**", "argument prefix");
- c = tPOW;
+ c = warn_balanced(tPOW, "**", "argument prefix");
}
}
else {
@@ -8127,8 +8127,7 @@ parser_yylex(struct parser_params *parser)
c = tSTAR;
}
else {
- warn_balanced("*", "argument prefix");
- c = '*';
+ c = warn_balanced('*', "*", "argument prefix");
}
}
SET_LEX_STATE(IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG);
@@ -8234,8 +8233,7 @@ parser_yylex(struct parser_params *parser)
return tOP_ASGN;
}
pushback(c);
- warn_balanced("<<", "here document");
- return tLSHFT;
+ return warn_balanced(tLSHFT, "<<", "here document");
}
pushback(c);
return '<';
@@ -8314,8 +8312,7 @@ parser_yylex(struct parser_params *parser)
c = tAMPER;
}
else {
- warn_balanced("&", "argument prefix");
- c = '&';
+ c = warn_balanced('&', "&", "argument prefix");
}
SET_LEX_STATE(IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG);
return c;
@@ -8365,8 +8362,7 @@ parser_yylex(struct parser_params *parser)
}
SET_LEX_STATE(EXPR_BEG);
pushback(c);
- warn_balanced("+", "unary operator");
- return '+';
+ return warn_balanced('+', "+", "unary operator");
case '-':
c = nextc();
@@ -8398,8 +8394,7 @@ parser_yylex(struct parser_params *parser)
}
SET_LEX_STATE(EXPR_BEG);
pushback(c);
- warn_balanced("-", "unary operator");
- return '-';
+ return warn_balanced('-', "-", "unary operator");
case '.':
SET_LEX_STATE(EXPR_BEG);
@@ -8448,9 +8443,9 @@ parser_yylex(struct parser_params *parser)
}
if (IS_END() || ISSPACE(c) || c == '#') {
pushback(c);
- warn_balanced(":", "symbol literal");
+ c = warn_balanced(':', ":", "symbol literal");
SET_LEX_STATE(EXPR_BEG);
- return ':';
+ return c;
}
switch (c) {
case '\'':
@@ -8483,8 +8478,7 @@ parser_yylex(struct parser_params *parser)
return tREGEXP_BEG;
}
SET_LEX_STATE(IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG);
- warn_balanced("/", "regexp literal");
- return '/';
+ return warn_balanced('/', "/", "regexp literal");
case '^':
if ((c = nextc()) == '=') {