Skip to content

Commit 4873c3d

Browse files
fix passing doc string as format parameter (#1024)
closes #1023 The kotlin poet api takes as first argument a format parameter for `addKdoc()`. So comments with percent signs would cause the format argument parser to error.
1 parent a851521 commit 4873c3d

File tree

9 files changed

+73
-11
lines changed

9 files changed

+73
-11
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import graphql.language.ScalarTypeDefinition
2828
internal fun generateGraphQLCustomScalarTypeAlias(context: GraphQLClientGeneratorContext, scalarTypeDefinition: ScalarTypeDefinition): TypeAliasSpec {
2929
val typeAliasSpec = TypeAliasSpec.builder(scalarTypeDefinition.name, String::class)
3030
scalarTypeDefinition.description?.content?.let { kdoc ->
31-
typeAliasSpec.addKdoc(kdoc)
31+
typeAliasSpec.addKdoc("%L", kdoc)
3232
}
3333

3434
val typeAlias = typeAliasSpec.build()

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ internal fun generateGraphQLCustomScalarTypeSpec(context: GraphQLClientGenerator
4141
val scalarTypeSpec = TypeSpec.classBuilder(customScalarName)
4242
scalarTypeSpec.addModifiers(KModifier.DATA)
4343
scalarTypeDefinition.description?.content?.let { kdoc ->
44-
scalarTypeSpec.addKdoc(kdoc)
44+
scalarTypeSpec.addKdoc("%L", kdoc)
4545
}
4646

4747
val scalarValue = PropertySpec.builder("value", converterMapping.type.toClassName())

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,12 @@ import graphql.language.StringValue
3030
internal fun generateGraphQLEnumTypeSpec(context: GraphQLClientGeneratorContext, enumDefinition: EnumTypeDefinition): TypeSpec {
3131
val enumTypeSpecBuilder = TypeSpec.enumBuilder(enumDefinition.name)
3232
enumDefinition.description?.content?.let { kdoc ->
33-
enumTypeSpecBuilder.addKdoc(kdoc)
33+
enumTypeSpecBuilder.addKdoc("%L", kdoc)
3434
}
3535
enumDefinition.enumValueDefinitions.forEach { enumValueDefinition ->
3636
val enumValueTypeSpecBuilder = TypeSpec.anonymousClassBuilder()
3737
enumValueDefinition.description?.content?.let { kdoc ->
38-
enumValueTypeSpecBuilder.addKdoc(kdoc)
38+
enumValueTypeSpecBuilder.addKdoc("%L", kdoc)
3939
}
4040
val deprecatedDirective = enumValueDefinition.getDirectives(DeprecatedDirective.name).firstOrNull()
4141
if (deprecatedDirective != null) {
@@ -51,7 +51,7 @@ internal fun generateGraphQLEnumTypeSpec(context: GraphQLClientGeneratorContext,
5151
}
5252

5353
val unkownTypeSpec = TypeSpec.anonymousClassBuilder()
54-
.addKdoc("This is a default enum value that will be used when attempting to deserialize unknown value.")
54+
.addKdoc("%L", "This is a default enum value that will be used when attempting to deserialize unknown value.")
5555
.addAnnotation(JsonEnumDefaultValue::class)
5656
.build()
5757

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ internal fun generateGraphQLInputObjectTypeSpec(context: GraphQLClientGeneratorC
3131
val inputObjectTypeSpecBuilder = TypeSpec.classBuilder(inputObjectDefinition.name)
3232
inputObjectTypeSpecBuilder.modifiers.add(KModifier.DATA)
3333
inputObjectDefinition.description?.content?.let { kdoc ->
34-
inputObjectTypeSpecBuilder.addKdoc(kdoc)
34+
inputObjectTypeSpecBuilder.addKdoc("%L", kdoc)
3535
}
3636

3737
val constructorBuilder = FunSpec.constructorBuilder()
@@ -42,7 +42,7 @@ internal fun generateGraphQLInputObjectTypeSpec(context: GraphQLClientGeneratorC
4242
val inputPropertySpecBuilder = PropertySpec.builder(fieldName, kotlinFieldType)
4343
.initializer(fieldName)
4444
fieldDefinition.description?.content?.let { kdoc ->
45-
inputPropertySpecBuilder.addKdoc(kdoc)
45+
inputPropertySpecBuilder.addKdoc("%L", kdoc)
4646
}
4747

4848
val inputPropertySpec = inputPropertySpecBuilder.build()

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ internal fun generateGraphQLObjectTypeSpec(
4343
val objectTypeSpecBuilder = TypeSpec.classBuilder(typeName)
4444
objectTypeSpecBuilder.modifiers.add(KModifier.DATA)
4545
objectDefinition.description?.content?.let { kdoc ->
46-
objectTypeSpecBuilder.addKdoc(kdoc)
46+
objectTypeSpecBuilder.addKdoc("%L", kdoc)
4747
}
4848

4949
val constructorBuilder = FunSpec.constructorBuilder()

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ internal fun generateInterfaceTypeSpec(
5858
): TypeSpec {
5959
val interfaceTypeSpec = TypeSpec.interfaceBuilder(interfaceName)
6060
if (kdoc != null) {
61-
interfaceTypeSpec.addKdoc(kdoc)
61+
interfaceTypeSpec.addKdoc("%L", kdoc)
6262
}
6363

6464
val namedFragments = selectionSet.getSelectionsOfType(FragmentSpread::class.java).map { fragment ->
@@ -163,7 +163,7 @@ private fun updateImplementationTypeSpecWithSuperInformation(context: GraphQLCli
163163

164164
val builder = TypeSpec.classBuilder(implementationTypeSpec.name!!)
165165
builder.addModifiers(implementationTypeSpec.modifiers)
166-
builder.addKdoc(implementationTypeSpec.kdoc)
166+
builder.addKdoc("%L", implementationTypeSpec.kdoc)
167167

168168
// TODO is there a better way to lookup interface class name?
169169
// - cannot use typeNameCache as it was not populated yet

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ internal fun generatePropertySpecs(
6666
}
6767
}
6868
fieldDefinition.description?.content?.let { kdoc ->
69-
propertySpecBuilder.addKdoc(kdoc)
69+
propertySpecBuilder.addKdoc("%L", kdoc)
7070
}
7171
propertySpecBuilder.build()
7272
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.expediagroup.graphql.plugin.client.generator.types
2+
3+
import com.expediagroup.graphql.plugin.client.generator.verifyGeneratedFileSpecContents
4+
import org.junit.jupiter.api.Test
5+
6+
class GenerateGraphQLDocsIT {
7+
@Test
8+
fun `verify docs with format params do not blow up`() {
9+
val expected =
10+
"""
11+
package com.expediagroup.graphql.plugin.generator.integration
12+
13+
import com.expediagroup.graphql.client.GraphQLClient
14+
import com.expediagroup.graphql.client.execute
15+
import com.expediagroup.graphql.types.GraphQLResponse
16+
import kotlin.Int
17+
import kotlin.String
18+
19+
const val TEST_QUERY: String = "query TestQuery {\n docQuery {\n id\n }\n}"
20+
21+
class TestQuery(
22+
private val graphQLClient: GraphQLClient
23+
) {
24+
suspend fun execute(): GraphQLResponse<TestQuery.Result> = graphQLClient.execute(TEST_QUERY,
25+
"TestQuery", null)
26+
27+
/**
28+
* Doc object with % and $ floating around
29+
*/
30+
data class DocObject(
31+
/**
32+
* An id with a comment containing % and $ as well
33+
*/
34+
val id: Int
35+
)
36+
37+
data class Result(
38+
/**
39+
* Query to test doc strings
40+
*/
41+
val docQuery: TestQuery.DocObject
42+
)
43+
}
44+
""".trimIndent()
45+
val query =
46+
"""
47+
query TestQuery {
48+
docQuery {
49+
id
50+
}
51+
}
52+
""".trimIndent()
53+
verifyGeneratedFileSpecContents(query, expected)
54+
}
55+
}

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
@@ -104,6 +104,8 @@ type Query {
104104
scalarQuery: ScalarWrapper!
105105
"Query returning union"
106106
unionQuery: BasicUnion!
107+
"Query to test doc strings"
108+
docQuery: DocObject!
107109
}
108110
"Wrapper that holds all supported scalar types"
109111
type ScalarWrapper {
@@ -129,6 +131,11 @@ type SecondInterfaceImplementation implements BasicInterface {
129131
"Name of the second implementation"
130132
name: String!
131133
}
134+
"Doc object with % and $ floating around"
135+
type DocObject {
136+
"An id with a comment containing % and $ as well"
137+
id: Int!
138+
}
132139
"Custom enum description"
133140
enum CustomEnum {
134141
"First enum value"

0 commit comments

Comments
 (0)