Exclude reporting type declarations passed as call arguments

This commit is contained in:
Sijawusz Pur Rahnama 2024-01-18 00:34:28 +01:00
parent 28fafea19f
commit a79e711fae
2 changed files with 20 additions and 5 deletions

View File

@ -388,19 +388,29 @@ module Ameba::Rule::Lint
CRYSTAL
end
it "doesn't report if this is a record declaration" do
it "doesn't report record declaration" do
expect_no_issues subject, <<-CRYSTAL
record Foo, foo : String
record Foo, foo = "foo"
CRYSTAL
end
it "doesn't report if this is a record declaration (generics)" do
it "doesn't report record declarations (generics)" do
expect_no_issues subject, <<-CRYSTAL
record Foo(T), foo : T
record Foo(T), foo = T.new
CRYSTAL
end
it "doesn't report if this is an accessor declaration" do
it "doesn't report type declaration as a call argument" do
expect_no_issues subject, <<-CRYSTAL
foo Foo(T), foo : T
foo Foo, foo : Nil
foo foo : String, bar : Int32?
CRYSTAL
end
it "doesn't report accessor declarations" do
accessor_macros = %w[setter class_setter]
%w[getter class_getter property class_property].each do |name|
accessor_macros << name

View File

@ -43,8 +43,13 @@ module Ameba::Rule::Lint
scope.variables.each do |var|
next if var.ignored? || var.used_in_macro? || var.captured_by_block?
next if exclude_type_declarations? && scope.assigns_type_dec?(var.name)
if scope.assigns_type_dec?(var.name)
next if exclude_type_declarations?
# exclude type declarations within calls
if node.is_a?(Crystal::Expressions)
next if node.expressions.first?.is_a?(Crystal::Call)
end
end
var.assignments.each do |assign|
next if assign.referenced?
issue_for assign.target_node, MSG % var.name