Skip to content

Commit b5ec699

Browse files
gh-action-runnergh-action-runner
authored andcommitted
Squashed 'apollo-ios-codegen/' changes from 4c748770..4bc820e4
4bc820e4 Prevent merging of fragment fields into selection tree if fragment field merging is disabled (#571) git-subtree-dir: apollo-ios-codegen git-subtree-split: 4bc820e4c3b1fa53992328d84b6c2b684e28ba2b
1 parent dbd83af commit b5ec699

File tree

3 files changed

+39
-12
lines changed

3 files changed

+39
-12
lines changed

Sources/ApolloCodegenLib/ApolloCodegen.swift

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,10 +295,16 @@ public class ApolloCodegen {
295295
ir: IRBuilder,
296296
fileManager: ApolloFileManager
297297
) async throws -> NonFatalErrors {
298+
let mergeNamedFragmentFields = config.experimentalFeatures.fieldMerging.options
299+
.contains(.namedFragments)
300+
298301
return try await nonFatalErrorCollectingTaskGroup() { group in
299302
for fragment in fragments {
300303
group.addTask {
301-
let irFragment = await ir.build(fragment: fragment)
304+
let irFragment = await ir.build(
305+
fragment: fragment,
306+
mergingNamedFragmentFields: mergeNamedFragmentFields
307+
)
302308

303309
let errors = try await FragmentFileGenerator(irFragment: irFragment, config: self.config)
304310
.generate(forConfig: self.config, fileManager: fileManager)
@@ -310,7 +316,10 @@ public class ApolloCodegen {
310316
group.addTask {
311317
async let identifier = self.operationIdentifierFactory.identifier(for: operation)
312318

313-
let irOperation = await ir.build(operation: operation)
319+
let irOperation = await ir.build(
320+
operation: operation,
321+
mergingNamedFragmentFields: mergeNamedFragmentFields
322+
)
314323

315324
let errors = try await OperationFileGenerator(
316325
irOperation: irOperation,

Sources/IR/IR+RootFieldBuilder.swift

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,34 @@ class RootFieldBuilder {
1616
static func buildRootEntityField(
1717
forRootField rootField: CompilationResult.Field,
1818
onRootEntity rootEntity: Entity,
19-
inIR ir: IRBuilder
19+
inIR ir: IRBuilder,
20+
mergingNamedFragmentFields: Bool
2021
) async -> Result {
21-
return await RootFieldBuilder(ir: ir, rootEntity: rootEntity)
22-
.build(rootField: rootField)
22+
return await RootFieldBuilder(
23+
ir: ir,
24+
rootEntity: rootEntity,
25+
mergeInNamedFragmentFields: mergingNamedFragmentFields
26+
)
27+
.build(rootField: rootField)
2328
}
2429

2530
private let ir: IRBuilder
2631
private let rootEntity: Entity
2732
private let entityStorage: DefinitionEntityStorage
33+
private let mergeInNamedFragmentFields: Bool
2834
private var referencedFragments: ReferencedFragments = []
2935
@IsEverTrue private var containsDeferredFragment: Bool
3036

3137
private var schema: Schema { ir.schema }
3238

33-
private init(ir: IRBuilder, rootEntity: Entity) {
39+
private init(
40+
ir: IRBuilder,
41+
rootEntity: Entity,
42+
mergeInNamedFragmentFields: Bool
43+
) {
3444
self.ir = ir
3545
self.rootEntity = rootEntity
46+
self.mergeInNamedFragmentFields = mergeInNamedFragmentFields
3647
self.entityStorage = DefinitionEntityStorage(rootEntity: rootEntity)
3748
}
3849

@@ -398,7 +409,10 @@ class RootFieldBuilder {
398409
spreadIntoParentWithTypePath parentTypeInfo: SelectionSet.TypeInfo,
399410
deferCondition: CompilationResult.DeferCondition? = nil
400411
) async -> NamedFragmentSpread {
401-
let fragment = await ir.build(fragment: fragmentSpread.fragment)
412+
let fragment = await ir.build(
413+
fragment: fragmentSpread.fragment,
414+
mergingNamedFragmentFields: self.mergeInNamedFragmentFields
415+
)
402416
referencedFragments.append(fragment)
403417
referencedFragments.append(contentsOf: fragment.referencedFragments)
404418

@@ -425,7 +439,7 @@ class RootFieldBuilder {
425439
inclusionConditions: AnyOf(scope.conditions)
426440
)
427441

428-
if fragmentSpread.typeInfo.deferCondition == nil {
442+
if mergeInNamedFragmentFields && fragmentSpread.typeInfo.deferCondition == nil {
429443
mergeAllSelectionsIntoEntitySelectionTrees(from: fragmentSpread)
430444
}
431445

Sources/IR/IRBuilder.swift

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ public class IRBuilder {
2323
}
2424

2525
public func build(
26-
operation operationDefinition: CompilationResult.OperationDefinition
26+
operation operationDefinition: CompilationResult.OperationDefinition,
27+
mergingNamedFragmentFields: Bool = true
2728
) async -> Operation {
2829
let rootField = CompilationResult.Field(
2930
name: operationDefinition.operationType.rawValue,
@@ -38,7 +39,8 @@ public class IRBuilder {
3839
let result = await RootFieldBuilder.buildRootEntityField(
3940
forRootField: rootField,
4041
onRootEntity: rootEntity,
41-
inIR: self
42+
inIR: self,
43+
mergingNamedFragmentFields: mergingNamedFragmentFields
4244
)
4345

4446
return Operation(
@@ -86,7 +88,8 @@ public class IRBuilder {
8688
}
8789

8890
public func build(
89-
fragment fragmentDefinition: CompilationResult.FragmentDefinition
91+
fragment fragmentDefinition: CompilationResult.FragmentDefinition,
92+
mergingNamedFragmentFields: Bool = true
9093
) async -> NamedFragment {
9194
await builtFragmentStorage.getFragment(named: fragmentDefinition.name) {
9295
let rootField = CompilationResult.Field(
@@ -102,7 +105,8 @@ public class IRBuilder {
102105
let result = await RootFieldBuilder.buildRootEntityField(
103106
forRootField: rootField,
104107
onRootEntity: rootEntity,
105-
inIR: self
108+
inIR: self,
109+
mergingNamedFragmentFields: mergingNamedFragmentFields
106110
)
107111

108112
return NamedFragment(

0 commit comments

Comments
 (0)