Skip to content

Commit 65f04e4

Browse files
committed
Expose unused definitions in SchemaParser (fix #116)
1 parent b3ba5a7 commit 65f04e4

File tree

3 files changed

+18
-8
lines changed

3 files changed

+18
-8
lines changed

src/main/kotlin/com/coxautodev/graphql/tools/ScannedSchemaObjects.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,12 @@ import graphql.schema.GraphQLScalarType
1010
* @author Andrew Potter
1111
*/
1212
internal data class ScannedSchemaObjects(
13-
val dictionary: TypeClassDictionary,
14-
val definitions: Set<TypeDefinition<*>>,
15-
val customScalars: CustomScalarMap,
16-
val rootInfo: RootTypeInfo,
17-
val fieldResolversByType: Map<ObjectTypeDefinition, MutableMap<FieldDefinition, FieldResolver>>
13+
val dictionary: TypeClassDictionary,
14+
val definitions: Set<TypeDefinition<*>>,
15+
val customScalars: CustomScalarMap,
16+
val rootInfo: RootTypeInfo,
17+
val fieldResolversByType: Map<ObjectTypeDefinition, MutableMap<FieldDefinition, FieldResolver>>,
18+
val unusedDefinitions: Set<TypeDefinition<*>>
1819
)
1920

2021
internal typealias TypeClassDictionary = BiMap<TypeDefinition<*>, Class<*>>

src/main/kotlin/com/coxautodev/graphql/tools/SchemaClassScanner.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,8 @@ internal class SchemaClassScanner(initialDictionary: BiMap<String, Class<*>>, al
151151
?: provided.description, provided.coercing, listOf(), definition)
152152
}.associateBy { it.name!! }
153153

154-
(definitionsByName.values - observedDefinitions).forEach { definition ->
154+
val unusedDefinitions = (definitionsByName.values - observedDefinitions).toSet()
155+
unusedDefinitions.forEach { definition ->
155156
log.warn("Schema type was defined but can never be accessed, and can be safely deleted: ${definition.name}")
156157
}
157158

@@ -167,7 +168,7 @@ internal class SchemaClassScanner(initialDictionary: BiMap<String, Class<*>>, al
167168
validateRootResolversWereUsed(rootTypeHolder.mutation, fieldResolvers)
168169
validateRootResolversWereUsed(rootTypeHolder.subscription, fieldResolvers)
169170

170-
return ScannedSchemaObjects(dictionary, observedDefinitions + extensionDefinitions, scalars, rootInfo, fieldResolversByType.toMap())
171+
return ScannedSchemaObjects(dictionary, observedDefinitions + extensionDefinitions, scalars, rootInfo, fieldResolversByType.toMap(), unusedDefinitions)
171172
}
172173

173174
private fun validateRootResolversWereUsed(rootType: RootType?, fieldResolvers: List<FieldResolver>) {

src/main/kotlin/com/coxautodev/graphql/tools/SchemaParser.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import graphql.language.ObjectTypeExtensionDefinition
1818
import graphql.language.ObjectValue
1919
import graphql.language.StringValue
2020
import graphql.language.Type
21+
import graphql.language.TypeDefinition
2122
import graphql.language.TypeName
2223
import graphql.language.UnionTypeDefinition
2324
import graphql.language.Value
@@ -59,13 +60,15 @@ class SchemaParser internal constructor(scanResult: ScannedSchemaObjects) {
5960
private val customScalars = scanResult.customScalars
6061
private val rootInfo = scanResult.rootInfo
6162
private val fieldResolversByType = scanResult.fieldResolversByType
63+
private val unusedDefinitions = scanResult.unusedDefinitions
6264

6365
private val extensionDefinitions = definitions.filterIsInstance<ObjectTypeExtensionDefinition>()
64-
private val objectDefinitions = (definitions.filterIsInstance<ObjectTypeDefinition>() - extensionDefinitions)
6566

67+
private val objectDefinitions = (definitions.filterIsInstance<ObjectTypeDefinition>() - extensionDefinitions)
6668
private val inputObjectDefinitions = definitions.filterIsInstance<InputObjectTypeDefinition>()
6769
private val enumDefinitions = definitions.filterIsInstance<EnumTypeDefinition>()
6870
private val interfaceDefinitions = definitions.filterIsInstance<InterfaceTypeDefinition>()
71+
6972
private val unionDefinitions = definitions.filterIsInstance<UnionTypeDefinition>()
7073

7174
private val permittedTypesForObject: Set<String> = (objectDefinitions.map { it.name } +
@@ -108,6 +111,11 @@ class SchemaParser internal constructor(scanResult: ScannedSchemaObjects) {
108111
*/
109112
fun makeExecutableSchema(): GraphQLSchema = parseSchemaObjects().toSchema()
110113

114+
/**
115+
* Returns any unused type definitions that were found in the schema
116+
*/
117+
fun getUnusedDefinitions(): Set<TypeDefinition<*>> = unusedDefinitions
118+
111119
private fun createObject(definition: ObjectTypeDefinition, interfaces: List<GraphQLInterfaceType>): GraphQLObjectType {
112120
val name = definition.name
113121
val builder = GraphQLObjectType.newObject()

0 commit comments

Comments
 (0)