Skip to content

Commit 76679a6

Browse files
authored
Merge pull request #725 from Netflix/codegen-result-singleton
Create singleton empty CodeGenResult instance
2 parents 48fb9ad + 10bfc60 commit 76679a6

16 files changed

+236
-238
lines changed

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

+102-138
Large diffs are not rendered by default.

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,11 @@ object EntitiesRepresentationTypeGeneratorUtils {
4141
representationGenerator: RepresentationGenerator
4242
): CodeGenResult {
4343
if (config.skipEntityQueries) {
44-
return CodeGenResult()
44+
return CodeGenResult.EMPTY
4545
}
4646
val representationName = toRepresentationName(definition)
4747
if (representationName in generatedRepresentations) {
48-
return CodeGenResult()
48+
return CodeGenResult.EMPTY
4949
}
5050

5151
val directiveArg =

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

+16-17
Original file line numberDiff line numberDiff line change
@@ -37,24 +37,23 @@ class ClientApiGenerator(private val config: CodeGenConfig, private val document
3737

3838
val rootProjection =
3939
it.type.findTypeDefinition(document, true)?.let { typeDefinition -> createRootProjection(typeDefinition, it.name.capitalized()) }
40-
?: CodeGenResult()
40+
?: CodeGenResult.EMPTY
4141
CodeGenResult(javaQueryTypes = listOf(javaFile)).merge(rootProjection)
42-
}.fold(CodeGenResult()) { total, current -> total.merge(current) }
42+
}.fold(CodeGenResult.EMPTY) { total, current -> total.merge(current) }
4343
}
4444

4545
fun generateEntities(definitions: List<ObjectTypeDefinition>): CodeGenResult {
4646
if (config.skipEntityQueries) {
47-
return CodeGenResult()
47+
return CodeGenResult.EMPTY
4848
}
4949

50-
var entitiesRootProjection = CodeGenResult()
5150
// generate for federation types, if present
5251
val federatedTypes = definitions.filter { it.hasDirective("key") }
5352
if (federatedTypes.isNotEmpty()) {
5453
// create entities root projection
55-
entitiesRootProjection = createEntitiesRootProjection(federatedTypes)
54+
return createEntitiesRootProjection(federatedTypes)
5655
}
57-
return CodeGenResult().merge(entitiesRootProjection)
56+
return CodeGenResult.EMPTY
5857
}
5958

6059
private fun createQueryClass(it: FieldDefinition, operation: String, methodNames: MutableSet<String>): JavaFile {
@@ -262,7 +261,7 @@ class ClientApiGenerator(private val config: CodeGenConfig, private val document
262261
.build()
263262
)
264263

265-
if (generatedClasses.contains(clazzName)) return CodeGenResult() else generatedClasses.add(clazzName)
264+
if (generatedClasses.contains(clazzName)) return CodeGenResult.EMPTY else generatedClasses.add(clazzName)
266265

267266
val fieldDefinitions = type.fieldDefinitions() + document.definitions.filterIsInstance<ObjectTypeExtensionDefinition>().filter { it.name == type.name }.flatMap { it.fieldDefinitions }
268267

@@ -309,7 +308,7 @@ class ClientApiGenerator(private val config: CodeGenConfig, private val document
309308
1
310309
)
311310
}
312-
.fold(CodeGenResult()) { total, current -> total.merge(current) }
311+
.fold(CodeGenResult.EMPTY) { total, current -> total.merge(current) }
313312

314313
fieldDefinitions.filterSkipped().forEach {
315314
val objectTypeDefinition = it.type.findTypeDefinition(document)
@@ -391,7 +390,7 @@ class ClientApiGenerator(private val config: CodeGenConfig, private val document
391390
.build()
392391
)
393392

394-
if (generatedClasses.contains(clazzName)) return CodeGenResult() else generatedClasses.add(clazzName)
393+
if (generatedClasses.contains(clazzName)) return CodeGenResult.EMPTY else generatedClasses.add(clazzName)
395394

396395
val codeGenResult = federatedTypes.map { objTypeDef ->
397396
val projectionName = "Entities${objTypeDef.name.capitalized()}KeyProjection"
@@ -411,7 +410,7 @@ class ClientApiGenerator(private val config: CodeGenConfig, private val document
411410
)
412411
val processedEdges = mutableSetOf<Pair<String, String>>()
413412
createFragment(objTypeDef, javaType.build(), javaType.build(), "Entities${objTypeDef.name.capitalized()}Key", processedEdges, 0)
414-
}.fold(CodeGenResult()) { total, current -> total.merge(current) }
413+
}.fold(CodeGenResult.EMPTY) { total, current -> total.merge(current) }
415414

