Skip to content

Commit 4984e54

Browse files
authored
[Fusion] Removed unreferenced types from the merged schema (#8259)
1 parent ffda53c commit 4984e54

25 files changed

+263
-34
lines changed

src/HotChocolate/Fusion-vnext/src/Fusion.Composition/Options/SourceSchemaMergerOptions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,7 @@ namespace HotChocolate.Fusion.Options;
22

33
internal sealed class SourceSchemaMergerOptions
44
{
5+
public bool RemoveUnreferencedTypes { get; init; } = true;
6+
57
public bool AddFusionDefinitions { get; init; } = true;
68
}

src/HotChocolate/Fusion-vnext/src/Fusion.Composition/SourceSchemaMerger.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,11 @@ public CompositionResult<MutableSchemaDefinition> Merge()
6767

6868
SetOperationTypes(mergedSchema);
6969

70+
if (_options.RemoveUnreferencedTypes)
71+
{
72+
mergedSchema.RemoveUnreferencedTypes();
73+
}
74+
7075
// Add lookup directives.
7176
foreach (var schema in _schemas)
7277
{
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
using HotChocolate.Types;
2+
using HotChocolate.Types.Mutable;
3+
4+
namespace HotChocolate.Fusion.Extensions;
5+
6+
public static class MutableSchemaDefinitionExtensions
7+
{
8+
public static void RemoveUnreferencedTypes(this MutableSchemaDefinition schema)
9+
{
10+
var touchedTypes = new HashSet<ITypeDefinition>();
11+
var backlog = new Stack<ITypeDefinition>();
12+
13+
if (schema.QueryType is not null)
14+
{
15+
backlog.Push(schema.QueryType);
16+
}
17+
18+
if (schema.MutationType is not null)
19+
{
20+
backlog.Push(schema.MutationType);
21+
}
22+
23+
if (schema.SubscriptionType is not null)
24+
{
25+
backlog.Push(schema.SubscriptionType);
26+
}
27+
28+
while (backlog.TryPop(out var type))
29+
{
30+
if (!touchedTypes.Add(type)
31+
|| type.Kind == TypeKind.Scalar
32+
|| type.Kind == TypeKind.Enum)
33+
{
34+
continue;
35+
}
36+
37+
switch (type)
38+
{
39+
case IComplexTypeDefinition complexType:
40+
InspectComplexType(schema, complexType, backlog);
41+
break;
42+
43+
case IInputObjectTypeDefinition inputObjectType:
44+
InspectInputObjectType(inputObjectType, backlog);
45+
break;
46+
47+
case IUnionTypeDefinition unionType:
48+
InspectUnionType(unionType, backlog);
49+
break;
50+
}
51+
}
52+
53+
var typesToRemove = new HashSet<ITypeDefinition>();
54+
foreach (var type in schema.Types)
55+
{
56+
if (touchedTypes.Contains(type))
57+
{
58+
continue;
59+
}
60+
61+
typesToRemove.Add(type);
62+
}
63+
64+
if (typesToRemove.Count > 0)
65+
{
66+
foreach (var type in typesToRemove)
67+
{
68+
schema.Types.Remove(type);
69+
}
70+
}
71+
}
72+
73+
private static void InspectComplexType(
74+
ISchemaDefinition schema,
75+
IComplexTypeDefinition complexType,
76+
Stack<ITypeDefinition> backlog)
77+
{
78+
foreach (var @interface in complexType.Implements)
79+
{
80+
backlog.Push(@interface);
81+
}
82+
83+
foreach (var field in complexType.Fields)
84+
{
85+
var returnType = field.Type.AsTypeDefinition();
86+
backlog.Push(returnType);
87+
88+
if (returnType is IInterfaceTypeDefinition or IUnionTypeDefinition)
89+
{
90+
foreach (var possibleType in schema.GetPossibleTypes(returnType))
91+
{
92+
backlog.Push(possibleType);
93+
}
94+
}
95+
96+
foreach (var argument in field.Arguments)
97+
{
98+
backlog.Push(argument.Type.AsTypeDefinition());
99+
}
100+
}
101+
}
102+
103+
private static void InspectInputObjectType(
104+
IInputObjectTypeDefinition inputObjectType,
105+
Stack<ITypeDefinition> backlog)
106+
{
107+
foreach (var field in inputObjectType.Fields)
108+
{
109+
backlog.Push(field.Type.AsTypeDefinition());
110+
}
111+
}
112+
113+
private static void InspectUnionType(
114+
IUnionTypeDefinition unionType,
115+
Stack<ITypeDefinition> backlog)
116+
{
117+
foreach (var member in unionType.Types)
118+
{
119+
backlog.Push(member);
120+
}
121+
}
122+
}

src/HotChocolate/Fusion-vnext/test/Fusion.Composition.Tests/PostMergeValidationRules/EmptyMergedEnumTypeRuleTests.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Collections.Immutable;
22
using HotChocolate.Fusion.Logging;
3+
using HotChocolate.Fusion.Options;
34
using static HotChocolate.Fusion.CompositionTestHelper;
45

56
namespace HotChocolate.Fusion.PostMergeValidationRules;
@@ -16,7 +17,9 @@ public void Examples_Valid(string[] sdl)
1617
{
1718
// arrange
1819
var schemas = CreateSchemaDefinitions(sdl);
19-
var merger = new SourceSchemaMerger(schemas);
20+
var merger = new SourceSchemaMerger(
21+
schemas,
22+
new SourceSchemaMergerOptions { RemoveUnreferencedTypes = false });
2023
var mergeResult = merger.Merge();
2124
var validator = new PostMergeValidator(mergeResult.Value, s_rules, schemas, _log);
2225

@@ -34,7 +37,9 @@ public void Examples_Invalid(string[] sdl, string[] errorMessages)
3437
{
3538
// arrange
3639
var schemas = CreateSchemaDefinitions(sdl);
37-
var merger = new SourceSchemaMerger(schemas);
40+
var merger = new SourceSchemaMerger(
41+
schemas,
42+
new SourceSchemaMergerOptions { RemoveUnreferencedTypes = false });
3843
var mergeResult = merger.Merge();
3944
var validator = new PostMergeValidator(mergeResult.Value, s_rules, schemas, _log);
4045

src/HotChocolate/Fusion-vnext/test/Fusion.Composition.Tests/PostMergeValidationRules/EmptyMergedInputObjectTypeRuleTests.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Collections.Immutable;
22
using HotChocolate.Fusion.Logging;
3+
using HotChocolate.Fusion.Options;
34
using static HotChocolate.Fusion.CompositionTestHelper;
45

56
namespace HotChocolate.Fusion.PostMergeValidationRules;
@@ -16,7 +17,9 @@ public void Examples_Valid(string[] sdl)
1617
{
1718
// arrange
1819
var schemas = CreateSchemaDefinitions(sdl);
19-
var merger = new SourceSchemaMerger(schemas);
20+
var merger = new SourceSchemaMerger(
21+
schemas,
22+
new SourceSchemaMergerOptions { RemoveUnreferencedTypes = false });
2023
var mergeResult = merger.Merge();
2124
var validator = new PostMergeValidator(mergeResult.Value, s_rules, schemas, _log);
2225

@@ -34,7 +37,9 @@ public void Examples_Invalid(string[] sdl, string[] errorMessages)
3437
{
3538
// arrange
3639
var schemas = CreateSchemaDefinitions(sdl);
37-
var merger = new SourceSchemaMerger(schemas);
40+
var merger = new SourceSchemaMerger(
41+
schemas,
42+
new SourceSchemaMergerOptions { RemoveUnreferencedTypes = false });
3843
var mergeResult = merger.Merge();
3944
var validator = new PostMergeValidator(mergeResult.Value, s_rules, schemas, _log);
4045

src/HotChocolate/Fusion-vnext/test/Fusion.Composition.Tests/PostMergeValidationRules/EmptyMergedInterfaceTypeRuleTests.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Collections.Immutable;
22
using HotChocolate.Fusion.Logging;
3+
using HotChocolate.Fusion.Options;
34
using static HotChocolate.Fusion.CompositionTestHelper;
45

56
namespace HotChocolate.Fusion.PostMergeValidationRules;
@@ -16,7 +17,9 @@ public void Examples_Valid(string[] sdl)
1617
{
1718
// arrange
1819
var schemas = CreateSchemaDefinitions(sdl);
19-
var merger = new SourceSchemaMerger(schemas);
20+
var merger = new SourceSchemaMerger(
21+
schemas,
22+
new SourceSchemaMergerOptions { RemoveUnreferencedTypes = false });
2023
var mergeResult = merger.Merge();
2124
var validator = new PostMergeValidator(mergeResult.Value, s_rules, schemas, _log);
2225

@@ -34,7 +37,9 @@ public void Examples_Invalid(string[] sdl, string[] errorMessages)
3437
{
3538
// arrange
3639
var schemas = CreateSchemaDefinitions(sdl);
37-
var merger = new SourceSchemaMerger(schemas);
40+
var merger = new SourceSchemaMerger(
41+
schemas,
42+
new SourceSchemaMergerOptions { RemoveUnreferencedTypes = false });
3843
var mergeResult = merger.Merge();
3944
var validator = new PostMergeValidator(mergeResult.Value, s_rules, schemas, _log);
4045

src/HotChocolate/Fusion-vnext/test/Fusion.Composition.Tests/PostMergeValidationRules/EmptyMergedObjectTypeRuleTests.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Collections.Immutable;
22
using HotChocolate.Fusion.Logging;
3+
using HotChocolate.Fusion.Options;
34
using static HotChocolate.Fusion.CompositionTestHelper;
45

56
namespace HotChocolate.Fusion.PostMergeValidationRules;
@@ -16,7 +17,9 @@ public void Examples_Valid(string[] sdl)
1617
{
1718
// arrange
1819
var schemas = CreateSchemaDefinitions(sdl);
19-
var merger = new SourceSchemaMerger(schemas);
20+
var merger = new SourceSchemaMerger(
21+
schemas,
22+
new SourceSchemaMergerOptions { RemoveUnreferencedTypes = false });
2023
var mergeResult = merger.Merge();
2124
var validator = new PostMergeValidator(mergeResult.Value, s_rules, schemas, _log);
2225

@@ -34,7 +37,9 @@ public void Examples_Invalid(string[] sdl, string[] errorMessages)
3437
{
3538
// arrange
3639
var schemas = CreateSchemaDefinitions(sdl);
37-
var merger = new SourceSchemaMerger(schemas);
40+
var merger = new SourceSchemaMerger(
41+
schemas,
42+
new SourceSchemaMergerOptions { RemoveUnreferencedTypes = false });
3843
var mergeResult = merger.Merge();
3944
var validator = new PostMergeValidator(mergeResult.Value, s_rules, schemas, _log);
4045

src/HotChocolate/Fusion-vnext/test/Fusion.Composition.Tests/PostMergeValidationRules/EmptyMergedUnionTypeRuleTests.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Collections.Immutable;
22
using HotChocolate.Fusion.Logging;
3+
using HotChocolate.Fusion.Options;
34
using static HotChocolate.Fusion.CompositionTestHelper;
45

56
namespace HotChocolate.Fusion.PostMergeValidationRules;
@@ -16,7 +17,9 @@ public void Examples_Valid(string[] sdl)
1617
{
1718
// arrange
1819
var schemas = CreateSchemaDefinitions(sdl);
19-
var merger = new SourceSchemaMerger(schemas);
20+
var merger = new SourceSchemaMerger(
21+
schemas,
22+
new SourceSchemaMergerOptions { RemoveUnreferencedTypes = false });
2023
var mergeResult = merger.Merge();
2124
var validator = new PostMergeValidator(mergeResult.Value, s_rules, schemas, _log);
2225

@@ -34,7 +37,9 @@ public void Examples_Invalid(string[] sdl, string[] errorMessages)
3437
{
3538
// arrange
3639
var schemas = CreateSchemaDefinitions(sdl);
37-
var merger = new SourceSchemaMerger(schemas);
40+
var merger = new SourceSchemaMerger(
41+
schemas,
42+
new SourceSchemaMergerOptions { RemoveUnreferencedTypes = false });
3843
var mergeResult = merger.Merge();
3944
var validator = new PostMergeValidator(mergeResult.Value, s_rules, schemas, _log);
4045

src/HotChocolate/Fusion-vnext/test/Fusion.Composition.Tests/PostMergeValidationRules/EnumTypeDefaultValueInaccessibleRuleTests.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Collections.Immutable;
22
using HotChocolate.Fusion.Logging;
3+
using HotChocolate.Fusion.Options;
34
using static HotChocolate.Fusion.CompositionTestHelper;
45

56
namespace HotChocolate.Fusion.PostMergeValidationRules;
@@ -16,7 +17,9 @@ public void Examples_Valid(string[] sdl)
1617
{
1718
// arrange
1819
var schemas = CreateSchemaDefinitions(sdl);
19-
var merger = new SourceSchemaMerger(schemas);
20+
var merger = new SourceSchemaMerger(
21+
schemas,
22+
new SourceSchemaMergerOptions { RemoveUnreferencedTypes = false });
2023
var mergeResult = merger.Merge();
2124
var validator = new PostMergeValidator(mergeResult.Value, s_rules, schemas, _log);
2225

@@ -34,7 +37,9 @@ public void Examples_Invalid(string[] sdl, string[] errorMessages)
3437
{
3538
// arrange
3639
var schemas = CreateSchemaDefinitions(sdl);
37-
var merger = new SourceSchemaMerger(schemas);
40+
var merger = new SourceSchemaMerger(
41+
schemas,
42+
new SourceSchemaMergerOptions { RemoveUnreferencedTypes = false });
3843
var mergeResult = merger.Merge();
3944
var validator = new PostMergeValidator(mergeResult.Value, s_rules, schemas, _log);
4045

src/HotChocolate/Fusion-vnext/test/Fusion.Composition.Tests/PostMergeValidationRules/ImplementedByInaccessibleRuleTests.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Collections.Immutable;
22
using HotChocolate.Fusion.Logging;
3+
using HotChocolate.Fusion.Options;
34
using static HotChocolate.Fusion.CompositionTestHelper;
45

56
namespace HotChocolate.Fusion.PostMergeValidationRules;
@@ -16,7 +17,9 @@ public void Examples_Valid(string[] sdl)
1617
{
1718
// arrange
1819
var schemas = CreateSchemaDefinitions(sdl);
19-
var merger = new SourceSchemaMerger(schemas);
20+
var merger = new SourceSchemaMerger(
21+
schemas,
22+
new SourceSchemaMergerOptions { RemoveUnreferencedTypes = false });
2023
var mergeResult = merger.Merge();
2124
var validator = new PostMergeValidator(mergeResult.Value, s_rules, schemas, _log);
2225

@@ -34,7 +37,9 @@ public void Examples_Invalid(string[] sdl, string[] errorMessages)
3437
{
3538
// arrange
3639
var schemas = CreateSchemaDefinitions(sdl);
37-
var merger = new SourceSchemaMerger(schemas);
40+
var merger = new SourceSchemaMerger(
41+
schemas,
42+
new SourceSchemaMergerOptions { RemoveUnreferencedTypes = false });
3843
var mergeResult = merger.Merge();
3944
var validator = new PostMergeValidator(mergeResult.Value, s_rules, schemas, _log);
4045

src/HotChocolate/Fusion-vnext/test/Fusion.Composition.Tests/PostMergeValidationRules/InterfaceFieldNoImplementationRuleTests.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Collections.Immutable;
22
using HotChocolate.Fusion.Logging;
3+
using HotChocolate.Fusion.Options;
34
using static HotChocolate.Fusion.CompositionTestHelper;
45

56
namespace HotChocolate.Fusion.PostMergeValidationRules;
@@ -16,7 +17,9 @@ public void Examples_Valid(string[] sdl)
1617
{
1718
// arrange
1819
var schemas = CreateSchemaDefinitions(sdl);
19-
var merger = new SourceSchemaMerger(schemas);
20+
var merger = new SourceSchemaMerger(
21+
schemas,
22+
new SourceSchemaMergerOptions { RemoveUnreferencedTypes = false });
2023
var mergeResult = merger.Merge();
2124
var validator = new PostMergeValidator(mergeResult.Value, s_rules, schemas, _log);
2225

@@ -34,7 +37,9 @@ public void Examples_Invalid(string[] sdl, string[] errorMessages)
3437
{
3538
// arrange
3639
var schemas = CreateSchemaDefinitions(sdl);
37-
var merger = new SourceSchemaMerger(schemas);
40+
var merger = new SourceSchemaMerger(
41+
schemas,
42+
new SourceSchemaMergerOptions { RemoveUnreferencedTypes = false });
3843
var mergeResult = merger.Merge();
3944
var validator = new PostMergeValidator(mergeResult.Value, s_rules, schemas, _log);
4045

0 commit comments

Comments
 (0)