diff --git a/src/main/kotlin/graphql/kickstart/tools/SchemaClassScanner.kt b/src/main/kotlin/graphql/kickstart/tools/SchemaClassScanner.kt index e91e3e2c..b327b7e4 100644 --- a/src/main/kotlin/graphql/kickstart/tools/SchemaClassScanner.kt +++ b/src/main/kotlin/graphql/kickstart/tools/SchemaClassScanner.kt @@ -91,15 +91,14 @@ internal class SchemaClassScanner( do { val unusedDefinitions = (definitionsByName.values - (dictionary.keys.toSet() + unvalidatedTypes)) .filter { definition -> definition.name != "PageInfo" } - .filterIsInstance().distinct() + .filter { isCompositeOrEnumType(it) } + .distinct() if (unusedDefinitions.isEmpty()) { break } - val unusedDefinition = unusedDefinitions.first() - - handleDictionaryTypes(listOf(unusedDefinition)) { "Object type '${it.name}' is unused and includeUnusedTypes is true. Please pass a class for type '${it.name}' in the parser's dictionary." } + handleDictionaryTypes(unusedDefinitions) { "Type '${it.name}' is unused and includeUnusedTypes is true. Please pass a class for type '${it.name}' in the parser's dictionary." } } while (scanQueue()) } @@ -108,6 +107,10 @@ internal class SchemaClassScanner( return validateAndCreateResult(rootTypeHolder) } + private fun isCompositeOrEnumType(definition: TypeDefinition<*>): Boolean { + return definition is ObjectTypeDefinition || definition is InterfaceTypeDefinition || definition is UnionTypeDefinition || definition is EnumTypeDefinition + } + private fun scanQueue(): Boolean { if (queue.isEmpty()) { return false diff --git a/src/test/kotlin/graphql/kickstart/tools/SchemaClassScannerTest.kt b/src/test/kotlin/graphql/kickstart/tools/SchemaClassScannerTest.kt index 9dff7011..e7a2f758 100644 --- a/src/test/kotlin/graphql/kickstart/tools/SchemaClassScannerTest.kt +++ b/src/test/kotlin/graphql/kickstart/tools/SchemaClassScannerTest.kt @@ -526,12 +526,19 @@ class SchemaClassScannerTest { type Implementation implements SomeInterface { value: String } + + union SomeUnion = Unused | Implementation + + enum SomeEnum { + A + B + } """) .resolvers(object : GraphQLQueryResolver { fun whatever(): Whatever? = null }) .options(SchemaParserOptions.newOptions().includeUnusedTypes(true).build()) - .dictionary(Unused::class, Implementation::class) + .dictionary(Unused::class, Implementation::class, SomeInterface::class, SomeUnion::class, SomeEnum::class) .build() .makeExecutableSchema() diff --git a/src/test/kotlin/graphql/kickstart/tools/TestInterfaces.kt b/src/test/kotlin/graphql/kickstart/tools/TestInterfaces.kt index 17a22a91..52e2ff54 100644 --- a/src/test/kotlin/graphql/kickstart/tools/TestInterfaces.kt +++ b/src/test/kotlin/graphql/kickstart/tools/TestInterfaces.kt @@ -14,3 +14,10 @@ interface SomeInterface { fun getValue(): String? } +interface SomeUnion + +enum class SomeEnum { + A, + B +} +