From 5a24f1eba58bfb58221ebe43b2ced77db82d7a3b Mon Sep 17 00:00:00 2001 From: Sijawusz Pur Rahnama Date: Fri, 29 Dec 2023 01:50:19 +0100 Subject: [PATCH] Add `UselessAssign#exclude_type_declarations` --- spec/ameba/rule/lint/useless_assign_spec.cr | 22 +++++++++++++++++++++ src/ameba/rule/lint/useless_assign.cr | 3 +++ 2 files changed, 25 insertions(+) diff --git a/spec/ameba/rule/lint/useless_assign_spec.cr b/spec/ameba/rule/lint/useless_assign_spec.cr index 726acfbb..7c7310de 100644 --- a/spec/ameba/rule/lint/useless_assign_spec.cr +++ b/spec/ameba/rule/lint/useless_assign_spec.cr @@ -3,6 +3,7 @@ require "../../../spec_helper" module Ameba::Rule::Lint describe UselessAssign do subject = UselessAssign.new + .tap(&.exclude_type_declarations = false) it "does not report used assignments" do expect_no_issues subject, <<-CRYSTAL @@ -1007,6 +1008,27 @@ module Ameba::Rule::Lint end end + context "#properties" do + context "#exclude_type_declarations" do + it "doesn't report type declarations if enabled" do + rule = UselessAssign.new + rule.exclude_type_declarations = true + + expect_no_issues rule, <<-CRYSTAL + a : String? + + class Foo + b : String? + end + + def foo + c : String? + end + CRYSTAL + end + end + end + context "uninitialized" do it "reports if uninitialized assignment is not referenced at a top level" do expect_issue subject, <<-CRYSTAL diff --git a/src/ameba/rule/lint/useless_assign.cr b/src/ameba/rule/lint/useless_assign.cr index 7aec210d..ed7d536d 100644 --- a/src/ameba/rule/lint/useless_assign.cr +++ b/src/ameba/rule/lint/useless_assign.cr @@ -24,10 +24,12 @@ module Ameba::Rule::Lint # ``` # Lint/UselessAssign: # Enabled: true + # ExcludeTypeDeclarations: false # ``` class UselessAssign < Base properties do description "Disallows useless variable assignments" + exclude_type_declarations false end MSG = "Useless assignment to variable `%s`" @@ -39,6 +41,7 @@ module Ameba::Rule::Lint def test(source, node, scope : AST::Scope) 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) var.assignments.each do |assign| next if assign.referenced?