From 6520d6c995704dd4408a4640336c008f855ccb45 Mon Sep 17 00:00:00 2001 From: Oleg Golberg Date: Sat, 6 Apr 2024 11:53:25 -0400 Subject: [PATCH 1/4] escape --- gradle/libs.versions.toml | 2 +- .../kotlin/protokt/v1/codegen/generate/EnumGenerator.kt | 9 +++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 95810979d..7e3ceedc8 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 0ac00f599..bb0d87b44 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.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}" } } From 31b0e6628f60242365a2dec00d0d494130cba113 Mon Sep 17 00:00:00 2001 From: Oleg Golberg Date: Wed, 10 Apr 2024 10:56:04 -0400 Subject: [PATCH 2/4] enum --- .../kotlin/protokt/v1/codegen/generate/EnumGenerator.kt | 2 +- .../src/main/kotlin/protokt/v1/codegen/util/EnumParser.kt | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) 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 bb0d87b44..c9a5bd458 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,7 @@ private class EnumGenerator( addCode( buildCodeBlock { beginControlFlow("return when (value)") - e.values.forEach { + e.values.distinctBy { it.number }.forEach { addStatement("%L -> %N", it.number, it.valueName) } addStatement("else -> UNRECOGNIZED(value)") 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 b1d8b04dd..32e3803f1 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 From f365631d5b796f6b8a733945dbb811fdf3be6ff0 Mon Sep 17 00:00:00 2001 From: Oleg Golberg Date: Wed, 10 Apr 2024 11:48:51 -0400 Subject: [PATCH 3/4] add test --- .../protokt/v1/testing/enum_names_with_shared_prefix.proto | 5 +++++ .../kotlin/protokt/v1/testing/EnumsWithSharedPrefixTest.kt | 4 ++++ 2 files changed, 9 insertions(+) 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 4397599e7..8ab46a51c 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 3c21c9766..6ec4dd9c6 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, prefix is not upper case + AnEnumTypeInvalidWithoutPrefix.AN_ENUM_TYPE_INVALID_WITHOUT_PREFIX_UNSPECIFIED + AnEnumTypeInvalidWithoutPrefix.AN_ENUM_TYPE_INVALID_WITHOUT_PREFIX_1_FOO } } From f65aa268dbe26760a2c72e90cdde7dac1047df91 Mon Sep 17 00:00:00 2001 From: Oleg Golberg Date: Wed, 10 Apr 2024 11:49:40 -0400 Subject: [PATCH 4/4] comment --- .../test/kotlin/protokt/v1/testing/EnumsWithSharedPrefixTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 6ec4dd9c6..8594bae8d 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 @@ -40,7 +40,7 @@ class EnumsWithSharedPrefixTest { AnEnumTypeLowerCase.AN_ENUM_TYPE_LOWER_CASE_FIRST AnEnumTypeLowerCase.AN_ENUM_TYPE_lower_CASE_SECOND - // not stripped, prefix is not upper case + // 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 }