Skip to content

"%" in schema comments is not escaped, causing KotlinPoet failure. #1023

@bsorbo

Description

@bsorbo

Library Version
3.6.8

Describe the bug
Now that we understand the (presumable) bug, this is easy to work around, but filing the issue since the problem wasn't immediately obvious in large auto-generated schemas.

Presently when a "%" is included in any schema comment, that will be passed as-is to KotlinPoet. KotlinPoet uses "%" for various formatters within the provided text string, causing parsing to fail. An example stack is:

Exception in thread "main" java.lang.IllegalArgumentException: index 1 for '% ' not in range (received 0 arguments)
        at com.squareup.kotlinpoet.CodeBlock$Builder.add(CodeBlock.kt:310)
        at com.squareup.kotlinpoet.TypeSpec$Builder.addKdoc(TypeSpec.kt:473)
        at com.expediagroup.graphql.plugin.generator.types.GenerateGraphQLEnumTypeSpecKt.generateGraphQLEnumTypeSpec(generateGraphQLEnumTypeSpec.kt:38)
        at com.expediagroup.graphql.plugin.generator.types.GenerateTypeNameKt.generateCustomClassName(generateTypeName.kt:89)
        at com.expediagroup.graphql.plugin.generator.types.GenerateTypeNameKt.generateTypeName(generateTypeName.kt:59)
        at com.expediagroup.graphql.plugin.generator.types.GeneratePropertySpecsKt.generatePropertySpecs(generatePropertySpecs.kt:45)
        at com.expediagroup.graphql.plugin.generator.types.GeneratePropertySpecsKt.generatePropertySpecs$default(generatePropertySpecs.kt:37)
        at com.expediagroup.graphql.plugin.generator.types.GenerateGraphQLObjectTypeSpecKt.generateGraphQLObjectTypeSpec(generateGraphQLObjectTypeSpec.kt:49)
        at com.expediagroup.graphql.plugin.generator.types.GenerateGraphQLObjectTypeSpecKt.generateGraphQLObjectTypeSpec$default(generateGraphQLObjectTypeSpec.kt:35)
        at com.expediagroup.graphql.plugin.generator.types.GenerateTypeNameKt.generateCustomClassName(generateTypeName.kt:87)
        at com.expediagroup.graphql.plugin.generator.types.GenerateTypeNameKt.generateTypeName(generateTypeName.kt:59)
        at com.expediagroup.graphql.plugin.generator.types.GenerateTypeNameKt.generateTypeName(generateTypeName.kt:53)
        at com.expediagroup.graphql.plugin.generator.types.GeneratePropertySpecsKt.generatePropertySpecs(generatePropertySpecs.kt:45)
        at com.expediagroup.graphql.plugin.generator.types.GeneratePropertySpecsKt.generatePropertySpecs$default(generatePropertySpecs.kt:37)
        at com.expediagroup.graphql.plugin.generator.types.GenerateGraphQLObjectTypeSpecKt.generateGraphQLObjectTypeSpec(generateGraphQLObjectTypeSpec.kt:49)
        at com.expediagroup.graphql.plugin.generator.types.GenerateGraphQLObjectTypeSpecKt.generateGraphQLObjectTypeSpec$default(generateGraphQLObjectTypeSpec.kt:35)
        at com.expediagroup.graphql.plugin.generator.types.GenerateTypeNameKt.generateCustomClassName(generateTypeName.kt:87)
        at com.expediagroup.graphql.plugin.generator.types.GenerateTypeNameKt.generateTypeName(generateTypeName.kt:59)
        at com.expediagroup.graphql.plugin.generator.types.GenerateTypeNameKt.generateTypeName(generateTypeName.kt:53)
        at com.expediagroup.graphql.plugin.generator.types.GenerateTypeNameKt.generateTypeName(generateTypeName.kt:61)
        at com.expediagroup.graphql.plugin.generator.types.GenerateTypeNameKt.generateTypeName(generateTypeName.kt:53)
        at com.expediagroup.graphql.plugin.generator.types.GeneratePropertySpecsKt.generatePropertySpecs(generatePropertySpecs.kt:45)
        at com.expediagroup.graphql.plugin.generator.types.GeneratePropertySpecsKt.generatePropertySpecs$default(generatePropertySpecs.kt:37)
        at com.expediagroup.graphql.plugin.generator.types.GenerateGraphQLObjectTypeSpecKt.generateGraphQLObjectTypeSpec(generateGraphQLObjectTypeSpec.kt:49)
        at com.expediagroup.graphql.plugin.generator.types.GenerateGraphQLObjectTypeSpecKt.generateGraphQLObjectTypeSpec$default(generateGraphQLObjectTypeSpec.kt:35)
        at com.expediagroup.graphql.plugin.generator.types.GenerateTypeNameKt.generateCustomClassName(generateTypeName.kt:87)
        at com.expediagroup.graphql.plugin.generator.types.GenerateTypeNameKt.generateTypeName(generateTypeName.kt:59)
        at com.expediagroup.graphql.plugin.generator.types.GenerateTypeNameKt.generateTypeName(generateTypeName.kt:53)
        at com.expediagroup.graphql.plugin.generator.types.GeneratePropertySpecsKt.generatePropertySpecs(generatePropertySpecs.kt:45)
        at com.expediagroup.graphql.plugin.generator.types.GeneratePropertySpecsKt.generatePropertySpecs$default(generatePropertySpecs.kt:37)
        at com.expediagroup.graphql.plugin.generator.types.GenerateGraphQLObjectTypeSpecKt.generateGraphQLObjectTypeSpec(generateGraphQLObjectTypeSpec.kt:49)
        at com.expediagroup.graphql.plugin.generator.GraphQLClientGenerator.generate$graphql_kotlin_plugin_core(GraphQLClientGenerator.kt:101)
        at com.expediagroup.graphql.plugin.generator.GraphQLClientGenerator.generate(GraphQLClientGenerator.kt:61)
        at com.expediagroup.graphql.plugin.GenerateClientKt.generateClient(generateClient.kt:35)
        at com.squareup.graphql_kt_codegen.Generator$Companion.main(Generator.kt:80)
        at com.squareup.graphql_kt_codegen.Generator.main(Generator.kt)

To Reproduce
Add the following comment to an existing (for example) enum in a schema.

"""
Test comment %
"""

e.g.

"""
Test %
"""
enum testEnum {
  TEST_VALUE
}

Expected behavior
(Prior to learning about KotlinPoet behavior) I would have expected the % to be passed through unmodified.

Metadata

Metadata

Assignees

No one assigned

    Labels

    module: pluginIssue affects the plugins codetype: bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions