@@ -39,29 +39,41 @@ class ConstantsGenerator(private val config: CodeGenConfig, private val document
39
39
.addOptionalGeneratedAnnotation(config)
40
40
.addModifiers(Modifier .PUBLIC )
41
41
42
+ val types = mutableMapOf<String , TypeSpec .Builder >()
43
+
42
44
document.definitions.filterIsInstance<ObjectTypeDefinition >()
43
45
.asSequence()
44
46
.excludeSchemaTypeExtension()
45
47
.forEach {
46
- val constantsType = createConstantTypeBuilder(config, it.name)
48
+ val constantsType = if (types.contains(it.name)) {
49
+ types[it.name]!!
50
+ } else {
51
+ createConstantTypeBuilder(config, it.name)
52
+ }
47
53
48
54
val extensions = findTypeExtensions(it.name, document.definitions)
49
55
val fields = it.fieldDefinitions + extensions.flatMap { ext -> ext.fieldDefinitions }
50
56
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
- )
57
+ if (! types.contains(it.name)) {
58
+ constantsType.addField(
59
+ FieldSpec .builder(ClassName .get(String ::class .java), " TYPE_NAME" )
60
+ .addModifiers(Modifier .PUBLIC , Modifier .STATIC , Modifier .FINAL )
61
+ .initializer(" \$ S" , it.name).build()
62
+ )
63
+ }
56
64
57
65
fields.forEach { field ->
58
66
addFieldNameConstant(constantsType, field.name)
59
67
addQueryInputArgument(constantsType, field)
60
68
}
61
69
62
- javaType.addType( constantsType.build())
70
+ types[it.name] = constantsType
63
71
}
64
72
73
+ types.values.forEach {
74
+ javaType.addType(it.build())
75
+ }
76
+
65
77
document.definitions.filterIsInstance<InputObjectTypeDefinition >()
66
78
.asSequence()
67
79
.excludeSchemaTypeExtension()
@@ -153,35 +165,46 @@ class ConstantsGenerator(private val config: CodeGenConfig, private val document
153
165
154
166
private fun createConstantTypeBuilder (conf : CodeGenConfig , name : String ): TypeSpec .Builder {
155
167
val className =
156
- if (conf.snakeCaseConstantNames) {
157
- CodeGeneratorUtils .camelCaseToSnakeCase(name, CodeGeneratorUtils .Case .UPPERCASE )
158
- } else {
159
- name.uppercase()
160
- }
168
+ getConstantTypeName(conf, name)
161
169
162
170
return TypeSpec
163
171
.classBuilder(className)
164
172
.addOptionalGeneratedAnnotation(config)
165
173
.addModifiers(Modifier .PUBLIC , Modifier .STATIC )
166
174
}
167
175
176
+ private fun getConstantTypeName (conf : CodeGenConfig , name : String ): String {
177
+ val className =
178
+ if (conf.snakeCaseConstantNames) {
179
+ CodeGeneratorUtils .camelCaseToSnakeCase(name, CodeGeneratorUtils .Case .UPPERCASE )
180
+ } else {
181
+ name.uppercase()
182
+ }
183
+ return className
184
+ }
185
+
168
186
private fun addFieldNameConstant (constantsType : TypeSpec .Builder , fieldName : String ) {
169
- constantsType.addField(
170
- FieldSpec .builder(
171
- ClassName .get(String ::class .java),
172
- ReservedKeywordSanitizer .sanitize(fieldName.capitalized())
187
+ val sanitizedFieldName = ReservedKeywordSanitizer .sanitize(fieldName.capitalized())
188
+ if (! constantsType.fieldSpecs.any { it.name == sanitizedFieldName }) {
189
+ constantsType.addField(
190
+ FieldSpec .builder(
191
+ ClassName .get(String ::class .java),
192
+ sanitizedFieldName
193
+ )
194
+ .addModifiers(Modifier .PUBLIC , Modifier .STATIC , Modifier .FINAL ).initializer(" \$ S" , fieldName).build()
173
195
)
174
- .addModifiers(Modifier .PUBLIC , Modifier .STATIC , Modifier .FINAL ).initializer(" \$ S" , fieldName).build()
175
- )
196
+ }
176
197
}
177
198
178
199
private fun addQueryInputArgument (constantsType : TypeSpec .Builder , field : FieldDefinition ) {
179
200
val inputFields = field.inputValueDefinitions
180
- if (inputFields.isNotEmpty()) {
181
- val inputConstantsType = createConstantTypeBuilder(config, field.name + " _INPUT_ARGUMENT" )
201
+ val name = getConstantTypeName(config, field.name + " _INPUT_ARGUMENT" )
202
+ if (inputFields.isNotEmpty() && ! constantsType.typeSpecs.any { it.name == name }) {
203
+ val inputConstantsType = createConstantTypeBuilder(config, name)
182
204
inputFields.forEach { inputField ->
183
205
addFieldNameConstant(inputConstantsType, inputField.name)
184
206
}
207
+
185
208
constantsType.addType(inputConstantsType.build())
186
209
}
187
210
}
0 commit comments