PiperOrigin-RevId: 682052240pull/18564/head
parent
671e6c5ef6
commit
d3cbd2154e
27 changed files with 939 additions and 1623 deletions
@ -0,0 +1,868 @@ |
||||
#include "google/protobuf/compiler/kotlin/field.h" |
||||
|
||||
#include <string> |
||||
|
||||
#include "absl/container/flat_hash_map.h" |
||||
#include "absl/strings/str_cat.h" |
||||
#include "absl/strings/string_view.h" |
||||
#include "google/protobuf/compiler/java/context.h" |
||||
#include "google/protobuf/compiler/java/doc_comment.h" |
||||
#include "google/protobuf/compiler/java/field_common.h" |
||||
#include "google/protobuf/compiler/java/helpers.h" |
||||
#include "google/protobuf/compiler/java/internal_helpers.h" |
||||
#include "google/protobuf/compiler/java/name_resolver.h" |
||||
#include "google/protobuf/descriptor.h" |
||||
|
||||
namespace google { |
||||
namespace protobuf { |
||||
namespace compiler { |
||||
namespace kotlin { |
||||
|
||||
FieldGenerator::FieldGenerator(const FieldDescriptor* descriptor, |
||||
java::Context* context, bool lite) |
||||
: descriptor_(descriptor), context_(context), lite_(lite) { |
||||
java::SetCommonFieldVariables( |
||||
descriptor, context->GetFieldGeneratorInfo(descriptor), &variables_); |
||||
variables_.insert( |
||||
{"kt_deprecation", |
||||
descriptor->options().deprecated() |
||||
? absl::StrCat("@kotlin.Deprecated(message = \"Field ", |
||||
variables_["name"], " is deprecated\") ") |
||||
: ""}); |
||||
} |
||||
|
||||
void FieldGenerator::Generate(io::Printer* printer) const { |
||||
auto cleanup = printer->WithVars(variables_); |
||||
switch (java::GetJavaType(descriptor_)) { |
||||
case java::JAVATYPE_MESSAGE: |
||||
if (descriptor_->is_repeated() && |
||||
java::IsMapEntry(descriptor_->message_type())) { |
||||
GenerateMapField(printer); |
||||
} else { |
||||
GenerateMessageField(printer); |
||||
} |
||||
break; |
||||
case java::JAVATYPE_STRING: |
||||
GenerateStringField(printer); |
||||
break; |
||||
case java::JAVATYPE_ENUM: |
||||
GenerateEnumField(printer); |
||||
break; |
||||
default: |
||||
GeneratePritimiveField(printer); |
||||
break; |
||||
} |
||||
} |
||||
|
||||
void FieldGenerator::GeneratePritimiveField(io::Printer* printer) const { |
||||
java::JavaType javaType = java::GetJavaType(descriptor_); |
||||
auto cleanup = printer->WithVars( |
||||
{{"kt_type", std::string(java::KotlinTypeName(javaType))}}); |
||||
|
||||
if (descriptor_->is_repeated()) { |
||||
GenerateRepeatedPritimiveField(printer); |
||||
return; |
||||
} |
||||
|
||||
java::JvmNameContext name_ctx = {context_->options(), printer, lite_}; |
||||
java::WriteFieldDocComment(printer, descriptor_, context_->options(), |
||||
/* kdoc */ true); |
||||
if (descriptor_->name() == "is_initialized") { |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name_get", |
||||
[&] { JvmName("${$get$kt_capitalized_name$$}$", name_ctx); }}, |
||||
{"jvm_name_set", |
||||
[&] { JvmName("${$set$kt_capitalized_name$$}$", name_ctx); }}, |
||||
}, |
||||
"// TODO: b/336400327 - remove this hack; we should access properties\n" |
||||
"$kt_deprecation$public var $kt_name$: $kt_type$\n" |
||||
" $jvm_name_get$" |
||||
" get() = $kt_dsl_builder$.get${$$kt_capitalized_name$$}$()\n" |
||||
" $jvm_name_set$" |
||||
" set(value) {\n" |
||||
" $kt_dsl_builder$.${$set$kt_capitalized_name$$}$(value)\n" |
||||
" }\n"); |
||||
} else { |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name_get", |
||||
[&] { JvmName("${$get$kt_capitalized_name$$}$", name_ctx); }}, |
||||
{"jvm_name_set", |
||||
[&] { JvmName("${$set$kt_capitalized_name$$}$", name_ctx); }}, |
||||
}, |
||||
"$kt_deprecation$public var $kt_name$: $kt_type$\n" |
||||
" $jvm_name_get$" |
||||
" get() = $kt_dsl_builder$.${$$kt_safe_name$$}$\n" |
||||
" $jvm_name_set$" |
||||
" set(value) {\n" |
||||
" $kt_dsl_builder$.${$$kt_safe_name$$}$ = value\n" |
||||
" }\n"); |
||||
} |
||||
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::CLEARER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Print( |
||||
"public fun ${$clear$kt_capitalized_name$$}$() {\n" |
||||
" $kt_dsl_builder$.${$clear$capitalized_name$$}$()\n" |
||||
"}\n"); |
||||
|
||||
if (descriptor_->has_presence()) { |
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::HAZZER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Print( |
||||
"public fun ${$has$kt_capitalized_name$$}$(): kotlin.Boolean {\n" |
||||
" return $kt_dsl_builder$.${$has$capitalized_name$$}$()\n" |
||||
"}\n"); |
||||
} |
||||
} |
||||
|
||||
void FieldGenerator::GenerateRepeatedPritimiveField( |
||||
io::Printer* printer) const { |
||||
java::JvmNameContext name_ctx = {context_->options(), printer, lite_}; |
||||
printer->Print( |
||||
"/**\n" |
||||
" * An uninstantiable, behaviorless type to represent the field in\n" |
||||
" * generics.\n" |
||||
" */\n" |
||||
"@kotlin.OptIn" |
||||
"(com.google.protobuf.kotlin.OnlyForUseByGeneratedProtoCode::class)\n" |
||||
"public class ${$$kt_capitalized_name$Proxy$}$ private constructor()" |
||||
" : com.google.protobuf.kotlin.DslProxy()\n"); |
||||
|
||||
WriteFieldDocComment(printer, descriptor_, context_->options(), |
||||
/* kdoc */ true); |
||||
printer->Print( |
||||
"$kt_deprecation$ public val $kt_name$: " |
||||
"com.google.protobuf.kotlin.DslList" |
||||
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>\n" |
||||
"$ jvm_synthetic$" |
||||
" get() = com.google.protobuf.kotlin.DslList(\n" |
||||
" $kt_dsl_builder$.${$$kt_property_name$List$}$\n" |
||||
" )\n"); |
||||
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::LIST_ADDER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", [&] { JvmName("add$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
"$jvm_synthetic$" |
||||
"$jvm_name$" |
||||
"public fun com.google.protobuf.kotlin.DslList" |
||||
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>." |
||||
"add(value: $kt_type$) {\n" |
||||
" $kt_dsl_builder$.${$add$capitalized_name$$}$(value)\n" |
||||
"}"); |
||||
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::LIST_ADDER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", |
||||
[&] { JvmName("plusAssign$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
"$jvm_synthetic$" |
||||
"$jvm_name$" |
||||
"@Suppress(\"NOTHING_TO_INLINE\")\n" |
||||
"public inline operator fun com.google.protobuf.kotlin.DslList" |
||||
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>." |
||||
"plusAssign(value: $kt_type$) {\n" |
||||
" add(value)\n" |
||||
"}"); |
||||
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::LIST_MULTI_ADDER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", |
||||
[&] { JvmName("addAll$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
"$jvm_synthetic$" |
||||
"$jvm_name$" |
||||
"public fun com.google.protobuf.kotlin.DslList" |
||||
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>." |
||||
"addAll(values: kotlin.collections.Iterable<$kt_type$>) {\n" |
||||
" $kt_dsl_builder$.${$addAll$capitalized_name$$}$(values)\n" |
||||
"}"); |
||||
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::LIST_MULTI_ADDER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", |
||||
[&] { JvmName("plusAssignAll$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
"$jvm_synthetic$" |
||||
"$jvm_name$" |
||||
"@Suppress(\"NOTHING_TO_INLINE\")\n" |
||||
"public inline operator fun com.google.protobuf.kotlin.DslList" |
||||
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>." |
||||
"plusAssign(values: kotlin.collections.Iterable<$kt_type$>) {\n" |
||||
" addAll(values)\n" |
||||
"}"); |
||||
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::LIST_INDEXED_SETTER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", [&] { JvmName("set$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
"$jvm_synthetic$" |
||||
"$jvm_name$" |
||||
"public operator fun com.google.protobuf.kotlin.DslList" |
||||
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>." |
||||
"set(index: kotlin.Int, value: $kt_type$) {\n" |
||||
" $kt_dsl_builder$.${$set$capitalized_name$$}$(index, value)\n" |
||||
"}"); |
||||
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::CLEARER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", |
||||
[&] { JvmName("clear$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
"$jvm_synthetic$" |
||||
"$jvm_name$" |
||||
"public fun com.google.protobuf.kotlin.DslList" |
||||
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>." |
||||
"clear() {\n" |
||||
" $kt_dsl_builder$.${$clear$capitalized_name$$}$()\n" |
||||
"}"); |
||||
} |
||||
|
||||
void FieldGenerator::GenerateMessageField(io::Printer* printer) const { |
||||
auto name_resolver = context_->GetNameResolver(); |
||||
auto cleanup = printer->WithVars( |
||||
{{"kt_type", |
||||
java::EscapeKotlinKeywords(name_resolver->GetImmutableClassName( |
||||
descriptor_->message_type()))}}); |
||||
|
||||
if (descriptor_->is_repeated()) { |
||||
GenerateRepeatedMessageField(printer); |
||||
return; |
||||
} |
||||
|
||||
java::JvmNameContext name_ctx = {context_->options(), printer, lite_}; |
||||
WriteFieldDocComment(printer, descriptor_, context_->options(), |
||||
/* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name_get", |
||||
[&] { JvmName("${$get$kt_capitalized_name$$}$", name_ctx); }}, |
||||
{"jvm_name_set", |
||||
[&] { JvmName("${$set$kt_capitalized_name$$}$", name_ctx); }}, |
||||
}, |
||||
"$kt_deprecation$public var $kt_name$: $kt_type$\n" |
||||
" $jvm_name_get$" |
||||
" get() = $kt_dsl_builder$.${$$kt_safe_name$$}$\n" |
||||
" $jvm_name_set$" |
||||
" set(value) {\n" |
||||
" $kt_dsl_builder$.${$$kt_safe_name$$}$ = value\n" |
||||
" }\n"); |
||||
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::CLEARER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Print( |
||||
"public fun ${$clear$kt_capitalized_name$$}$() {\n" |
||||
" $kt_dsl_builder$.${$clear$capitalized_name$$}$()\n" |
||||
"}\n"); |
||||
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::HAZZER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Print( |
||||
"public fun ${$has$kt_capitalized_name$$}$(): kotlin.Boolean {\n" |
||||
" return $kt_dsl_builder$.${$has$capitalized_name$$}$()\n" |
||||
"}\n"); |
||||
if (descriptor_->has_presence() && |
||||
descriptor_->real_containing_oneof() == nullptr) { |
||||
printer->Print( |
||||
"$kt_deprecation$\n" |
||||
"public val $classname$Kt.Dsl.$name$OrNull: $kt_type$?\n" |
||||
" get() = $kt_dsl_builder$.$name$OrNull\n"); |
||||
} |
||||
} |
||||
|
||||
void FieldGenerator::GenerateRepeatedMessageField(io::Printer* printer) const { |
||||
java::JvmNameContext name_ctx = {context_->options(), printer, lite_}; |
||||
printer->Print( |
||||
"/**\n" |
||||
" * An uninstantiable, behaviorless type to represent the field in\n" |
||||
" * generics.\n" |
||||
" */\n" |
||||
"@kotlin.OptIn" |
||||
"(com.google.protobuf.kotlin.OnlyForUseByGeneratedProtoCode::class)\n" |
||||
"public class ${$$kt_capitalized_name$Proxy$}$ private constructor()" |
||||
" : com.google.protobuf.kotlin.DslProxy()\n"); |
||||
|
||||
WriteFieldDocComment(printer, descriptor_, context_->options(), |
||||
/* kdoc */ true); |
||||
printer->Print( |
||||
"$kt_deprecation$ public val $kt_name$: " |
||||
"com.google.protobuf.kotlin.DslList" |
||||
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>\n" |
||||
"$ jvm_synthetic$" |
||||
" get() = com.google.protobuf.kotlin.DslList(\n" |
||||
" $kt_dsl_builder$.${$$kt_property_name$List$}$\n" |
||||
" )\n"); |
||||
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::LIST_ADDER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", [&] { JvmName("add$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
"$jvm_synthetic$" |
||||
"$jvm_name$" |
||||
"public fun com.google.protobuf.kotlin.DslList" |
||||
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>." |
||||
"add(value: $kt_type$) {\n" |
||||
" $kt_dsl_builder$.${$add$capitalized_name$$}$(value)\n" |
||||
"}\n"); |
||||
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::LIST_ADDER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", |
||||
[&] { JvmName("plusAssign$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
"$jvm_synthetic$" |
||||
"$jvm_name$" |
||||
"@Suppress(\"NOTHING_TO_INLINE\")\n" |
||||
"public inline operator fun com.google.protobuf.kotlin.DslList" |
||||
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>." |
||||
"plusAssign(value: $kt_type$) {\n" |
||||
" add(value)\n" |
||||
"}\n"); |
||||
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::LIST_MULTI_ADDER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", |
||||
[&] { JvmName("addAll$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
"$jvm_synthetic$" |
||||
"$jvm_name$" |
||||
"public fun com.google.protobuf.kotlin.DslList" |
||||
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>." |
||||
"addAll(values: kotlin.collections.Iterable<$kt_type$>) {\n" |
||||
" $kt_dsl_builder$.${$addAll$capitalized_name$$}$(values)\n" |
||||
"}\n"); |
||||
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::LIST_MULTI_ADDER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", |
||||
[&] { JvmName("plusAssignAll$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
"$jvm_synthetic$" |
||||
"$jvm_name$" |
||||
"@Suppress(\"NOTHING_TO_INLINE\")\n" |
||||
"public inline operator fun com.google.protobuf.kotlin.DslList" |
||||
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>." |
||||
"plusAssign(values: kotlin.collections.Iterable<$kt_type$>) {\n" |
||||
" addAll(values)\n" |
||||
"}\n"); |
||||
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::LIST_INDEXED_SETTER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", [&] { JvmName("set$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
"$jvm_synthetic$" |
||||
"$jvm_name$" |
||||
"public operator fun com.google.protobuf.kotlin.DslList" |
||||
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>." |
||||
"set(index: kotlin.Int, value: $kt_type$) {\n" |
||||
" $kt_dsl_builder$.${$set$capitalized_name$$}$(index, value)\n" |
||||
"}\n"); |
||||
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::CLEARER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", |
||||
[&] { JvmName("clear$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
|
||||
"$jvm_synthetic$" |
||||
"$jvm_name$" |
||||
"public fun com.google.protobuf.kotlin.DslList" |
||||
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>." |
||||
"clear() {\n" |
||||
" $kt_dsl_builder$.${$clear$capitalized_name$$}$()\n" |
||||
"}\n"); |
||||
} |
||||
|
||||
void FieldGenerator::GenerateStringField(io::Printer* printer) const { |
||||
if (descriptor_->is_repeated()) { |
||||
GenerateRepeatedStringField(printer); |
||||
return; |
||||
} |
||||
java::JvmNameContext name_ctx = {context_->options(), printer, lite_}; |
||||
WriteFieldDocComment(printer, descriptor_, context_->options(), |
||||
/* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name_get", |
||||
[&] { JvmName("${$get$kt_capitalized_name$$}$", name_ctx); }}, |
||||
{"jvm_name_set", |
||||
[&] { JvmName("${$set$kt_capitalized_name$$}$", name_ctx); }}, |
||||
}, |
||||
"$kt_deprecation$public var $kt_name$: kotlin.String\n" |
||||
" $jvm_name_get$" |
||||
" get() = $kt_dsl_builder$.${$$kt_safe_name$$}$\n" |
||||
" $jvm_name_set$" |
||||
" set(value) {\n" |
||||
" $kt_dsl_builder$.${$$kt_safe_name$$}$ = value\n" |
||||
" }\n"); |
||||
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::CLEARER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Print( |
||||
"public fun ${$clear$kt_capitalized_name$$}$() {\n" |
||||
" $kt_dsl_builder$.${$clear$capitalized_name$$}$()\n" |
||||
"}\n"); |
||||
|
||||
if (descriptor_->has_presence()) { |
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::HAZZER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Print( |
||||
"public fun ${$has$kt_capitalized_name$$}$(): kotlin.Boolean {\n" |
||||
" return $kt_dsl_builder$.${$has$capitalized_name$$}$()\n" |
||||
"}\n"); |
||||
} |
||||
} |
||||
|
||||
void FieldGenerator::GenerateRepeatedStringField(io::Printer* printer) const { |
||||
java::JvmNameContext name_ctx = {context_->options(), printer, lite_}; |
||||
printer->Print( |
||||
"/**\n" |
||||
" * An uninstantiable, behaviorless type to represent the field in\n" |
||||
" * generics.\n" |
||||
" */\n" |
||||
"@kotlin.OptIn" |
||||
"(com.google.protobuf.kotlin.OnlyForUseByGeneratedProtoCode::class)\n" |
||||
"public class ${$$kt_capitalized_name$Proxy$}$ private constructor()" |
||||
" : com.google.protobuf.kotlin.DslProxy()\n"); |
||||
|
||||
// property for List<String>
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::LIST_GETTER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Print( |
||||
"$kt_deprecation$public val $kt_name$: " |
||||
"com.google.protobuf.kotlin.DslList" |
||||
"<kotlin.String, ${$$kt_capitalized_name$Proxy$}$>\n" |
||||
"@kotlin.OptIn" |
||||
"(com.google.protobuf.kotlin.OnlyForUseByGeneratedProtoCode::class)\n" |
||||
" get() = com.google.protobuf.kotlin.DslList(\n" |
||||
" $kt_dsl_builder$.${$$kt_property_name$List$}$\n" |
||||
" )\n"); |
||||
|
||||
// List<String>.add(String)
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::LIST_ADDER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", [&] { JvmName("add$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
"$jvm_synthetic$" |
||||
"$jvm_name$" |
||||
"public fun com.google.protobuf.kotlin.DslList" |
||||
"<kotlin.String, ${$$kt_capitalized_name$Proxy$}$>." |
||||
"add(value: kotlin.String) {\n" |
||||
" $kt_dsl_builder$.${$add$capitalized_name$$}$(value)\n" |
||||
"}\n"); |
||||
|
||||
// List<String> += String
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::LIST_ADDER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", |
||||
[&] { JvmName("plusAssign$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
"$jvm_synthetic$" |
||||
"$jvm_name$" |
||||
"@Suppress(\"NOTHING_TO_INLINE\")\n" |
||||
"public inline operator fun com.google.protobuf.kotlin.DslList" |
||||
"<kotlin.String, ${$$kt_capitalized_name$Proxy$}$>." |
||||
"plusAssign(value: kotlin.String) {\n" |
||||
" add(value)\n" |
||||
"}\n"); |
||||
|
||||
// List<String>.addAll(Iterable<String>)
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::LIST_MULTI_ADDER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", |
||||
[&] { JvmName("addAll$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
"$jvm_synthetic$" |
||||
"$jvm_name$" |
||||
"public fun com.google.protobuf.kotlin.DslList" |
||||
"<kotlin.String, ${$$kt_capitalized_name$Proxy$}$>." |
||||
"addAll(values: kotlin.collections.Iterable<kotlin.String>) {\n" |
||||
" $kt_dsl_builder$.${$addAll$capitalized_name$$}$(values)\n" |
||||
"}\n"); |
||||
|
||||
// List<String> += Iterable<String>
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::LIST_MULTI_ADDER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", |
||||
[&] { JvmName("plusAssignAll$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
"$jvm_synthetic$" |
||||
"$jvm_name$" |
||||
"@Suppress(\"NOTHING_TO_INLINE\")\n" |
||||
"public inline operator fun com.google.protobuf.kotlin.DslList" |
||||
"<kotlin.String, ${$$kt_capitalized_name$Proxy$}$>." |
||||
"plusAssign(values: kotlin.collections.Iterable<kotlin.String>) {\n" |
||||
" addAll(values)\n" |
||||
"}\n"); |
||||
|
||||
// List<String>[Int] = String
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::LIST_INDEXED_SETTER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", [&] { JvmName("set$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
"$jvm_synthetic$" |
||||
"$jvm_name$" |
||||
"public operator fun com.google.protobuf.kotlin.DslList" |
||||
"<kotlin.String, ${$$kt_capitalized_name$Proxy$}$>." |
||||
"set(index: kotlin.Int, value: kotlin.String) {\n" |
||||
" $kt_dsl_builder$.${$set$capitalized_name$$}$(index, value)\n" |
||||
"}"); |
||||
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::CLEARER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", [&] { JvmName("set$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
"$jvm_synthetic$" |
||||
"$jvm_name$" |
||||
"public fun com.google.protobuf.kotlin.DslList" |
||||
"<kotlin.String, ${$$kt_capitalized_name$Proxy$}$>." |
||||
"clear() {\n" |
||||
" $kt_dsl_builder$.${$clear$capitalized_name$$}$()\n" |
||||
"}"); |
||||
} |
||||
|
||||
void FieldGenerator::GenerateEnumField(io::Printer* printer) const { |
||||
auto name_resolver = context_->GetNameResolver(); |
||||
auto cleanup = printer->WithVars( |
||||
{{"kt_type", |
||||
java::EscapeKotlinKeywords( |
||||
name_resolver->GetImmutableClassName(descriptor_->enum_type()))}}); |
||||
|
||||
if (descriptor_->is_repeated()) { |
||||
GenerateRepeatedEnumField(printer); |
||||
return; |
||||
} |
||||
|
||||
java::JvmNameContext name_ctx = {context_->options(), printer, lite_}; |
||||
WriteFieldDocComment(printer, descriptor_, context_->options(), |
||||
/* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name_get", |
||||
[&] { JvmName("${$get$kt_capitalized_name$$}$", name_ctx); }}, |
||||
{"jvm_name_set", |
||||
[&] { JvmName("${$set$kt_capitalized_name$$}$", name_ctx); }}, |
||||
}, |
||||
"$kt_deprecation$public var $kt_name$: $kt_type$\n" |
||||
" $jvm_name_get$" |
||||
" get() = $kt_dsl_builder$.${$$kt_safe_name$$}$\n" |
||||
" $jvm_name_set$" |
||||
" set(value) {\n" |
||||
" $kt_dsl_builder$.${$$kt_safe_name$$}$ = value\n" |
||||
" }\n"); |
||||
|
||||
if (java::SupportUnknownEnumValue(descriptor_)) { |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name_get", |
||||
[&] { JvmName("${$get$kt_capitalized_name$Value$}$", name_ctx); }}, |
||||
{"jvm_name_set", |
||||
[&] { JvmName("${$set$kt_capitalized_name$Value$}$", name_ctx); }}, |
||||
}, |
||||
"$kt_deprecation$public var $kt_name$Value: kotlin.Int\n" |
||||
" $jvm_name_get$" |
||||
" get() = $kt_dsl_builder$.${$$kt_property_name$Value$}$\n" |
||||
" $jvm_name_set$" |
||||
" set(value) {\n" |
||||
" $kt_dsl_builder$.${$$kt_property_name$Value$}$ = value\n" |
||||
" }\n"); |
||||
} |
||||
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::CLEARER, |
||||
context_->options(), |
||||
/* kdoc */ true); |
||||
printer->Print( |
||||
"public fun ${$clear$kt_capitalized_name$$}$() {\n" |
||||
" $kt_dsl_builder$.${$clear$capitalized_name$$}$()\n" |
||||
"}\n"); |
||||
|
||||
if (descriptor_->has_presence()) { |
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::HAZZER, |
||||
context_->options(), |
||||
/* kdoc */ true); |
||||
printer->Print( |
||||
"public fun ${$has$kt_capitalized_name$$}$(): kotlin.Boolean {\n" |
||||
" return $kt_dsl_builder$.${$has$capitalized_name$$}$()\n" |
||||
"}\n"); |
||||
} |
||||
} |
||||
|
||||
void FieldGenerator::GenerateRepeatedEnumField(io::Printer* printer) const { |
||||
java::JvmNameContext name_ctx = {context_->options(), printer, lite_}; |
||||
printer->Print( |
||||
"/**\n" |
||||
" * An uninstantiable, behaviorless type to represent the field in\n" |
||||
" * generics.\n" |
||||
" */\n" |
||||
"@kotlin.OptIn" |
||||
"(com.google.protobuf.kotlin.OnlyForUseByGeneratedProtoCode::class)\n" |
||||
"public class ${$$kt_capitalized_name$Proxy$}$ private constructor()" |
||||
" : com.google.protobuf.kotlin.DslProxy()\n"); |
||||
|
||||
WriteFieldDocComment(printer, descriptor_, context_->options(), |
||||
/* kdoc */ true); |
||||
printer->Print( |
||||
"$kt_deprecation$ public val $kt_name$: " |
||||
"com.google.protobuf.kotlin.DslList" |
||||
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>\n" |
||||
"$ jvm_synthetic$" |
||||
" get() = com.google.protobuf.kotlin.DslList(\n" |
||||
" $kt_dsl_builder$.${$$kt_property_name$List$}$\n" |
||||
" )\n"); |
||||
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::LIST_ADDER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", [&] { JvmName("add$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
"$jvm_synthetic$" |
||||
"$jvm_name$" |
||||
"public fun com.google.protobuf.kotlin.DslList" |
||||
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>." |
||||
"add(value: $kt_type$) {\n" |
||||
" $kt_dsl_builder$.${$add$capitalized_name$$}$(value)\n" |
||||
"}"); |
||||
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::LIST_ADDER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", |
||||
[&] { JvmName("plusAssign$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
"$jvm_synthetic$" |
||||
"$jvm_name$" |
||||
"@Suppress(\"NOTHING_TO_INLINE\")\n" |
||||
"public inline operator fun com.google.protobuf.kotlin.DslList" |
||||
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>." |
||||
"plusAssign(value: $kt_type$) {\n" |
||||
" add(value)\n" |
||||
"}"); |
||||
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::LIST_MULTI_ADDER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", |
||||
[&] { JvmName("addAll$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
"$jvm_synthetic$" |
||||
"$jvm_name$" |
||||
"public fun com.google.protobuf.kotlin.DslList" |
||||
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>." |
||||
"addAll(values: kotlin.collections.Iterable<$kt_type$>) {\n" |
||||
" $kt_dsl_builder$.${$addAll$capitalized_name$$}$(values)\n" |
||||
"}"); |
||||
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::LIST_MULTI_ADDER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", |
||||
[&] { JvmName("plusAssignAll$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
"$jvm_synthetic$" |
||||
"$jvm_name$" |
||||
"@Suppress(\"NOTHING_TO_INLINE\")\n" |
||||
"public inline operator fun com.google.protobuf.kotlin.DslList" |
||||
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>." |
||||
"plusAssign(values: kotlin.collections.Iterable<$kt_type$>) {\n" |
||||
" addAll(values)\n" |
||||
"}"); |
||||
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::LIST_INDEXED_SETTER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", [&] { JvmName("set$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
"$jvm_synthetic$" |
||||
"$jvm_name$" |
||||
"public operator fun com.google.protobuf.kotlin.DslList" |
||||
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>." |
||||
"set(index: kotlin.Int, value: $kt_type$) {\n" |
||||
" $kt_dsl_builder$.${$set$capitalized_name$$}$(index, value)\n" |
||||
"}"); |
||||
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, java::CLEARER, |
||||
context_->options(), /* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", |
||||
[&] { JvmName("clear$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
"$jvm_synthetic$" |
||||
"$jvm_name$" |
||||
"public fun com.google.protobuf.kotlin.DslList" |
||||
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>." |
||||
"clear() {\n" |
||||
" $kt_dsl_builder$.${$clear$capitalized_name$$}$()\n" |
||||
"}"); |
||||
} |
||||
|
||||
namespace { |
||||
std::string KotlinTypeName(const FieldDescriptor* field, |
||||
java::ClassNameResolver* name_resolver) { |
||||
if (java::GetJavaType(field) == java::JAVATYPE_MESSAGE) { |
||||
return name_resolver->GetImmutableClassName(field->message_type()); |
||||
} else if (java::GetJavaType(field) == java::JAVATYPE_ENUM) { |
||||
return name_resolver->GetImmutableClassName(field->enum_type()); |
||||
} else { |
||||
return std::string(java::KotlinTypeName(java::GetJavaType(field))); |
||||
} |
||||
} |
||||
} // namespace
|
||||
|
||||
void FieldGenerator::GenerateMapField(io::Printer* printer) const { |
||||
auto name_resolver = context_->GetNameResolver(); |
||||
const FieldDescriptor* key = java::MapKeyField(descriptor_); |
||||
const FieldDescriptor* value = java::MapValueField(descriptor_); |
||||
auto cleanup = printer->WithVars( |
||||
{{"kt_key_type", KotlinTypeName(key, name_resolver)}, |
||||
{"kt_value_type", KotlinTypeName(value, name_resolver)}}); |
||||
|
||||
java::JvmNameContext name_ctx = {context_->options(), printer, lite_}; |
||||
printer->Print( |
||||
"/**\n" |
||||
" * An uninstantiable, behaviorless type to represent the field in\n" |
||||
" * generics.\n" |
||||
" */\n" |
||||
"@kotlin.OptIn" |
||||
"(com.google.protobuf.kotlin.OnlyForUseByGeneratedProtoCode::class)\n" |
||||
"public class ${$$kt_capitalized_name$Proxy$}$ private constructor()" |
||||
" : com.google.protobuf.kotlin.DslProxy()\n"); |
||||
|
||||
WriteFieldDocComment(printer, descriptor_, context_->options(), |
||||
/* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", |
||||
[&] { JvmName("get$kt_capitalized_name$Map", name_ctx); }}, |
||||
}, |
||||
"$kt_deprecation$ public val $kt_name$: " |
||||
"com.google.protobuf.kotlin.DslMap" |
||||
"<$kt_key_type$, $kt_value_type$, ${$$kt_capitalized_name$Proxy$}$>\n" |
||||
"$ jvm_synthetic$" |
||||
"$jvm_name$" |
||||
" get() = com.google.protobuf.kotlin.DslMap(\n" |
||||
" $kt_dsl_builder$.${$$kt_property_name$Map$}$\n" |
||||
" )\n"); |
||||
|
||||
WriteFieldDocComment(printer, descriptor_, context_->options(), |
||||
/* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", [&] { JvmName("put$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
"$jvm_name$" |
||||
"public fun com.google.protobuf.kotlin.DslMap" |
||||
"<$kt_key_type$, $kt_value_type$, ${$$kt_capitalized_name$Proxy$}$>\n" |
||||
" .put(key: $kt_key_type$, value: $kt_value_type$) {\n" |
||||
" $kt_dsl_builder$.${$put$capitalized_name$$}$(key, value)\n" |
||||
" }\n"); |
||||
|
||||
WriteFieldDocComment(printer, descriptor_, context_->options(), |
||||
/* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", [&] { JvmName("set$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
"$jvm_synthetic$" |
||||
"$jvm_name$" |
||||
"@Suppress(\"NOTHING_TO_INLINE\")\n" |
||||
"public inline operator fun com.google.protobuf.kotlin.DslMap" |
||||
"<$kt_key_type$, $kt_value_type$, ${$$kt_capitalized_name$Proxy$}$>\n" |
||||
" .set(key: $kt_key_type$, value: $kt_value_type$) {\n" |
||||
" put(key, value)\n" |
||||
" }\n"); |
||||
|
||||
WriteFieldDocComment(printer, descriptor_, context_->options(), |
||||
/* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", |
||||
[&] { JvmName("remove$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
"$jvm_synthetic$" |
||||
"$jvm_name$" |
||||
"public fun com.google.protobuf.kotlin.DslMap" |
||||
"<$kt_key_type$, $kt_value_type$, ${$$kt_capitalized_name$Proxy$}$>\n" |
||||
" .remove(key: $kt_key_type$) {\n" |
||||
" $kt_dsl_builder$.${$remove$capitalized_name$$}$(key)\n" |
||||
" }\n"); |
||||
|
||||
WriteFieldDocComment(printer, descriptor_, context_->options(), |
||||
/* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", |
||||
[&] { JvmName("putAll$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
"$jvm_synthetic$" |
||||
"$jvm_name$" |
||||
"public fun com.google.protobuf.kotlin.DslMap" |
||||
"<$kt_key_type$, $kt_value_type$, ${$$kt_capitalized_name$Proxy$}$>\n" |
||||
" .putAll(map: kotlin.collections.Map<$kt_key_type$, $kt_value_type$>) " |
||||
"{\n" |
||||
" $kt_dsl_builder$.${$putAll$capitalized_name$$}$(map)\n" |
||||
" }\n"); |
||||
|
||||
WriteFieldDocComment(printer, descriptor_, context_->options(), |
||||
/* kdoc */ true); |
||||
printer->Emit( |
||||
{ |
||||
{"jvm_name", |
||||
[&] { JvmName("clear$kt_capitalized_name$", name_ctx); }}, |
||||
}, |
||||
"$jvm_synthetic$" |
||||
"$jvm_name$" |
||||
"public fun com.google.protobuf.kotlin.DslMap" |
||||
"<$kt_key_type$, $kt_value_type$, ${$$kt_capitalized_name$Proxy$}$>\n" |
||||
" .clear() {\n" |
||||
" $kt_dsl_builder$.${$clear$capitalized_name$$}$()\n" |
||||
" }\n"); |
||||
} |
||||
|
||||
} // namespace kotlin
|
||||
} // namespace compiler
|
||||
} // namespace protobuf
|
||||
} // namespace google
|
@ -0,0 +1,50 @@ |
||||
#ifndef GOOGLE_PROTOBUF_COMPILER_KOTLIN_FIELD_H__ |
||||
#define GOOGLE_PROTOBUF_COMPILER_KOTLIN_FIELD_H__ |
||||
|
||||
#include <string> |
||||
|
||||
#include "absl/container/flat_hash_map.h" |
||||
#include "absl/strings/string_view.h" |
||||
#include "google/protobuf/compiler/java/context.h" |
||||
#include "google/protobuf/descriptor.h" |
||||
#include "google/protobuf/io/printer.h" |
||||
|
||||
namespace google { |
||||
namespace protobuf { |
||||
namespace compiler { |
||||
namespace kotlin { |
||||
|
||||
class FieldGenerator { |
||||
public: |
||||
FieldGenerator(const FieldDescriptor* descriptor, java::Context* context, |
||||
bool lite); |
||||
FieldGenerator(const FieldGenerator&) = delete; |
||||
FieldGenerator& operator=(const FieldGenerator&) = delete; |
||||
~FieldGenerator() = default; |
||||
|
||||
void Generate(io::Printer* printer) const; |
||||
|
||||
private: |
||||
const FieldDescriptor* descriptor_; |
||||
absl::flat_hash_map<absl::string_view, std::string> variables_; |
||||
java::Context* context_; |
||||
bool lite_; |
||||
|
||||
void GeneratePritimiveField(io::Printer* printer) const; |
||||
void GenerateMessageField(io::Printer* printer) const; |
||||
void GenerateMapField(io::Printer* printer) const; |
||||
void GenerateStringField(io::Printer* printer) const; |
||||
void GenerateEnumField(io::Printer* printer) const; |
||||
|
||||
void GenerateRepeatedPritimiveField(io::Printer* printer) const; |
||||
void GenerateRepeatedMessageField(io::Printer* printer) const; |
||||
void GenerateRepeatedStringField(io::Printer* printer) const; |
||||
void GenerateRepeatedEnumField(io::Printer* printer) const; |
||||
}; |
||||
|
||||
} // namespace kotlin
|
||||
} // namespace compiler
|
||||
} // namespace protobuf
|
||||
} // namespace google
|
||||
|
||||
#endif // GOOGLE_PROTOBUF_COMPILER_KOTLIN_FIELD_H__
|
Loading…
Reference in new issue