416415
val javaFile = JavaFile.builder(getPackageName(), javaType.build()).build()
417416
return CodeGenResult(clientProjections = listOf(javaFile)).merge(codeGenResult)
@@ -424,9 +423,9 @@ class ClientApiGenerator(private val config: CodeGenConfig, private val document
424423
}
425424
concreteTypes.map {
426425
addFragmentProjectionMethod(javaType, root, prefix, it, processedEdges, queryDepth)
427-
}.fold(CodeGenResult()) { total, current -> total.merge(current) }
426+
}.fold(CodeGenResult.EMPTY) { total, current -> total.merge(current) }
428427
} else {
429-
CodeGenResult()
428+
CodeGenResult.EMPTY
430429
}
431430
}
432431

@@ -435,9 +434,9 @@ class ClientApiGenerator(private val config: CodeGenConfig, private val document
435434
val memberTypes = type.memberTypes.mapNotNull { it.findTypeDefinition(document, true) }.toList()
436435
memberTypes.map {
437436
addFragmentProjectionMethod(javaType, rootType, prefix, it, processedEdges, queryDepth)
438-
}.fold(CodeGenResult()) { total, current -> total.merge(current) }
437+
}.fold(CodeGenResult.EMPTY) { total, current -> total.merge(current) }
439438
} else {
440-
CodeGenResult()
439+
CodeGenResult.EMPTY
441440
}
442441
}
443442

