In the Kotlin DSL, reference builder methods with property syntax.
Instead of `_builder.getFoo()` and `_builder.setFoo(value)`, the generated code now uses `_builder.foo` and `_builder.foo = value`. When compiling against the Java Proto API, this makes no difference, since the Kotlin compiler treats Java methods `getFoo`/`setFoo` as defining a Kotlin property `foo`. But if a compatible proto API is implemented in Kotlin then there is no such equivalence. Such an implementation would have to define either both forms or just the one that the DSL uses. For a Kotlin API it is more natural to use properties.
Similarly, the generated Java methods `getFoosList()`, `getFoosCount()`, `getFoosMap()`, and `getEnumValue()` are accessed via property names (`foosList`, `foosCount`, `foosMap`, `enumValue`).
PiperOrigin-RevId: 629220383
diff --git a/java/kotlin/src/test/kotlin/com/google/protobuf/Proto2Test.kt b/java/kotlin/src/test/kotlin/com/google/protobuf/Proto2Test.kt
index c9fee8a..7c319bf 100644
--- a/java/kotlin/src/test/kotlin/com/google/protobuf/Proto2Test.kt
+++ b/java/kotlin/src/test/kotlin/com/google/protobuf/Proto2Test.kt
@@ -225,7 +225,7 @@
TestAllTypesKt.repeatedGroup { a = 1 },
TestAllTypesKt.repeatedGroup { a = 2 },
TestAllTypesKt.repeatedGroup { a = 3 },
- TestAllTypesKt.repeatedGroup { a = 4 }
+ TestAllTypesKt.repeatedGroup { a = 4 },
)
)
repeatedGroup[0] = TestAllTypesKt.repeatedGroup { a = 5 }
@@ -235,7 +235,7 @@
TestAllTypesKt.repeatedGroup { a = 5 },
TestAllTypesKt.repeatedGroup { a = 2 },
TestAllTypesKt.repeatedGroup { a = 3 },
- TestAllTypesKt.repeatedGroup { a = 4 }
+ TestAllTypesKt.repeatedGroup { a = 4 },
)
)
@@ -249,7 +249,7 @@
nestedMessage { bb = 1 },
nestedMessage { bb = 2 },
nestedMessage { bb = 3 },
- nestedMessage { bb = 4 }
+ nestedMessage { bb = 4 },
)
)
repeatedNestedMessage[0] = nestedMessage { bb = 5 }
@@ -259,7 +259,7 @@
nestedMessage { bb = 5 },
nestedMessage { bb = 2 },
nestedMessage { bb = 3 },
- nestedMessage { bb = 4 }
+ nestedMessage { bb = 4 },
)
)
@@ -548,7 +548,7 @@
repeatedGroupExtension { a = 1 },
repeatedGroupExtension { a = 2 },
repeatedGroupExtension { a = 3 },
- repeatedGroupExtension { a = 4 }
+ repeatedGroupExtension { a = 4 },
)
)
this[UnittestProto.repeatedGroupExtension][0] = repeatedGroupExtension { a = 5 }
@@ -558,7 +558,7 @@
repeatedGroupExtension { a = 5 },
repeatedGroupExtension { a = 2 },
repeatedGroupExtension { a = 3 },
- repeatedGroupExtension { a = 4 }
+ repeatedGroupExtension { a = 4 },
)
)
@@ -575,7 +575,7 @@
nestedMessage { bb = 1 },
nestedMessage { bb = 2 },
nestedMessage { bb = 3 },
- nestedMessage { bb = 4 }
+ nestedMessage { bb = 4 },
)
)
this[UnittestProto.repeatedNestedMessageExtension][0] = nestedMessage { bb = 5 }
@@ -585,7 +585,7 @@
nestedMessage { bb = 5 },
nestedMessage { bb = 2 },
nestedMessage { bb = 3 },
- nestedMessage { bb = 4 }
+ nestedMessage { bb = 4 },
)
)
@@ -757,7 +757,7 @@
1 to Proto2MapEnum.PROTO2_MAP_ENUM_FOO,
2 to Proto2MapEnum.PROTO2_MAP_ENUM_BAR,
3 to Proto2MapEnum.PROTO2_MAP_ENUM_BAZ,
- 4 to Proto2MapEnum.PROTO2_MAP_ENUM_FOO
+ 4 to Proto2MapEnum.PROTO2_MAP_ENUM_FOO,
)
)
}
@@ -844,6 +844,11 @@
cachedSize_ = "foo"
serializedSize_ = true
by = "foo"
+ dEPRECATEDFoo = "foo"
+ DEPRECATEDBar = "foo"
+ iD = "foo"
+ aBNotification = "foo"
+ notDEPRECATEDFoo = "foo"
}
)
.isEqualTo(
@@ -869,6 +874,11 @@
.setCachedSize_("foo")
.setSerializedSize_(true)
.setBy("foo")
+ .setDEPRECATEDFoo("foo")
+ .setDEPRECATEDBar("foo")
+ .setID("foo")
+ .setABNotification("foo")
+ .setNotDEPRECATEDFoo("foo")
.build()
)
diff --git a/java/kotlin/src/test/kotlin/com/google/protobuf/Proto3Test.kt b/java/kotlin/src/test/kotlin/com/google/protobuf/Proto3Test.kt
index 0b270e6..72ab8e1 100644
--- a/java/kotlin/src/test/kotlin/com/google/protobuf/Proto3Test.kt
+++ b/java/kotlin/src/test/kotlin/com/google/protobuf/Proto3Test.kt
@@ -81,7 +81,7 @@
nestedMessage { bb = 1 },
nestedMessage { bb = 2 },
nestedMessage { bb = 3 },
- nestedMessage { bb = 4 }
+ nestedMessage { bb = 4 },
)
)
repeatedNestedMessage[0] = nestedMessage { bb = 5 }
@@ -91,7 +91,7 @@
nestedMessage { bb = 5 },
nestedMessage { bb = 2 },
nestedMessage { bb = 3 },
- nestedMessage { bb = 4 }
+ nestedMessage { bb = 4 },
)
)
@@ -200,6 +200,11 @@
pairs["foo"] = 1
LeadingUnderscore = "foo"
option = 1
+ dEPRECATEDFoo = "foo"
+ iD = "foo"
+ aBNotification = "foo"
+ DEPRECATEDBar = "foo"
+ notDEPRECATEDFoo = "foo"
}
)
.isEqualTo(
@@ -237,6 +242,11 @@
.putPairs("foo", 1)
.setLeadingUnderscore("foo")
.setOption(1)
+ .setDEPRECATEDFoo("foo")
+ .setID("foo")
+ .setABNotification("foo")
+ .setDEPRECATEDBar("foo")
+ .setNotDEPRECATEDFoo("foo")
.build()
)
diff --git a/java/kotlin/src/test/proto/com/google/protobuf/evil_names_proto2.proto b/java/kotlin/src/test/proto/com/google/protobuf/evil_names_proto2.proto
index ba08274..f771bf9 100644
--- a/java/kotlin/src/test/proto/com/google/protobuf/evil_names_proto2.proto
+++ b/java/kotlin/src/test/proto/com/google/protobuf/evil_names_proto2.proto
@@ -43,6 +43,15 @@
optional string cached_size = 23;
optional bool serialized_size = 24;
optional string by = 25;
+
+ optional string DEPRECATED_foo = 26;
+ optional group DEPRECATED_NavigationImageRequested = 27 {
+ optional int32 DEPRECATED_FooBar = 28;
+ }
+ optional string __DEPRECATED_Bar = 29;
+ optional string ID = 30;
+ optional string a_b_notification = 31;
+ optional string not_DEPRECATED_foo = 32;
}
message List {}
diff --git a/java/kotlin/src/test/proto/com/google/protobuf/evil_names_proto3.proto b/java/kotlin/src/test/proto/com/google/protobuf/evil_names_proto3.proto
index 2c9b5a2..238bebc 100644
--- a/java/kotlin/src/test/proto/com/google/protobuf/evil_names_proto3.proto
+++ b/java/kotlin/src/test/proto/com/google/protobuf/evil_names_proto3.proto
@@ -56,6 +56,12 @@
oneof _leading_underscore_oneof {
int32 option = 34;
}
+
+ optional string DEPRECATED_foo = 35;
+ optional string ID = 36;
+ optional string a_b_notification = 37;
+ optional string __DEPRECATED_Bar = 38;
+ optional string not_DEPRECATED_foo = 39;
}
message HardKeywordsAllTypesProto3 {
diff --git a/src/google/protobuf/compiler/java/BUILD.bazel b/src/google/protobuf/compiler/java/BUILD.bazel
index 39f862f..915b370 100644
--- a/src/google/protobuf/compiler/java/BUILD.bazel
+++ b/src/google/protobuf/compiler/java/BUILD.bazel
@@ -144,6 +144,7 @@
"@com_google_absl//absl/container:flat_hash_map",
"@com_google_absl//absl/log:absl_check",
"@com_google_absl//absl/log:absl_log",
+ "@com_google_absl//absl/strings",
"@com_google_absl//absl/strings:string_view",
],
)
diff --git a/src/google/protobuf/compiler/java/field_common.cc b/src/google/protobuf/compiler/java/field_common.cc
index 4acafab..bb3cd6a 100644
--- a/src/google/protobuf/compiler/java/field_common.cc
+++ b/src/google/protobuf/compiler/java/field_common.cc
@@ -1,8 +1,11 @@
#include "google/protobuf/compiler/java/field_common.h"
+#include <cstddef>
#include <string>
+#include "absl/strings/str_cat.h"
#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/names.h"
#include "google/protobuf/descriptor.h"
namespace google {
@@ -10,6 +13,8 @@
namespace compiler {
namespace java {
+std::string GetKotlinPropertyName(const FieldDescriptor* descriptor);
+
void SetCommonFieldVariables(
const FieldDescriptor* descriptor, const FieldGeneratorInfo* info,
absl::flat_hash_map<absl::string_view, std::string>* variables) {
@@ -30,6 +35,11 @@
(*variables)["kt_name"] = IsForbiddenKotlin(info->name)
? absl::StrCat(info->name, "_")
: info->name;
+ auto kt_property_name = GetKotlinPropertyName(descriptor);
+ (*variables)["kt_property_name"] = kt_property_name;
+ (*variables)["kt_safe_name"] = IsForbiddenKotlin(kt_property_name)
+ ? absl::StrCat("`", kt_property_name, "`")
+ : kt_property_name;
(*variables)["kt_capitalized_name"] =
IsForbiddenKotlin(info->name) ? absl::StrCat(info->capitalized_name, "_")
: info->capitalized_name;
@@ -51,6 +61,52 @@
}
}
+// Locale-independent ASCII upper and lower case munging.
+static bool IsUpper(char c) {
+ return static_cast<unsigned int>(c - 'A') <= 'Z' - 'A';
+}
+
+static char ToLower(char c) { return IsUpper(c) ? c - 'A' + 'a' : c; }
+
+// Returns the name by which the generated Java getters and setters should be
+// referenced from Kotlin as properties. In the simplest case, the original name
+// is something like `foo_bar`, which gets translated into `getFooBar()` etc,
+// and that in turn can be referenced from Kotlin as `fooBar`.
+//
+// The algorithm for translating proto names into Java getters and setters is
+// straightforward. The first letter of each underscore-separated word gets
+// uppercased and the underscores are deleted. There are no other changes, so in
+// particular if the proto name has a string of capitals then those remain
+// as-is.
+//
+// The algorithm that the Kotlin compiler uses to derive the property name is
+// slightly more complicated. If the first character after `get` (etc) is a
+// capital and the second isn't, then the property name is just that string with
+// its first letter lowercased. So `getFoo` becomes `foo` and `getX` becomes
+// `x`. But if there is more than one capital, then all but the last get
+// lowercased. So `getHTMLPage` becomes `htmlPage`. If there are only capitals
+// then they all get lowercased, so `getID` becomes `id`.
+// TODO: move this to a Kotlin-specific location
+std::string GetKotlinPropertyName(const FieldDescriptor* descriptor) {
+ // Find the first non-capital. If it is the second character, then we just
+ // need to lowercase the first one. Otherwise we need to lowercase everything
+ // up to but not including the last capital, except that if everything is
+ // capitals then everything must be lowercased.
+ std::string capitalized_name = CapitalizedFieldName(descriptor);
+ std::string kt_property_name = capitalized_name;
+ size_t first_non_capital;
+ for (first_non_capital = 0; first_non_capital < capitalized_name.length() &&
+ IsUpper(capitalized_name[first_non_capital]);
+ first_non_capital++) {
+ }
+ size_t stop = first_non_capital;
+ if (stop > 1 && stop < capitalized_name.length()) stop--;
+ for (size_t i = 0; i < stop; i++) {
+ kt_property_name[i] = ToLower(kt_property_name[i]);
+ }
+ return kt_property_name;
+}
+
void SetCommonOneofVariables(
const FieldDescriptor* descriptor, const OneofGeneratorInfo* info,
absl::flat_hash_map<absl::string_view, std::string>* variables) {
diff --git a/src/google/protobuf/compiler/java/immutable/enum_field.cc b/src/google/protobuf/compiler/java/immutable/enum_field.cc
index 2cb734f..4a64460 100644
--- a/src/google/protobuf/compiler/java/immutable/enum_field.cc
+++ b/src/google/protobuf/compiler/java/immutable/enum_field.cc
@@ -273,10 +273,10 @@
printer->Print(variables_,
"$kt_deprecation$public var $kt_name$: $kt_type$\n"
" @JvmName(\"${$get$kt_capitalized_name$$}$\")\n"
- " get() = $kt_dsl_builder$.${$get$capitalized_name$$}$()\n"
+ " get() = $kt_dsl_builder$.${$$kt_safe_name$$}$\n"
" @JvmName(\"${$set$kt_capitalized_name$$}$\")\n"
" set(value) {\n"
- " $kt_dsl_builder$.${$set$capitalized_name$$}$(value)\n"
+ " $kt_dsl_builder$.${$$kt_safe_name$$}$ = value\n"
" }\n");
if (SupportUnknownEnumValue(descriptor_)) {
@@ -284,10 +284,10 @@
variables_,
"$kt_deprecation$public var $kt_name$Value: kotlin.Int\n"
" @JvmName(\"${$get$kt_capitalized_name$Value$}$\")\n"
- " get() = $kt_dsl_builder$.${$get$capitalized_name$Value$}$()\n"
+ " get() = $kt_dsl_builder$.${$$kt_property_name$Value$}$\n"
" @JvmName(\"${$set$kt_capitalized_name$Value$}$\")\n"
" set(value) {\n"
- " $kt_dsl_builder$.${$set$capitalized_name$Value$}$(value)\n"
+ " $kt_dsl_builder$.${$$kt_property_name$Value$}$ = value\n"
" }\n");
}
@@ -1100,7 +1100,7 @@
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>\n"
" @kotlin.jvm.JvmSynthetic\n"
" get() = com.google.protobuf.kotlin.DslList(\n"
- " $kt_dsl_builder$.${$get$capitalized_name$List$}$()\n"
+ " $kt_dsl_builder$.${$$kt_property_name$List$}$\n"
" )\n");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_ADDER,
diff --git a/src/google/protobuf/compiler/java/immutable/map_field.cc b/src/google/protobuf/compiler/java/immutable/map_field.cc
index 02e8587..13e6319 100644
--- a/src/google/protobuf/compiler/java/immutable/map_field.cc
+++ b/src/google/protobuf/compiler/java/immutable/map_field.cc
@@ -981,7 +981,7 @@
" @kotlin.jvm.JvmSynthetic\n"
" @JvmName(\"get$kt_capitalized_name$Map\")\n"
" get() = com.google.protobuf.kotlin.DslMap(\n"
- " $kt_dsl_builder$.${$get$capitalized_name$Map$}$()\n"
+ " $kt_dsl_builder$.${$$kt_property_name$Map$}$\n"
" )\n");
WriteFieldDocComment(printer, descriptor_, context_->options(),
diff --git a/src/google/protobuf/compiler/java/immutable/message_field.cc b/src/google/protobuf/compiler/java/immutable/message_field.cc
index 1b76fc2..31eb0ea 100644
--- a/src/google/protobuf/compiler/java/immutable/message_field.cc
+++ b/src/google/protobuf/compiler/java/immutable/message_field.cc
@@ -378,10 +378,10 @@
printer->Print(variables_,
"$kt_deprecation$public var $kt_name$: $kt_type$\n"
" @JvmName(\"${$get$kt_capitalized_name$$}$\")\n"
- " get() = $kt_dsl_builder$.${$get$capitalized_name$$}$()\n"
+ " get() = $kt_dsl_builder$.${$$kt_safe_name$$}$\n"
" @JvmName(\"${$set$kt_capitalized_name$$}$\")\n"
" set(value) {\n"
- " $kt_dsl_builder$.${$set$capitalized_name$$}$(value)\n"
+ " $kt_dsl_builder$.${$$kt_safe_name$$}$ = value\n"
" }\n");
WriteFieldAccessorDocComment(printer, descriptor_, CLEARER,
@@ -1376,7 +1376,7 @@
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>\n"
" @kotlin.jvm.JvmSynthetic\n"
" get() = com.google.protobuf.kotlin.DslList(\n"
- " $kt_dsl_builder$.${$get$capitalized_name$List$}$()\n"
+ " $kt_dsl_builder$.${$$kt_property_name$List$}$\n"
" )\n");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_ADDER,
diff --git a/src/google/protobuf/compiler/java/immutable/primitive_field.cc b/src/google/protobuf/compiler/java/immutable/primitive_field.cc
index eb31a7b..3dc402e 100644
--- a/src/google/protobuf/compiler/java/immutable/primitive_field.cc
+++ b/src/google/protobuf/compiler/java/immutable/primitive_field.cc
@@ -291,14 +291,27 @@
io::Printer* printer) const {
WriteFieldDocComment(printer, descriptor_, context_->options(),
/* kdoc */ true);
- printer->Print(variables_,
- "$kt_deprecation$public var $kt_name$: $kt_type$\n"
- " @JvmName(\"${$get$kt_capitalized_name$$}$\")\n"
- " get() = $kt_dsl_builder$.${$get$capitalized_name$$}$()\n"
- " @JvmName(\"${$set$kt_capitalized_name$$}$\")\n"
- " set(value) {\n"
- " $kt_dsl_builder$.${$set$capitalized_name$$}$(value)\n"
- " }\n");
+ if (descriptor_->name() == "is_initialized") {
+ printer->Print(
+ variables_,
+ "// TODO: remove this hack; we should access properties\n"
+ "$kt_deprecation$public var $kt_name$: $kt_type$\n"
+ " @JvmName(\"${$get$kt_capitalized_name$$}$\")\n"
+ " get() = $kt_dsl_builder$.${$get$kt_capitalized_name$$}$()\n"
+ " @JvmName(\"${$set$kt_capitalized_name$$}$\")\n"
+ " set(value) {\n"
+ " $kt_dsl_builder$.${$set$kt_capitalized_name$$}$(value)\n"
+ " }\n");
+ } else {
+ printer->Print(variables_,
+ "$kt_deprecation$public var $kt_name$: $kt_type$\n"
+ " @JvmName(\"${$get$kt_capitalized_name$$}$\")\n"
+ " get() = $kt_dsl_builder$.${$$kt_safe_name$$}$\n"
+ " @JvmName(\"${$set$kt_capitalized_name$$}$\")\n"
+ " set(value) {\n"
+ " $kt_dsl_builder$.${$$kt_safe_name$$}$ = value\n"
+ " }\n");
+ }
WriteFieldAccessorDocComment(printer, descriptor_, CLEARER,
context_->options(),
@@ -848,7 +861,7 @@
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>\n"
" @kotlin.jvm.JvmSynthetic\n"
" get() = com.google.protobuf.kotlin.DslList(\n"
- " $kt_dsl_builder$.${$get$capitalized_name$List$}$()\n"
+ " $kt_dsl_builder$.${$$kt_property_name$List$}$\n"
" )\n");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_ADDER,
diff --git a/src/google/protobuf/compiler/java/immutable/string_field.cc b/src/google/protobuf/compiler/java/immutable/string_field.cc
index c9ac5f4..df12b05 100644
--- a/src/google/protobuf/compiler/java/immutable/string_field.cc
+++ b/src/google/protobuf/compiler/java/immutable/string_field.cc
@@ -372,10 +372,10 @@
printer->Print(variables_,
"$kt_deprecation$public var $kt_name$: kotlin.String\n"
" @JvmName(\"${$get$kt_capitalized_name$$}$\")\n"
- " get() = $kt_dsl_builder$.${$get$capitalized_name$$}$()\n"
+ " get() = $kt_dsl_builder$.${$$kt_safe_name$$}$\n"
" @JvmName(\"${$set$kt_capitalized_name$$}$\")\n"
" set(value) {\n"
- " $kt_dsl_builder$.${$set$capitalized_name$$}$(value)\n"
+ " $kt_dsl_builder$.${$$kt_safe_name$$}$ = value\n"
" }\n");
WriteFieldAccessorDocComment(printer, descriptor_, CLEARER,
@@ -992,7 +992,7 @@
"<kotlin.String, ${$$kt_capitalized_name$Proxy$}$>\n"
" @kotlin.jvm.JvmSynthetic\n"
" get() = com.google.protobuf.kotlin.DslList(\n"
- " $kt_dsl_builder$.${$get$capitalized_name$List$}$()\n"
+ " $kt_dsl_builder$.${$$kt_property_name$List$}$\n"
" )\n");
// List<String>.add(String)
diff --git a/src/google/protobuf/compiler/java/lite/enum_field.cc b/src/google/protobuf/compiler/java/lite/enum_field.cc
index f2fb340..b9cde7a 100644
--- a/src/google/protobuf/compiler/java/lite/enum_field.cc
+++ b/src/google/protobuf/compiler/java/lite/enum_field.cc
@@ -308,10 +308,10 @@
printer->Print(variables_,
"$kt_deprecation$public var $kt_name$: $kt_type$\n"
" @JvmName(\"${$get$kt_capitalized_name$$}$\")\n"
- " get() = $kt_dsl_builder$.${$get$capitalized_name$$}$()\n"
+ " get() = $kt_dsl_builder$.${$$kt_safe_name$$}$\n"
" @JvmName(\"${$set$kt_capitalized_name$$}$\")\n"
" set(value) {\n"
- " $kt_dsl_builder$.${$set$capitalized_name$$}$(value)\n"
+ " $kt_dsl_builder$.${$$kt_safe_name$$}$ = value\n"
" }\n");
if (SupportUnknownEnumValue(descriptor_)) {
@@ -319,10 +319,10 @@
variables_,
"$kt_deprecation$public var $kt_name$Value: kotlin.Int\n"
" @JvmName(\"${$get$kt_capitalized_name$Value$}$\")\n"
- " get() = $kt_dsl_builder$.${$get$capitalized_name$Value$}$()\n"
+ " get() = $kt_dsl_builder$.${$$kt_property_name$Value$}$\n"
" @JvmName(\"${$set$kt_capitalized_name$Value$}$\")\n"
" set(value) {\n"
- " $kt_dsl_builder$.${$set$capitalized_name$Value$}$(value)\n"
+ " $kt_dsl_builder$.${$$kt_property_name$Value$}$ = value\n"
" }\n");
}
@@ -914,7 +914,7 @@
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>\n"
" @kotlin.jvm.JvmSynthetic\n"
" get() = com.google.protobuf.kotlin.DslList(\n"
- " $kt_dsl_builder$.${$get$capitalized_name$List$}$()\n"
+ " $kt_dsl_builder$.${$$kt_property_name$List$}$\n"
" )\n");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_ADDER,
diff --git a/src/google/protobuf/compiler/java/lite/map_field.cc b/src/google/protobuf/compiler/java/lite/map_field.cc
index 74fc93f..491523d 100644
--- a/src/google/protobuf/compiler/java/lite/map_field.cc
+++ b/src/google/protobuf/compiler/java/lite/map_field.cc
@@ -857,7 +857,7 @@
" @kotlin.jvm.JvmSynthetic\n"
" @JvmName(\"get$kt_capitalized_name$Map\")\n"
" get() = com.google.protobuf.kotlin.DslMap(\n"
- " $kt_dsl_builder$.${$get$capitalized_name$Map$}$()\n"
+ " $kt_dsl_builder$.${$$kt_property_name$Map$}$\n"
" )\n");
WriteFieldDocComment(printer, descriptor_, context_->options(),
diff --git a/src/google/protobuf/compiler/java/lite/message_field.cc b/src/google/protobuf/compiler/java/lite/message_field.cc
index 7c5cc3c..c46407b 100644
--- a/src/google/protobuf/compiler/java/lite/message_field.cc
+++ b/src/google/protobuf/compiler/java/lite/message_field.cc
@@ -283,10 +283,10 @@
printer->Print(variables_,
"$kt_deprecation$public var $kt_name$: $kt_type$\n"
" @JvmName(\"${$get$kt_capitalized_name$$}$\")\n"
- " get() = $kt_dsl_builder$.${$get$capitalized_name$$}$()\n"
+ " get() = $kt_dsl_builder$.${$$kt_safe_name$$}$\n"
" @JvmName(\"${$set$kt_capitalized_name$$}$\")\n"
" set(value) {\n"
- " $kt_dsl_builder$.${$set$capitalized_name$$}$(value)\n"
+ " $kt_dsl_builder$.${$$kt_safe_name$$}$ = value\n"
" }\n");
WriteFieldAccessorDocComment(printer, descriptor_, CLEARER,
@@ -818,7 +818,7 @@
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>\n"
" @kotlin.jvm.JvmSynthetic\n"
" get() = com.google.protobuf.kotlin.DslList(\n"
- " $kt_dsl_builder$.${$get$capitalized_name$List$}$()\n"
+ " $kt_dsl_builder$.${$$kt_property_name$List$}$\n"
" )\n");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_ADDER,
diff --git a/src/google/protobuf/compiler/java/lite/primitive_field.cc b/src/google/protobuf/compiler/java/lite/primitive_field.cc
index 69924c9..c9b3a29 100644
--- a/src/google/protobuf/compiler/java/lite/primitive_field.cc
+++ b/src/google/protobuf/compiler/java/lite/primitive_field.cc
@@ -217,10 +217,9 @@
"private static final $field_type$ $bytes_default$ = $default$;\n");
}
if (!context_->options().opensource_runtime) {
- printer->Print(
- variables_,
- "@com.google.protobuf.ProtoField(\n"
- " isRequired=$required$)\n");
+ printer->Print(variables_,
+ "@com.google.protobuf.ProtoField(\n"
+ " isRequired=$required$)\n");
if (HasHasbit(descriptor_)) {
printer->Print(variables_,
"@com.google.protobuf.ProtoPresenceCheckedField(\n"
@@ -329,14 +328,27 @@
void ImmutablePrimitiveFieldLiteGenerator::GenerateKotlinDslMembers(
io::Printer* printer) const {
WriteFieldDocComment(printer, descriptor_, context_->options());
- printer->Print(variables_,
- "$kt_deprecation$public var $kt_name$: $kt_type$\n"
- " @JvmName(\"${$get$kt_capitalized_name$$}$\")\n"
- " get() = $kt_dsl_builder$.${$get$capitalized_name$$}$()\n"
- " @JvmName(\"${$set$kt_capitalized_name$$}$\")\n"
- " set(value) {\n"
- " $kt_dsl_builder$.${$set$capitalized_name$$}$(value)\n"
- " }\n");
+ if (descriptor_->name() == "is_initialized") {
+ printer->Print(
+ variables_,
+ "// TODO: b/336400327 - remove this hack; we should access properties\n"
+ "$kt_deprecation$public var $kt_name$: $kt_type$\n"
+ " @JvmName(\"${$get$kt_capitalized_name$$}$\")\n"
+ " get() = $kt_dsl_builder$.get${$$kt_capitalized_name$$}$()\n"
+ " @JvmName(\"${$set$kt_capitalized_name$$}$\")\n"
+ " set(value) {\n"
+ " $kt_dsl_builder$.${$set$kt_capitalized_name$$}$(value)\n"
+ " }\n");
+ } else {
+ printer->Print(variables_,
+ "$kt_deprecation$public var $kt_name$: $kt_type$\n"
+ " @JvmName(\"${$get$kt_capitalized_name$$}$\")\n"
+ " get() = $kt_dsl_builder$.${$$kt_safe_name$$}$\n"
+ " @JvmName(\"${$set$kt_capitalized_name$$}$\")\n"
+ " set(value) {\n"
+ " $kt_dsl_builder$.${$$kt_safe_name$$}$ = value\n"
+ " }\n");
+ }
WriteFieldAccessorDocComment(printer, descriptor_, CLEARER,
context_->options(),
@@ -718,7 +730,7 @@
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>\n"
" @kotlin.jvm.JvmSynthetic\n"
" get() = com.google.protobuf.kotlin.DslList(\n"
- " $kt_dsl_builder$.${$get$capitalized_name$List$}$()\n"
+ " $kt_dsl_builder$.${$$kt_property_name$List$}$\n"
" )\n");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_ADDER,
diff --git a/src/google/protobuf/compiler/java/lite/string_field.cc b/src/google/protobuf/compiler/java/lite/string_field.cc
index 833f415..a08bae5 100644
--- a/src/google/protobuf/compiler/java/lite/string_field.cc
+++ b/src/google/protobuf/compiler/java/lite/string_field.cc
@@ -336,10 +336,10 @@
printer->Print(variables_,
"$kt_deprecation$public var $kt_name$: kotlin.String\n"
" @JvmName(\"${$get$kt_capitalized_name$$}$\")\n"
- " get() = $kt_dsl_builder$.${$get$capitalized_name$$}$()\n"
+ " get() = $kt_dsl_builder$.${$$kt_safe_name$$}$\n"
" @JvmName(\"${$set$kt_capitalized_name$$}$\")\n"
" set(value) {\n"
- " $kt_dsl_builder$.${$set$capitalized_name$$}$(value)\n"
+ " $kt_dsl_builder$.${$$kt_safe_name$$}$ = value\n"
" }\n");
WriteFieldAccessorDocComment(printer, descriptor_, CLEARER,
@@ -825,7 +825,7 @@
"@kotlin.OptIn"
"(com.google.protobuf.kotlin.OnlyForUseByGeneratedProtoCode::class)\n"
" get() = com.google.protobuf.kotlin.DslList(\n"
- " $kt_dsl_builder$.${$get$capitalized_name$List$}$()\n"
+ " $kt_dsl_builder$.${$$kt_property_name$List$}$\n"
" )\n");
// List<String>.add(String)