@@ -47,12 +47,13 @@ public CompositionResult<SchemaDefinition> Merge()
47
47
// [TypeName: [{Type, Schema}, ...], ...].
48
48
var typeGroupByName = _schemas
49
49
. SelectMany ( s => s . Types , ( schema , type ) => new TypeInfo ( type , schema ) )
50
+ . OrderBy ( i => i . Type . Kind ) // Ensure that object types are merged before union types.
50
51
. GroupBy ( i => i . Type . Name ) ;
51
52
52
53
// Merge types.
53
54
foreach ( var grouping in typeGroupByName )
54
55
{
55
- var mergedType = MergeTypes ( [ .. grouping ] ) ;
56
+ var mergedType = MergeTypes ( [ .. grouping ] , mergedSchema ) ;
56
57
57
58
if ( mergedType is not null )
58
59
{
@@ -88,7 +89,9 @@ public CompositionResult<SchemaDefinition> Merge()
88
89
return mergedSchema ;
89
90
}
90
91
91
- private INamedTypeDefinition ? MergeTypes ( ImmutableArray < TypeInfo > typeGroup )
92
+ private INamedTypeDefinition ? MergeTypes (
93
+ ImmutableArray < TypeInfo > typeGroup ,
94
+ SchemaDefinition mergedSchema )
92
95
{
93
96
var kind = typeGroup [ 0 ] . Type . Kind ;
94
97
@@ -102,7 +105,7 @@ public CompositionResult<SchemaDefinition> Merge()
102
105
TypeKind . Interface => MergeInterfaceTypes ( typeGroup ) ,
103
106
TypeKind . Object => MergeObjectTypes ( typeGroup ) ,
104
107
TypeKind . Scalar => MergeScalarTypes ( typeGroup ) ,
105
- TypeKind . Union => MergeUnionTypes ( typeGroup ) ,
108
+ TypeKind . Union => MergeUnionTypes ( typeGroup , mergedSchema ) ,
106
109
_ => throw new InvalidOperationException ( )
107
110
} ;
108
111
}
@@ -536,7 +539,9 @@ private ScalarTypeDefinition MergeScalarTypes(ImmutableArray<TypeInfo> typeGroup
536
539
/// <seealso href="https://graphql.github.io/composite-schemas-spec/draft/#sec-Merge-Union-Types">
537
540
/// Specification
538
541
/// </seealso>
539
- private UnionTypeDefinition ? MergeUnionTypes ( ImmutableArray < TypeInfo > typeGroup )
542
+ private UnionTypeDefinition ? MergeUnionTypes (
543
+ ImmutableArray < TypeInfo > typeGroup ,
544
+ SchemaDefinition mergedSchema )
540
545
{
541
546
var firstUnion = typeGroup [ 0 ] . Type ;
542
547
var name = firstUnion . Name ;
@@ -574,11 +579,9 @@ private ScalarTypeDefinition MergeScalarTypes(ImmutableArray<TypeInfo> typeGroup
574
579
575
580
foreach ( var grouping in unionMemberGroupByName )
576
581
{
577
- var memberType = new ObjectTypeDefinition ( grouping . Key ) ;
578
-
579
582
AddFusionUnionMemberDirectives ( unionType , [ .. grouping ] ) ;
580
583
581
- unionType . Types . Add ( memberType ) ;
584
+ unionType . Types . Add ( ( ObjectTypeDefinition ) mergedSchema . Types [ grouping . Key ] ) ;
582
585
}
583
586
584
587
return unionType ;
0 commit comments