aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/google/protobuf/compiler/csharp/csharp_message_field.cc
diff options
context:
space:
mode:
authorGravatar Jie Luo <jieluo@google.com>2015-05-29 12:48:25 -0700
committerGravatar Jie Luo <jieluo@google.com>2015-05-29 13:29:30 -0700
commitf7b417ddfe63cb4d39775e5fd4560894cc547d65 (patch)
tree2ffb9956310e6aeb46078e7ad58db94d517f1d86 /src/google/protobuf/compiler/csharp/csharp_message_field.cc
parent55df12194f5f0348c3ddf0636c63ba2b3978fab5 (diff)
Add oneof support for C#
Diffstat (limited to 'src/google/protobuf/compiler/csharp/csharp_message_field.cc')
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_message_field.cc118
1 files changed, 116 insertions, 2 deletions
diff --git a/src/google/protobuf/compiler/csharp/csharp_message_field.cc b/src/google/protobuf/compiler/csharp/csharp_message_field.cc
index 10464c4b..b533d735 100644
--- a/src/google/protobuf/compiler/csharp/csharp_message_field.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_message_field.cc
@@ -50,6 +50,7 @@ namespace csharp {
MessageFieldGenerator::MessageFieldGenerator(const FieldDescriptor* descriptor,
int fieldOrdinal)
: FieldGeneratorBase(descriptor, fieldOrdinal) {
+ has_property_check = "has" + property_name();
}
MessageFieldGenerator::~MessageFieldGenerator() {
@@ -149,7 +150,7 @@ void MessageFieldGenerator::GenerateParsingCode(Writer* writer) {
}
void MessageFieldGenerator::GenerateSerializationCode(Writer* writer) {
- writer->WriteLine("if (has$0$) {", property_name());
+ writer->WriteLine("if ($0$) {", has_property_check);
writer->WriteLine(" output.Write$0$($1$, field_names[$3$], $2$);",
message_or_group(), number(), property_name(),
field_ordinal());
@@ -157,7 +158,7 @@ void MessageFieldGenerator::GenerateSerializationCode(Writer* writer) {
}
void MessageFieldGenerator::GenerateSerializedSizeCode(Writer* writer) {
- writer->WriteLine("if (has$0$) {", property_name());
+ writer->WriteLine("if ($0$) {", has_property_check);
writer->WriteLine(" size += pb::CodedOutputStream.Compute$0$Size($1$, $2$);",
message_or_group(), number(), property_name());
writer->WriteLine("}");
@@ -177,6 +178,119 @@ void MessageFieldGenerator::WriteToString(Writer* writer) {
property_name(), name(), GetFieldName(descriptor_));
}
+MessageOneofFieldGenerator::MessageOneofFieldGenerator(const FieldDescriptor* descriptor,
+ int fieldOrdinal)
+ : MessageFieldGenerator(descriptor, fieldOrdinal) {
+ has_property_check = oneof_name() + "Case_ == " + oneof_property_name() +
+ "OneofCase." + property_name();
+}
+
+MessageOneofFieldGenerator::~MessageOneofFieldGenerator() {
+
+}
+
+void MessageOneofFieldGenerator::GenerateMembers(Writer* writer) {
+ if (SupportFieldPresence(descriptor_->file())) {
+ AddDeprecatedFlag(writer);
+ writer->WriteLine("public bool Has$0$ {", property_name());
+ writer->WriteLine(" get { return $0$; }", has_property_check);
+ writer->WriteLine("}");
+ }
+ AddDeprecatedFlag(writer);
+ writer->WriteLine("public $0$ $1$ {", type_name(), property_name());
+ writer->WriteLine(" get { return $0$ ? ($1$) $2$_ : $3$; }",
+ has_property_check, type_name(), oneof_name(), default_value());
+ writer->WriteLine("}");
+}
+
+void MessageOneofFieldGenerator::GenerateBuilderMembers(Writer* writer) {
+ if (SupportFieldPresence(descriptor_->file())) {
+ AddDeprecatedFlag(writer);
+ writer->WriteLine("public bool Has$0$ {", property_name());
+ writer->WriteLine(" get { return result.$0$; }", has_property_check);
+ writer->WriteLine("}");
+ }
+ AddDeprecatedFlag(writer);
+ writer->WriteLine("public $0$ $1$ {", type_name(), property_name());
+ writer->WriteLine(" get { return result.$0$ ? ($1$) result.$2$_ : $3$; }",
+ has_property_check, type_name(), oneof_name(), default_value());
+ writer->WriteLine(" set { Set$0$(value); }", property_name());
+ writer->WriteLine("}");
+ AddDeprecatedFlag(writer);
+ writer->WriteLine("public Builder Set$0$($1$ value) {", property_name(),
+ type_name());
+ AddNullCheck(writer);
+ writer->WriteLine(" PrepareBuilder();");
+ writer->WriteLine(" result.$0$Case_ = $1$OneofCase.$2$;",
+ oneof_name(), oneof_property_name(), property_name());
+ writer->WriteLine(" result.$0$_ = value;", oneof_name());
+ writer->WriteLine(" return this;");
+ writer->WriteLine("}");
+ AddDeprecatedFlag(writer);
+ writer->WriteLine("public Builder Set$0$($1$.Builder builderForValue) {",
+ property_name(), type_name());
+ AddNullCheck(writer, "builderForValue");
+ writer->WriteLine(" PrepareBuilder();");
+ writer->WriteLine(" result.$0$Case_ = $1$OneofCase.$2$;",
+ oneof_name(), oneof_property_name(), property_name());
+ writer->WriteLine(" result.$0$_ = builderForValue.Build();", oneof_name());
+ writer->WriteLine(" return this;");
+ writer->WriteLine("}");
+ AddDeprecatedFlag(writer);
+ writer->WriteLine("public Builder Merge$0$($1$ value) {", property_name(),
+ type_name());
+ AddNullCheck(writer);
+ writer->WriteLine(" PrepareBuilder();");
+ writer->WriteLine(" if (result.$0$ &&", has_property_check);
+ writer->WriteLine(" result.$0$ != $1$) {", property_name(), default_value());
+ writer->WriteLine(
+ " result.$0$_ = $1$.CreateBuilder(result.$2$).MergeFrom(value).BuildPartial();",
+ oneof_name(), type_name(), property_name());
+ writer->WriteLine(" } else {");
+ writer->WriteLine(" result.$0$_ = value;", oneof_name());
+ writer->WriteLine(" }");
+ writer->WriteLine(" result.$0$Case_ = $1$OneofCase.$2$;",
+ oneof_name(), oneof_property_name(), property_name());
+ writer->WriteLine(" return this;");
+ writer->WriteLine("}");
+ AddDeprecatedFlag(writer);
+ writer->WriteLine("public Builder Clear$0$() {", property_name());
+ writer->WriteLine(" if (result.$0$) {", has_property_check);
+ writer->WriteLine(" PrepareBuilder();");
+ writer->WriteLine(" result.$0$Case_ = $1$OneofCase.None;",
+ oneof_name(), oneof_property_name());
+ writer->WriteLine(" result.$0$_ = null;", oneof_name());
+ writer->WriteLine(" }");
+ writer->WriteLine(" return this;");
+ writer->WriteLine("}");
+}
+
+void MessageOneofFieldGenerator::GenerateParsingCode(Writer* writer) {
+ writer->WriteLine("$0$.Builder subBuilder = $0$.CreateBuilder();",
+ type_name());
+ writer->WriteLine("if (result.$0$) {", has_property_check);
+ writer->WriteLine(" subBuilder.MergeFrom($0$);", property_name());
+ writer->WriteLine("}");
+
+ if (descriptor_->type() == FieldDescriptor::TYPE_GROUP) {
+ writer->WriteLine("input.ReadGroup($0$, subBuilder, extensionRegistry);",
+ number());
+ } else {
+ writer->WriteLine("input.ReadMessage(subBuilder, extensionRegistry);");
+ }
+ writer->WriteLine("result.$0$_ = subBuilder.BuildPartial();", oneof_name());
+ writer->WriteLine("result.$0$Case_ = $1$OneofCase.$2$;",
+ oneof_name(), oneof_property_name(), property_name());
+}
+
+void MessageOneofFieldGenerator::WriteEquals(Writer* writer) {
+ writer->WriteLine("if (!$0$.Equals(other.$0$)) return false;", property_name());
+}
+void MessageOneofFieldGenerator::WriteToString(Writer* writer) {
+ writer->WriteLine("PrintField(\"$0$\", $1$, $2$_, writer);",
+ descriptor_->name(), has_property_check, oneof_name());
+}
+
} // namespace csharp
} // namespace compiler
} // namespace protobuf