Skip to content

Commit 30cff1a

Browse files
committed
Check duplication of instance variable declaration
1 parent d3b2c51 commit 30cff1a

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

lib/rbs/definition_builder.rb

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ def define_instance(definition, type_name, subst, define_class_vars:)
155155
member.names.each do |name|
156156
ivar_name = :"@#{name}"
157157
attr_type = member.type || Types::Bases::Any.new(location: nil)
158-
158+
159159
insert_variable(
160160
type_name,
161161
definition.instance_variables,
@@ -574,6 +574,7 @@ def insert_variable(type_name, variables, name:, type:, source:)
574574
declared_in: type_name,
575575
source: source
576576
)
577+
577578
validate_variable(variables[name])
578579
end
579580

@@ -584,7 +585,15 @@ def validate_variable(var)
584585
variables = [] #: Array[Definition::Variable]
585586
tmp_var = var
586587
while tmp_var
587-
variables << tmp_var if tmp_var.source.is_a?(AST::Members::Var)
588+
case tmp_var.source
589+
when AST::Members::AttrReader, AST::Members::AttrWriter, AST::Members::AttrAccessor
590+
# nop
591+
when AST::Ruby::Members::AttrReaderMember, AST::Ruby::Members::AttrWriterMember, AST::Ruby::Members::AttrAccessorMember
592+
# nop
593+
else
594+
variables << tmp_var
595+
end
596+
588597
tmp_var = tmp_var.parent_variable
589598
end
590599

@@ -602,6 +611,10 @@ def validate_variable(var)
602611
if r.source.instance_of?(AST::Members::ClassInstanceVariable) && l.declared_in == r.declared_in
603612
raise ClassInstanceVariableDuplicationError.new(type_name: l.declared_in, variable_name: l.source.name, location: l.source.location)
604613
end
614+
when AST::Ruby::Members::InstanceVariableMember
615+
if l.declared_in == r.declared_in
616+
raise InstanceVariableDuplicationError.new(type_name: l.declared_in, variable_name: l.source.name, location: l.source.location)
617+
end
605618
end
606619
end
607620

test/rbs/definition_builder_test.rb

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3645,4 +3645,28 @@ def initialize
36453645
end
36463646
end
36473647
end
3648+
3649+
def test_inline_instance_variable_declarations_duplicates
3650+
SignatureManager.new do |manager|
3651+
manager.add_ruby_file("person.rb", <<~RUBY)
3652+
class Person
3653+
# @rbs @name: String
3654+
# @rbs @name: Integer
3655+
3656+
def initialize(name, age)
3657+
@name = name
3658+
@age = age
3659+
end
3660+
end
3661+
RUBY
3662+
3663+
manager.build do |env|
3664+
builder = DefinitionBuilder.new(env: env)
3665+
3666+
assert_raises RBS::InstanceVariableDuplicationError do
3667+
builder.build_instance(type_name("::Person"))
3668+
end
3669+
end
3670+
end
3671+
end
36483672
end

0 commit comments

Comments
 (0)