Skip to content

Commit e49327c

Browse files
authored
[client] support selection of multiple enums (#1115)
We are providing default `__UNKNOWN_VALUE` value for enums. When generating references to this default value using kotlinpoet `MemberName` it was adding redundant explicit import of that enum value. If there were multiple fields asking for different enums then compilation would fail with multiple imports of `__UNKNOWN_VALUE`. Updated logic to use the explicit `TypeName` of the enum and `Name` of the constant. Resolves: #1114
1 parent b2b05df commit e49327c

File tree

10 files changed

+57
-11
lines changed

10 files changed

+57
-11
lines changed

plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/types/generateGraphQLObjectTypeSpec.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import com.expediagroup.graphql.plugin.client.generator.extensions.findFragmentD
2323
import com.squareup.kotlinpoet.ClassName
2424
import com.squareup.kotlinpoet.FunSpec
2525
import com.squareup.kotlinpoet.KModifier
26-
import com.squareup.kotlinpoet.MemberName
26+
import com.squareup.kotlinpoet.MemberName.Companion.member
2727
import com.squareup.kotlinpoet.ParameterSpec
2828
import com.squareup.kotlinpoet.TypeSpec
2929
import graphql.language.FragmentSpread
@@ -67,8 +67,7 @@ internal fun generateGraphQLObjectTypeSpec(
6767
val constructorParameter = ParameterSpec.builder(propertySpec.name, propertySpec.type)
6868
val className = propertySpec.type as? ClassName
6969
if (className != null && context.enumClassToTypeSpecs.keys.contains(className)) {
70-
val unknownValue = MemberName(className.packageName, "${className.simpleName}.$UNKNOWN_VALUE")
71-
constructorParameter.defaultValue("%M", unknownValue)
70+
constructorParameter.defaultValue("%T.%N", className, className.member(UNKNOWN_VALUE))
7271
}
7372
constructorBuilder.addParameter(constructorParameter.build())
7473
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
query EnumQuery {
22
enumQuery
3+
otherEnumQuery
34
}

plugins/client/graphql-kotlin-client-generator/src/test/data/jackson/enums/EnumQuery.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ package com.expediagroup.graphql.generated
22

33
import com.expediagroup.graphql.client.types.GraphQLClientRequest
44
import com.expediagroup.graphql.generated.enums.CustomEnum
5-
import com.expediagroup.graphql.generated.enums.CustomEnum.__UNKNOWN_VALUE
5+
import com.expediagroup.graphql.generated.enums.OtherEnum
66
import kotlin.String
77
import kotlin.reflect.KClass
88

9-
public const val ENUM_QUERY: String = "query EnumQuery {\n enumQuery\n}"
9+
public const val ENUM_QUERY: String = "query EnumQuery {\n enumQuery\n otherEnumQuery\n}"
1010

1111
public class EnumQuery : GraphQLClientRequest<EnumQuery.Result> {
1212
public override val query: String = ENUM_QUERY
@@ -19,6 +19,10 @@ public class EnumQuery : GraphQLClientRequest<EnumQuery.Result> {
1919
/**
2020
* Query that returns enum value
2121
*/
22-
public val enumQuery: CustomEnum = CustomEnum.__UNKNOWN_VALUE
22+
public val enumQuery: CustomEnum = CustomEnum.__UNKNOWN_VALUE,
23+
/**
24+
* Query that returns other enum value
25+
*/
26+
public val otherEnumQuery: OtherEnum = OtherEnum.__UNKNOWN_VALUE
2327
)
2428
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.expediagroup.graphql.generated.enums
2+
3+
import com.fasterxml.jackson.`annotation`.JsonEnumDefaultValue
4+
5+
/**
6+
* Other enum description
7+
*/
8+
public enum class OtherEnum {
9+
FIRST,
10+
SECOND,
11+
/**
12+
* This is a default enum value that will be used when attempting to deserialize unknown value.
13+
*/
14+
@JsonEnumDefaultValue
15+
__UNKNOWN_VALUE,
16+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
query EnumQuery {
22
enumQuery
3+
otherEnumQuery
34
}

plugins/client/graphql-kotlin-client-generator/src/test/data/kotlinx/enums/EnumQuery.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ package com.expediagroup.graphql.generated
22

33
import com.expediagroup.graphql.client.types.GraphQLClientRequest
44
import com.expediagroup.graphql.generated.enums.CustomEnum
5-
import com.expediagroup.graphql.generated.enums.CustomEnum.__UNKNOWN_VALUE
5+
import com.expediagroup.graphql.generated.enums.OtherEnum
66
import kotlin.String
77
import kotlin.reflect.KClass
88
import kotlinx.serialization.Serializable
99

10-
public const val ENUM_QUERY: String = "query EnumQuery {\n enumQuery\n}"
10+
public const val ENUM_QUERY: String = "query EnumQuery {\n enumQuery\n otherEnumQuery\n}"
1111

1212
@Serializable
1313
public class EnumQuery : GraphQLClientRequest<EnumQuery.Result> {
@@ -22,6 +22,10 @@ public class EnumQuery : GraphQLClientRequest<EnumQuery.Result> {
2222
/**
2323
* Query that returns enum value
2424
*/
25-
public val enumQuery: CustomEnum = CustomEnum.__UNKNOWN_VALUE
25+
public val enumQuery: CustomEnum = CustomEnum.__UNKNOWN_VALUE,
26+
/**
27+
* Query that returns other enum value
28+
*/
29+
public val otherEnumQuery: OtherEnum = OtherEnum.__UNKNOWN_VALUE
2630
)
2731
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.expediagroup.graphql.generated.enums
2+
3+
import kotlinx.serialization.Serializable
4+
5+
/**
6+
* Other enum description
7+
*/
8+
@Serializable
9+
public enum class OtherEnum {
10+
FIRST,
11+
SECOND,
12+
/**
13+
* This is a default enum value that will be used when attempting to deserialize unknown value.
14+
*/
15+
__UNKNOWN_VALUE,
16+
}

plugins/client/graphql-kotlin-client-generator/src/test/data/kotlinx/multiple_queries/FirstQuery.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package com.expediagroup.graphql.generated
22

33
import com.expediagroup.graphql.client.types.GraphQLClientRequest
44
import com.expediagroup.graphql.generated.enums.CustomEnum
5-
import com.expediagroup.graphql.generated.enums.CustomEnum.__UNKNOWN_VALUE
65
import com.expediagroup.graphql.generated.firstquery.BasicInterface
76
import com.expediagroup.graphql.generated.firstquery.ComplexObject
87
import com.expediagroup.graphql.generated.firstquery.ScalarWrapper

plugins/client/graphql-kotlin-client-generator/src/test/data/kotlinx/multiple_queries/SecondQuery.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package com.expediagroup.graphql.generated
22

33
import com.expediagroup.graphql.client.types.GraphQLClientRequest
44
import com.expediagroup.graphql.generated.enums.CustomEnum
5-
import com.expediagroup.graphql.generated.enums.CustomEnum.__UNKNOWN_VALUE
65
import com.expediagroup.graphql.generated.inputs.ComplexArgumentInput
76
import com.expediagroup.graphql.generated.secondquery.BasicInterface
87
import com.expediagroup.graphql.generated.secondquery.ComplexObject

plugins/client/graphql-kotlin-client-generator/src/test/resources/testSchema.graphql

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ type Query {
9292
deprecatedQuery: String! @deprecated(reason : "old query should not be used")
9393
"Query that returns enum value"
9494
enumQuery: CustomEnum!
95+
"Query that returns other enum value"
96+
otherEnumQuery: OtherEnum!
9597
"Query that accepts some input arguments"
9698
inputObjectQuery(criteria: SimpleArgumentInput!): Boolean!
9799
"Query returning an interface"
@@ -147,6 +149,11 @@ enum CustomEnum {
147149
"Lowercase enum value"
148150
four
149151
}
152+
"Other enum description"
153+
enum OtherEnum {
154+
FIRST,
155+
SECOND
156+
}
150157
"Custom scalar representing UUID"
151158
scalar UUID
152159
"Test input object"

0 commit comments

Comments
 (0)