mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
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
This commit is contained in:
parent
01134984ef
commit
549a3b74c4
2 changed files with 23 additions and 23 deletions
38
parse.y
38
parse.y
|
@ -7221,16 +7221,18 @@ parser_prepare(struct parser_params *parser)
|
||||||
#define IS_AFTER_OPERATOR() IS_lex_state(EXPR_FNAME | EXPR_DOT)
|
#define IS_AFTER_OPERATOR() IS_lex_state(EXPR_FNAME | EXPR_DOT)
|
||||||
|
|
||||||
#ifndef RIPPER
|
#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("`"op"' after local variable or literal is interpreted as binary operator"), \
|
||||||
rb_warning0("even though it seems like "syn""))
|
rb_warning0("even though it seems like "syn""))
|
||||||
#else
|
#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
|
#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) && \
|
(!IS_lex_state_for(last_state, EXPR_CLASS|EXPR_DOT|EXPR_FNAME|EXPR_ENDFN) && \
|
||||||
space_seen && !ISSPACE(c) && \
|
space_seen && !ISSPACE(c) && \
|
||||||
(ambiguous_operator(op, syn), 0)))
|
(ambiguous_operator(tok, op, syn), 0)), \
|
||||||
|
(tok))
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
parse_rational(struct parser_params *parser, char *str, int len, int seen_point)
|
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);
|
SET_LEX_STATE(IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG);
|
||||||
pushback(c);
|
pushback(c);
|
||||||
warn_balanced("%%", "string literal");
|
return warn_balanced('%', "%%", "string literal");
|
||||||
return '%';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -8108,8 +8109,7 @@ parser_yylex(struct parser_params *parser)
|
||||||
c = tDSTAR;
|
c = tDSTAR;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
warn_balanced("**", "argument prefix");
|
c = warn_balanced(tPOW, "**", "argument prefix");
|
||||||
c = tPOW;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -8127,8 +8127,7 @@ parser_yylex(struct parser_params *parser)
|
||||||
c = tSTAR;
|
c = tSTAR;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
warn_balanced("*", "argument prefix");
|
c = warn_balanced('*', "*", "argument prefix");
|
||||||
c = '*';
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SET_LEX_STATE(IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG);
|
SET_LEX_STATE(IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG);
|
||||||
|
@ -8234,8 +8233,7 @@ parser_yylex(struct parser_params *parser)
|
||||||
return tOP_ASGN;
|
return tOP_ASGN;
|
||||||
}
|
}
|
||||||
pushback(c);
|
pushback(c);
|
||||||
warn_balanced("<<", "here document");
|
return warn_balanced(tLSHFT, "<<", "here document");
|
||||||
return tLSHFT;
|
|
||||||
}
|
}
|
||||||
pushback(c);
|
pushback(c);
|
||||||
return '<';
|
return '<';
|
||||||
|
@ -8314,8 +8312,7 @@ parser_yylex(struct parser_params *parser)
|
||||||
c = tAMPER;
|
c = tAMPER;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
warn_balanced("&", "argument prefix");
|
c = warn_balanced('&', "&", "argument prefix");
|
||||||
c = '&';
|
|
||||||
}
|
}
|
||||||
SET_LEX_STATE(IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG);
|
SET_LEX_STATE(IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG);
|
||||||
return c;
|
return c;
|
||||||
|
@ -8365,8 +8362,7 @@ parser_yylex(struct parser_params *parser)
|
||||||
}
|
}
|
||||||
SET_LEX_STATE(EXPR_BEG);
|
SET_LEX_STATE(EXPR_BEG);
|
||||||
pushback(c);
|
pushback(c);
|
||||||
warn_balanced("+", "unary operator");
|
return warn_balanced('+', "+", "unary operator");
|
||||||
return '+';
|
|
||||||
|
|
||||||
case '-':
|
case '-':
|
||||||
c = nextc();
|
c = nextc();
|
||||||
|
@ -8398,8 +8394,7 @@ parser_yylex(struct parser_params *parser)
|
||||||
}
|
}
|
||||||
SET_LEX_STATE(EXPR_BEG);
|
SET_LEX_STATE(EXPR_BEG);
|
||||||
pushback(c);
|
pushback(c);
|
||||||
warn_balanced("-", "unary operator");
|
return warn_balanced('-', "-", "unary operator");
|
||||||
return '-';
|
|
||||||
|
|
||||||
case '.':
|
case '.':
|
||||||
SET_LEX_STATE(EXPR_BEG);
|
SET_LEX_STATE(EXPR_BEG);
|
||||||
|
@ -8448,9 +8443,9 @@ parser_yylex(struct parser_params *parser)
|
||||||
}
|
}
|
||||||
if (IS_END() || ISSPACE(c) || c == '#') {
|
if (IS_END() || ISSPACE(c) || c == '#') {
|
||||||
pushback(c);
|
pushback(c);
|
||||||
warn_balanced(":", "symbol literal");
|
c = warn_balanced(':', ":", "symbol literal");
|
||||||
SET_LEX_STATE(EXPR_BEG);
|
SET_LEX_STATE(EXPR_BEG);
|
||||||
return ':';
|
return c;
|
||||||
}
|
}
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case '\'':
|
case '\'':
|
||||||
|
@ -8483,8 +8478,7 @@ parser_yylex(struct parser_params *parser)
|
||||||
return tREGEXP_BEG;
|
return tREGEXP_BEG;
|
||||||
}
|
}
|
||||||
SET_LEX_STATE(IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG);
|
SET_LEX_STATE(IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG);
|
||||||
warn_balanced("/", "regexp literal");
|
return warn_balanced('/', "/", "regexp literal");
|
||||||
return '/';
|
|
||||||
|
|
||||||
case '^':
|
case '^':
|
||||||
if ((c = nextc()) == '=') {
|
if ((c = nextc()) == '=') {
|
||||||
|
|
|
@ -173,8 +173,14 @@ class TestRipper::ParserEvents < Test::Unit::TestCase
|
||||||
|
|
||||||
def test_operator_ambiguous
|
def test_operator_ambiguous
|
||||||
thru_operator_ambiguous = false
|
thru_operator_ambiguous = false
|
||||||
parse('a=1; a %[]', :on_operator_ambiguous) {thru_operator_ambiguous = true}
|
token = syntax = nil
|
||||||
|
parse('a=1; a %[]', :on_operator_ambiguous) {|*a|
|
||||||
|
thru_operator_ambiguous = true
|
||||||
|
_, token, syntax = *a
|
||||||
|
}
|
||||||
assert_equal true, thru_operator_ambiguous
|
assert_equal true, thru_operator_ambiguous
|
||||||
|
assert_equal :%, token
|
||||||
|
assert_equal "string literal", syntax
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_array # array literal
|
def test_array # array literal
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue