Skip to content

Commit 69f01a1

Browse files
Fix package name for type mapped union sub types (#731)
1 parent 76679a6 commit 69f01a1

File tree

3 files changed

+56
-3
lines changed

3 files changed

+56
-3
lines changed

graphql-dgs-codegen-core/src/main/kotlin/com/netflix/graphql/dgs/codegen/CodeGen.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ class CodeGen(private val config: CodeGenConfig) {
355355
.excludeSchemaTypeExtension()
356356
.map {
357357
val extensions = findUnionExtensions(it.name, definitions)
358-
KotlinUnionTypeGenerator(config).generate(it, extensions)
358+
KotlinUnionTypeGenerator(config, document).generate(it, extensions)
359359
}
360360
.fold(CodeGenResult.EMPTY) { result, next -> result.merge(next) }
361361

graphql-dgs-codegen-core/src/main/kotlin/com/netflix/graphql/dgs/codegen/generators/kotlin/KotlinUnionTypeGenerator.kt

+5-2
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,15 @@ import com.netflix.graphql.dgs.codegen.shouldSkip
2424
import com.squareup.kotlinpoet.ClassName
2525
import com.squareup.kotlinpoet.FileSpec
2626
import com.squareup.kotlinpoet.TypeSpec
27+
import graphql.language.Document
2728
import graphql.language.TypeName
2829
import graphql.language.UnionTypeDefinition
2930
import graphql.language.UnionTypeExtensionDefinition
3031

31-
class KotlinUnionTypeGenerator(private val config: CodeGenConfig) {
32+
class KotlinUnionTypeGenerator(private val config: CodeGenConfig, document: Document) {
3233

3334
private val packageName = config.packageNameTypes
35+
private val typeUtils = KotlinTypeUtils(packageName, config, document)
3436

3537
fun generate(definition: UnionTypeDefinition, extensions: List<UnionTypeExtensionDefinition>): CodeGenResult {
3638
if (definition.shouldSkip(config)) {
@@ -42,7 +44,8 @@ class KotlinUnionTypeGenerator(private val config: CodeGenConfig) {
4244

4345
val memberTypes = definition.memberTypes.plus(extensions.flatMap { it.memberTypes }).asSequence()
4446
.filterIsInstance<TypeName>()
45-
.map { member -> ClassName(packageName, member.name) }
47+
.map { member -> typeUtils.findKtInterfaceName(member.name, packageName) }
48+
.filterIsInstance<ClassName>()
4649
.toList()
4750

4851
if (memberTypes.isNotEmpty()) {

graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/KotlinCodeGenTest.kt

+50
Original file line numberDiff line numberDiff line change
@@ -1114,6 +1114,56 @@ class KotlinCodeGenTest {
11141114
)
11151115
}
11161116

1117+
@Test
1118+
fun `Use mapped type name when the type implements non-mapped union type`() {
1119+
val schema = """
1120+
union Pet = Cat | Dog
1121+
type Cat implements Pet {
1122+
name: ID!
1123+
}
1124+
type Dog implements Pet {
1125+
name: ID!
1126+
}
1127+
""".trimIndent()
1128+
1129+
val codeGenResult = CodeGen(
1130+
CodeGenConfig(
1131+
schemas = setOf(schema),
1132+
packageName = basePackageName,
1133+
language = Language.KOTLIN,
1134+
typeMapping = mapOf(
1135+
"Cat" to "mypackage.Cat"
1136+
)
1137+
)
1138+
).generate()
1139+
val interfaces = codeGenResult.kotlinInterfaces
1140+
1141+
assertThat(interfaces.size).isEqualTo(1)
1142+
assertThat(interfaces[0].toString()).isEqualTo(
1143+
"""
1144+
|package com.netflix.graphql.dgs.codegen.tests.generated.types
1145+
|
1146+
|import com.fasterxml.jackson.`annotation`.JsonSubTypes
1147+
|import com.fasterxml.jackson.`annotation`.JsonTypeInfo
1148+
|import mypackage.Cat
1149+
|
1150+
|@JsonTypeInfo(
1151+
| use = JsonTypeInfo.Id.NAME,
1152+
| include = JsonTypeInfo.As.PROPERTY,
1153+
| property = "__typename",
1154+
|)
1155+
|@JsonSubTypes(value = [
1156+
| JsonSubTypes.Type(value = Cat::class, name = "Cat"),
1157+
| JsonSubTypes.Type(value = Dog::class, name = "Dog")
1158+
|])
1159+
|public interface Pet {
1160+
| public companion object
1161+
|}
1162+
|
1163+
""".trimMargin()
1164+
)
1165+
}
1166+
11171167
class MappedTypesTestCases : ArgumentsProvider {
11181168
override fun provideArguments(context: ExtensionContext): Stream<out Arguments> = of(
11191169
arguments("java.time.LocalDateTime", "java.time.LocalDateTime"),

0 commit comments

Comments
 (0)