diff --git a/kotlinpoet/src/main/java/com/squareup/kotlinpoet/Util.kt b/kotlinpoet/src/main/java/com/squareup/kotlinpoet/Util.kt index 7bee9fd80f..cebb46cccb 100644 --- a/kotlinpoet/src/main/java/com/squareup/kotlinpoet/Util.kt +++ b/kotlinpoet/src/main/java/com/squareup/kotlinpoet/Util.kt @@ -248,6 +248,10 @@ private val KEYWORDS = setOf( "value", "vararg", + // These aren't keywords anymore but still break some code if unescaped. https://youtrack.jetbrains.com/issue/KT-52315 + "header", + "impl", + // Other reserved keywords "yield", ) diff --git a/kotlinpoet/src/test/java/com/squareup/kotlinpoet/TypeSpecTest.kt b/kotlinpoet/src/test/java/com/squareup/kotlinpoet/TypeSpecTest.kt index a0334e3de4..327416a9e9 100644 --- a/kotlinpoet/src/test/java/com/squareup/kotlinpoet/TypeSpecTest.kt +++ b/kotlinpoet/src/test/java/com/squareup/kotlinpoet/TypeSpecTest.kt @@ -4898,6 +4898,43 @@ class TypeSpecTest { ) } + // https://youtrack.jetbrains.com/issue/KT-52315 + @Test fun escapeHeaderAndImplAsEnumConstantNames() { + val primaryConstructor = FunSpec.constructorBuilder() + .addParameter("int", Int::class) + .build() + val enum = TypeSpec + .enumBuilder("MyEnum") + .primaryConstructor(primaryConstructor) + .addEnumConstant( + "header", + TypeSpec.anonymousClassBuilder() + .addSuperclassConstructorParameter("%L", 1) + .build() + ) + .addEnumConstant( + "impl", + TypeSpec.anonymousClassBuilder() + .addSuperclassConstructorParameter("%L", 2) + .build() + ) + .build() + assertThat(toString(enum)).isEqualTo( + """ + |package com.squareup.tacos + | + |import kotlin.Int + | + |public enum class MyEnum( + | int: Int, + |) { + | `header`(1), + | `impl`(2), + |} + |""".trimMargin() + ) + } + @Test fun escapeClassNames() { val type = TypeSpec.classBuilder("fun").build() assertThat(type.toString()).isEqualTo(