Skip to content

Commit 9161bc9

Browse files
Fix import of typemapped types in generated union classes. (#657)
1 parent 506ad51 commit 9161bc9

File tree

3 files changed

+41
-5
lines changed

3 files changed

+41
-5
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
@@ -210,7 +210,7 @@ class CodeGen(private val config: CodeGenConfig) {
210210
.filterIsInstance<UnionTypeDefinition>()
211211
.excludeSchemaTypeExtension()
212212
.filter { config.generateDataTypes || config.generateInterfaces || it.name in requiredTypeCollector.requiredTypes }
213-
.map { UnionTypeGenerator(config).generate(it, findUnionExtensions(it.name, definitions)) }
213+
.map { UnionTypeGenerator(config, document).generate(it, findUnionExtensions(it.name, definitions)) }
214214
.fold(CodeGenResult()) { t: CodeGenResult, u: CodeGenResult -> t.merge(u) }
215215
}
216216

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

+10-4
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,17 @@ import com.netflix.graphql.dgs.codegen.shouldSkip
2424
import com.squareup.javapoet.ClassName
2525
import com.squareup.javapoet.JavaFile
2626
import com.squareup.javapoet.TypeSpec
27+
import graphql.language.Document
2728
import graphql.language.TypeName
2829
import graphql.language.UnionTypeDefinition
2930
import graphql.language.UnionTypeExtensionDefinition
3031
import javax.lang.model.element.Modifier
3132

32-
class UnionTypeGenerator(private val config: CodeGenConfig) {
33+
class UnionTypeGenerator(private val config: CodeGenConfig, private val document: Document) {
34+
35+
val packageName = config.packageNameTypes
36+
private val typeUtils = TypeUtils(packageName, config, document)
37+
3338
fun generate(definition: UnionTypeDefinition, extensions: List<UnionTypeExtensionDefinition>): CodeGenResult {
3439
if (definition.shouldSkip(config)) {
3540
return CodeGenResult()
@@ -41,7 +46,10 @@ class UnionTypeGenerator(private val config: CodeGenConfig) {
4146

4247
val memberTypes = definition.memberTypes.plus(extensions.flatMap { it.memberTypes }).asSequence()
4348
.filterIsInstance<TypeName>()
44-
.map { member -> ClassName.get(packageName, member.name) }
49+
.map { member ->
50+
typeUtils.findJavaInterfaceName(member.name, packageName)
51+
}
52+
.filterIsInstance<ClassName>()
4553
.toList()
4654

4755
if (memberTypes.isNotEmpty()) {
@@ -52,6 +60,4 @@ class UnionTypeGenerator(private val config: CodeGenConfig) {
5260
val javaFile = JavaFile.builder(packageName, javaType.build()).build()
5361
return CodeGenResult(javaInterfaces = listOf(javaFile))
5462
}
55-
56-
val packageName = config.packageNameTypes
5763
}

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

+30
Original file line numberDiff line numberDiff line change
@@ -4530,6 +4530,36 @@ It takes a title and such.
45304530
assertThat(dataTypes[1].typeSpec.superinterfaces[0].toString()).isEqualTo("java.lang.String")
45314531
}
45324532

4533+
@Test
4534+
fun `Supports typeMapping in union type generation`() {
4535+
val schema = """
4536+
type A {
4537+
name: String
4538+
}
4539+
4540+
type B {
4541+
count: Int
4542+
}
4543+
4544+
union C = A | B
4545+
""".trimIndent()
4546+
4547+
val result = CodeGen(
4548+
CodeGenConfig(
4549+
schemas = setOf(schema),
4550+
packageName = basePackageName,
4551+
typeMapping = mapOf(
4552+
"A" to "java.lang.String"
4553+
)
4554+
)
4555+
).generate()
4556+
4557+
assertThat(result.javaDataTypes.size).isEqualTo(1)
4558+
4559+
assertThat(result.javaDataTypes[0].typeSpec.superinterfaces[0].toString()).isEqualTo("com.netflix.graphql.dgs.codegen.tests.generated.types.C")
4560+
assertCompilesJava(result)
4561+
}
4562+
45334563
@Test
45344564
fun `The default value for Locale should be overridden and wrapped`() {
45354565
val schema = """

0 commit comments

Comments
 (0)