@@ -467,7 +466,7 @@ class ClientApiGenerator(private val config: CodeGenConfig, private val document
467466

468467
private fun createFragment(type: ObjectTypeDefinition, parent: TypeSpec, root: TypeSpec, prefix: String, processedEdges: Set<Pair<String, String>>, queryDepth: Int): CodeGenResult {
469468
val subProjection = createSubProjectionType(type, parent, root, prefix, processedEdges, queryDepth)
470-
?: return CodeGenResult()
469+
?: return CodeGenResult.EMPTY
471470
val javaType = subProjection.first
472471
val codeGenResult = subProjection.second
473472

@@ -510,7 +509,7 @@ class ClientApiGenerator(private val config: CodeGenConfig, private val document
510509

511510
private fun createSubProjection(type: TypeDefinition<*>, parent: TypeSpec, root: TypeSpec, prefix: String, processedEdges: Set<Pair<String, String>>, queryDepth: Int): CodeGenResult {
512511
val subProjection = createSubProjectionType(type, parent, root, prefix, processedEdges, queryDepth)
513-
?: return CodeGenResult()
512+
?: return CodeGenResult.EMPTY
514513
val javaType = subProjection.first
515514
val codeGenResult = subProjection.second
516515

@@ -601,7 +600,7 @@ class ClientApiGenerator(private val config: CodeGenConfig, private val document
601600
queryDepth + 1
602601
)
603602
}
604-
.fold(CodeGenResult()) { total, current -> total.merge(current) }
603+
.fold(CodeGenResult.EMPTY) { total, current -> total.merge(current) }
605604

606605
fieldDefinitions
607606
.filterSkipped()

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

+54-18
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ import com.netflix.graphql.dgs.codegen.generators.shared.SchemaExtensionsUtils.f
2626
import com.netflix.graphql.dgs.codegen.generators.shared.SchemaExtensionsUtils.findInterfaceExtensions
2727
import com.netflix.graphql.dgs.codegen.generators.shared.SchemaExtensionsUtils.findTypeExtensions
2828
import com.netflix.graphql.dgs.codegen.generators.shared.excludeSchemaTypeExtension
29+
import com.squareup.javapoet.ClassName
2930
import com.squareup.javapoet.FieldSpec
3031
import com.squareup.javapoet.JavaFile
31-
import com.squareup.javapoet.TypeName
3232
import com.squareup.javapoet.TypeSpec
3333
import graphql.language.*
3434
import javax.lang.model.element.Modifier
@@ -48,7 +48,11 @@ class ConstantsGenerator(private val config: CodeGenConfig, private val document
4848
val extensions = findTypeExtensions(it.name, document.definitions)
4949
val fields = it.fieldDefinitions + extensions.flatMap { ext -> ext.fieldDefinitions }
5050

51-
constantsType.addField(FieldSpec.builder(TypeName.get(String::class.java), "TYPE_NAME").addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).initializer(""""${it.name}"""").build())
51+
constantsType.addField(
52+
FieldSpec.builder(ClassName.get(String::class.java), "TYPE_NAME")
53+
.addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
54+
.initializer("\$S", it.name).build()
55+
)
5256

5357
fields.forEach { field ->
5458
addFieldNameConstant(constantsType, field.name)
@@ -63,13 +67,21 @@ class ConstantsGenerator(private val config: CodeGenConfig, private val document
6367
.excludeSchemaTypeExtension()
6468
.forEach {
6569
val constantsType = createConstantTypeBuilder(config, it.name)
66-
constantsType.addField(FieldSpec.builder(TypeName.get(String::class.java), "TYPE_NAME").addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).initializer(""""${it.name}"""").build())
70+
constantsType.addField(
71+
FieldSpec.builder(ClassName.get(String::class.java), "TYPE_NAME")
72+
.addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
73+
.initializer("\$S", it.name).build()
74+
)
75+
76+
for (definition in it.inputValueDefinitions) {
77+
addFieldNameConstant(constantsType, definition.name)
78+
}
6779

6880
val extensions = findInputExtensions(it.name, document.definitions)
69-
val fields = it.inputValueDefinitions + extensions.flatMap { ext -> ext.inputValueDefinitions }
70-
71-
fields.forEach { field ->
72-
addFieldNameConstant(constantsType, field.name)
81+
for (extension in extensions) {
82+
for (definition in extension.inputValueDefinitions) {
83+
addFieldNameConstant(constantsType, definition.name)
84+
}
7385
}
7486

7587
javaType.addType(constantsType.build())
@@ -81,13 +93,21 @@ class ConstantsGenerator(private val config: CodeGenConfig, private val document
8193
.forEach {
8294
val constantsType = createConstantTypeBuilder(config, it.name)
8395

84-
constantsType.addField(FieldSpec.builder(TypeName.get(String::class.java), "TYPE_NAME").addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).initializer(""""${it.name}"""").build())
96+
constantsType.addField(
97+
FieldSpec.builder(ClassName.get(String::class.java), "TYPE_NAME")
98+
.addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
99+
.initializer("\$S", it.name).build()
100+
)
85101

86-
val extensions = findInterfaceExtensions(it.name, document.definitions)
87-
val merged = it.fieldDefinitions + extensions.flatMap { ext -> ext.fieldDefinitions }
102+
for (definition in it.fieldDefinitions) {
103+
addFieldNameConstant(constantsType, definition.name)
104+
}
88105

89-
merged.forEach { field ->
90-
addFieldNameConstant(constantsType, field.name)
106+
val extensions = findInterfaceExtensions(it.name, document.definitions)
107+
for (extension in extensions) {
108+
for (definition in extension.fieldDefinitions) {
109+
addFieldNameConstant(constantsType, definition.name)
110+
}
91111
}
92112

93113
javaType.addType(constantsType.build())
@@ -98,17 +118,33 @@ class ConstantsGenerator(private val config: CodeGenConfig, private val document
98118
.excludeSchemaTypeExtension()
99119
.forEach {
100120
val constantsType = createConstantTypeBuilder(config, it.name)
101-
constantsType.addField(FieldSpec.builder(TypeName.get(String::class.java), "TYPE_NAME").addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).initializer(""""${it.name}"""").build())
121+
constantsType.addField(
122+
FieldSpec.builder(ClassName.get(String::class.java), "TYPE_NAME")
123+
.addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
124+
.initializer("\$S", it.name).build()
125+
)
102126
}
103127

104128
if (document.definitions.any { it is ObjectTypeDefinition && it.name == "Query" }) {
105-
javaType.addField(FieldSpec.builder(TypeName.get(String::class.java), "QUERY_TYPE").addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).initializer(""""Query"""").build())
129+
javaType.addField(
130+
FieldSpec.builder(ClassName.get(String::class.java), "QUERY_TYPE")
131+
.addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
132+
.initializer(""""Query"""").build()
133+
)
106134
}
107135
if (document.definitions.any { it is ObjectTypeDefinition && it.name == "Mutation" }) {
108-
javaType.addField(FieldSpec.builder(TypeName.get(String::class.java), "MUTATION_TYPE").addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).initializer(""""Mutation"""").build())
136+
javaType.addField(
137+
FieldSpec.builder(ClassName.get(String::class.java), "MUTATION_TYPE")
138+
.addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
139+
.initializer(""""Mutation"""").build()
140+
)
109141
}
110142
if (document.definitions.any { it is ObjectTypeDefinition && it.name == "Subscription" }) {
111-
javaType.addField(FieldSpec.builder(TypeName.get(String::class.java), "SUBSCRIPTION_TYPE").addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).initializer(""""Subscription"""").build())
143+
javaType.addField(
144+
FieldSpec.builder(ClassName.get(String::class.java), "SUBSCRIPTION_TYPE")
145+
.addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
146+
.initializer(""""Subscription"""").build()
147+
)
112148
}
113149

114150
val javaFile = JavaFile.builder(config.packageName, javaType.build()).build()
@@ -132,10 +168,10 @@ class ConstantsGenerator(private val config: CodeGenConfig, private val document
132168
private fun addFieldNameConstant(constantsType: TypeSpec.Builder, fieldName: String) {
133169
constantsType.addField(
134170
FieldSpec.builder(
135-
TypeName.get(String::class.java),
171+
ClassName.get(String::class.java),
136172
ReservedKeywordSanitizer.sanitize(fieldName.capitalized())
137173
)
138-
.addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).initializer(""""$fieldName"""").build()
174+
.addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).initializer("\$S", fieldName).build()
139175
)
140176
}
141177

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ class DataTypeGenerator(config: CodeGenConfig, document: Document) : BaseDataTyp
6666

6767
fun generate(definition: ObjectTypeDefinition, extensions: List<ObjectTypeExtensionDefinition>): CodeGenResult {
6868
if (definition.shouldSkip(config)) {
69-
return CodeGenResult()
69+
return CodeGenResult.EMPTY
7070
}
7171

7272
logger.info("Generating data type {}", definition.name)
@@ -81,7 +81,7 @@ class DataTypeGenerator(config: CodeGenConfig, document: Document) : BaseDataTyp
8181

8282
var useInterfaceType = false
8383
var overrideGetter = false
84-
var interfaceCodeGenResult = CodeGenResult()
84+
var interfaceCodeGenResult = CodeGenResult.EMPTY
8585

8686
if (config.generateInterfaces) {
8787
useInterfaceType = true
@@ -163,7 +163,7 @@ class InputTypeGenerator(config: CodeGenConfig, document: Document) : BaseDataTy
163163
inputTypeDefinitions: List<InputObjectTypeDefinition>
164164
): CodeGenResult {
165165
if (definition.shouldSkip(config)) {
166-
return CodeGenResult()
166+
return CodeGenResult.EMPTY
167167
}
168168

169169
logger.info("Generating input type {}", definition.name)

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

+6-6
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import graphql.language.EnumTypeDefinition
3131
import graphql.language.FieldDefinition
3232
import graphql.language.InterfaceTypeDefinition
3333
import graphql.language.ObjectTypeDefinition
34+
import org.slf4j.Logger
3435
import org.slf4j.LoggerFactory
3536

3637
@Suppress("UNCHECKED_CAST")
@@ -59,9 +60,9 @@ class EntitiesRepresentationTypeGenerator(
5960
keyFields: Map<String, Any>
6061
): CodeGenResult {
6162
if (generatedRepresentations.containsKey(representationName)) {
62-
return CodeGenResult()
63+
return CodeGenResult.EMPTY
6364
}
64-
var fieldsCodeGenAccumulator = CodeGenResult()
65+
var fieldsCodeGenAccumulator = CodeGenResult.EMPTY
6566
// generate representations of entity types that have @key, including the __typename field, and the key fields
6667
val typeName = Field("__typename", ClassName.get(String::class.java), CodeBlock.of("\$S", definitionName))
6768
val fieldDefinitions =
@@ -84,7 +85,7 @@ class EntitiesRepresentationTypeGenerator(
8485
.replace(type.name, fieldTypeRepresentationName)
8586

8687
if (generatedRepresentations.containsKey(fieldTypeRepresentationName)) {
87-
logger.trace("Representation fo $fieldTypeRepresentationName was already generated.")
88+
logger.trace("Representation for {} was already generated.", fieldTypeRepresentationName)
8889
} else {
8990
logger.debug("Generating entity representation {} ...", fieldTypeRepresentationName)
9091
val fieldTypeRepresentation = generateRepresentations(
@@ -106,7 +107,7 @@ class EntitiesRepresentationTypeGenerator(
106107
val parentRepresentationCodeGen = super.generate(
107108
name = representationName,
108109
interfaces = emptyList(),
109-
fields = fieldDefinitions.plus(typeName),
110+
fields = fieldDefinitions + typeName,
110111
description = null,
111112
directives = emptyList()
112113
)
@@ -116,7 +117,6 @@ class EntitiesRepresentationTypeGenerator(
116117
}
117118

118119
companion object {
119-
private val logger: org.slf4j.Logger =
120-
LoggerFactory.getLogger(EntitiesRepresentationTypeGenerator::class.java)
120+
private val logger: Logger = LoggerFactory.getLogger(EntitiesRepresentationTypeGenerator::class.java)
121121
}
122122
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class EnumTypeGenerator(private val config: CodeGenConfig) {
3737

3838
fun generate(definition: EnumTypeDefinition, extensions: List<EnumTypeDefinition>): CodeGenResult {
3939
if (definition.shouldSkip(config)) {
40-
return CodeGenResult()
40+
return CodeGenResult.EMPTY
4141
}
4242

4343
logger.info("Generating enum type {}", definition.name)

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class InterfaceGenerator(private val config: CodeGenConfig, private val document
4747
extensions: List<InterfaceTypeExtensionDefinition>
4848
): CodeGenResult {
4949
if (definition.shouldSkip(config)) {
50-
return CodeGenResult()
50+
return CodeGenResult.EMPTY
5151
}
5252

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

0 commit comments

Comments
 (0)