@@ -212,7 +212,11 @@ def ensure_all_loaded(types_to_visit)
212212 def load_all ( types : nil )
213213 if @visit . nil?
214214 # Set up the visit system
215- @interface_type_memberships = Hash . new { |h , interface_type | h [ interface_type ] = [ ] } . compare_by_identity
215+ @interface_type_memberships = Hash . new { |h , interface_type |
216+ h [ interface_type ] = Hash . new { |h2 , obj_type |
217+ h2 [ obj_type ] = [ ]
218+ } . compare_by_identity
219+ } . compare_by_identity
216220 @directives = [ ]
217221 @types = { } # String => Module
218222 @all_references = Hash . new { |h , member | h [ member ] = Set . new . compare_by_identity } . compare_by_identity
@@ -237,7 +241,7 @@ def load_all(types: nil)
237241 @all_references [ itm . abstract_type ] << member
238242 # `itm.object_type` may not actually be `member` if this implementation
239243 # is inherited from a superclass
240- @interface_type_memberships [ itm . abstract_type ] << [ itm , member ]
244+ @interface_type_memberships [ itm . abstract_type ] [ member ] << itm
241245 end
242246 elsif member < GraphQL ::Schema ::Union
243247 @unions_for_references << member
@@ -286,12 +290,11 @@ def load_all(types: nil)
286290
287291 # TODO: somehow don't iterate over all these,
288292 # only the ones that may have been modified
289- @interface_type_memberships . each do |int_type , type_membership_pairs |
290- referers = @all_references [ int_type ] . select { |r | r . is_a? ( GraphQL ::Schema ::Field ) }
291- if !referers . empty?
292- type_membership_pairs . each do |( type_membership , impl_type ) |
293- # Add new items only:
294- @all_references [ impl_type ] |= referers
293+ @interface_type_memberships . each do |int_type , obj_type_memberships |
294+ referrers = @all_references [ int_type ] . select { |r | r . is_a? ( GraphQL ::Schema ::Field ) }
295+ if !referrers . empty?
296+ obj_type_memberships . each_key do |impl_type |
297+ @all_references [ impl_type ] |= referrers
295298 end
296299 end
297300 end
0 commit comments