aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/google/protobuf/compiler/csharp/csharp_enum_field.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/google/protobuf/compiler/csharp/csharp_enum_field.cc')
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_enum_field.cc60
1 files changed, 21 insertions, 39 deletions
diff --git a/src/google/protobuf/compiler/csharp/csharp_enum_field.cc b/src/google/protobuf/compiler/csharp/csharp_enum_field.cc
index 51a95b9f..d38fb1ed 100644
--- a/src/google/protobuf/compiler/csharp/csharp_enum_field.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_enum_field.cc
@@ -55,36 +55,29 @@ EnumFieldGenerator::~EnumFieldGenerator() {
void EnumFieldGenerator::GenerateParsingCode(io::Printer* printer) {
printer->Print(variables_,
- "object unknown;\n"
- "if(input.ReadEnum(ref result.$name$_, out unknown)) {\n");
- if (SupportFieldPresence(descriptor_->file())) {
- printer->Print(variables_,
- " result.has$property_name$ = true;\n");
- }
- printer->Print("} else if(unknown is int) {\n");
- if (!use_lite_runtime()) {
- printer->Print(variables_,
- " if (unknownFields == null) {\n" // First unknown field - create builder now
- " unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);\n"
- " }\n"
- " unknownFields.MergeVarintField($number$, (ulong)(int)unknown);\n");
- }
- printer->Print("}\n");
+ "$name$_ = ($type_name$) input.ReadEnum();\n");
}
void EnumFieldGenerator::GenerateSerializationCode(io::Printer* printer) {
printer->Print(variables_,
- "if ($has_property_check$) {\n"
- " output.WriteEnum($number$, field_names[$field_ordinal$], (int) $property_name$, $property_name$);\n"
- "}\n");
+ "if ($has_property_check$) {\n"
+ " output.WriteRawTag($tag_bytes$);\n"
+ " output.WriteEnum((int) $property_name$);\n"
+ "}\n");
}
void EnumFieldGenerator::GenerateSerializedSizeCode(io::Printer* printer) {
printer->Print(
- variables_,
- "if ($has_property_check$) {\n"
- " size += pb::CodedOutputStream.ComputeEnumSize($number$, (int) $property_name$);\n"
- "}\n");
+ variables_,
+ "if ($has_property_check$) {\n"
+ " size += $tag_size$ + pb::CodedOutputStream.ComputeEnumSize((int) $property_name$);\n"
+ "}\n");
+}
+
+void EnumFieldGenerator::GenerateCodecCode(io::Printer* printer) {
+ printer->Print(
+ variables_,
+ "pb::FieldCodec.ForEnum($tag$, x => (int) x, x => ($type_name$) x)");
}
EnumOneofFieldGenerator::EnumOneofFieldGenerator(const FieldDescriptor* descriptor,
@@ -96,30 +89,19 @@ EnumOneofFieldGenerator::~EnumOneofFieldGenerator() {
}
void EnumOneofFieldGenerator::GenerateParsingCode(io::Printer* printer) {
+ // TODO(jonskeet): What about if we read the default value?
printer->Print(
variables_,
- "object unknown;\n"
- "$type_name$ enumValue = $default_value$;\n"
- "if(input.ReadEnum(ref enumValue, out unknown)) {\n"
- " result.$oneof_name$_ = enumValue;\n"
- " result.$oneof_name$Case_ = $oneof_property_name$OneofCase.$property_name$;\n"
- "} else if(unknown is int) {\n");
- if (!use_lite_runtime()) {
- printer->Print(
- variables_,
- " if (unknownFields == null) {\n" // First unknown field - create builder now
- " unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);\n"
- " }\n"
- " unknownFields.MergeVarintField($number$, (ulong)(int)unknown);\n");
- }
- printer->Print("}\n");
+ "$oneof_name$_ = input.ReadEnum();\n"
+ "$oneof_name$Case_ = $oneof_property_name$OneofCase.$property_name$;\n");
}
void EnumOneofFieldGenerator::GenerateSerializationCode(io::Printer* printer) {
printer->Print(
variables_,
"if ($has_property_check$) {\n"
- " output.WriteEnum($number$, field_names[$field_ordinal$], (int) $property_name$, $property_name$);\n"
+ " output.WriteRawTag($tag_bytes$);\n"
+ " output.WriteEnum((int) $property_name$);\n"
"}\n");
}
@@ -127,7 +109,7 @@ void EnumOneofFieldGenerator::GenerateSerializedSizeCode(io::Printer* printer) {
printer->Print(
variables_,
"if ($has_property_check$) {\n"
- " size += pb::CodedOutputStream.ComputeEnumSize($number$, (int) $property_name$);\n"
+ " size += $tag_size$ + pb::CodedOutputStream.ComputeEnumSize((int) $property_name$);\n"
"}\n");
}