in graphql-dgs-codegen-core/src/main/kotlin/com/netflix/graphql/dgs/codegen/generators/kotlin/KotlinInterfaceTypeGenerator.kt [42:112]
fun generate(
definition: InterfaceTypeDefinition,
extensions: List<InterfaceTypeExtensionDefinition>,
): CodeGenResult {
if (definition.shouldSkip(config)) {
return CodeGenResult.EMPTY
}
logger.info("Generating type {}", definition.name)
val interfaceBuilder =
TypeSpec
.interfaceBuilder(definition.name)
.addOptionalGeneratedAnnotation(config)
if (definition.description != null) {
interfaceBuilder.addKdoc("%L", definition.description.sanitizeKdoc())
}
superInterfacesNames(definition)
.forEach {
interfaceBuilder.addSuperinterface(typeUtils.findKtInterfaceName(it, packageName))
}
val mergedFieldDefinitions = definition.fieldDefinitions + extensions.flatMap { it.fieldDefinitions }
mergedFieldDefinitions.filterSkipped().forEach { field ->
val returnType = typeUtils.findReturnType(field.type)
val nullableType = if (typeUtils.isNullable(field.type)) returnType.copy(nullable = true) else returnType
val propertySpec = PropertySpec.builder(field.name, nullableType)
if (field.description != null) {
propertySpec.addKdoc("%L", field.description.sanitizeKdoc())
}
if (definition.implements.isNotEmpty()) {
val superInterfaceFields =
document
.getDefinitionsOfType(InterfaceTypeDefinition::class.java)
.filter {
superInterfacesNames(definition).contains(it.name)
}.asSequence()
.flatMap { it.fieldDefinitions }
.map { it.name }
.toSet()
if (field.name in superInterfaceFields) {
propertySpec.addModifiers(KModifier.OVERRIDE)
}
}
interfaceBuilder.addProperty(propertySpec.build())
}
val implementations =
document
.getDefinitionsOfType(ObjectTypeDefinition::class.java)
.asSequence()
.filter { node -> node.implements.any { it.isEqualTo(TypeName(definition.name)) } }
.map { node -> typeUtils.findKtInterfaceName(node.name, packageName) }
.filterIsInstance<ClassName>()
.toList()
if (implementations.isNotEmpty()) {
interfaceBuilder.addAnnotation(jsonTypeInfoAnnotation())
interfaceBuilder.addAnnotation(jsonSubTypesAnnotation(implementations))
}
interfaceBuilder.addType(TypeSpec.companionObjectBuilder().addOptionalGeneratedAnnotation(config).build())
val fileSpec = FileSpec.get(packageName, interfaceBuilder.build())
return CodeGenResult(kotlinInterfaces = listOf(fileSpec))
}