From f2677d68f6d43b19a6c94713e444d4e22c1f1f59 Mon Sep 17 00:00:00 2001 From: Sijawusz Pur Rahnama Date: Tue, 16 Jan 2024 02:04:41 +0100 Subject: [PATCH] Do not report type declarations within generic records --- spec/ameba/rule/lint/useless_assign_spec.cr | 6 ++++++ src/ameba/ast/visitors/scope_visitor.cr | 16 ++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/spec/ameba/rule/lint/useless_assign_spec.cr b/spec/ameba/rule/lint/useless_assign_spec.cr index 1ea3d3ba..a37d8110 100644 --- a/spec/ameba/rule/lint/useless_assign_spec.cr +++ b/spec/ameba/rule/lint/useless_assign_spec.cr @@ -394,6 +394,12 @@ module Ameba::Rule::Lint CRYSTAL end + it "doesn't report if this is a record declaration (generics)" do + expect_no_issues subject, <<-CRYSTAL + record Foo(T), foo : T + CRYSTAL + end + it "doesn't report if this is an accessor declaration" do accessor_macros = %w[setter class_setter] %w[getter class_getter property class_property].each do |name| diff --git a/src/ameba/ast/visitors/scope_visitor.cr b/src/ameba/ast/visitors/scope_visitor.cr index 53ea39eb..27719524 100644 --- a/src/ameba/ast/visitors/scope_visitor.cr +++ b/src/ameba/ast/visitors/scope_visitor.cr @@ -173,9 +173,10 @@ module Ameba::AST scope = @current_scope case - when scope.top_level? && record_macro?(node) then return false - when scope.type_definition? && record_macro?(node) then return false - when scope.type_definition? && accessor_macro?(node) then return false + when (scope.top_level? || scope.type_definition?) && record_macro?(node) + return false + when scope.type_definition? && accessor_macro?(node) + return false when scope.def? && special_node?(node) scope.arguments.each do |arg| ref = arg.variable.reference(scope) @@ -194,7 +195,14 @@ module Ameba::AST end private def record_macro?(node) - node.name == "record" && node.args.first?.is_a?(Crystal::Path) + return false unless node.name == "record" + + case node.args.first? + when Crystal::Path, Crystal::Generic + true + else + false + end end private def skip?(node)