Skip to content

Commit 4cd0b11

Browse files
Merge pull request #519 from Netflix/fix-constructor
Fix constructor
2 parents c2f7376 + 3b66fdd commit 4cd0b11

File tree

6 files changed

+127
-8
lines changed

6 files changed

+127
-8
lines changed

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

+1
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,7 @@ data class CodeGenConfig(
470470
/** If enabled, the names of the classes available via the DgsConstant class will be snake cased.*/
471471
val snakeCaseConstantNames: Boolean = false,
472472
val generateInterfaceSetters: Boolean = true,
473+
val generateInterfaceMethodsForInterfaceFields: Boolean = false,
473474
val includeImports: Map<String, String> = emptyMap(),
474475
val includeEnumImports: Map<String, Map<String, String>> = emptyMap(),
475476
val includeClassImports: Map<String, Map<String, String>> = emptyMap(),

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ class DataTypeGenerator(config: CodeGenConfig, document: Document) : BaseDataTyp
8787
.map {
8888
Field(
8989
it.name,
90-
typeUtils.findReturnType(it.type, useInterfaceType),
90+
typeUtils.findReturnType(it.type, useInterfaceType, true),
9191
overrideGetter = overrideGetter,
9292
description = it.description,
9393
directives = it.directives
@@ -97,7 +97,7 @@ class DataTypeGenerator(config: CodeGenConfig, document: Document) : BaseDataTyp
9797
extensions.flatMap { it.fieldDefinitions }.filterSkipped().map {
9898
Field(
9999
it.name,
100-
typeUtils.findReturnType(it.type, useInterfaceType),
100+
typeUtils.findReturnType(it.type, useInterfaceType, true),
101101
overrideGetter = overrideGetter,
102102
description = it.description,
103103
directives = it.directives

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class InterfaceGenerator(private val config: CodeGenConfig, private val document
8181
// implementation classes. This is not an issue if the overridden field has the same base type,
8282
// however.
8383
// Ref: https://github.com/graphql/graphql-js/issues/776
84-
if (!isFieldAnInterface(it)) {
84+
if (!isFieldAnInterface(it) || config.generateInterfaceMethodsForInterfaceFields) {
8585
addInterfaceMethod(it, javaType)
8686
}
8787
}
@@ -110,7 +110,7 @@ class InterfaceGenerator(private val config: CodeGenConfig, private val document
110110
}
111111

112112
private fun addInterfaceMethod(fieldDefinition: FieldDefinition, javaType: TypeSpec.Builder) {
113-
val returnType = typeUtils.findReturnType(fieldDefinition.type, useInterfaceType)
113+
val returnType = typeUtils.findReturnType(fieldDefinition.type, useInterfaceType, true)
114114

115115
val fieldName = fieldDefinition.name
116116
val getterBuilder = MethodSpec.methodBuilder(typeUtils.transformIfDefaultClassMethodExists("get${fieldName.capitalized()}", TypeUtils.Companion.getClass))

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ class TypeUtils(private val packageName: String, private val config: CodeGenConf
7474
if (useWildcardType) {
7575
if (typeName is ClassName) {
7676
if (document.definitions.filterIsInstance<ObjectTypeDefinition>()
77-
.any { e -> "I${e.name}" == typeName.simpleName() }
77+
.any { e -> "I${e.name}" == typeName.simpleName() } || (config.generateInterfaces && document.definitions.filterIsInstance<InterfaceTypeDefinition>().any { e -> "${e.name}" == typeName.simpleName() })
7878
) {
7979
canUseWildcardType = true
8080
}

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

+117-1
Original file line numberDiff line numberDiff line change
@@ -2416,6 +2416,121 @@ class CodeGenTest {
24162416
assertCompilesJava(dataTypes + interfaces)
24172417
}
24182418

2419+
@Test
2420+
fun generateInterfaceMethodsForInterfaceFields() {
2421+
val schema = """
2422+
interface Fruit {
2423+
seeds: [Seed]
2424+
}
2425+
2426+
interface FruitCategory {
2427+
color: String
2428+
fruit: Fruit
2429+
}
2430+
2431+
type Apple implements Fruit {
2432+
seeds: [Seed]
2433+
}
2434+
2435+
type Seed {
2436+
shape: String
2437+
}
2438+
""".trimIndent()
2439+
2440+
val result = CodeGen(
2441+
CodeGenConfig(
2442+
schemas = setOf(schema),
2443+
packageName = basePackageName,
2444+
generateInterfaceMethodsForInterfaceFields = true
2445+
)
2446+
).generate()
2447+
2448+
val interfaces = result.javaInterfaces
2449+
val dataTypes = result.javaDataTypes
2450+
2451+
val fruit = interfaces[0]
2452+
assertThat(fruit.typeSpec.name).isEqualTo("Fruit")
2453+
assertThat(fruit.typeSpec.fieldSpecs).isEmpty()
2454+
assertThat(fruit.typeSpec.methodSpecs.size).isEqualTo(2)
2455+
assertThat(fruit.typeSpec.methodSpecs[0].name).isEqualTo("getSeeds")
2456+
assertThat(fruit.typeSpec.methodSpecs[1].name).isEqualTo("setSeeds")
2457+
2458+
val category = interfaces[1]
2459+
assertThat(category.typeSpec.name).isEqualTo("FruitCategory")
2460+
assertThat(category.typeSpec.fieldSpecs).isEmpty()
2461+
assertThat(category.typeSpec.methodSpecs.size).isEqualTo(4)
2462+
assertThat(category.typeSpec.methodSpecs[0].name).isEqualTo("getColor")
2463+
assertThat(category.typeSpec.methodSpecs[1].name).isEqualTo("setColor")
2464+
assertThat(category.typeSpec.methodSpecs[2].name).isEqualTo("getFruit")
2465+
assertThat(category.typeSpec.methodSpecs[3].name).isEqualTo("setFruit")
2466+
2467+
assertCompilesJava(dataTypes + interfaces)
2468+
}
2469+
2470+
@Test
2471+
fun generateInterfacesWithMethodsForInterfaceFields() {
2472+
val schema = """
2473+
interface Fruit {
2474+
seeds: [Seed]
2475+
}
2476+
2477+
interface FruitCategory {
2478+
color: String
2479+
fruit: Fruit
2480+
}
2481+
2482+
type Apple implements Fruit {
2483+
seeds: [Seed]
2484+
}
2485+
2486+
type Seed {
2487+
shape: String
2488+
}
2489+
""".trimIndent()
2490+
2491+
val result = CodeGen(
2492+
CodeGenConfig(
2493+
schemas = setOf(schema),
2494+
packageName = basePackageName,
2495+
generateInterfaceMethodsForInterfaceFields = true,
2496+
generateInterfaces = true
2497+
)
2498+
).generate()
2499+
2500+
val interfaces = result.javaInterfaces
2501+
val dataTypes = result.javaDataTypes
2502+
2503+
val iapple = interfaces[0]
2504+
assertThat(iapple.typeSpec.name).isEqualTo("IApple")
2505+
2506+
val iseed = interfaces[1]
2507+
assertThat(iseed.typeSpec.name).isEqualTo("ISeed")
2508+
assertThat(iseed.typeSpec.fieldSpecs).isEmpty()
2509+
assertThat(iseed.typeSpec.methodSpecs.size).isEqualTo(1)
2510+
assertThat(iseed.typeSpec.methodSpecs[0].name).isEqualTo("getShape")
2511+
2512+
val fruit = interfaces[2]
2513+
assertThat(fruit.typeSpec.name).isEqualTo("Fruit")
2514+
assertThat(fruit.typeSpec.fieldSpecs).isEmpty()
2515+
assertThat(fruit.typeSpec.methodSpecs.size).isEqualTo(2)
2516+
assertThat(fruit.typeSpec.methodSpecs[0].name).isEqualTo("getSeeds")
2517+
val parameterizedTypeName = fruit.typeSpec.methodSpecs[0].returnType as ParameterizedTypeName
2518+
val wildcardTypeName = parameterizedTypeName.typeArguments[0] as WildcardTypeName
2519+
assertThat(wildcardTypeName.upperBounds[0]).extracting("simpleName").isEqualTo("ISeed")
2520+
assertThat(fruit.typeSpec.methodSpecs[1].name).isEqualTo("setSeeds")
2521+
2522+
val category = interfaces[3]
2523+
assertThat(category.typeSpec.name).isEqualTo("FruitCategory")
2524+
assertThat(category.typeSpec.fieldSpecs).isEmpty()
2525+
assertThat(category.typeSpec.methodSpecs.size).isEqualTo(4)
2526+
assertThat(category.typeSpec.methodSpecs[0].name).isEqualTo("getColor")
2527+
assertThat(category.typeSpec.methodSpecs[1].name).isEqualTo("setColor")
2528+
assertThat(category.typeSpec.methodSpecs[2].name).isEqualTo("getFruit")
2529+
assertThat(category.typeSpec.methodSpecs[3].name).isEqualTo("setFruit")
2530+
2531+
assertCompilesJava(dataTypes + interfaces)
2532+
}
2533+
24192534
@Test
24202535
fun generateObjectTypeInterfaceWithInterfaceInheritance() {
24212536
val schema = """
@@ -2669,7 +2784,8 @@ class CodeGenTest {
26692784
assertThat(moviePage.typeSpec.fieldSpecs).extracting("name").containsExactly("items")
26702785
parameterizedTypeName = moviePage.typeSpec.fieldSpecs[0].type as ParameterizedTypeName
26712786
assertThat(parameterizedTypeName.rawType).extracting("simpleName").isEqualTo("List")
2672-
assertThat(parameterizedTypeName.typeArguments[0]).extracting("simpleName").isEqualTo("IMovie")
2787+
val movieTypeName = parameterizedTypeName.typeArguments[0] as WildcardTypeName
2788+
assertThat(movieTypeName.upperBounds[0]).extracting("simpleName").isEqualTo("IMovie")
26732789

26742790
val genre = dataTypes[2]
26752791
assertThat(genre.typeSpec.name).isEqualTo("Genre")

graphql-dgs-codegen-gradle/src/main/kotlin/com/netflix/graphql/dgs/codegen/gradle/GenerateJavaTask.kt

+4-2
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,10 @@ import java.io.File
2828
import java.nio.file.Paths
2929
import java.util.*
3030

31-
@CacheableTask
3231
open class GenerateJavaTask : DefaultTask() {
3332
@Input
3433
var generatedSourcesDir: String = project.buildDir.absolutePath
3534

36-
@PathSensitive(PathSensitivity.RELATIVE)
3735
@InputFiles
3836
var schemaPaths = mutableListOf<Any>("${project.projectDir}/src/main/resources/schema")
3937

@@ -83,6 +81,9 @@ open class GenerateJavaTask : DefaultTask() {
8381
@Input
8482
var generateInterfaceSetters = true
8583

84+
@Input
85+
var generateInterfaceMethodsForInterfaceFields = false
86+
8687
@Input
8788
var implementSerializable = false
8889

@@ -181,6 +182,7 @@ open class GenerateJavaTask : DefaultTask() {
181182
generateKotlinClosureProjections = generateKotlinClosureProjections,
182183
generateInterfaces = generateInterfaces,
183184
generateInterfaceSetters = generateInterfaceSetters,
185+
generateInterfaceMethodsForInterfaceFields = generateInterfaceMethodsForInterfaceFields,
184186
typeMapping = typeMapping,
185187
includeQueries = includeQueries.toSet(),
186188
includeMutations = includeMutations.toSet(),

0 commit comments

Comments
 (0)