11package graphql.nadel.definition.coordinates
22
33import graphql.Directives
4+ import graphql.language.Definition
45import graphql.language.Document
56import graphql.language.NamedNode
7+ import graphql.language.SDLNamedDefinition
68import graphql.nadel.engine.util.AnySDLDefinition
9+ import graphql.nadel.engine.util.AnySDLNamedDefinition
710import graphql.nadel.engine.util.unwrapAll
811import graphql.nadel.schema.NadelSchemaDefinitionTraverser
912import graphql.nadel.schema.NadelSchemaDefinitionTraverserElement
@@ -62,22 +65,33 @@ class NadelSchemaMemberCoordinatesFactory {
6265
6366 fun create (
6467 schema : Document ,
68+ resolveTypeReferences : Boolean ,
6569 ): Set <NadelSchemaMemberCoordinates > {
66- val definitions = schema.definitions
70+ return create(
71+ schema = schema.definitions,
72+ resolveTypeReferences = resolveTypeReferences,
73+ )
74+ }
75+
76+ fun create (
77+ schema : Iterable <Definition <* >>,
78+ resolveTypeReferences : Boolean ,
79+ ): Set <NadelSchemaMemberCoordinates > {
80+ val definitions = schema
6781 .asSequence()
68- .filterIsInstance<AnySDLDefinition >()
82+ .filterIsInstance<AnySDLNamedDefinition >()
6983
7084 // There can be multiple definitions per name, but in this scenario we don't care
7185 val definitionByName = definitions
7286 .associateBy {
73- (it as NamedNode < * >) .name
87+ it .name
7488 }
7589
7690 val roots = definitions
7791 .mapNotNull(NadelSchemaDefinitionTraverserElement ::from)
7892 .toList()
7993
80- return createImpl(roots, definitionByName)
94+ return createImpl(roots, definitionByName, resolveTypeReferences )
8195 }
8296
8397 private fun createImpl (
@@ -97,13 +111,18 @@ class NadelSchemaMemberCoordinatesFactory {
97111 private fun createImpl (
98112 roots : List <NadelSchemaDefinitionTraverserElement >,
99113 definitionByName : Map <String , AnySDLDefinition >,
114+ resolveTypeReferences : Boolean ,
100115 ): Set <NadelSchemaMemberCoordinates > {
101116 val coordinates = mutableSetOf<NadelSchemaMemberCoordinates >()
102117
103118 NadelSchemaDefinitionTraverser ()
104119 .traverse(
105120 roots,
106- NadelSchemaDefinitionCoordinateCollectorTraverserVisitor (coordinates, definitionByName),
121+ NadelSchemaDefinitionCoordinateCollectorTraverserVisitor (
122+ coordinates,
123+ definitionByName,
124+ resolveTypeReferences,
125+ ),
107126 )
108127
109128 return coordinates
@@ -225,6 +244,7 @@ internal class NadelSchemaCoordinateCollectorTraverserVisitor(
225244internal class NadelSchemaDefinitionCoordinateCollectorTraverserVisitor (
226245 private val coordinates : MutableCollection <NadelSchemaMemberCoordinates >,
227246 private val definitionByName : Map <String , AnySDLDefinition >,
247+ private val resolveTypeReferences : Boolean ,
228248) : NadelSchemaDefinitionTraverserVisitor {
229249 override fun visitGraphQLAppliedDirective (element : NadelSchemaDefinitionTraverserElement .AppliedDirective ): Boolean {
230250 coordinates.add(element.coordinates())
@@ -302,6 +322,14 @@ internal class NadelSchemaDefinitionCoordinateCollectorTraverserVisitor(
302322 }
303323
304324 override fun visitTypeReference (element : NadelSchemaDefinitionTraverserElement .TypeReference ): Boolean {
325+ return if (resolveTypeReferences) {
326+ resolveTypeReference(element)
327+ } else {
328+ false
329+ }
330+ }
331+
332+ private fun resolveTypeReference (element : NadelSchemaDefinitionTraverserElement .TypeReference ): Boolean {
305333 // Resolve definition then traverse
306334 val typeName = element.node.unwrapAll().name
307335
0 commit comments