diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 95810979..7e3ceedc 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,7 +16,7 @@ autoService = "1.1.1" grpc-java = "1.58.0" grpc-kotlin = "1.4.1" kotlinLogging = "5.1.0" -kotlinPoet = "1.14.2" +kotlinPoet = "1.16.0" kotlinx-coroutines = "1.6.0" kotlinx-serialization = "1.6.3" ktlint = "1.2.1" diff --git a/protokt-codegen/src/main/kotlin/protokt/v1/codegen/generate/EnumGenerator.kt b/protokt-codegen/src/main/kotlin/protokt/v1/codegen/generate/EnumGenerator.kt index 0ac00f59..c9a5bd45 100644 --- a/protokt-codegen/src/main/kotlin/protokt/v1/codegen/generate/EnumGenerator.kt +++ b/protokt-codegen/src/main/kotlin/protokt/v1/codegen/generate/EnumGenerator.kt @@ -119,7 +119,9 @@ private class EnumGenerator( addCode( buildCodeBlock { beginControlFlow("return when (value)") - cases().forEach(::addStatement) + e.values.distinctBy { it.number }.forEach { + addStatement("%L -> %N", it.number, it.valueName) + } addStatement("else -> UNRECOGNIZED(value)") endControlFlowWithoutNewline() } @@ -129,9 +131,4 @@ private class EnumGenerator( .build() ) } - - private fun cases() = - e.values - .distinctBy { it.number } - .map { "${it.number} -> ${it.valueName}" } } diff --git a/protokt-codegen/src/main/kotlin/protokt/v1/codegen/util/EnumParser.kt b/protokt-codegen/src/main/kotlin/protokt/v1/codegen/util/EnumParser.kt index b1d8b04d..32e3803f 100644 --- a/protokt-codegen/src/main/kotlin/protokt/v1/codegen/util/EnumParser.kt +++ b/protokt-codegen/src/main/kotlin/protokt/v1/codegen/util/EnumParser.kt @@ -28,7 +28,11 @@ class EnumParser( fun toEnum(): Enum { val enumTypeNamePrefixToStrip = (CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, desc.name) + '_') - .takeIf { desc.valueList.all { e -> e.name.startsWith(it) } } + .takeIf { + desc.valueList.all { e -> + e.name.startsWith(it) && e.name.length > it.length && !e.name[it.length].isDigit() + } + } val simpleNames = enclosingMessages + desc.name diff --git a/testing/protokt-generation/src/main/proto/protokt/v1/testing/enum_names_with_shared_prefix.proto b/testing/protokt-generation/src/main/proto/protokt/v1/testing/enum_names_with_shared_prefix.proto index 4397599e..8ab46a51 100644 --- a/testing/protokt-generation/src/main/proto/protokt/v1/testing/enum_names_with_shared_prefix.proto +++ b/testing/protokt-generation/src/main/proto/protokt/v1/testing/enum_names_with_shared_prefix.proto @@ -40,3 +40,8 @@ enum AnEnumTypeLowerCase { AN_ENUM_TYPE_LOWER_CASE_FIRST = 1; AN_ENUM_TYPE_lower_CASE_SECOND = 2; } + +enum AnEnumTypeInvalidWithoutPrefix { + AN_ENUM_TYPE_INVALID_WITHOUT_PREFIX_UNSPECIFIED = 0; + AN_ENUM_TYPE_INVALID_WITHOUT_PREFIX_1_FOO = 1; +} diff --git a/testing/protokt-generation/src/test/kotlin/protokt/v1/testing/EnumsWithSharedPrefixTest.kt b/testing/protokt-generation/src/test/kotlin/protokt/v1/testing/EnumsWithSharedPrefixTest.kt index 3c21c976..8594bae8 100644 --- a/testing/protokt-generation/src/test/kotlin/protokt/v1/testing/EnumsWithSharedPrefixTest.kt +++ b/testing/protokt-generation/src/test/kotlin/protokt/v1/testing/EnumsWithSharedPrefixTest.kt @@ -39,5 +39,9 @@ class EnumsWithSharedPrefixTest { AnEnumTypeLowerCase.AN_ENUM_TYPE_LOWER_CASE_UNSPECIFIED AnEnumTypeLowerCase.AN_ENUM_TYPE_LOWER_CASE_FIRST AnEnumTypeLowerCase.AN_ENUM_TYPE_lower_CASE_SECOND + + // not stripped, some enum names are not valid without the prefix + AnEnumTypeInvalidWithoutPrefix.AN_ENUM_TYPE_INVALID_WITHOUT_PREFIX_UNSPECIFIED + AnEnumTypeInvalidWithoutPrefix.AN_ENUM_TYPE_INVALID_WITHOUT_PREFIX_1_FOO } }