Do not report expanded arguments in ShadowingOuterLocalVar rule

This commit is contained in:
Sijawusz Pur Rahnama 2023-11-17 18:36:19 +01:00
parent 5aac63ea74
commit 30e3816ed1
2 changed files with 31 additions and 4 deletions

View file

@ -31,6 +31,30 @@ module Ameba::Rule::Lint
CRYSTAL
end
pending "reports if there is a shadowing in an unpacked variable in a block" do
expect_issue subject, <<-CRYSTAL
def some_method
foo = 1
[{3}].each do |(foo)|
# ^ error: Shadowing outer local variable `foo`
end
end
CRYSTAL
end
pending "reports if there is a shadowing in an unpacked variable in a block (2)" do
expect_issue subject, <<-CRYSTAL
def some_method
foo = 1
[{[3]}].each do |((foo))|
# ^ error: Shadowing outer local variable `foo`
end
end
CRYSTAL
end
it "does not report outer vars declared below shadowed block" do
expect_no_issues subject, <<-CRYSTAL
methods = klass.methods.select { |m| m.annotation(MyAnn) }

View file

@ -53,13 +53,16 @@ module Ameba::Rule::Lint
return unless outer_scope = scope.outer_scope
scope.arguments.reject(&.ignored?).each do |arg|
variable = outer_scope.find_variable(arg.name)
# TODO: handle unpacked variables from `Block#unpacks`
next unless name = arg.name.presence
variable = outer_scope.find_variable(name)
next if variable.nil? || !variable.declared_before?(arg)
next if outer_scope.assigns_ivar?(arg.name)
next if outer_scope.assigns_type_dec?(arg.name)
next if outer_scope.assigns_ivar?(name)
next if outer_scope.assigns_type_dec?(name)
issue_for arg.node, MSG % arg.name
issue_for arg.node, MSG % name
end
end
end