Skip to content

Commit 437ec35

Browse files
pkwarrencopybara-github
authored andcommitted
Update Kotlin compiler to escape package names (#13310)
The current Kotlin code generator creates code which fails to compile with imports like: ``` syntax = "proto3"; package net.example.v1; message Sample { string net = 1; } ``` This results in a condition where 'net' is ambiguous in some cases (could refer to the field or the package). To avoid these issues, the code generator should enclose package paths in backticks: ``` net.example.v1.SampleKt => `net.example.v1`.SampleKt ``` Fixes #13182. Closes #13310 COPYBARA_INTEGRATE_REVIEW=#13310 from pkwarren:pkw/issue-13182 3f72b2f PiperOrigin-RevId: 564481691
1 parent dfc8445 commit 437ec35

File tree

4 files changed

+20
-5
lines changed

4 files changed

+20
-5
lines changed

src/google/protobuf/compiler/java/message.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1316,8 +1316,7 @@ void ImmutableMessageGenerator::GenerateTopLevelKotlinMembers(
13161316
"message",
13171317
EscapeKotlinKeywords(name_resolver_->GetClassName(descriptor_, true)),
13181318
"message_kt",
1319-
EscapeKotlinKeywords(
1320-
name_resolver_->GetKotlinExtensionsClassName(descriptor_)));
1319+
name_resolver_->GetKotlinExtensionsClassNameEscaped(descriptor_));
13211320

13221321
for (int i = 0; i < descriptor_->nested_type_count(); i++) {
13231322
if (IsMapEntry(descriptor_->nested_type(i))) continue;

src/google/protobuf/compiler/java/message_lite.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -841,8 +841,7 @@ void ImmutableMessageLiteGenerator::GenerateTopLevelKotlinMembers(
841841
"message",
842842
EscapeKotlinKeywords(name_resolver_->GetClassName(descriptor_, true)),
843843
"message_kt",
844-
EscapeKotlinKeywords(
845-
name_resolver_->GetKotlinExtensionsClassName(descriptor_)));
844+
name_resolver_->GetKotlinExtensionsClassNameEscaped(descriptor_));
846845

847846
for (int i = 0; i < descriptor_->nested_type_count(); i++) {
848847
if (IsMapEntry(descriptor_->nested_type(i))) continue;
@@ -853,7 +852,8 @@ void ImmutableMessageLiteGenerator::GenerateTopLevelKotlinMembers(
853852
GenerateKotlinOrNull(printer);
854853
}
855854

856-
void ImmutableMessageLiteGenerator::GenerateKotlinOrNull(io::Printer* printer) const {
855+
void ImmutableMessageLiteGenerator::GenerateKotlinOrNull(
856+
io::Printer* printer) const {
857857
// Generate getFieldOrNull getters for all optional message fields.
858858
for (int i = 0; i < descriptor_->field_count(); i++) {
859859
const FieldDescriptor* field = descriptor_->field(i);

src/google/protobuf/compiler/java/name_resolver.cc

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,21 @@ std::string ClassNameResolver::GetKotlinExtensionsClassName(
342342
descriptor->file(), true, true, true);
343343
}
344344

345+
std::string ClassNameResolver::GetKotlinExtensionsClassNameEscaped(
346+
const Descriptor* descriptor) {
347+
std::string name_without_package = ClassNameWithoutPackageKotlin(descriptor);
348+
std::string full_name = GetClassFullName(
349+
name_without_package, descriptor->file(), true, true, true);
350+
std::string name_without_package_suffix =
351+
absl::StrCat(".", name_without_package, "Kt");
352+
size_t package_end = full_name.rfind(name_without_package_suffix);
353+
if (package_end != std::string::npos) {
354+
return absl::StrCat("`", full_name.substr(0, package_end), "`",
355+
name_without_package_suffix);
356+
}
357+
return full_name;
358+
}
359+
345360
std::string ClassNameResolver::GetJavaMutableClassName(
346361
const Descriptor* descriptor) {
347362
return GetJavaClassFullName(ClassNameWithoutPackage(descriptor, false),

src/google/protobuf/compiler/java/name_resolver.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ class ClassNameResolver {
102102
std::string GetJavaImmutableClassName(const ServiceDescriptor* descriptor);
103103
std::string GetKotlinFactoryName(const Descriptor* descriptor);
104104
std::string GetKotlinExtensionsClassName(const Descriptor* descriptor);
105+
std::string GetKotlinExtensionsClassNameEscaped(const Descriptor* descriptor);
105106
std::string GetJavaMutableClassName(const Descriptor* descriptor);
106107
std::string GetJavaMutableClassName(const EnumDescriptor* descriptor);
107108
std::string GetJavaMutableClassName(const ServiceDescriptor* descriptor);

0 commit comments

Comments
 (0)