@@ -604,6 +604,9 @@ struct SelectionSetTemplate {
604
604
private func InitializerTemplate(
605
605
_ selectionSet: ComputedSelectionSet
606
606
) -> TemplateString {
607
+ let containsDeferredFragment = ( selectionSet. direct? . inlineFragments. containsDeferredFragment ?? false ) ||
608
+ ( selectionSet. direct? . namedFragments. containsDeferredFragment ?? false )
609
+
607
610
return """
608
611
\( renderAccessControl ( ) ) init(
609
612
\( InitializerSelectionParametersTemplate ( selectionSet) )
@@ -612,7 +615,14 @@ struct SelectionSetTemplate {
612
615
data: [
613
616
\( InitializerDataDictTemplate ( selectionSet) )
614
617
],
615
- fulfilledFragments: \( InitializerFulfilledFragments ( selectionSet) )
618
+ fulfilledFragments: [
619
+ \( InitializerFulfilledFragments ( selectionSet) )
620
+ ] \( if: containsDeferredFragment, """
621
+ ,
622
+ deferredFragments: [
623
+ \( InitializerDeferredFragments ( selectionSet) )
624
+ ]
625
+ """ )
616
626
))
617
627
}
618
628
"""
@@ -708,9 +718,41 @@ struct SelectionSetTemplate {
708
718
}
709
719
710
720
return """
711
- [
712
- \( fulfilledFragments. map { " ObjectIdentifier( \( $0) .self) " } )
713
- ]
721
+ \( fulfilledFragments. map { " ObjectIdentifier( \( $0) .self) " } )
722
+ """
723
+ }
724
+
725
+ private func InitializerDeferredFragments(
726
+ _ selectionSet: ComputedSelectionSet
727
+ ) -> TemplateString ? {
728
+ guard let directSelections = selectionSet. direct else { return nil }
729
+
730
+ var deferredFragments : OrderedSet < String > = [ ]
731
+
732
+ let nameGenerator : ( _ typeInfo: SelectionSet . TypeInfo ) -> String = { typeInfo in
733
+ SelectionSetNameGenerator . generatedSelectionSetName (
734
+ for: typeInfo,
735
+ format: . fullyQualified,
736
+ pluralizer: config. pluralizer
737
+ )
738
+ }
739
+
740
+ for inlineFragmentSpread in directSelections. inlineFragments. values. elements {
741
+ if inlineFragmentSpread. typeInfo. isDeferred {
742
+ let selectionSetName = nameGenerator ( inlineFragmentSpread. typeInfo)
743
+ deferredFragments. append ( selectionSetName)
744
+ }
745
+ }
746
+
747
+ for namedFragment in directSelections. namedFragments. values. elements {
748
+ if namedFragment. typeInfo. isDeferred {
749
+ let selectionSetName = nameGenerator ( namedFragment. typeInfo)
750
+ deferredFragments. append ( selectionSetName)
751
+ }
752
+ }
753
+
754
+ return """
755
+ \( deferredFragments. map { " ObjectIdentifier( \( $0) .self) " } )
714
756
"""
715
757
}
716
758
0 commit comments