11package graphql.nadel.definition.coordinates
22
33import graphql.Directives
4+ import graphql.language.Definition
45import graphql.language.Document
5- import graphql.language.NamedNode
66import graphql.nadel.engine.util.AnySDLDefinition
7+ import graphql.nadel.engine.util.AnySDLNamedDefinition
78import graphql.nadel.engine.util.unwrapAll
89import graphql.nadel.schema.NadelSchemaDefinitionTraverser
910import graphql.nadel.schema.NadelSchemaDefinitionTraverserElement
@@ -62,22 +63,33 @@ class NadelSchemaMemberCoordinatesFactory {
6263
6364 fun create (
6465 schema : Document ,
66+ resolveTypeReferences : Boolean ,
6567 ): Set <NadelSchemaMemberCoordinates > {
66- val definitions = schema.definitions
68+ return create(
69+ schema = schema.definitions,
70+ resolveTypeReferences = resolveTypeReferences,
71+ )
72+ }
73+
74+ fun create (
75+ schema : Iterable <Definition <* >>,
76+ resolveTypeReferences : Boolean ,
77+ ): Set <NadelSchemaMemberCoordinates > {
78+ val definitions = schema
6779 .asSequence()
68- .filterIsInstance<AnySDLDefinition >()
80+ .filterIsInstance<AnySDLNamedDefinition >()
6981
7082 // There can be multiple definitions per name, but in this scenario we don't care
7183 val definitionByName = definitions
7284 .associateBy {
73- (it as NamedNode < * >) .name
85+ it .name
7486 }
7587
7688 val roots = definitions
7789 .mapNotNull(NadelSchemaDefinitionTraverserElement ::from)
7890 .toList()
7991
80- return createImpl(roots, definitionByName)
92+ return createImpl(roots, definitionByName, resolveTypeReferences )
8193 }
8294
8395 private fun createImpl (
@@ -97,13 +109,18 @@ class NadelSchemaMemberCoordinatesFactory {
97109 private fun createImpl (
98110 roots : List <NadelSchemaDefinitionTraverserElement >,
99111 definitionByName : Map <String , AnySDLDefinition >,
112+ resolveTypeReferences : Boolean ,
100113 ): Set <NadelSchemaMemberCoordinates > {
101114 val coordinates = mutableSetOf<NadelSchemaMemberCoordinates >()
102115
103116 NadelSchemaDefinitionTraverser ()
104117 .traverse(
105118 roots,
106- NadelSchemaDefinitionCoordinateCollectorTraverserVisitor (coordinates, definitionByName),
119+ NadelSchemaDefinitionCoordinateCollectorTraverserVisitor (
120+ coordinates,
121+ definitionByName,
122+ resolveTypeReferences,
123+ ),
107124 )
108125
109126 return coordinates
@@ -225,6 +242,7 @@ internal class NadelSchemaCoordinateCollectorTraverserVisitor(
225242internal class NadelSchemaDefinitionCoordinateCollectorTraverserVisitor (
226243 private val coordinates : MutableCollection <NadelSchemaMemberCoordinates >,
227244 private val definitionByName : Map <String , AnySDLDefinition >,
245+ private val resolveTypeReferences : Boolean ,
228246) : NadelSchemaDefinitionTraverserVisitor {
229247 override fun visitGraphQLAppliedDirective (element : NadelSchemaDefinitionTraverserElement .AppliedDirective ): Boolean {
230248 coordinates.add(element.coordinates())
@@ -302,6 +320,14 @@ internal class NadelSchemaDefinitionCoordinateCollectorTraverserVisitor(
302320 }
303321
304322 override fun visitTypeReference (element : NadelSchemaDefinitionTraverserElement .TypeReference ): Boolean {
323+ return if (resolveTypeReferences) {
324+ resolveTypeReference(element)
325+ } else {
326+ false
327+ }
328+ }
329+
330+ private fun resolveTypeReference (element : NadelSchemaDefinitionTraverserElement .TypeReference ): Boolean {
305331 // Resolve definition then traverse
306332 val typeName = element.node.unwrapAll().name
307333
0 commit comments