diff --git a/spec/ameba/ast/variabling/type_def_variable_spec.cr b/spec/ameba/ast/variabling/type_def_variable_spec.cr new file mode 100644 index 00000000..7d273b1f --- /dev/null +++ b/spec/ameba/ast/variabling/type_def_variable_spec.cr @@ -0,0 +1,30 @@ +require "../../../spec_helper" + +module Ameba::AST + describe TypeDecVariable do + var = Crystal::Var.new("foo") + declared_type = Crystal::Path.new("String") + type_dec = Crystal::TypeDeclaration.new(var, declared_type) + + describe "#initialize" do + it "creates a new type dec variable" do + variable = TypeDecVariable.new(type_dec) + variable.node.should_not be_nil + end + end + + describe "#name" do + it "returns var name" do + variable = TypeDecVariable.new(type_dec) + variable.name.should eq var.name + end + + it "raises if type declaration is incorrect" do + type_dec = Crystal::TypeDeclaration.new(declared_type, declared_type) + expect_raises(Exception, "unsupported var node type: Crystal::Path") do + TypeDecVariable.new(type_dec).name + end + end + end + end +end diff --git a/src/ameba/ast/scope.cr b/src/ameba/ast/scope.cr index 59c7f3de..8f930642 100644 --- a/src/ameba/ast/scope.cr +++ b/src/ameba/ast/scope.cr @@ -135,13 +135,13 @@ module Ameba::AST # Returns `true` if instance variable is assigned in this scope. def assigns_ivar?(name) - arguments.find(&.name.== name) && - ivariables.find(&.name.== "@#{name}") + arguments.any?(&.name.== name) && + ivariables.any?(&.name.== "@#{name}") end # Returns `true` if type declaration variable is assigned in this scope. def assigns_type_dec?(name) - type_dec_variables.find(&.name.== name) || outer_scope.try(&.assigns_type_dec?(name)) + type_dec_variables.any?(&.name.== name) || outer_scope.try(&.assigns_type_dec?(name)) end # Returns `true` if and only if current scope represents some diff --git a/src/ameba/ast/variabling/type_def_variable.cr b/src/ameba/ast/variabling/type_def_variable.cr index 9509eec4..e8ad83ae 100644 --- a/src/ameba/ast/variabling/type_def_variable.cr +++ b/src/ameba/ast/variabling/type_def_variable.cr @@ -13,16 +13,10 @@ module Ameba::AST var = @node.var case var - when Crystal::Var - var.name - when Crystal::InstanceVar - var.name - when Crystal::ClassVar - var.name - when Crystal::Global + when Crystal::Var, Crystal::InstanceVar, Crystal::ClassVar, Crystal::Global var.name else - raise "unsupported type declaration var node" + raise "unsupported var node type: #{var.class}" end end end