@@ -55,40 +55,69 @@ public extension SelectionSet {
5555
5656 private func fieldsForEquality( ) -> [ String : FieldValue ] {
5757 var fields : [ String : FieldValue ] = [ : ]
58- if let asTypeCase = self as? any InlineFragment {
59- self . addFulfilledSelections ( of: type ( of: asTypeCase. asRootEntityType) , to: & fields)
58+ var addedFragments : Set < ObjectIdentifier > = [ ]
6059
61- } else {
62- self . addFulfilledSelections ( of: type ( of : self ) , to: & fields)
60+ for fragment in type ( of : self ) . __fulfilledFragments {
61+ self . addFulfilledSelections ( of: fragment , to: & fields, addedFragments : & addedFragments )
6362 }
6463
6564 return fields
6665 }
6766
6867 private func addFulfilledSelections(
6968 of selectionSetType: any SelectionSet . Type ,
70- to fields: inout [ String : FieldValue ]
69+ to fields: inout [ String : FieldValue ] ,
70+ addedFragments: inout Set < ObjectIdentifier >
7171 ) {
72- guard self . __data. fragmentIsFulfilled ( selectionSetType) else {
72+ let selectionSetTypeId = ObjectIdentifier ( selectionSetType)
73+ guard !addedFragments. contains ( selectionSetTypeId) ,
74+ self . __data. fragmentIsFulfilled ( selectionSetType) else {
7375 return
7476 }
7577
78+ addedFragments. insert ( selectionSetTypeId)
79+
7680 for selection in selectionSetType. __selections {
7781 switch selection {
7882 case let . field( field) :
7983 add ( field: field, to: & fields)
8084
8185 case let . inlineFragment( typeCase) :
82- self . addFulfilledSelections ( of: typeCase, to: & fields)
86+ self . addFulfilledSelections ( of: typeCase, to: & fields, addedFragments : & addedFragments )
8387
8488 case let . conditional( _, selections) :
85- self . addConditionalSelections ( selections, to: & fields)
89+ self . addConditionalSelections ( selections, to: & fields, addedFragments : & addedFragments )
8690
8791 case let . fragment( fragmentType) :
88- self . addFulfilledSelections ( of: fragmentType, to: & fields)
92+ self . addFulfilledSelections ( of: fragmentType, to: & fields, addedFragments : & addedFragments )
8993
9094 case let . deferred( _, fragmentType, _) :
91- self . addFulfilledSelections ( of: fragmentType, to: & fields)
95+ self . addFulfilledSelections ( of: fragmentType, to: & fields, addedFragments: & addedFragments)
96+ }
97+ }
98+ }
99+
100+ private func addConditionalSelections(
101+ _ selections: [ Selection ] ,
102+ to fields: inout [ String : FieldValue ] ,
103+ addedFragments: inout Set < ObjectIdentifier >
104+ ) {
105+ for selection in selections {
106+ switch selection {
107+ case let . inlineFragment( typeCase) :
108+ self . addFulfilledSelections ( of: typeCase, to: & fields, addedFragments: & addedFragments)
109+
110+ case let . fragment( fragment) :
111+ self . addFulfilledSelections ( of: fragment, to: & fields, addedFragments: & addedFragments)
112+
113+ case let . deferred( _, fragment, _) :
114+ self . addFulfilledSelections ( of: fragment, to: & fields, addedFragments: & addedFragments)
115+
116+ case let . conditional( _, selections) :
117+ addConditionalSelections ( selections, to: & fields, addedFragments: & addedFragments)
118+
119+ case let . field( field) :
120+ add ( field: field, to: & fields)
92121 }
93122 }
94123 }
@@ -177,30 +206,6 @@ public extension SelectionSet {
177206
178207 }
179208
180- private func addConditionalSelections(
181- _ selections: [ Selection ] ,
182- to fields: inout [ String : FieldValue ]
183- ) {
184- for selection in selections {
185- switch selection {
186- case let . inlineFragment( typeCase) :
187- self . addFulfilledSelections ( of: typeCase, to: & fields)
188-
189- case let . fragment( fragment) :
190- self . addFulfilledSelections ( of: fragment, to: & fields)
191-
192- case let . deferred( _, fragment, _) :
193- self . addFulfilledSelections ( of: fragment, to: & fields)
194-
195- case let . conditional( _, selections) :
196- addConditionalSelections ( selections, to: & fields)
197-
198- case let . field( field) :
199- add ( field: field, to: & fields)
200- }
201- }
202- }
203-
204209}
205210
206211extension Hasher {
0 commit comments