mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
parse.y: warn static content assign in cond
* parse.y (assign_in_cond): warn for static content object asignments in conditional statements. [ruby-dev:43083] [Feature #4299] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37344 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
1fe5783104
commit
e672994d14
3 changed files with 54 additions and 18 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
Sun Oct 28 00:49:06 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* parse.y (assign_in_cond): warn for static content object asignments
|
||||||
|
in conditional statements. [ruby-dev:43083] [Feature #4299]
|
||||||
|
|
||||||
Sat Oct 27 23:33:41 2012 Benoit Daloze <eregontp@gmail.com>
|
Sat Oct 27 23:33:41 2012 Benoit Daloze <eregontp@gmail.com>
|
||||||
|
|
||||||
* gc.c (gc_profile_result, gc_profile_report): use internal structures
|
* gc.c (gc_profile_result, gc_profile_report): use internal structures
|
||||||
|
|
40
parse.y
40
parse.y
|
@ -8935,6 +8935,30 @@ reduce_nodes_gen(struct parser_params *parser, NODE **body)
|
||||||
#undef subnodes
|
#undef subnodes
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
is_static_content(NODE *node)
|
||||||
|
{
|
||||||
|
if (!node) return 1;
|
||||||
|
switch (nd_type(node)) {
|
||||||
|
case NODE_HASH:
|
||||||
|
if (!(node = node->nd_head)) break;
|
||||||
|
case NODE_ARRAY:
|
||||||
|
do {
|
||||||
|
if (!is_static_content(node->nd_head)) return 0;
|
||||||
|
} while ((node = node->nd_next) != 0);
|
||||||
|
case NODE_LIT:
|
||||||
|
case NODE_STR:
|
||||||
|
case NODE_NIL:
|
||||||
|
case NODE_TRUE:
|
||||||
|
case NODE_FALSE:
|
||||||
|
case NODE_ZARRAY:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
assign_in_cond(struct parser_params *parser, NODE *node)
|
assign_in_cond(struct parser_params *parser, NODE *node)
|
||||||
{
|
{
|
||||||
|
@ -8955,23 +8979,9 @@ assign_in_cond(struct parser_params *parser, NODE *node)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!node->nd_value) return 1;
|
if (!node->nd_value) return 1;
|
||||||
switch (nd_type(node->nd_value)) {
|
if (is_static_content(node->nd_value)) {
|
||||||
case NODE_LIT:
|
|
||||||
case NODE_STR:
|
|
||||||
case NODE_NIL:
|
|
||||||
case NODE_TRUE:
|
|
||||||
case NODE_FALSE:
|
|
||||||
/* reports always */
|
/* reports always */
|
||||||
parser_warn(node->nd_value, "found = in conditional, should be ==");
|
parser_warn(node->nd_value, "found = in conditional, should be ==");
|
||||||
return 1;
|
|
||||||
|
|
||||||
case NODE_DSTR:
|
|
||||||
case NODE_XSTR:
|
|
||||||
case NODE_DXSTR:
|
|
||||||
case NODE_EVSTR:
|
|
||||||
case NODE_DREGX:
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -331,12 +331,33 @@ class TestRubyOptions < Test::Unit::TestCase
|
||||||
t.puts " end"
|
t.puts " end"
|
||||||
t.puts "end"
|
t.puts "end"
|
||||||
t.close
|
t.close
|
||||||
err = ["#{t.path}:1: warning: found = in conditional, should be ==",
|
warning = ' warning: found = in conditional, should be =='
|
||||||
"#{t.path}:4: warning: found = in conditional, should be =="]
|
err = ["#{t.path}:1:#{warning}",
|
||||||
err = /\A(#{Regexp.quote(t.path)}):1(: warning: found = in conditional, should be ==)\n\1:4\2\Z/
|
"#{t.path}:4:#{warning}",
|
||||||
|
]
|
||||||
bug2136 = '[ruby-dev:39363]'
|
bug2136 = '[ruby-dev:39363]'
|
||||||
assert_in_out_err(["-w", t.path], "", [], err, bug2136)
|
assert_in_out_err(["-w", t.path], "", [], err, bug2136)
|
||||||
assert_in_out_err(["-wr", t.path, "-e", ""], "", [], err, bug2136)
|
assert_in_out_err(["-wr", t.path, "-e", ""], "", [], err, bug2136)
|
||||||
|
|
||||||
|
t.open
|
||||||
|
t.truncate(0)
|
||||||
|
t.puts "if a = ''; end"
|
||||||
|
t.puts "if a = []; end"
|
||||||
|
t.puts "if a = [1]; end"
|
||||||
|
t.puts "if a = [a]; end"
|
||||||
|
t.puts "if a = {}; end"
|
||||||
|
t.puts "if a = {1=>2}; end"
|
||||||
|
t.puts "if a = {3=>a}; end"
|
||||||
|
t.close
|
||||||
|
err = ["#{t.path}:1:#{warning}",
|
||||||
|
"#{t.path}:2:#{warning}",
|
||||||
|
"#{t.path}:3:#{warning}",
|
||||||
|
"#{t.path}:5:#{warning}",
|
||||||
|
"#{t.path}:6:#{warning}",
|
||||||
|
]
|
||||||
|
feature4299 = '[ruby-dev:43083]'
|
||||||
|
assert_in_out_err(["-w", t.path], "", [], err, feature4299)
|
||||||
|
assert_in_out_err(["-wr", t.path, "-e", ""], "", [], err, feature4299)
|
||||||
ensure
|
ensure
|
||||||
t.close(true) if t
|
t.close(true) if t
|
||||||
end
|
end
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue