@@ -145,23 +145,23 @@ def define_instance(definition, type_name, subst)
145145 type_name ,
146146 definition . instance_variables ,
147147 name : ivar_name ,
148- type : member . type . sub ( subst_ )
148+ type : member . type . sub ( subst_ ) ,
149+ source : member
149150 )
150151 end
151152 end
152153
153154 when AST ::Members ::InstanceVariable
154- InstanceVariableDuplicationError . check! ( variables : definition . instance_variables , member : member , type_name : type_name )
155155 insert_variable (
156156 type_name ,
157157 definition . instance_variables ,
158158 name : member . name ,
159- type : member . type . sub ( subst_ )
159+ type : member . type . sub ( subst_ ) ,
160+ source : member
160161 )
161162
162163 when AST ::Members ::ClassVariable
163- ClassVariableDuplicationError . check! ( variables : definition . class_variables , member : member , type_name : type_name )
164- insert_variable ( type_name , definition . class_variables , name : member . name , type : member . type )
164+ insert_variable ( type_name , definition . class_variables , name : member . name , type : member . type , source : member )
165165 end
166166 end
167167 end
@@ -284,17 +284,15 @@ def build_singleton0(type_name)
284284 end
285285
286286 if ivar_name
287- insert_variable ( type_name , definition . instance_variables , name : ivar_name , type : member . type )
287+ insert_variable ( type_name , definition . instance_variables , name : ivar_name , type : member . type , source : member )
288288 end
289289 end
290290
291291 when AST ::Members ::ClassInstanceVariable
292- ClassInstanceVariableDuplicationError . check! ( variables : definition . instance_variables , member : member , type_name : type_name )
293- insert_variable ( type_name , definition . instance_variables , name : member . name , type : member . type )
292+ insert_variable ( type_name , definition . instance_variables , name : member . name , type : member . type , source : member )
294293
295294 when AST ::Members ::ClassVariable
296- ClassVariableDuplicationError . check! ( variables : definition . class_variables , member : member , type_name : type_name )
297- insert_variable ( type_name , definition . class_variables , name : member . name , type : member . type )
295+ insert_variable ( type_name , definition . class_variables , name : member . name , type : member . type , source : member )
298296 end
299297 end
300298 end
@@ -539,12 +537,46 @@ def validate_type_params(definition, ancestors:, methods:)
539537 end
540538 end
541539
542- def insert_variable ( type_name , variables , name :, type :)
540+ def insert_variable ( type_name , variables , name :, type :, source : )
543541 variables [ name ] = Definition ::Variable . new (
544542 parent_variable : variables [ name ] ,
545543 type : type ,
546- declared_in : type_name
544+ declared_in : type_name ,
545+ source : source
547546 )
547+ validate_variable ( variables [ name ] )
548+ end
549+
550+ def validate_variable ( var )
551+ return unless var . parent_variable
552+
553+ # Ignore attrs
554+ variables = [ ] #: Array[Definition::Variable]
555+ tmp_var = var
556+ while tmp_var
557+ variables << tmp_var if tmp_var . source . is_a? ( AST ::Members ::Var )
558+ tmp_var = tmp_var . parent_variable
559+ end
560+
561+ # Duplicates should be eliminated, so there can't be more than 3.
562+ return unless variables . length == 2
563+
564+ l , r = variables #: [Definition::Variable, Definition::Variable]
565+
566+ case l . source
567+ when AST ::Members ::InstanceVariable
568+ if r . source . instance_of? ( AST ::Members ::InstanceVariable ) && l . declared_in == r . declared_in
569+ raise InstanceVariableDuplicationError . new ( member : l . source )
570+ end
571+ when AST ::Members ::ClassInstanceVariable
572+ if r . source . instance_of? ( AST ::Members ::ClassInstanceVariable ) && l . declared_in == r . declared_in
573+ raise ClassInstanceVariableDuplicationError . new ( member : l . source )
574+ end
575+ when AST ::Members ::ClassVariable
576+ if r . source . instance_of? ( AST ::Members ::ClassVariable )
577+ raise ClassVariableDuplicationError . new ( member : l . source )
578+ end
579+ end
548580 end
549581
550582 def import_methods ( definition , module_name , module_methods , interfaces_methods , subst , self_type_methods )
0 commit comments