Skip to content

Commit 8d2dc23

Browse files
feat(#389): allow templating for generated Java / Kotlin class names
Adds an optional `nameTemplate` input parameter to the plugin, allowing customization of the generated Java / Kotlin class names. The following template variables are supported: - name - the original name of the class - schemaType - the GraphQL schema type (Type, Input, Interface, Enum) The default value for this new property is null. In this case the output will be identical to the current one. Examples: Given an original class name `Person` and schema type `Type`: - null -> Person - "{name}GraphQL{schemaType}" -> PersonGraphQLType - "{name}GraphQL" -> PersonGraphQL - "{name}{schemaType}" -> PersonType
1 parent 506ad51 commit 8d2dc23

24 files changed

+448
-35
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -505,7 +505,8 @@ class CodeGenConfig(
505505
var javaGenerateAllConstructor: Boolean = true,
506506
var implementSerializable: Boolean = false,
507507
var addGeneratedAnnotation: Boolean = false,
508-
var addDeprecatedAnnotation: Boolean = false
508+
var addDeprecatedAnnotation: Boolean = false,
509+
var nameTemplate: String? = null
509510
) {
510511
val packageNameClient: String = "$packageName.$subPackageNameClient"
511512

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

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,39 @@
1818

1919
package com.netflix.graphql.dgs.codegen.generators.java
2020

21-
import com.netflix.graphql.dgs.codegen.*
21+
import com.netflix.graphql.dgs.codegen.CodeGenConfig
22+
import com.netflix.graphql.dgs.codegen.CodeGenResult
23+
import com.netflix.graphql.dgs.codegen.filterSkipped
24+
import com.netflix.graphql.dgs.codegen.generators.shared.CodeGeneratorUtils.templatedClassName
2225
import com.netflix.graphql.dgs.codegen.generators.shared.SiteTarget
2326
import com.netflix.graphql.dgs.codegen.generators.shared.applyDirectivesJava
24-
import com.squareup.javapoet.*
25-
import graphql.language.*
27+
import com.netflix.graphql.dgs.codegen.shouldSkip
28+
import com.squareup.javapoet.ClassName
29+
import com.squareup.javapoet.CodeBlock
30+
import com.squareup.javapoet.FieldSpec
31+
import com.squareup.javapoet.JavaFile
32+
import com.squareup.javapoet.MethodSpec
33+
import com.squareup.javapoet.ParameterSpec
34+
import com.squareup.javapoet.TypeSpec
35+
import graphql.language.ArrayValue
36+
import graphql.language.BooleanValue
37+
import graphql.language.Description
38+
import graphql.language.Directive
39+
import graphql.language.Document
40+
import graphql.language.EnumValue
41+
import graphql.language.FloatValue
42+
import graphql.language.InputObjectTypeDefinition
43+
import graphql.language.InputObjectTypeExtensionDefinition
44+
import graphql.language.IntValue
45+
import graphql.language.InterfaceTypeDefinition
46+
import graphql.language.ListType
47+
import graphql.language.ObjectTypeDefinition
48+
import graphql.language.ObjectTypeExtensionDefinition
49+
import graphql.language.ObjectValue
50+
import graphql.language.StringValue
51+
import graphql.language.Type
2652
import graphql.language.TypeName
53+
import graphql.language.UnionTypeDefinition
2754
import org.slf4j.Logger
2855
import org.slf4j.LoggerFactory
2956
import java.io.Serializable
@@ -39,7 +66,7 @@ class DataTypeGenerator(config: CodeGenConfig, document: Document) : BaseDataTyp
3966

4067
logger.info("Generating data type ${definition.name}")
4168

42-
val name = definition.name
69+
val name = definition.templatedClassName(config.nameTemplate)
4370
val unionTypes = document.getDefinitionsOfType(UnionTypeDefinition::class.java).filter { union ->
4471
union.memberTypes.asSequence().map { it as TypeName }.any { it.name == name }
4572
}.map { it.name }
@@ -120,7 +147,7 @@ class InputTypeGenerator(config: CodeGenConfig, document: Document) : BaseDataTy
120147

121148
logger.info("Generating input type ${definition.name}")
122149

123-
val name = definition.name
150+
val name = definition.templatedClassName(config.nameTemplate)
124151
val fieldDefinitions = definition.inputValueDefinitions.map {
125152
val defaultValue = it.defaultValue?.let { defVal ->
126153
when (defVal) {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ package com.netflix.graphql.dgs.codegen.generators.java
2020

2121
import com.netflix.graphql.dgs.codegen.CodeGenConfig
2222
import com.netflix.graphql.dgs.codegen.CodeGenResult
23+
import com.netflix.graphql.dgs.codegen.generators.shared.CodeGeneratorUtils.templatedClassName
2324
import com.netflix.graphql.dgs.codegen.generators.shared.SiteTarget
2425
import com.netflix.graphql.dgs.codegen.generators.shared.applyDirectivesJava
2526
import com.netflix.graphql.dgs.codegen.shouldSkip
@@ -42,7 +43,7 @@ class EnumTypeGenerator(private val config: CodeGenConfig) {
4243

4344
val javaType =
4445
TypeSpec
45-
.enumBuilder(definition.name)
46+
.enumBuilder(definition.templatedClassName(config.nameTemplate))
4647
.addModifiers(Modifier.PUBLIC)
4748
.addOptionalGeneratedAnnotation(config)
4849

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,18 @@ import com.netflix.graphql.dgs.codegen.CodeGenConfig
2222
import com.netflix.graphql.dgs.codegen.CodeGenResult
2323
import com.netflix.graphql.dgs.codegen.filterSkipped
2424
import com.netflix.graphql.dgs.codegen.generators.shared.CodeGeneratorUtils.capitalized
25+
import com.netflix.graphql.dgs.codegen.generators.shared.CodeGeneratorUtils.templatedClassName
2526
import com.netflix.graphql.dgs.codegen.shouldSkip
2627
import com.squareup.javapoet.ClassName
2728
import com.squareup.javapoet.JavaFile
2829
import com.squareup.javapoet.MethodSpec
2930
import com.squareup.javapoet.TypeSpec
30-
import graphql.language.*
31+
import graphql.language.Document
32+
import graphql.language.FieldDefinition
33+
import graphql.language.InterfaceTypeDefinition
34+
import graphql.language.InterfaceTypeExtensionDefinition
35+
import graphql.language.ObjectTypeDefinition
36+
import graphql.language.TypeName
3137
import org.slf4j.Logger
3238
import org.slf4j.LoggerFactory
3339
import javax.lang.model.element.Modifier
@@ -48,7 +54,7 @@ class InterfaceGenerator(private val config: CodeGenConfig, private val document
4854
}
4955

5056
logger.info("Generating type ${definition.name}")
51-
val javaType = TypeSpec.interfaceBuilder(definition.name)
57+
val javaType = TypeSpec.interfaceBuilder(definition.templatedClassName(config.nameTemplate))
5258
.addOptionalGeneratedAnnotation(config)
5359
.addModifiers(Modifier.PUBLIC)
5460

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import com.netflix.graphql.dgs.codegen.CodeGenConfig
2222
import com.netflix.graphql.dgs.codegen.CodeGenResult
2323
import com.netflix.graphql.dgs.codegen.filterSkipped
2424
import com.netflix.graphql.dgs.codegen.generators.java.InputTypeGenerator
25+
import com.netflix.graphql.dgs.codegen.generators.shared.CodeGeneratorUtils.templatedClassName
2526
import com.netflix.graphql.dgs.codegen.generators.shared.applyDirectivesKotlin
2627
import com.netflix.graphql.dgs.codegen.shouldSkip
2728
import com.squareup.kotlinpoet.BOOLEAN
@@ -67,7 +68,7 @@ class KotlinDataTypeGenerator(config: CodeGenConfig, document: Document) :
6768
.filterSkipped()
6869
.map { Field(it.name, typeUtils.findReturnType(it.type), typeUtils.isNullable(it.type), null, it.description, it.directives) }
6970
val interfaces = definition.implements
70-
return generate(definition.name, fields, interfaces, document, definition.description, definition.directives)
71+
return generate(definition.templatedClassName(config.nameTemplate), fields, interfaces, document, definition.description, definition.directives)
7172
}
7273
}
7374

@@ -94,7 +95,7 @@ class KotlinInputTypeGenerator(config: CodeGenConfig, document: Document) :
9495
}
9596
)
9697
val interfaces = emptyList<Type<*>>()
97-
return generate(definition.name, fields, interfaces, document, definition.description, definition.directives)
98+
return generate(definition.templatedClassName(config.nameTemplate), fields, interfaces, document, definition.description, definition.directives)
9899
}
99100

100101
private fun generateCode(value: Value<Value<*>>, type: KtTypeName): CodeBlock =

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import com.netflix.graphql.dgs.codegen.CodeGenConfig
2222
import com.netflix.graphql.dgs.codegen.CodeGenResult
2323
import com.netflix.graphql.dgs.codegen.generators.java.EnumTypeGenerator
2424
import com.netflix.graphql.dgs.codegen.generators.java.ReservedKeywordSanitizer
25+
import com.netflix.graphql.dgs.codegen.generators.shared.CodeGeneratorUtils.templatedClassName
2526
import com.netflix.graphql.dgs.codegen.generators.shared.applyDirectivesKotlin
2627
import com.netflix.graphql.dgs.codegen.shouldSkip
2728
import com.squareup.kotlinpoet.FileSpec
@@ -41,7 +42,7 @@ class KotlinEnumTypeGenerator(private val config: CodeGenConfig) {
4142

4243
logger.info("Generating enum type ${definition.name}")
4344

44-
val kotlinType = TypeSpec.classBuilder(definition.name)
45+
val kotlinType = TypeSpec.classBuilder(definition.templatedClassName(config.nameTemplate))
4546
.addOptionalGeneratedAnnotation(config)
4647
.addModifiers(KModifier.ENUM)
4748

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ package com.netflix.graphql.dgs.codegen.generators.kotlin
2020

2121
import com.netflix.graphql.dgs.codegen.CodeGenConfig
2222
import com.netflix.graphql.dgs.codegen.CodeGenResult
23+
import com.netflix.graphql.dgs.codegen.generators.shared.CodeGeneratorUtils.templatedClassName
2324
import com.netflix.graphql.dgs.codegen.shouldSkip
2425
import com.squareup.kotlinpoet.*
2526
import graphql.language.*
@@ -46,7 +47,7 @@ class KotlinInterfaceTypeGenerator(private val config: CodeGenConfig, private va
4647

4748
logger.info("Generating type {}", definition.name)
4849

49-
val interfaceBuilder = TypeSpec.interfaceBuilder(definition.name)
50+
val interfaceBuilder = TypeSpec.interfaceBuilder(definition.templatedClassName(config.nameTemplate))
5051
.addOptionalGeneratedAnnotation(config)
5152
if (definition.description != null) {
5253
interfaceBuilder.addKdoc("%L", definition.description.sanitizeKdoc())

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import com.netflix.graphql.dgs.codegen.generators.kotlin.sanitizeKdoc
3333
import com.netflix.graphql.dgs.codegen.generators.kotlin.suppressInapplicableJvmNameAnnotation
3434
import com.netflix.graphql.dgs.codegen.generators.kotlin.toKtTypeName
3535
import com.netflix.graphql.dgs.codegen.generators.shared.CodeGeneratorUtils.capitalized
36+
import com.netflix.graphql.dgs.codegen.generators.shared.CodeGeneratorUtils.templatedClassName
3637
import com.netflix.graphql.dgs.codegen.generators.shared.SchemaExtensionsUtils.findTypeExtensions
3738
import com.netflix.graphql.dgs.codegen.generators.shared.excludeSchemaTypeExtension
3839
import com.netflix.graphql.dgs.codegen.shouldSkip
@@ -166,7 +167,7 @@ fun generateKotlin2DataTypes(
166167
.build()
167168

168169
// create the data class
169-
val typeSpec = TypeSpec.classBuilder(typeDefinition.name)
170+
val typeSpec = TypeSpec.classBuilder(typeDefinition.templatedClassName(config.nameTemplate))
170171
.addOptionalGeneratedAnnotation(config)
171172
// add docs if available
172173
.apply {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import com.netflix.graphql.dgs.codegen.CodeGenConfig
2222
import com.netflix.graphql.dgs.codegen.generators.kotlin.addEnumConstants
2323
import com.netflix.graphql.dgs.codegen.generators.kotlin.addOptionalGeneratedAnnotation
2424
import com.netflix.graphql.dgs.codegen.generators.kotlin.sanitizeKdoc
25+
import com.netflix.graphql.dgs.codegen.generators.shared.CodeGeneratorUtils.templatedClassName
2526
import com.netflix.graphql.dgs.codegen.generators.shared.SchemaExtensionsUtils.findEnumExtensions
2627
import com.netflix.graphql.dgs.codegen.generators.shared.applyDirectivesKotlin
2728
import com.netflix.graphql.dgs.codegen.generators.shared.excludeSchemaTypeExtension
@@ -55,7 +56,7 @@ fun generateKotlin2EnumTypes(
5556
.flatMap { it.enumValueDefinitions }
5657

5758
// create the enum class
58-
val enumSpec = TypeSpec.classBuilder(enumDefinition.name)
59+
val enumSpec = TypeSpec.classBuilder(enumDefinition.templatedClassName(config.nameTemplate))
5960
.addOptionalGeneratedAnnotation(config)
6061
.addModifiers(KModifier.ENUM)
6162
// add docs if available

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import com.netflix.graphql.dgs.codegen.GraphQLInput
2323
import com.netflix.graphql.dgs.codegen.generators.kotlin.ReservedKeywordFilter
2424
import com.netflix.graphql.dgs.codegen.generators.kotlin.addOptionalGeneratedAnnotation
2525
import com.netflix.graphql.dgs.codegen.generators.kotlin.sanitizeKdoc
26+
import com.netflix.graphql.dgs.codegen.generators.shared.CodeGeneratorUtils.templatedClassName
2627
import com.netflix.graphql.dgs.codegen.generators.shared.SchemaExtensionsUtils.findInputExtensions
2728
import com.netflix.graphql.dgs.codegen.generators.shared.excludeSchemaTypeExtension
2829
import com.netflix.graphql.dgs.codegen.shouldSkip
@@ -70,7 +71,7 @@ fun generateKotlin2InputTypes(
7071
val typeName = ClassName(config.packageNameTypes, inputDefinition.name)
7172

7273
// create the input class
73-
val typeSpec = TypeSpec.classBuilder(typeName)
74+
val typeSpec = TypeSpec.classBuilder(inputDefinition.templatedClassName(config.nameTemplate))
7475
.addOptionalGeneratedAnnotation(config)
7576
// add docs if available
7677
.apply {

0 commit comments

Comments
 (0)