From 90da3514cdc372b8221a32f9fc97da0d4e047e92 Mon Sep 17 00:00:00 2001 From: Jie Luo Date: Wed, 3 Jun 2015 18:02:17 -0700 Subject: Migrate writer to io::Printer for C# --- .../ProtocolBuffers.Test/TestProtos/Unittest.cs | 14 +- .../TestProtos/Unittest.cs | 14 +- .../TestProtos/UnittestLite.cs | 2 +- src/google/protobuf/compiler/csharp/csharp_enum.cc | 25 +- src/google/protobuf/compiler/csharp/csharp_enum.h | 4 +- .../protobuf/compiler/csharp/csharp_enum_field.cc | 107 +- .../protobuf/compiler/csharp/csharp_enum_field.h | 14 +- .../protobuf/compiler/csharp/csharp_extension.cc | 138 +-- .../protobuf/compiler/csharp/csharp_extension.h | 28 +- .../protobuf/compiler/csharp/csharp_field_base.cc | 54 +- .../protobuf/compiler/csharp/csharp_field_base.h | 33 +- .../protobuf/compiler/csharp/csharp_generator.cc | 8 +- .../protobuf/compiler/csharp/csharp_message.cc | 1119 ++++++++++---------- .../protobuf/compiler/csharp/csharp_message.h | 26 +- .../compiler/csharp/csharp_message_field.cc | 419 ++++---- .../compiler/csharp/csharp_message_field.h | 35 +- .../compiler/csharp/csharp_primitive_field.cc | 313 +++--- .../compiler/csharp/csharp_primitive_field.h | 35 +- .../compiler/csharp/csharp_repeated_enum_field.cc | 278 ++--- .../compiler/csharp/csharp_repeated_enum_field.h | 20 +- .../csharp/csharp_repeated_message_field.cc | 260 +++-- .../csharp/csharp_repeated_message_field.h | 20 +- .../csharp/csharp_repeated_primitive_field.cc | 256 ++--- .../csharp/csharp_repeated_primitive_field.h | 20 +- .../csharp/csharp_source_generator_base.cc | 3 +- .../compiler/csharp/csharp_source_generator_base.h | 4 +- .../compiler/csharp/csharp_umbrella_class.cc | 249 ++--- .../compiler/csharp/csharp_umbrella_class.h | 10 +- 28 files changed, 1861 insertions(+), 1647 deletions(-) diff --git a/csharp/src/ProtocolBuffers.Test/TestProtos/Unittest.cs b/csharp/src/ProtocolBuffers.Test/TestProtos/Unittest.cs index 4dda7bcd..d3441937 100644 --- a/csharp/src/ProtocolBuffers.Test/TestProtos/Unittest.cs +++ b/csharp/src/ProtocolBuffers.Test/TestProtos/Unittest.cs @@ -6432,7 +6432,7 @@ namespace Google.ProtocolBuffers.TestProtos { } public bool HasOneofNestedMessage { - get { return result.oneofFieldCase_ == OneofFieldOneofCase.OneofNestedMessage; } + get { return result.oneofFieldCase_ == OneofFieldOneofCase.OneofNestedMessage; } } public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage OneofNestedMessage { get { return result.oneofFieldCase_ == OneofFieldOneofCase.OneofNestedMessage ? (global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage) result.oneofField_ : global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance; } @@ -22008,7 +22008,7 @@ namespace Google.ProtocolBuffers.TestProtos { } public bool HasFooMessage { - get { return result.fooCase_ == FooOneofCase.FooMessage; } + get { return result.fooCase_ == FooOneofCase.FooMessage; } } public global::Google.ProtocolBuffers.TestProtos.TestAllTypes FooMessage { get { return result.fooCase_ == FooOneofCase.FooMessage ? (global::Google.ProtocolBuffers.TestProtos.TestAllTypes) result.foo_ : global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance; } @@ -22050,7 +22050,7 @@ namespace Google.ProtocolBuffers.TestProtos { } public bool HasFooGroup { - get { return result.fooCase_ == FooOneofCase.FooGroup; } + get { return result.fooCase_ == FooOneofCase.FooGroup; } } public global::Google.ProtocolBuffers.TestProtos.TestOneof.Types.FooGroup FooGroup { get { return result.fooCase_ == FooOneofCase.FooGroup ? (global::Google.ProtocolBuffers.TestProtos.TestOneof.Types.FooGroup) result.foo_ : global::Google.ProtocolBuffers.TestProtos.TestOneof.Types.FooGroup.DefaultInstance; } @@ -24405,7 +24405,7 @@ namespace Google.ProtocolBuffers.TestProtos { } public bool HasFooMessage { - get { return result.fooCase_ == FooOneofCase.FooMessage; } + get { return result.fooCase_ == FooOneofCase.FooMessage; } } public global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage FooMessage { get { return result.fooCase_ == FooOneofCase.FooMessage ? (global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage) result.foo_ : global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage.DefaultInstance; } @@ -24447,7 +24447,7 @@ namespace Google.ProtocolBuffers.TestProtos { } public bool HasFooGroup { - get { return result.fooCase_ == FooOneofCase.FooGroup; } + get { return result.fooCase_ == FooOneofCase.FooGroup; } } public global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.FooGroup FooGroup { get { return result.fooCase_ == FooOneofCase.FooGroup ? (global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.FooGroup) result.foo_ : global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.FooGroup.DefaultInstance; } @@ -24489,7 +24489,7 @@ namespace Google.ProtocolBuffers.TestProtos { } public bool HasFooLazyMessage { - get { return result.fooCase_ == FooOneofCase.FooLazyMessage; } + get { return result.fooCase_ == FooOneofCase.FooLazyMessage; } } public global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage FooLazyMessage { get { return result.fooCase_ == FooOneofCase.FooLazyMessage ? (global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage) result.foo_ : global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage.DefaultInstance; } @@ -25377,7 +25377,7 @@ namespace Google.ProtocolBuffers.TestProtos { } public bool HasFooMessage { - get { return result.fooCase_ == FooOneofCase.FooMessage; } + get { return result.fooCase_ == FooOneofCase.FooMessage; } } public global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.Types.NestedMessage FooMessage { get { return result.fooCase_ == FooOneofCase.FooMessage ? (global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.Types.NestedMessage) result.foo_ : global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.Types.NestedMessage.DefaultInstance; } diff --git a/csharp/src/ProtocolBuffersLite.Test/TestProtos/Unittest.cs b/csharp/src/ProtocolBuffersLite.Test/TestProtos/Unittest.cs index 4dda7bcd..d3441937 100644 --- a/csharp/src/ProtocolBuffersLite.Test/TestProtos/Unittest.cs +++ b/csharp/src/ProtocolBuffersLite.Test/TestProtos/Unittest.cs @@ -6432,7 +6432,7 @@ namespace Google.ProtocolBuffers.TestProtos { } public bool HasOneofNestedMessage { - get { return result.oneofFieldCase_ == OneofFieldOneofCase.OneofNestedMessage; } + get { return result.oneofFieldCase_ == OneofFieldOneofCase.OneofNestedMessage; } } public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage OneofNestedMessage { get { return result.oneofFieldCase_ == OneofFieldOneofCase.OneofNestedMessage ? (global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage) result.oneofField_ : global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance; } @@ -22008,7 +22008,7 @@ namespace Google.ProtocolBuffers.TestProtos { } public bool HasFooMessage { - get { return result.fooCase_ == FooOneofCase.FooMessage; } + get { return result.fooCase_ == FooOneofCase.FooMessage; } } public global::Google.ProtocolBuffers.TestProtos.TestAllTypes FooMessage { get { return result.fooCase_ == FooOneofCase.FooMessage ? (global::Google.ProtocolBuffers.TestProtos.TestAllTypes) result.foo_ : global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance; } @@ -22050,7 +22050,7 @@ namespace Google.ProtocolBuffers.TestProtos { } public bool HasFooGroup { - get { return result.fooCase_ == FooOneofCase.FooGroup; } + get { return result.fooCase_ == FooOneofCase.FooGroup; } } public global::Google.ProtocolBuffers.TestProtos.TestOneof.Types.FooGroup FooGroup { get { return result.fooCase_ == FooOneofCase.FooGroup ? (global::Google.ProtocolBuffers.TestProtos.TestOneof.Types.FooGroup) result.foo_ : global::Google.ProtocolBuffers.TestProtos.TestOneof.Types.FooGroup.DefaultInstance; } @@ -24405,7 +24405,7 @@ namespace Google.ProtocolBuffers.TestProtos { } public bool HasFooMessage { - get { return result.fooCase_ == FooOneofCase.FooMessage; } + get { return result.fooCase_ == FooOneofCase.FooMessage; } } public global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage FooMessage { get { return result.fooCase_ == FooOneofCase.FooMessage ? (global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage) result.foo_ : global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage.DefaultInstance; } @@ -24447,7 +24447,7 @@ namespace Google.ProtocolBuffers.TestProtos { } public bool HasFooGroup { - get { return result.fooCase_ == FooOneofCase.FooGroup; } + get { return result.fooCase_ == FooOneofCase.FooGroup; } } public global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.FooGroup FooGroup { get { return result.fooCase_ == FooOneofCase.FooGroup ? (global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.FooGroup) result.foo_ : global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.FooGroup.DefaultInstance; } @@ -24489,7 +24489,7 @@ namespace Google.ProtocolBuffers.TestProtos { } public bool HasFooLazyMessage { - get { return result.fooCase_ == FooOneofCase.FooLazyMessage; } + get { return result.fooCase_ == FooOneofCase.FooLazyMessage; } } public global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage FooLazyMessage { get { return result.fooCase_ == FooOneofCase.FooLazyMessage ? (global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage) result.foo_ : global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage.DefaultInstance; } @@ -25377,7 +25377,7 @@ namespace Google.ProtocolBuffers.TestProtos { } public bool HasFooMessage { - get { return result.fooCase_ == FooOneofCase.FooMessage; } + get { return result.fooCase_ == FooOneofCase.FooMessage; } } public global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.Types.NestedMessage FooMessage { get { return result.fooCase_ == FooOneofCase.FooMessage ? (global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.Types.NestedMessage) result.foo_ : global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.Types.NestedMessage.DefaultInstance; } diff --git a/csharp/src/ProtocolBuffersLite.Test/TestProtos/UnittestLite.cs b/csharp/src/ProtocolBuffersLite.Test/TestProtos/UnittestLite.cs index d84a505f..bf0da956 100644 --- a/csharp/src/ProtocolBuffersLite.Test/TestProtos/UnittestLite.cs +++ b/csharp/src/ProtocolBuffersLite.Test/TestProtos/UnittestLite.cs @@ -6440,7 +6440,7 @@ namespace Google.ProtocolBuffers.TestProtos { } public bool HasOneofNestedMessage { - get { return result.oneofFieldCase_ == OneofFieldOneofCase.OneofNestedMessage; } + get { return result.oneofFieldCase_ == OneofFieldOneofCase.OneofNestedMessage; } } public global::Google.ProtocolBuffers.TestProtos.TestAllTypesLite.Types.NestedMessage OneofNestedMessage { get { return result.oneofFieldCase_ == OneofFieldOneofCase.OneofNestedMessage ? (global::Google.ProtocolBuffers.TestProtos.TestAllTypesLite.Types.NestedMessage) result.oneofField_ : global::Google.ProtocolBuffers.TestProtos.TestAllTypesLite.Types.NestedMessage.DefaultInstance; } diff --git a/src/google/protobuf/compiler/csharp/csharp_enum.cc b/src/google/protobuf/compiler/csharp/csharp_enum.cc index 27643e61..0e8f9836 100644 --- a/src/google/protobuf/compiler/csharp/csharp_enum.cc +++ b/src/google/protobuf/compiler/csharp/csharp_enum.cc @@ -40,7 +40,6 @@ #include #include -#include using google::protobuf::internal::scoped_ptr; @@ -57,20 +56,20 @@ EnumGenerator::EnumGenerator(const EnumDescriptor* descriptor) : EnumGenerator::~EnumGenerator() { } -void EnumGenerator::Generate(Writer* writer) { - WriteGeneratedCodeAttributes(writer); - writer->WriteLine("$0$ enum $1$ {", - class_access_level(), - descriptor_->name()); - writer->Indent(); +void EnumGenerator::Generate(io::Printer* printer) { + WriteGeneratedCodeAttributes(printer); + printer->Print("$access_level$ enum $name$ {\n", + "access_level", class_access_level(), + "name", descriptor_->name()); + printer->Indent(); for (int i = 0; i < descriptor_->value_count(); i++) { - writer->WriteLine("$0$ = $1$,", - descriptor_->value(i)->name(), - SimpleItoa(descriptor_->value(i)->number())); + printer->Print("$name$ = $number$,\n", + "name", descriptor_->value(i)->name(), + "number", SimpleItoa(descriptor_->value(i)->number())); } - writer->Outdent(); - writer->WriteLine("}"); - writer->WriteLine(); + printer->Outdent(); + printer->Print("}\n"); + printer->Print("\n"); } } // namespace csharp diff --git a/src/google/protobuf/compiler/csharp/csharp_enum.h b/src/google/protobuf/compiler/csharp/csharp_enum.h index eaa7a9c5..2cf2fad4 100644 --- a/src/google/protobuf/compiler/csharp/csharp_enum.h +++ b/src/google/protobuf/compiler/csharp/csharp_enum.h @@ -41,14 +41,12 @@ namespace protobuf { namespace compiler { namespace csharp { -class Writer; - class EnumGenerator : public SourceGeneratorBase { public: EnumGenerator(const EnumDescriptor* descriptor); ~EnumGenerator(); - void Generate(Writer* writer); + void Generate(io::Printer* printer); private: const EnumDescriptor* descriptor_; diff --git a/src/google/protobuf/compiler/csharp/csharp_enum_field.cc b/src/google/protobuf/compiler/csharp/csharp_enum_field.cc index 28f5a05c..51a95b9f 100644 --- a/src/google/protobuf/compiler/csharp/csharp_enum_field.cc +++ b/src/google/protobuf/compiler/csharp/csharp_enum_field.cc @@ -39,7 +39,6 @@ #include #include -#include namespace google { namespace protobuf { @@ -54,39 +53,38 @@ EnumFieldGenerator::EnumFieldGenerator(const FieldDescriptor* descriptor, EnumFieldGenerator::~EnumFieldGenerator() { } -void EnumFieldGenerator::GenerateParsingCode(Writer* writer) { - writer->WriteLine("object unknown;"); - writer->WriteLine("if(input.ReadEnum(ref result.$0$_, out unknown)) {", name()); +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())) { - writer->WriteLine(" result.has$0$ = true;", property_name()); + printer->Print(variables_, + " result.has$property_name$ = true;\n"); } - writer->WriteLine("} else if(unknown is int) {"); + printer->Print("} else if(unknown is int) {\n"); if (!use_lite_runtime()) { - writer->WriteLine(" if (unknownFields == null) {"); // First unknown field - create builder now - writer->WriteLine( - " unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);"); - writer->WriteLine(" }"); - writer->WriteLine( - " unknownFields.MergeVarintField($0$, (ulong)(int)unknown);", - number()); + 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"); } - writer->WriteLine("}"); + printer->Print("}\n"); } -void EnumFieldGenerator::GenerateSerializationCode(Writer* writer) { - writer->WriteLine("if ($0$) {", has_property_check); - writer->WriteLine( - " output.WriteEnum($0$, field_names[$2$], (int) $1$, $1$);", number(), - property_name(), field_ordinal()); - writer->WriteLine("}"); +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"); } -void EnumFieldGenerator::GenerateSerializedSizeCode(Writer* writer) { - writer->WriteLine("if ($0$) {", has_property_check); - writer->WriteLine( - " size += pb::CodedOutputStream.ComputeEnumSize($0$, (int) $1$);", - number(), property_name()); - writer->WriteLine("}"); +void EnumFieldGenerator::GenerateSerializedSizeCode(io::Printer* printer) { + printer->Print( + variables_, + "if ($has_property_check$) {\n" + " size += pb::CodedOutputStream.ComputeEnumSize($number$, (int) $property_name$);\n" + "}\n"); } EnumOneofFieldGenerator::EnumOneofFieldGenerator(const FieldDescriptor* descriptor, @@ -97,41 +95,40 @@ EnumOneofFieldGenerator::EnumOneofFieldGenerator(const FieldDescriptor* descript EnumOneofFieldGenerator::~EnumOneofFieldGenerator() { } -void EnumOneofFieldGenerator::GenerateParsingCode(Writer* writer) { - writer->WriteLine("object unknown;"); - writer->WriteLine("$0$ enumValue = $1$;", type_name(), default_value()); - writer->WriteLine("if(input.ReadEnum(ref enumValue, out unknown)) {", - name()); - writer->WriteLine(" result.$0$_ = enumValue;", oneof_name()); - writer->WriteLine(" result.$0$Case_ = $1$OneofCase.$2$;", - oneof_name(), oneof_property_name(), property_name()); - writer->WriteLine("} else if(unknown is int) {"); +void EnumOneofFieldGenerator::GenerateParsingCode(io::Printer* printer) { + 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()) { - writer->WriteLine(" if (unknownFields == null) {"); // First unknown field - create builder now - writer->WriteLine( - " unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);"); - writer->WriteLine(" }"); - writer->WriteLine( - " unknownFields.MergeVarintField($0$, (ulong)(int)unknown);", - number()); + 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"); } - writer->WriteLine("}"); + printer->Print("}\n"); } -void EnumOneofFieldGenerator::GenerateSerializationCode(Writer* writer) { - writer->WriteLine("if ($0$) {", has_property_check); - writer->WriteLine( - " output.WriteEnum($0$, field_names[$2$], (int) $1$, $1$);", number(), - property_name(), field_ordinal()); - writer->WriteLine("}"); +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" + "}\n"); } -void EnumOneofFieldGenerator::GenerateSerializedSizeCode(Writer* writer) { - writer->WriteLine("if ($0$) {", has_property_check); - writer->WriteLine( - " size += pb::CodedOutputStream.ComputeEnumSize($0$, (int) $1$);", - number(), property_name()); - writer->WriteLine("}"); +void EnumOneofFieldGenerator::GenerateSerializedSizeCode(io::Printer* printer) { + printer->Print( + variables_, + "if ($has_property_check$) {\n" + " size += pb::CodedOutputStream.ComputeEnumSize($number$, (int) $property_name$);\n" + "}\n"); } } // namespace csharp diff --git a/src/google/protobuf/compiler/csharp/csharp_enum_field.h b/src/google/protobuf/compiler/csharp/csharp_enum_field.h index c6b7b848..e627b7cc 100644 --- a/src/google/protobuf/compiler/csharp/csharp_enum_field.h +++ b/src/google/protobuf/compiler/csharp/csharp_enum_field.h @@ -41,16 +41,14 @@ namespace protobuf { namespace compiler { namespace csharp { -class Writer; - class EnumFieldGenerator : public PrimitiveFieldGenerator { public: EnumFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal); ~EnumFieldGenerator(); - virtual void GenerateParsingCode(Writer* writer); - virtual void GenerateSerializationCode(Writer* writer); - virtual void GenerateSerializedSizeCode(Writer* writer); + virtual void GenerateParsingCode(io::Printer* printer); + virtual void GenerateSerializationCode(io::Printer* printer); + virtual void GenerateSerializedSizeCode(io::Printer* printer); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumFieldGenerator); @@ -61,9 +59,9 @@ class EnumOneofFieldGenerator : public PrimitiveOneofFieldGenerator { EnumOneofFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal); ~EnumOneofFieldGenerator(); - virtual void GenerateParsingCode(Writer* writer); - virtual void GenerateSerializationCode(Writer* writer); - virtual void GenerateSerializedSizeCode(Writer* writer); + virtual void GenerateParsingCode(io::Printer* printer); + virtual void GenerateSerializationCode(io::Printer* printer); + virtual void GenerateSerializedSizeCode(io::Printer* printer); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumOneofFieldGenerator); diff --git a/src/google/protobuf/compiler/csharp/csharp_extension.cc b/src/google/protobuf/compiler/csharp/csharp_extension.cc index 2bac320d..8b665ae4 100644 --- a/src/google/protobuf/compiler/csharp/csharp_extension.cc +++ b/src/google/protobuf/compiler/csharp/csharp_extension.cc @@ -39,7 +39,6 @@ #include #include -#include #include using google::protobuf::internal::scoped_ptr; @@ -52,20 +51,34 @@ namespace csharp { ExtensionGenerator::ExtensionGenerator(const FieldDescriptor* descriptor) : FieldGeneratorBase(descriptor, 0) { if (descriptor_->extension_scope()) { - scope_ = GetClassName(descriptor_->extension_scope()); + variables_["scope"] = GetClassName(descriptor_->extension_scope()); } else { - scope_ = GetFullUmbrellaClassName(descriptor_->file()); + variables_["scope"] = GetFullUmbrellaClassName(descriptor_->file()); + } + variables_["extends"] = GetClassName(descriptor_->containing_type()); + variables_["capitalized_type_name"] = capitalized_type_name(); + variables_["full_name"] = descriptor_->full_name(); + variables_["access_level"] = class_access_level(); + variables_["index"] = SimpleItoa(descriptor_->index()); + variables_["property_name"] = property_name(); + variables_["type_name"] = type_name(); + if (use_lite_runtime()) { + variables_["generated_extension"] = descriptor_->is_repeated() ? + "GeneratedRepeatExtensionLite" : "GeneratedExtensionLite"; + } else { + variables_["generated_extension"] = descriptor_->is_repeated() ? + "GeneratedRepeatExtension" : "GeneratedExtension"; } - extends_ = GetClassName(descriptor_->containing_type()); } ExtensionGenerator::~ExtensionGenerator() { } -void ExtensionGenerator::Generate(Writer* writer) { - writer->WriteLine("public const int $0$ = $1$;", - GetFieldConstantName(descriptor_), - SimpleItoa(descriptor_->number())); +void ExtensionGenerator::Generate(io::Printer* printer) { + printer->Print( + "public const int $constant_name$ = $number$;\n", + "constant_name", GetFieldConstantName(descriptor_), + "number", SimpleItoa(descriptor_->number())); if (use_lite_runtime()) { // TODO(jtattermusch): include the following check @@ -75,36 +88,34 @@ void ExtensionGenerator::Generate(Writer* writer) { // "option message_set_wire_format = true; is not supported in Lite runtime extensions."); //} - writer->Write("$0$ ", class_access_level()); - writer->WriteLine( - "static pb::$3$<$0$, $1$> $2$;", - extends_, - type_name(), - property_name(), - descriptor_->is_repeated() ? - "GeneratedRepeatExtensionLite" : "GeneratedExtensionLite"); + printer->Print( + variables_, + "$access_level$ static pb::$generated_extension$<$extends$, $type_name$> $property_name$;\n"); } else if (descriptor_->is_repeated()) { - writer->WriteLine( - "$0$ static pb::GeneratedExtensionBase> $2$;", - class_access_level(), type_name(), property_name()); + printer->Print( + variables_, + "$access_level$ static pb::GeneratedExtensionBase> $property_name$;\n"); } else { - writer->WriteLine("$0$ static pb::GeneratedExtensionBase<$1$> $2$;", - class_access_level(), type_name(), property_name()); + printer->Print( + variables_, + "$access_level$ static pb::GeneratedExtensionBase<$type_name$> $property_name$;\n"); } } -void ExtensionGenerator::GenerateStaticVariableInitializers(Writer* writer) { +void ExtensionGenerator::GenerateStaticVariableInitializers(io::Printer* printer) { if (use_lite_runtime()) { - writer->WriteLine("$0$.$1$ = ", scope_, property_name()); - writer->Indent(); - writer->WriteLine( - "new pb::$0$<$1$, $2$>(", - descriptor_->is_repeated() ? - "GeneratedRepeatExtensionLite" : "GeneratedExtensionLite", - extends_, type_name()); - writer->Indent(); - writer->WriteLine("\"$0$\",", descriptor_->full_name()); - writer->WriteLine("$0$.DefaultInstance,", extends_); + printer->Print( + variables_, + "$scope$.$property_name$ = \n"); + printer->Indent(); + printer->Print( + variables_, + "new pb::$generated_extension$<$extends$, $type_name$>(\n"); + printer->Indent(); + printer->Print( + variables_, + "\"$full_name$\",\n" + "$extends$.DefaultInstance,\n"); if (!descriptor_->is_repeated()) { std::string default_val; if (descriptor_->has_default_value()) { @@ -112,52 +123,59 @@ void ExtensionGenerator::GenerateStaticVariableInitializers(Writer* writer) { } else { default_val = is_nullable_type() ? "null" : ("default(" + type_name() + ")"); } - writer->WriteLine("$0$,", default_val); + printer->Print("$default_val$,\n", "default_val", default_val); } - writer->WriteLine( - "$0$,", - (GetCSharpType(descriptor_->type()) == CSHARPTYPE_MESSAGE) ? - type_name() + ".DefaultInstance" : "null"); - writer->WriteLine( - "$0$,", - (GetCSharpType(descriptor_->type()) == CSHARPTYPE_ENUM) ? - "new EnumLiteMap<" + type_name() + ">()" : "null"); - writer->WriteLine("$0$.$1$FieldNumber,", scope_, - GetPropertyName(descriptor_)); - writer->Write("pbd::FieldType.$0$", capitalized_type_name()); + printer->Print( + "$message_val$,\n", + "message_val", + (GetCSharpType(descriptor_->type()) == CSHARPTYPE_MESSAGE) ? + type_name() + ".DefaultInstance" : "null"); + printer->Print( + "$enum_val$,\n", + "enum_val", + (GetCSharpType(descriptor_->type()) == CSHARPTYPE_ENUM) ? + "new EnumLiteMap<" + type_name() + ">()" : "null"); + printer->Print( + variables_, + "$scope$.$property_name$FieldNumber,\n" + "pbd::FieldType.$capitalized_type_name$"); if (descriptor_->is_repeated()) { - writer->WriteLine(","); - writer->Write(descriptor_->is_packed() ? "true" : "false"); + printer->Print( + ",\n" + "$is_packed$", + "is_packed", descriptor_->is_packed() ? "true" : "false"); } - writer->Outdent(); - writer->WriteLine(");"); - writer->Outdent(); + printer->Outdent(); + printer->Print(");\n"); + printer->Outdent(); } else if (descriptor_->is_repeated()) { - writer->WriteLine( - "$0$.$1$ = pb::GeneratedRepeatExtension<$2$>.CreateInstance($0$.Descriptor.Extensions[$3$]);", - scope_, property_name(), type_name(), SimpleItoa(descriptor_->index())); + printer->Print( + variables_, + "$scope$.$property_name$ = pb::GeneratedRepeatExtension<$type_name$>.CreateInstance($scope$.Descriptor.Extensions[$index$]);\n"); } else { - writer->WriteLine( - "$0$.$1$ = pb::GeneratedSingleExtension<$2$>.CreateInstance($0$.Descriptor.Extensions[$3$]);", - scope_, property_name(), type_name(), SimpleItoa(descriptor_->index())); + printer->Print( + variables_, + "$scope$.$property_name$ = pb::GeneratedSingleExtension<$type_name$>.CreateInstance($scope$.Descriptor.Extensions[$index$]);\n"); } } -void ExtensionGenerator::GenerateExtensionRegistrationCode(Writer* writer) { - writer->WriteLine("registry.Add($0$.$1$);", scope_, property_name()); +void ExtensionGenerator::GenerateExtensionRegistrationCode(io::Printer* printer) { + printer->Print( + variables_, + "registry.Add($scope$.$property_name$);\n"); } -void ExtensionGenerator::WriteHash(Writer* writer) { +void ExtensionGenerator::WriteHash(io::Printer* printer) { } -void ExtensionGenerator::WriteEquals(Writer* writer) { +void ExtensionGenerator::WriteEquals(io::Printer* printer) { } -void ExtensionGenerator::WriteToString(Writer* writer) { +void ExtensionGenerator::WriteToString(io::Printer* printer) { } } // namespace csharp diff --git a/src/google/protobuf/compiler/csharp/csharp_extension.h b/src/google/protobuf/compiler/csharp/csharp_extension.h index 203f6e5e..f251a21c 100644 --- a/src/google/protobuf/compiler/csharp/csharp_extension.h +++ b/src/google/protobuf/compiler/csharp/csharp_extension.h @@ -41,28 +41,26 @@ namespace protobuf { namespace compiler { namespace csharp { -class Writer; - class ExtensionGenerator : public FieldGeneratorBase { public: ExtensionGenerator(const FieldDescriptor* descriptor); ~ExtensionGenerator(); - void GenerateStaticVariableInitializers(Writer* writer); - void GenerateExtensionRegistrationCode(Writer* writer); - void Generate(Writer* writer); + void GenerateStaticVariableInitializers(io::Printer* printer); + void GenerateExtensionRegistrationCode(io::Printer* printer); + void Generate(io::Printer* printer); - virtual void WriteHash(Writer* writer); - virtual void WriteEquals(Writer* writer); - virtual void WriteToString(Writer* writer); + virtual void WriteHash(io::Printer* printer); + virtual void WriteEquals(io::Printer* printer); + virtual void WriteToString(io::Printer* printer); - virtual void GenerateMembers(Writer* writer) {}; - virtual void GenerateBuilderMembers(Writer* writer) {}; - virtual void GenerateMergingCode(Writer* writer) {}; - virtual void GenerateBuildingCode(Writer* writer) {}; - virtual void GenerateParsingCode(Writer* writer) {}; - virtual void GenerateSerializationCode(Writer* writer) {}; - virtual void GenerateSerializedSizeCode(Writer* writer) {}; + virtual void GenerateMembers(io::Printer* printer) {}; + virtual void GenerateBuilderMembers(io::Printer* printer) {}; + virtual void GenerateMergingCode(io::Printer* printer) {}; + virtual void GenerateBuildingCode(io::Printer* printer) {}; + virtual void GenerateParsingCode(io::Printer* printer) {}; + virtual void GenerateSerializationCode(io::Printer* printer) {}; + virtual void GenerateSerializedSizeCode(io::Printer* printer) {}; private: std::string scope_; diff --git a/src/google/protobuf/compiler/csharp/csharp_field_base.cc b/src/google/protobuf/compiler/csharp/csharp_field_base.cc index dfc803e6..c3ce426b 100644 --- a/src/google/protobuf/compiler/csharp/csharp_field_base.cc +++ b/src/google/protobuf/compiler/csharp/csharp_field_base.cc @@ -41,7 +41,6 @@ #include #include -#include using google::protobuf::internal::scoped_ptr; @@ -50,35 +49,72 @@ namespace protobuf { namespace compiler { namespace csharp { +void FieldGeneratorBase::SetCommonFieldVariables( + map* variables) { + (*variables)["property_name"] = property_name(); + (*variables)["type_name"] = type_name(); + (*variables)["name"] = name(); + (*variables)["descriptor_name"] = descriptor_->name(); + (*variables)["default_value"] = default_value(); + if (has_default_value()) { + (*variables)["name_def_message"] = + (*variables)["name"] + "_ = " + (*variables)["default_value"]; + } else { + (*variables)["name_def_message"] = (*variables)["name"] + "_"; + } + (*variables)["capitalized_type_name"] = capitalized_type_name(); + (*variables)["number"] = number(); + (*variables)["field_ordinal"] = field_ordinal(); + if (SupportFieldPresence(descriptor_->file())) { + (*variables)["has_property_check"] = "has" + (*variables)["property_name"]; + (*variables)["other_has_property_check"] = "other.Has" + (*variables)["property_name"]; + } else { + (*variables)["has_property_check"] = + (*variables)["property_name"] + " != " + (*variables)["default_value"]; + (*variables)["other_has_property_check"] = "other." + + (*variables)["property_name"] + " != " + (*variables)["default_value"]; + } +} + +void FieldGeneratorBase::SetCommonOneofFieldVariables( + map* variables) { + (*variables)["oneof_name"] = oneof_name(); + (*variables)["has_property_check"] = oneof_name() + "Case_ == " + oneof_property_name() + + "OneofCase." + property_name(); + (*variables)["oneof_property_name"] = oneof_property_name(); +} + FieldGeneratorBase::FieldGeneratorBase(const FieldDescriptor* descriptor, int fieldOrdinal) : SourceGeneratorBase(descriptor->file()), descriptor_(descriptor), fieldOrdinal_(fieldOrdinal) { + SetCommonFieldVariables(&variables_); } FieldGeneratorBase::~FieldGeneratorBase() { } -void FieldGeneratorBase::AddDeprecatedFlag(Writer* writer) { +void FieldGeneratorBase::AddDeprecatedFlag(io::Printer* printer) { if (descriptor_->options().deprecated()) { - writer->WriteLine("[global::System.ObsoleteAttribute()]"); + printer->Print("[global::System.ObsoleteAttribute()]\n"); } } -void FieldGeneratorBase::AddNullCheck(Writer* writer) { - AddNullCheck(writer, "value"); +void FieldGeneratorBase::AddNullCheck(io::Printer* printer) { + AddNullCheck(printer, "value"); } -void FieldGeneratorBase::AddNullCheck(Writer* writer, const std::string& name) { +void FieldGeneratorBase::AddNullCheck(io::Printer* printer, const std::string& name) { if (is_nullable_type()) { - writer->WriteLine(" pb::ThrowHelper.ThrowIfNull($0$, \"$0$\");", name); + printer->Print(" pb::ThrowHelper.ThrowIfNull($name$, \"$name$\");\n", + "name", name); } } -void FieldGeneratorBase::AddPublicMemberAttributes(Writer* writer) { - AddDeprecatedFlag(writer); +void FieldGeneratorBase::AddPublicMemberAttributes(io::Printer* printer) { + AddDeprecatedFlag(printer); } std::string FieldGeneratorBase::oneof_property_name() { diff --git a/src/google/protobuf/compiler/csharp/csharp_field_base.h b/src/google/protobuf/compiler/csharp/csharp_field_base.h index 312da12b..b1570587 100644 --- a/src/google/protobuf/compiler/csharp/csharp_field_base.h +++ b/src/google/protobuf/compiler/csharp/csharp_field_base.h @@ -49,27 +49,29 @@ class FieldGeneratorBase : public SourceGeneratorBase { FieldGeneratorBase(const FieldDescriptor* descriptor, int fieldOrdinal); ~FieldGeneratorBase(); - virtual void GenerateMembers(Writer* writer) = 0; - virtual void GenerateBuilderMembers(Writer* writer) = 0; - virtual void GenerateMergingCode(Writer* writer) = 0; - virtual void GenerateBuildingCode(Writer* writer) = 0; - virtual void GenerateParsingCode(Writer* writer) = 0; - virtual void GenerateSerializationCode(Writer* writer) = 0; - virtual void GenerateSerializedSizeCode(Writer* writer) = 0; - - virtual void WriteHash(Writer* writer) = 0; - virtual void WriteEquals(Writer* writer) = 0; - virtual void WriteToString(Writer* writer) = 0; + virtual void GenerateMembers(io::Printer* printer) = 0; + virtual void GenerateBuilderMembers(io::Printer* printer) = 0; + virtual void GenerateMergingCode(io::Printer* printer) = 0; + virtual void GenerateBuildingCode(io::Printer* printer) = 0; + virtual void GenerateParsingCode(io::Printer* printer) = 0; + virtual void GenerateSerializationCode(io::Printer* printer) = 0; + virtual void GenerateSerializedSizeCode(io::Printer* printer) = 0; + + virtual void WriteHash(io::Printer* printer) = 0; + virtual void WriteEquals(io::Printer* printer) = 0; + virtual void WriteToString(io::Printer* printer) = 0; protected: const FieldDescriptor* descriptor_; const int fieldOrdinal_; + map variables_; - void AddDeprecatedFlag(Writer* writer); - void AddNullCheck(Writer* writer); - void AddNullCheck(Writer* writer, const std::string& name); + void AddDeprecatedFlag(io::Printer* printer); + void AddNullCheck(io::Printer* printer); + void AddNullCheck(io::Printer* printer, const std::string& name); - void AddPublicMemberAttributes(Writer* writer); + void AddPublicMemberAttributes(io::Printer* printer); + void SetCommonOneofFieldVariables(map* variables); std::string oneof_property_name(); std::string oneof_name(); @@ -85,6 +87,7 @@ class FieldGeneratorBase : public SourceGeneratorBase { std::string field_ordinal(); private: + void SetCommonFieldVariables(map* variables); std::string GetStringDefaultValueInternal(); std::string GetBytesDefaultValueInternal(); diff --git a/src/google/protobuf/compiler/csharp/csharp_generator.cc b/src/google/protobuf/compiler/csharp/csharp_generator.cc index 64c4bd7d..2a416fac 100644 --- a/src/google/protobuf/compiler/csharp/csharp_generator.cc +++ b/src/google/protobuf/compiler/csharp/csharp_generator.cc @@ -40,7 +40,6 @@ #include #include #include -#include using google::protobuf::internal::scoped_ptr; @@ -55,9 +54,9 @@ std::string GetOutputFile(const google::protobuf::FileDescriptor* file, const st } void GenerateFile(const google::protobuf::FileDescriptor* file, - Writer* writer) { + io::Printer* printer) { UmbrellaClassGenerator umbrellaGenerator(file); - umbrellaGenerator.Generate(writer); + umbrellaGenerator.Generate(printer); } bool Generator::Generate( @@ -83,9 +82,8 @@ bool Generator::Generate( scoped_ptr output( generator_context->Open(filename)); io::Printer printer(output.get(), '$'); - Writer writer(&printer); - GenerateFile(file, &writer); + GenerateFile(file, &printer); return true; } diff --git a/src/google/protobuf/compiler/csharp/csharp_message.cc b/src/google/protobuf/compiler/csharp/csharp_message.cc index 22681235..66b87110 100644 --- a/src/google/protobuf/compiler/csharp/csharp_message.cc +++ b/src/google/protobuf/compiler/csharp/csharp_message.cc @@ -30,6 +30,7 @@ #include #include +#include #include #include @@ -46,7 +47,6 @@ #include #include #include -#include using google::protobuf::internal::scoped_ptr; @@ -105,7 +105,7 @@ std::string GetUniqueFileScopeIdentifier(const Descriptor* descriptor) { return "static_" + result; } -void MessageGenerator::GenerateStaticVariables(Writer* writer) { +void MessageGenerator::GenerateStaticVariables(io::Printer* printer) { // Because descriptor.proto (Google.ProtocolBuffers.DescriptorProtos) is // used in the construction of descriptors, we have a tricky bootstrapping // problem. To help control static initialization order, we make sure all @@ -117,175 +117,184 @@ void MessageGenerator::GenerateStaticVariables(Writer* writer) { if (!use_lite_runtime()) { // The descriptor for this type. - std::string access = "internal"; - writer->WriteLine( - "$0$ static pbd::MessageDescriptor internal__$1$__Descriptor;", access, - identifier); - writer->WriteLine( - "$0$ static pb::FieldAccess.FieldAccessorTable<$1$, $1$.Builder> internal__$2$__FieldAccessorTable;", - access, full_class_name(), identifier); + printer->Print( + "internal static pbd::MessageDescriptor internal__$identifier$__Descriptor;\n" + "internal static pb::FieldAccess.FieldAccessorTable<$full_class_name$, $full_class_name$.Builder> internal__$identifier$__FieldAccessorTable;\n", + "identifier", GetUniqueFileScopeIdentifier(descriptor_), + "full_class_name", full_class_name()); } for (int i = 0; i < descriptor_->nested_type_count(); i++) { MessageGenerator messageGenerator(descriptor_->nested_type(i)); - messageGenerator.GenerateStaticVariables(writer); + messageGenerator.GenerateStaticVariables(printer); } } -void MessageGenerator::GenerateStaticVariableInitializers(Writer* writer) { - std::string identifier = GetUniqueFileScopeIdentifier(descriptor_); - +void MessageGenerator::GenerateStaticVariableInitializers(io::Printer* printer) { + map vars; + vars["identifier"] = GetUniqueFileScopeIdentifier(descriptor_); + vars["index"] = SimpleItoa(descriptor_->index()); + vars["full_class_name"] = full_class_name(); + if (descriptor_->containing_type() != NULL) { + vars["parent"] = GetUniqueFileScopeIdentifier( + descriptor_->containing_type()); + } if (!use_lite_runtime()) { - writer->Write("internal__$0$__Descriptor = ", identifier); + printer->Print(vars, "internal__$identifier$__Descriptor = "); if (!descriptor_->containing_type()) { - writer->WriteLine("Descriptor.MessageTypes[$0$];", - SimpleItoa(descriptor_->index())); + printer->Print(vars, "Descriptor.MessageTypes[$index$];\n"); } else { - writer->WriteLine( - "internal__$0$__Descriptor.NestedTypes[$1$];", - GetUniqueFileScopeIdentifier(descriptor_->containing_type()), - SimpleItoa(descriptor_->index())); + printer->Print(vars, "internal__$parent$__Descriptor.NestedTypes[$index$];\n"); } - writer->WriteLine("internal__$0$__FieldAccessorTable = ", identifier); - writer->WriteLine( - " new pb::FieldAccess.FieldAccessorTable<$1$, $1$.Builder>(internal__$0$__Descriptor,", - identifier, full_class_name()); - writer->Write(" new string[] { "); + printer->Print( + vars, + "internal__$identifier$__FieldAccessorTable = \n" + " new pb::FieldAccess.FieldAccessorTable<$full_class_name$, $full_class_name$.Builder>(internal__$identifier$__Descriptor,\n"); + printer->Print(" new string[] { "); for (int i = 0; i < descriptor_->field_count(); i++) { - writer->Write("\"$0$\", ", GetPropertyName(descriptor_->field(i))); + printer->Print("\"$property_name$\", ", + "property_name", GetPropertyName(descriptor_->field(i))); } for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { - writer->Write("\"$0$\", ", - UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), true)); + printer->Print("\"$oneof_name$\", ", + "oneof_name", + UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), true)); } - writer->WriteLine("});"); + printer->Print("});\n"); } // Generate static member initializers for all nested types. for (int i = 0; i < descriptor_->nested_type_count(); i++) { MessageGenerator messageGenerator(descriptor_->nested_type(i)); - messageGenerator.GenerateStaticVariableInitializers(writer); + messageGenerator.GenerateStaticVariableInitializers(printer); } for (int i = 0; i < descriptor_->extension_count(); i++) { ExtensionGenerator extensionGenerator(descriptor_->extension(i)); - extensionGenerator.GenerateStaticVariableInitializers(writer); + extensionGenerator.GenerateStaticVariableInitializers(printer); } } -void MessageGenerator::Generate(Writer* writer) { - writer->WriteLine( - "[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]"); - WriteGeneratedCodeAttributes(writer); - writer->WriteLine( - "$0$ sealed partial class $1$ : pb::$2$Message$3$<$1$, $1$.Builder> {", - class_access_level(), class_name(), - descriptor_->extension_range_count() > 0 ? "Extendable" : "Generated", - runtime_suffix()); - writer->Indent(); - writer->WriteLine("private $0$() { }", class_name()); // Private ctor. - // Must call MakeReadOnly() to make sure all lists are made read-only - writer->WriteLine( - "private static readonly $0$ defaultInstance = new $0$().MakeReadOnly();", - class_name()); +void MessageGenerator::Generate(io::Printer* printer) { + map vars; + vars["class_name"] = class_name(); + vars["access_level"] = class_access_level(); + vars["extendable_or_generated"] = descriptor_->extension_range_count() > 0 ? + "Extendable" : "Generated"; + vars["suffix"] = runtime_suffix(); + vars["umbrella_class_name"] = GetFullUmbrellaClassName(descriptor_->file()); + vars["identifier"] = GetUniqueFileScopeIdentifier(descriptor_); + + printer->Print( + "[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n"); + WriteGeneratedCodeAttributes(printer); + printer->Print( + vars, + "$access_level$ sealed partial class $class_name$ : pb::$extendable_or_generated$Message$suffix$<$class_name$, $class_name$.Builder> {\n"); + printer->Indent(); + printer->Print( + vars, + "private $class_name$() { }\n" // Private ctor. + // Must call MakeReadOnly() to make sure all lists are made read-only + "private static readonly $class_name$ defaultInstance = new $class_name$().MakeReadOnly();\n"); if (optimize_speed()) { - writer->WriteLine( - "private static readonly string[] _$0$FieldNames = new string[] { $2$$1$$2$ };", - UnderscoresToCamelCase(class_name(), false), - JoinStrings(field_names(), "\", \""), - field_names().size() > 0 ? "\"" : ""); + printer->Print( + "private static readonly string[] _$name$FieldNames = " + "new string[] { $slash$$field_names$$slash$ };\n", + "name", UnderscoresToCamelCase(class_name(), false), + "field_names", JoinStrings(field_names(), "\", \""), + "slash", field_names().size() > 0 ? "\"" : ""); std::vector tags; for (int i = 0; i < field_names().size(); i++) { uint32 tag = internal::WireFormat::MakeTag( descriptor_->FindFieldByName(field_names()[i])); tags.push_back(SimpleItoa(tag)); } - writer->WriteLine( - "private static readonly uint[] _$0$FieldTags = new uint[] { $1$ };", - UnderscoresToCamelCase(class_name(), false), JoinStrings(tags, ", ")); - } - writer->WriteLine("public static $0$ DefaultInstance {", class_name()); - writer->WriteLine(" get { return defaultInstance; }"); - writer->WriteLine("}"); - writer->WriteLine(); - writer->WriteLine("public override $0$ DefaultInstanceForType {", - class_name()); - writer->WriteLine(" get { return DefaultInstance; }"); - writer->WriteLine("}"); - writer->WriteLine(); - writer->WriteLine("protected override $0$ ThisMessage {", class_name()); - writer->WriteLine(" get { return this; }"); - writer->WriteLine("}"); - writer->WriteLine(); + printer->Print( + "private static readonly uint[] _$name$FieldTags = new uint[] { $tags$ };\n", + "name", UnderscoresToCamelCase(class_name(), false), + "tags", JoinStrings(tags, ", ")); + } + printer->Print( + vars, + "public static $class_name$ DefaultInstance {\n" + " get { return defaultInstance; }\n" + "}\n" + "\n" + "public override $class_name$ DefaultInstanceForType {\n" + " get { return DefaultInstance; }\n" + "}\n" + "\n" + "protected override $class_name$ ThisMessage {\n" + " get { return this; }\n" + "}\n\n"); + if (!use_lite_runtime()) { - writer->WriteLine("public static pbd::MessageDescriptor Descriptor {"); - writer->WriteLine(" get { return $0$.internal__$1$__Descriptor; }", - GetFullUmbrellaClassName(descriptor_->file()), - GetUniqueFileScopeIdentifier(descriptor_)); - writer->WriteLine("}"); - writer->WriteLine(); - writer->WriteLine( - "protected override pb::FieldAccess.FieldAccessorTable<$0$, $0$.Builder> InternalFieldAccessors {", - class_name()); - writer->WriteLine(" get { return $0$.internal__$1$__FieldAccessorTable; }", - GetFullUmbrellaClassName(descriptor_->file()), - GetUniqueFileScopeIdentifier(descriptor_)); - writer->WriteLine("}"); - writer->WriteLine(); + printer->Print( + vars, + "public static pbd::MessageDescriptor Descriptor {\n" + " get { return $umbrella_class_name$.internal__$identifier$__Descriptor; }\n" + "}\n" + "\n" + "protected override pb::FieldAccess.FieldAccessorTable<$class_name$, $class_name$.Builder> InternalFieldAccessors {\n" + " get { return $umbrella_class_name$.internal__$identifier$__FieldAccessorTable; }\n" + "}\n" + "\n"); } // Extensions don't need to go in an extra nested type for (int i = 0; i < descriptor_->extension_count(); i++) { ExtensionGenerator extensionGenerator(descriptor_->extension(i)); - extensionGenerator.Generate(writer); + extensionGenerator.Generate(printer); } if (descriptor_->enum_type_count() + descriptor_->nested_type_count() > 0) { - writer->WriteLine("#region Nested types"); - writer->WriteLine( - "[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]"); - WriteGeneratedCodeAttributes(writer); - writer->WriteLine("public static partial class Types {"); - writer->Indent(); + printer->Print("#region Nested types\n" + "[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n"); + WriteGeneratedCodeAttributes(printer); + printer->Print("public static partial class Types {\n"); + printer->Indent(); for (int i = 0; i < descriptor_->enum_type_count(); i++) { EnumGenerator enumGenerator(descriptor_->enum_type(i)); - enumGenerator.Generate(writer); + enumGenerator.Generate(printer); } for (int i = 0; i < descriptor_->nested_type_count(); i++) { MessageGenerator messageGenerator(descriptor_->nested_type(i)); - messageGenerator.Generate(writer); + messageGenerator.Generate(printer); } - writer->Outdent(); - writer->WriteLine("}"); - writer->WriteLine("#endregion"); - writer->WriteLine(); + printer->Outdent(); + printer->Print("}\n" + "#endregion\n" + "\n"); } // oneof for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { - string name = UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), false); - string property_name = UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), true); - writer->WriteLine("private object $0$_;", name); - writer->WriteLine("public enum $0$OneofCase {", property_name); - writer->Indent(); + vars["name"] = UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), false); + vars["property_name"] = UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), true); + printer->Print( + vars, + "private object $name$_;\n" + "public enum $property_name$OneofCase {\n"); + printer->Indent(); for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) { const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j); - writer->WriteLine("$0$ = $1$,", - GetPropertyName(field), - SimpleItoa(field->number())); + printer->Print("$field_property_name$ = $index$,\n", + "field_property_name", GetPropertyName(field), + "index", SimpleItoa(field->number())); } - writer->WriteLine("None = 0,"); - writer->Outdent(); - writer->WriteLine("}"); - writer->WriteLine("private $0$OneofCase $1$Case_ = $0$OneofCase.None;", - property_name, name); - writer->WriteLine("public $0$OneofCase $0$Case {", property_name); - writer->WriteLine(" get { return $0$Case_; }", name); - writer->WriteLine("}"); - writer->WriteLine(); + printer->Print("None = 0,\n"); + printer->Outdent(); + printer->Print("}\n"); + printer->Print( + vars, + "private $property_name$OneofCase $name$Case_ = $property_name$OneofCase.None;\n" + "public $property_name$OneofCase $property_name$Case {\n" + " get { return $name$Case_; }\n" + "}\n\n"); } // Fields @@ -293,108 +302,119 @@ void MessageGenerator::Generate(Writer* writer) { const FieldDescriptor* fieldDescriptor = descriptor_->field(i); // Rats: we lose the debug comment here :( - writer->WriteLine("public const int $0$ = $1$;", - GetFieldConstantName(fieldDescriptor), - SimpleItoa(fieldDescriptor->number())); + printer->Print( + "public const int $field_constant_name$ = $index$;\n", + "field_constant_name", GetFieldConstantName(fieldDescriptor), + "index", SimpleItoa(fieldDescriptor->number())); scoped_ptr generator( CreateFieldGeneratorInternal(fieldDescriptor)); - generator->GenerateMembers(writer); - writer->WriteLine(); + generator->GenerateMembers(printer); + printer->Print("\n"); } if (optimize_speed()) { if (SupportFieldPresence(descriptor_->file())) { - GenerateIsInitialized(writer); + GenerateIsInitialized(printer); } - GenerateMessageSerializationMethods(writer); + GenerateMessageSerializationMethods(printer); } if (use_lite_runtime()) { - GenerateLiteRuntimeMethods(writer); + GenerateLiteRuntimeMethods(printer); } - GenerateParseFromMethods(writer); - GenerateBuilder(writer); + GenerateParseFromMethods(printer); + GenerateBuilder(printer); // Force the static initialization code for the file to run, since it may // initialize static variables declared in this class. - writer->WriteLine("static $0$() {", class_name()); + printer->Print(vars, "static $class_name$() {\n"); // We call object.ReferenceEquals() just to make it a valid statement on its own. // Another option would be GetType(), but that causes problems in DescriptorProtoFile, // where the bootstrapping is somewhat recursive - type initializers call // each other, effectively. We temporarily see Descriptor as null. - writer->WriteLine(" object.ReferenceEquals($0$.Descriptor, null);", - GetFullUmbrellaClassName(descriptor_->file())); - writer->WriteLine("}"); + printer->Print( + vars, + " object.ReferenceEquals($umbrella_class_name$.Descriptor, null);\n" + "}\n"); - writer->Outdent(); - writer->WriteLine("}"); - writer->WriteLine(); + printer->Outdent(); + printer->Print("}\n"); + printer->Print("\n"); } -void MessageGenerator::GenerateLiteRuntimeMethods(Writer* writer) { +void MessageGenerator::GenerateLiteRuntimeMethods(io::Printer* printer) { + map vars; + vars["class_name"] = class_name(); + bool callbase = descriptor_->extension_range_count() > 0; - writer->WriteLine("#region Lite runtime methods"); - writer->WriteLine("public override int GetHashCode() {"); - writer->Indent(); - writer->WriteLine("int hash = GetType().GetHashCode();"); + printer->Print("#region Lite runtime methods\n" + "public override int GetHashCode() {\n"); + printer->Indent(); + printer->Print("int hash = GetType().GetHashCode();\n"); for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); if (field->containing_oneof() == NULL) { scoped_ptr generator( CreateFieldGeneratorInternal(field)); - generator->WriteHash(writer); + generator->WriteHash(printer); } } for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { string name = UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), false); string property_name = UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), true); - writer->WriteLine("if ($0$Case_ != $1$OneofCase.None) {", name, property_name); - writer->WriteLine(" hash ^= $0$_.GetHashCode();", name); - writer->WriteLine("}"); + printer->Print( + "if ($name$Case_ != $property_name$OneofCase.None) {\n" + " hash ^= $name$_.GetHashCode();\n" + "}\n", + "name", UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), false), + "property_name", + UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), true)); } if (callbase) { - writer->WriteLine("hash ^= base.GetHashCode();"); - } - writer->WriteLine("return hash;"); - writer->Outdent(); - writer->WriteLine("}"); - writer->WriteLine(); - - writer->WriteLine("public override bool Equals(object obj) {"); - writer->Indent(); - writer->WriteLine("$0$ other = obj as $0$;", class_name()); - writer->WriteLine("if (other == null) return false;"); + printer->Print("hash ^= base.GetHashCode();\n"); + } + printer->Print("return hash;\n"); + printer->Outdent(); + printer->Print("}\n"); + printer->Print("\n"); + + printer->Print("public override bool Equals(object obj) {\n"); + printer->Indent(); + printer->Print( + vars, + "$class_name$ other = obj as $class_name$;\n" + "if (other == null) return false;\n"); for (int i = 0; i < descriptor_->field_count(); i++) { scoped_ptr generator( CreateFieldGeneratorInternal(descriptor_->field(i))); - generator->WriteEquals(writer); + generator->WriteEquals(printer); } if (callbase) { - writer->WriteLine("if (!base.Equals(other)) return false;"); + printer->Print("if (!base.Equals(other)) return false;\n"); } - writer->WriteLine("return true;"); - writer->Outdent(); - writer->WriteLine("}"); - writer->WriteLine(); + printer->Print("return true;\n"); + printer->Outdent(); + printer->Print("}\n"); + printer->Print("\n"); - writer->WriteLine( - "public override void PrintTo(global::System.IO.TextWriter writer) {"); - writer->Indent(); + printer->Print( + "public override void PrintTo(global::System.IO.TextWriter writer) {\n"); + printer->Indent(); for (int i = 0; i < fields_by_number().size(); i++) { scoped_ptr generator( CreateFieldGeneratorInternal(fields_by_number()[i])); - generator->WriteToString(writer); + generator->WriteToString(printer); } if (callbase) { - writer->WriteLine("base.PrintTo(writer);"); + printer->Print("base.PrintTo(writer);\n"); } - writer->Outdent(); - writer->WriteLine("}"); - writer->WriteLine("#endregion"); - writer->WriteLine(); + printer->Outdent(); + printer->Print("}\n"); + printer->Print("#endregion\n"); + printer->Print("\n"); } bool CompareExtensionRangesStart(const Descriptor::ExtensionRange* r1, @@ -402,7 +422,7 @@ bool CompareExtensionRangesStart(const Descriptor::ExtensionRange* r1, return r1->start < r2->start; } -void MessageGenerator::GenerateMessageSerializationMethods(Writer* writer) { +void MessageGenerator::GenerateMessageSerializationMethods(io::Printer* printer) { std::vector extension_ranges_sorted; for (int i = 0; i < descriptor_->extension_range_count(); i++) { extension_ranges_sorted.push_back(descriptor_->extension_range(i)); @@ -410,439 +430,442 @@ void MessageGenerator::GenerateMessageSerializationMethods(Writer* writer) { std::sort(extension_ranges_sorted.begin(), extension_ranges_sorted.end(), CompareExtensionRangesStart); - writer->WriteLine( - "public override void WriteTo(pb::ICodedOutputStream output) {"); - writer->Indent(); + printer->Print( + "public override void WriteTo(pb::ICodedOutputStream output) {\n"); + printer->Indent(); // Make sure we've computed the serialized length, so that packed fields are generated correctly. - writer->WriteLine("CalcSerializedSize();"); - writer->WriteLine("string[] field_names = _$0$FieldNames;", - UnderscoresToCamelCase(class_name(), false)); + printer->Print("CalcSerializedSize();\n" + "string[] field_names = _$class_name$FieldNames;\n", + "class_name", UnderscoresToCamelCase(class_name(), false)); if (descriptor_->extension_range_count()) { - writer->WriteLine( - "pb::ExtendableMessage$1$<$0$, $0$.Builder>.ExtensionWriter extensionWriter = CreateExtensionWriter(this);", - class_name(), runtime_suffix()); + printer->Print( + "pb::ExtendableMessage$runtime_suffix$<$class_name$, $class_name$.Builder>.ExtensionWriter extensionWriter = CreateExtensionWriter(this);\n", + "class_name", class_name(), + "runtime_suffix", runtime_suffix()); } // Merge the fields and the extension ranges, both sorted by field number. for (int i = 0, j = 0; i < fields_by_number().size() || j < extension_ranges_sorted.size();) { if (i == fields_by_number().size()) { - GenerateSerializeOneExtensionRange(writer, extension_ranges_sorted[j++]); + GenerateSerializeOneExtensionRange(printer, extension_ranges_sorted[j++]); } else if (j == extension_ranges_sorted.size()) { - GenerateSerializeOneField(writer, fields_by_number()[i++]); + GenerateSerializeOneField(printer, fields_by_number()[i++]); } else if (fields_by_number()[i]->number() < extension_ranges_sorted[j]->start) { - GenerateSerializeOneField(writer, fields_by_number()[i++]); + GenerateSerializeOneField(printer, fields_by_number()[i++]); } else { - GenerateSerializeOneExtensionRange(writer, extension_ranges_sorted[j++]); + GenerateSerializeOneExtensionRange(printer, extension_ranges_sorted[j++]); } } if (!use_lite_runtime()) { if (descriptor_->options().message_set_wire_format()) { - writer->WriteLine("UnknownFields.WriteAsMessageSetTo(output);"); + printer->Print("UnknownFields.WriteAsMessageSetTo(output);\n"); } else { - writer->WriteLine("UnknownFields.WriteTo(output);"); + printer->Print("UnknownFields.WriteTo(output);\n"); } } - writer->Outdent(); - writer->WriteLine("}"); - writer->WriteLine(); - writer->WriteLine("private int memoizedSerializedSize = -1;"); - writer->WriteLine("public override int SerializedSize {"); - writer->Indent(); - writer->WriteLine("get {"); - writer->Indent(); - writer->WriteLine("int size = memoizedSerializedSize;"); - writer->WriteLine("if (size != -1) return size;"); - writer->WriteLine("return CalcSerializedSize();"); - writer->Outdent(); - writer->WriteLine("}"); - writer->Outdent(); - writer->WriteLine("}"); - writer->WriteLine(); - - writer->WriteLine("private int CalcSerializedSize() {"); - writer->Indent(); - writer->WriteLine("int size = memoizedSerializedSize;"); - writer->WriteLine("if (size != -1) return size;"); - writer->WriteLine(); - writer->WriteLine("size = 0;"); + printer->Outdent(); + printer->Print( + "}\n" + "\n" + "private int memoizedSerializedSize = -1;\n" + "public override int SerializedSize {\n"); + printer->Indent(); + printer->Print("get {\n"); + printer->Indent(); + printer->Print( + "int size = memoizedSerializedSize;\n" + "if (size != -1) return size;\n" + "return CalcSerializedSize();\n"); + printer->Outdent(); + printer->Print("}\n"); + printer->Outdent(); + printer->Print("}\n"); + printer->Print("\n"); + + printer->Print("private int CalcSerializedSize() {\n"); + printer->Indent(); + printer->Print( + "int size = memoizedSerializedSize;\n" + "if (size != -1) return size;\n" + "\n" + "size = 0;\n"); for (int i = 0; i < descriptor_->field_count(); i++) { scoped_ptr generator( CreateFieldGeneratorInternal(descriptor_->field(i))); - generator->GenerateSerializedSizeCode(writer); + generator->GenerateSerializedSizeCode(printer); } if (descriptor_->extension_range_count() > 0) { - writer->WriteLine("size += ExtensionsSerializedSize;"); + printer->Print("size += ExtensionsSerializedSize;\n"); } if (!use_lite_runtime()) { if (descriptor_->options().message_set_wire_format()) { - writer->WriteLine("size += UnknownFields.SerializedSizeAsMessageSet;"); + printer->Print("size += UnknownFields.SerializedSizeAsMessageSet;\n"); } else { - writer->WriteLine("size += UnknownFields.SerializedSize;"); + printer->Print("size += UnknownFields.SerializedSize;\n"); } } - writer->WriteLine("memoizedSerializedSize = size;"); - writer->WriteLine("return size;"); - writer->Outdent(); - writer->WriteLine("}"); + printer->Print( + "memoizedSerializedSize = size;\n" + "return size;\n"); + printer->Outdent(); + printer->Print("}\n"); } void MessageGenerator::GenerateSerializeOneField( - Writer* writer, const FieldDescriptor* fieldDescriptor) { + io::Printer* printer, const FieldDescriptor* fieldDescriptor) { scoped_ptr generator( CreateFieldGeneratorInternal(fieldDescriptor)); - generator->GenerateSerializationCode(writer); + generator->GenerateSerializationCode(printer); } void MessageGenerator::GenerateSerializeOneExtensionRange( - Writer* writer, const Descriptor::ExtensionRange* extensionRange) { - writer->WriteLine("extensionWriter.WriteUntil($0$, output);", - SimpleItoa(extensionRange->end)); + io::Printer* printer, const Descriptor::ExtensionRange* extensionRange) { + printer->Print("extensionWriter.WriteUntil($range_end$, output);\n", + "range_end", SimpleItoa(extensionRange->end)); } -void MessageGenerator::GenerateParseFromMethods(Writer* writer) { +void MessageGenerator::GenerateParseFromMethods(io::Printer* printer) { // Note: These are separate from GenerateMessageSerializationMethods() // because they need to be generated even for messages that are optimized // for code size. - - writer->WriteLine("public static $0$ ParseFrom(pb::ByteString data) {", - class_name()); - writer->WriteLine( - " return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();"); - writer->WriteLine("}"); - writer->WriteLine( - "public static $0$ ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {", - class_name()); - writer->WriteLine( - " return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();"); - writer->WriteLine("}"); - writer->WriteLine("public static $0$ ParseFrom(byte[] data) {", class_name()); - writer->WriteLine( - " return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();"); - writer->WriteLine("}"); - writer->WriteLine( - "public static $0$ ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {", - class_name()); - writer->WriteLine( - " return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();"); - writer->WriteLine("}"); - writer->WriteLine( - "public static $0$ ParseFrom(global::System.IO.Stream input) {", - class_name()); - writer->WriteLine( - " return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();"); - writer->WriteLine("}"); - writer->WriteLine( - "public static $0$ ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {", - class_name()); - writer->WriteLine( - " return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();"); - writer->WriteLine("}"); - writer->WriteLine( - "public static $0$ ParseDelimitedFrom(global::System.IO.Stream input) {", - class_name()); - writer->WriteLine( - " return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();"); - writer->WriteLine("}"); - writer->WriteLine( - "public static $0$ ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {", - class_name()); - writer->WriteLine( - " return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();"); - writer->WriteLine("}"); - writer->WriteLine( - "public static $0$ ParseFrom(pb::ICodedInputStream input) {", - class_name()); - writer->WriteLine( - " return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();"); - writer->WriteLine("}"); - writer->WriteLine( - "public static $0$ ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {", - class_name()); - writer->WriteLine( - " return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();"); - writer->WriteLine("}"); + map vars; + vars["class_name"] = class_name(); + + printer->Print( + vars, + "public static $class_name$ ParseFrom(pb::ByteString data) {\n" + " return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();\n" + "}\n" + "public static $class_name$ ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {\n" + " return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();\n" + "}\n" + "public static $class_name$ ParseFrom(byte[] data) {\n" + " return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();\n" + "}\n" + "public static $class_name$ ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {\n" + " return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();\n" + "}\n" + "public static $class_name$ ParseFrom(global::System.IO.Stream input) {\n" + " return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();\n" + "}\n" + "public static $class_name$ ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {\n" + " return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();\n" + "}\n" + "public static $class_name$ ParseDelimitedFrom(global::System.IO.Stream input) {\n" + " return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();\n" + "}\n" + "public static $class_name$ ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {\n" + " return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();\n" + "}\n" + "public static $class_name$ ParseFrom(pb::ICodedInputStream input) {\n" + " return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();\n" + "}\n" + "public static $class_name$ ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {\n" + " return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();\n" + "}\n"); } -void MessageGenerator::GenerateBuilder(Writer* writer) { - writer->WriteLine("private $0$ MakeReadOnly() {", class_name()); - writer->Indent(); +void MessageGenerator::GenerateBuilder(io::Printer* printer) { + map vars; + vars["class_name"] = class_name(); + vars["access_level"] = class_access_level(); + vars["extendable_or_generated"] = descriptor_->extension_range_count() > 0 ? + "Extendable" : "Generated"; + vars["suffix"] = runtime_suffix(); + + printer->Print(vars, "private $class_name$ MakeReadOnly() {\n"); + printer->Indent(); for (int i = 0; i < descriptor_->field_count(); i++) { scoped_ptr generator( CreateFieldGeneratorInternal(descriptor_->field(i))); - generator->GenerateBuildingCode(writer); - } - writer->WriteLine("return this;"); - writer->Outdent(); - writer->WriteLine("}"); - writer->WriteLine(); - - writer->WriteLine( - "public static Builder CreateBuilder() { return new Builder(); }"); - writer->WriteLine( - "public override Builder ToBuilder() { return CreateBuilder(this); }"); - writer->WriteLine( - "public override Builder CreateBuilderForType() { return new Builder(); }"); - writer->WriteLine("public static Builder CreateBuilder($0$ prototype) {", - class_name()); - writer->WriteLine(" return new Builder(prototype);"); - writer->WriteLine("}"); - writer->WriteLine(); - writer->WriteLine( - "[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]"); - WriteGeneratedCodeAttributes(writer); - writer->WriteLine( - "$0$ sealed partial class Builder : pb::$2$Builder$3$<$1$, Builder> {", - class_access_level(), class_name(), - descriptor_->extension_range_count() > 0 ? "Extendable" : "Generated", - runtime_suffix()); - writer->Indent(); - writer->WriteLine("protected override Builder ThisBuilder {"); - writer->WriteLine(" get { return this; }"); - writer->WriteLine("}"); - GenerateCommonBuilderMethods(writer); + generator->GenerateBuildingCode(printer); + } + printer->Print("return this;\n"); + printer->Outdent(); + printer->Print("}\n\n"); + + printer->Print( + vars, + "public static Builder CreateBuilder() { return new Builder(); }\n" + "public override Builder ToBuilder() { return CreateBuilder(this); }\n" + "public override Builder CreateBuilderForType() { return new Builder(); }\n" + "public static Builder CreateBuilder($class_name$ prototype) {\n" + " return new Builder(prototype);\n" + "}\n" + "\n" + "[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n"); + WriteGeneratedCodeAttributes(printer); + printer->Print( + vars, + "$access_level$ sealed partial class Builder : pb::$extendable_or_generated$Builder$suffix$<$class_name$, Builder> {\n"); + printer->Indent(); + printer->Print( + "protected override Builder ThisBuilder {\n" + " get { return this; }\n" + "}\n"); + GenerateCommonBuilderMethods(printer); if (optimize_speed()) { - GenerateBuilderParsingMethods(writer); + GenerateBuilderParsingMethods(printer); } for (int i = 0; i < descriptor_->field_count(); i++) { scoped_ptr generator( CreateFieldGeneratorInternal(descriptor_->field(i))); - writer->WriteLine(); + printer->Print("\n"); // No field comment :( - generator->GenerateBuilderMembers(writer); + generator->GenerateBuilderMembers(printer); } // oneof for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { - writer->WriteLine(); + printer->Print("\n"); string name = UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), false); string property_name = UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), true); - writer->WriteLine("public $0$OneofCase $0$Case {", property_name); - writer->WriteLine(" get { return result.$0$Case_; }", name); - writer->WriteLine("}"); - writer->WriteLine("public Builder Clear$0$() {", property_name); - writer->WriteLine(" PrepareBuilder();"); - writer->WriteLine(" result.$0$_ = null;", name); - writer->WriteLine(" result.$0$Case_ = $1$OneofCase.None;", name, property_name); - writer->WriteLine(" return this;"); - writer->WriteLine("}"); - } - - writer->Outdent(); - writer->WriteLine("}"); + printer->Print( + "public $property_name$OneofCase $property_name$Case {\n" + " get { return result.$name$Case_; }\n" + "}\n" + "public Builder Clear$property_name$() {\n" + " PrepareBuilder();\n" + " result.$name$_ = null;\n" + " result.$name$Case_ = $property_name$OneofCase.None;\n" + " return this;\n" + "}\n", + "name", UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), false), + "property_name", + UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), true)); + } + + printer->Outdent(); + printer->Print("}\n"); } -void MessageGenerator::GenerateCommonBuilderMethods(Writer* writer) { - //default constructor - writer->WriteLine("public Builder() {"); - //Durring static initialization of message, DefaultInstance is expected to return null. - writer->WriteLine(" result = DefaultInstance;"); - writer->WriteLine(" resultIsReadOnly = true;"); - writer->WriteLine("}"); - //clone constructor - writer->WriteLine("internal Builder($0$ cloneFrom) {", class_name()); - writer->WriteLine(" result = cloneFrom;"); - writer->WriteLine(" resultIsReadOnly = true;"); - writer->WriteLine("}"); - writer->WriteLine(); - writer->WriteLine("private bool resultIsReadOnly;"); - writer->WriteLine("private $0$ result;", class_name()); - writer->WriteLine(); - writer->WriteLine("private $0$ PrepareBuilder() {", class_name()); - writer->WriteLine(" if (resultIsReadOnly) {"); - writer->WriteLine(" $0$ original = result;", class_name()); - writer->WriteLine(" result = new $0$();", class_name()); - writer->WriteLine(" resultIsReadOnly = false;"); - writer->WriteLine(" MergeFrom(original);"); - writer->WriteLine(" }"); - writer->WriteLine(" return result;"); - writer->WriteLine("}"); - writer->WriteLine(); - writer->WriteLine("public override bool IsInitialized {"); - writer->WriteLine(" get { return result.IsInitialized; }"); - writer->WriteLine("}"); - writer->WriteLine(); - writer->WriteLine("protected override $0$ MessageBeingBuilt {", class_name()); - writer->WriteLine(" get { return PrepareBuilder(); }"); - writer->WriteLine("}"); - writer->WriteLine(); +void MessageGenerator::GenerateCommonBuilderMethods(io::Printer* printer) { + map vars; + vars["class_name"] = class_name(); + vars["full_class_name"] = full_class_name(); + vars["suffix"] = runtime_suffix(); + + printer->Print( + vars, + //default constructor + "public Builder() {\n" + //Durring static initialization of message, DefaultInstance is expected to return null. + " result = DefaultInstance;\n" + " resultIsReadOnly = true;\n" + "}\n" + //clone constructor + "internal Builder($class_name$ cloneFrom) {\n" + " result = cloneFrom;\n" + " resultIsReadOnly = true;\n" + "}\n" + "\n" + "private bool resultIsReadOnly;\n" + "private $class_name$ result;\n" + "\n" + "private $class_name$ PrepareBuilder() {\n" + " if (resultIsReadOnly) {\n" + " $class_name$ original = result;\n" + " result = new $class_name$();\n" + " resultIsReadOnly = false;\n" + " MergeFrom(original);\n" + " }\n" + " return result;\n" + "}\n" + "\n" + "public override bool IsInitialized {\n" + " get { return result.IsInitialized; }\n" + "}\n" + "\n" + "protected override $class_name$ MessageBeingBuilt {\n" + " get { return PrepareBuilder(); }\n" + "}\n" + "\n"); //Not actually expecting that DefaultInstance would ever be null here; however, we will ensure it does not break - writer->WriteLine("public override Builder Clear() {"); - writer->WriteLine(" result = DefaultInstance;"); - writer->WriteLine(" resultIsReadOnly = true;"); - writer->WriteLine(" return this;"); - writer->WriteLine("}"); - writer->WriteLine(); - writer->WriteLine("public override Builder Clone() {"); - writer->WriteLine(" if (resultIsReadOnly) {"); - writer->WriteLine(" return new Builder(result);"); - writer->WriteLine(" } else {"); - writer->WriteLine(" return new Builder().MergeFrom(result);"); - writer->WriteLine(" }"); - writer->WriteLine("}"); - writer->WriteLine(); + printer->Print( + "public override Builder Clear() {\n" + " result = DefaultInstance;\n" + " resultIsReadOnly = true;\n" + " return this;\n" + "}\n" + "\n" + "public override Builder Clone() {\n" + " if (resultIsReadOnly) {\n" + " return new Builder(result);\n" + " } else {\n" + " return new Builder().MergeFrom(result);\n" + " }\n" + "}\n" + "\n"); if (!use_lite_runtime()) { - writer->WriteLine( - "public override pbd::MessageDescriptor DescriptorForType {"); - writer->WriteLine(" get { return $0$.Descriptor; }", full_class_name()); - writer->WriteLine("}"); - writer->WriteLine(); - } - writer->WriteLine("public override $0$ DefaultInstanceForType {", - class_name()); - writer->WriteLine(" get { return $0$.DefaultInstance; }", full_class_name()); - writer->WriteLine("}"); - writer->WriteLine(); - - writer->WriteLine("public override $0$ BuildPartial() {", class_name()); - writer->Indent(); - writer->WriteLine("if (resultIsReadOnly) {"); - writer->WriteLine(" return result;"); - writer->WriteLine("}"); - writer->WriteLine("resultIsReadOnly = true;"); - writer->WriteLine("return result.MakeReadOnly();"); - writer->Outdent(); - writer->WriteLine("}"); - writer->WriteLine(); + printer->Print( + vars, + "public override pbd::MessageDescriptor DescriptorForType {\n" + " get { return $full_class_name$.Descriptor; }\n" + "}\n\n"); + } + printer->Print( + vars, + "public override $class_name$ DefaultInstanceForType {\n" + " get { return $full_class_name$.DefaultInstance; }\n" + "}\n\n"); + + printer->Print( + vars, + "public override $class_name$ BuildPartial() {\n" + " if (resultIsReadOnly) {\n" + " return result;\n" + " }\n" + " resultIsReadOnly = true;\n" + " return result.MakeReadOnly();\n" + "}\n\n"); if (optimize_speed()) { - writer->WriteLine( - "public override Builder MergeFrom(pb::IMessage$0$ other) {", - runtime_suffix()); - writer->WriteLine(" if (other is $0$) {", class_name()); - writer->WriteLine(" return MergeFrom(($0$) other);", class_name()); - writer->WriteLine(" } else {"); - writer->WriteLine(" base.MergeFrom(other);"); - writer->WriteLine(" return this;"); - writer->WriteLine(" }"); - writer->WriteLine("}"); - writer->WriteLine(); - writer->WriteLine("public override Builder MergeFrom($0$ other) {", - class_name()); + printer->Print( + vars, + "public override Builder MergeFrom(pb::IMessage$suffix$ other) {\n" + " if (other is $class_name$) {\n" + " return MergeFrom(($class_name$) other);\n" + " } else {\n" + " base.MergeFrom(other);\n" + " return this;\n" + " }\n" + "}\n\n"); + + printer->Print(vars,"public override Builder MergeFrom($class_name$ other) {\n"); // Optimization: If other is the default instance, we know none of its // fields are set so we can skip the merge. - writer->Indent(); - writer->WriteLine("if (other == $0$.DefaultInstance) return this;", - full_class_name()); - writer->WriteLine("PrepareBuilder();"); + printer->Indent(); + printer->Print( + vars, + "if (other == $full_class_name$.DefaultInstance) return this;\n" + "PrepareBuilder();\n"); for (int i = 0; i < descriptor_->field_count(); i++) { if (!descriptor_->field(i)->containing_oneof()) { scoped_ptr generator( CreateFieldGeneratorInternal(descriptor_->field(i))); - generator->GenerateMergingCode(writer); + generator->GenerateMergingCode(printer); } } // Merge oneof fields for (int i = 0; i < descriptor_->oneof_decl_count(); ++i) { - string name = UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), false); - string property_name = UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), true); - writer->WriteLine("switch (other.$0$Case) {", property_name); - writer->Indent(); + vars["name"] = UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), false); + vars["property_name"] = UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), true); + printer->Print(vars, "switch (other.$property_name$Case) {\n"); + printer->Indent(); for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) { const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j); - writer->WriteLine("case $0$OneofCase.$1$: {", - property_name, GetPropertyName(field)); + vars["field_property_name"] = GetPropertyName(field); + printer->Print( + vars, + "case $property_name$OneofCase.$field_property_name$: {\n"); if (field->type() == FieldDescriptor::TYPE_GROUP || field->type() == FieldDescriptor::TYPE_MESSAGE) { - writer->WriteLine(" Merge$0$(other.$0$);", GetPropertyName(field)); + printer->Print( + vars, + " Merge$field_property_name$(other.$field_property_name$);\n"); } else { - writer->WriteLine(" Set$0$(other.$0$);", GetPropertyName(field)); + printer->Print( + vars, + " Set$field_property_name$(other.$field_property_name$);\n"); } - writer->WriteLine(" break;"); - writer->WriteLine("}"); + printer->Print(" break;\n"); + printer->Print("}\n"); } - writer->WriteLine("case $0$OneofCase.None: { break; }", property_name); - writer->Outdent(); - writer->WriteLine("}"); + printer->Print(vars, "case $property_name$OneofCase.None: { break; }\n"); + printer->Outdent(); + printer->Print("}\n"); } // if message type has extensions if (descriptor_->extension_range_count() > 0) { - writer->WriteLine(" this.MergeExtensionFields(other);"); + printer->Print(" this.MergeExtensionFields(other);\n"); } if (!use_lite_runtime()) { - writer->WriteLine("this.MergeUnknownFields(other.UnknownFields);"); + printer->Print("this.MergeUnknownFields(other.UnknownFields);\n"); } - writer->WriteLine("return this;"); - writer->Outdent(); - writer->WriteLine("}"); - writer->WriteLine(); + printer->Print("return this;\n"); + printer->Outdent(); + printer->Print("}\n\n"); } } -void MessageGenerator::GenerateBuilderParsingMethods(Writer* writer) { - writer->WriteLine( - "public override Builder MergeFrom(pb::ICodedInputStream input) {"); - writer->WriteLine(" return MergeFrom(input, pb::ExtensionRegistry.Empty);"); - writer->WriteLine("}"); - writer->WriteLine(); - writer->WriteLine( - "public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {"); - writer->Indent(); - writer->WriteLine("PrepareBuilder();"); +void MessageGenerator::GenerateBuilderParsingMethods(io::Printer* printer) { + printer->Print( + "public override Builder MergeFrom(pb::ICodedInputStream input) {\n" + " return MergeFrom(input, pb::ExtensionRegistry.Empty);\n" + "}\n\n"); + + printer->Print( + "public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {\n"); + printer->Indent(); + printer->Print("PrepareBuilder();\n"); if (!use_lite_runtime()) { - writer->WriteLine("pb::UnknownFieldSet.Builder unknownFields = null;"); - } - writer->WriteLine("uint tag;"); - writer->WriteLine("string field_name;"); - writer->WriteLine("while (input.ReadTag(out tag, out field_name)) {"); - writer->Indent(); - writer->WriteLine("if(tag == 0 && field_name != null) {"); - writer->Indent(); + printer->Print("pb::UnknownFieldSet.Builder unknownFields = null;\n"); + } + printer->Print( + "uint tag;\n" + "string field_name;\n" + "while (input.ReadTag(out tag, out field_name)) {\n"); + printer->Indent(); + printer->Print("if(tag == 0 && field_name != null) {\n"); + printer->Indent(); //if you change from StringComparer.Ordinal, the array sort in FieldNames { get; } must also change - writer->WriteLine( - "int field_ordinal = global::System.Array.BinarySearch(_$0$FieldNames, field_name, global::System.StringComparer.Ordinal);", - UnderscoresToCamelCase(class_name(), false)); - writer->WriteLine("if(field_ordinal >= 0)"); - writer->WriteLine(" tag = _$0$FieldTags[field_ordinal];", - UnderscoresToCamelCase(class_name(), false)); - writer->WriteLine("else {"); + printer->Print( + "int field_ordinal = global::System.Array.BinarySearch(_$camel_class_name$FieldNames, field_name, global::System.StringComparer.Ordinal);\n" + "if(field_ordinal >= 0)\n" + " tag = _$camel_class_name$FieldTags[field_ordinal];\n" + "else {\n", + "camel_class_name", UnderscoresToCamelCase(class_name(), false)); if (!use_lite_runtime()) { - writer->WriteLine(" if (unknownFields == null) {"); // First unknown field - create builder now - writer->WriteLine( - " unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);"); - writer->WriteLine(" }"); - } - writer->WriteLine( - " ParseUnknownField(input, $0$extensionRegistry, tag, field_name);", - use_lite_runtime() ? "" : "unknownFields, "); - writer->WriteLine(" continue;"); - writer->WriteLine("}"); - writer->Outdent(); - writer->WriteLine("}"); - - writer->WriteLine("switch (tag) {"); - writer->Indent(); - writer->WriteLine("case 0: {"); // 0 signals EOF / limit reached - writer->WriteLine(" throw pb::InvalidProtocolBufferException.InvalidTag();"); - writer->WriteLine("}"); - writer->WriteLine("default: {"); - writer->WriteLine(" if (pb::WireFormat.IsEndGroupTag(tag)) {"); + printer->Print( + " if (unknownFields == null) {\n" // First unknown field - create builder now + " unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);\n" + " }\n"); + } + printer->Print( + " ParseUnknownField(input, $prefix$extensionRegistry, tag, field_name);\n", + "prefix", use_lite_runtime() ? "" : "unknownFields, "); + printer->Print(" continue;\n"); + printer->Print("}\n"); + printer->Outdent(); + printer->Print("}\n"); + + printer->Print("switch (tag) {\n"); + printer->Indent(); + printer->Print( + "case 0: {\n" // 0 signals EOF / limit reached + " throw pb::InvalidProtocolBufferException.InvalidTag();\n" + "}\n" + "default: {\n" + " if (pb::WireFormat.IsEndGroupTag(tag)) {\n"); if (!use_lite_runtime()) { - writer->WriteLine(" if (unknownFields != null) {"); - writer->WriteLine(" this.UnknownFields = unknownFields.Build();"); - writer->WriteLine(" }"); - } - writer->WriteLine(" return this;"); // it's an endgroup tag - writer->WriteLine(" }"); + printer->Print( + " if (unknownFields != null) {\n" + " this.UnknownFields = unknownFields.Build();\n" + " }\n"); + } + printer->Print( + " return this;\n" // it's an endgroup tag + " }\n"); if (!use_lite_runtime()) { - writer->WriteLine(" if (unknownFields == null) {"); // First unknown field - create builder now - writer->WriteLine( - " unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);"); - writer->WriteLine(" }"); + printer->Print( + " if (unknownFields == null) {\n" // First unknown field - create builder now + " unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);\n" + " }\n"); } - writer->WriteLine( - " ParseUnknownField(input, $0$extensionRegistry, tag, field_name);", - use_lite_runtime() ? "" : "unknownFields, "); - writer->WriteLine(" break;"); - writer->WriteLine("}"); + printer->Print( + " ParseUnknownField(input, $prefix$extensionRegistry, tag, field_name);\n", + "prefix", use_lite_runtime() ? "" : "unknownFields, "); + printer->Print(" break;\n"); + printer->Print("}\n"); for (int i = 0; i < fields_by_number().size(); i++) { const FieldDescriptor* field = fields_by_number()[i]; @@ -853,53 +876,54 @@ void MessageGenerator::GenerateBuilderParsingMethods(Writer* writer) { && (wt == internal::WireFormatLite::WIRETYPE_VARINT || wt == internal::WireFormatLite::WIRETYPE_FIXED32 || wt == internal::WireFormatLite::WIRETYPE_FIXED64)) { - writer->WriteLine( - "case $0$:", - SimpleItoa( - internal::WireFormatLite::MakeTag( - field->number(), - internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED))); + printer->Print( + "case $number$:\n", + "number", + SimpleItoa( + internal::WireFormatLite::MakeTag( + field->number(), + internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED))); } - writer->WriteLine("case $0$: {", SimpleItoa(tag)); - writer->Indent(); + printer->Print("case $tag$: {\n", "tag", SimpleItoa(tag)); + printer->Indent(); scoped_ptr generator( CreateFieldGeneratorInternal(field)); - generator->GenerateParsingCode(writer); - writer->WriteLine("break;"); - writer->Outdent(); - writer->WriteLine("}"); + generator->GenerateParsingCode(printer); + printer->Print("break;\n"); + printer->Outdent(); + printer->Print("}\n"); } - writer->Outdent(); - writer->WriteLine("}"); - writer->Outdent(); - writer->WriteLine("}"); - writer->WriteLine(); + printer->Outdent(); + printer->Print("}\n"); + printer->Outdent(); + printer->Print("}\n"); + printer->Print("\n"); if (!use_lite_runtime()) { - writer->WriteLine("if (unknownFields != null) {"); - writer->WriteLine(" this.UnknownFields = unknownFields.Build();"); - writer->WriteLine("}"); - } - writer->WriteLine("return this;"); - writer->Outdent(); - writer->WriteLine("}"); - writer->WriteLine(); + printer->Print( + "if (unknownFields != null) {\n" + " this.UnknownFields = unknownFields.Build();\n" + "}\n"); + } + printer->Print("return this;\n"); + printer->Outdent(); + printer->Print("}\n\n"); } -void MessageGenerator::GenerateIsInitialized(Writer* writer) { - writer->WriteLine("public override bool IsInitialized {"); - writer->Indent(); - writer->WriteLine("get {"); - writer->Indent(); +void MessageGenerator::GenerateIsInitialized(io::Printer* printer) { + printer->Print("public override bool IsInitialized {\n"); + printer->Indent(); + printer->Print("get {\n"); + printer->Indent(); // Check that all required fields in this message are set. // TODO(kenton): We can optimize this when we switch to putting all the // "has" fields into a single bitfield. for (int i = 0; i < descriptor_->field_count(); i++) { if (descriptor_->field(i)->is_required()) { - writer->WriteLine("if (!has$0$) return false;", - GetPropertyName(descriptor_->field(i))); + printer->Print("if (!has$property_name$) return false;\n", + "property_name", GetPropertyName(descriptor_->field(i))); } } @@ -916,43 +940,48 @@ void MessageGenerator::GenerateIsInitialized(Writer* writer) { string propertyName = UnderscoresToPascalCase(GetFieldName(field)); if (field->is_repeated()) { - writer->WriteLine("foreach ($0$ element in $1$List) {", - GetClassName(field->message_type()), - propertyName); - writer->WriteLine(" if (!element.IsInitialized) return false;"); - writer->WriteLine("}"); + printer->Print( + "foreach ($class_name$ element in $property_name$List) {\n" + " if (!element.IsInitialized) return false;\n" + "}\n", + "class_name", GetClassName(field->message_type()), + "property_name", propertyName); } else if (field->is_optional()) { - writer->WriteLine("if (Has$0$) {", propertyName); - writer->WriteLine(" if (!$0$.IsInitialized) return false;", propertyName); - writer->WriteLine("}"); + printer->Print( + "if (Has$property_name$) {\n" + " if (!$property_name$.IsInitialized) return false;\n" + "}\n", + "property_name", propertyName); } else { - writer->WriteLine("if (!$0$.IsInitialized) return false;", propertyName); + printer->Print( + "if (!$property_name$.IsInitialized) return false;\n", + "property_name", propertyName); } } if (descriptor_->extension_range_count() > 0) { - writer->WriteLine("if (!ExtensionsAreInitialized) return false;"); - } - writer->WriteLine("return true;"); - writer->Outdent(); - writer->WriteLine("}"); - writer->Outdent(); - writer->WriteLine("}"); - writer->WriteLine(); + printer->Print("if (!ExtensionsAreInitialized) return false;\n"); + } + printer->Print("return true;\n"); + printer->Outdent(); + printer->Print("}\n"); + printer->Outdent(); + printer->Print("}\n"); + printer->Print("\n"); } -void MessageGenerator::GenerateExtensionRegistrationCode(Writer* writer) { +void MessageGenerator::GenerateExtensionRegistrationCode(io::Printer* printer) { for (int i = 0; i < descriptor_->extension_count(); i++) { ExtensionGenerator extensionGenerator(descriptor_->extension(i)); - extensionGenerator.GenerateExtensionRegistrationCode(writer); + extensionGenerator.GenerateExtensionRegistrationCode(printer); } for (int i = 0; i < descriptor_->nested_type_count(); i++) { MessageGenerator messageGenerator(descriptor_->nested_type(i)); - messageGenerator.GenerateExtensionRegistrationCode(writer); + messageGenerator.GenerateExtensionRegistrationCode(printer); } } diff --git a/src/google/protobuf/compiler/csharp/csharp_message.h b/src/google/protobuf/compiler/csharp/csharp_message.h index b8d15df0..ebe58618 100644 --- a/src/google/protobuf/compiler/csharp/csharp_message.h +++ b/src/google/protobuf/compiler/csharp/csharp_message.h @@ -51,27 +51,27 @@ class MessageGenerator : public SourceGeneratorBase { MessageGenerator(const Descriptor* descriptor); ~MessageGenerator(); - void GenerateStaticVariables(Writer* printer); - void GenerateStaticVariableInitializers(Writer* printer); - void GenerateExtensionRegistrationCode(Writer* printer); - void Generate(Writer* printer); + void GenerateStaticVariables(io::Printer* printer); + void GenerateStaticVariableInitializers(io::Printer* printer); + void GenerateExtensionRegistrationCode(io::Printer* printer); + void Generate(io::Printer* printer); private: const Descriptor* descriptor_; std::vector field_names_; std::vector fields_by_number_; - void GenerateLiteRuntimeMethods(Writer* writer); - void GenerateMessageSerializationMethods(Writer* writer); - void GenerateSerializeOneField(Writer* writer, + void GenerateLiteRuntimeMethods(io::Printer* printer); + void GenerateMessageSerializationMethods(io::Printer* printer); + void GenerateSerializeOneField(io::Printer* printer, const FieldDescriptor* fieldDescriptor); void GenerateSerializeOneExtensionRange( - Writer* writer, const Descriptor::ExtensionRange* extendsionRange); - void GenerateParseFromMethods(Writer* writer); - void GenerateBuilder(Writer* writer); - void GenerateCommonBuilderMethods(Writer* writer); - void GenerateBuilderParsingMethods(Writer* writer); - void GenerateIsInitialized(Writer* writer); + io::Printer* printer, const Descriptor::ExtensionRange* extendsionRange); + void GenerateParseFromMethods(io::Printer* printer); + void GenerateBuilder(io::Printer* printer); + void GenerateCommonBuilderMethods(io::Printer* printer); + void GenerateBuilderParsingMethods(io::Printer* printer); + void GenerateIsInitialized(io::Printer* printer); int GetFieldOrdinal(const FieldDescriptor* descriptor); FieldGeneratorBase* CreateFieldGeneratorInternal( diff --git a/src/google/protobuf/compiler/csharp/csharp_message_field.cc b/src/google/protobuf/compiler/csharp/csharp_message_field.cc index b533d735..50eb9df6 100644 --- a/src/google/protobuf/compiler/csharp/csharp_message_field.cc +++ b/src/google/protobuf/compiler/csharp/csharp_message_field.cc @@ -40,7 +40,6 @@ #include #include -#include namespace google { namespace protobuf { @@ -50,245 +49,291 @@ namespace csharp { MessageFieldGenerator::MessageFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal) : FieldGeneratorBase(descriptor, fieldOrdinal) { - has_property_check = "has" + property_name(); + variables_["has_property_check"] = "has" + property_name(); + variables_["message_or_group"] = message_or_group(); } MessageFieldGenerator::~MessageFieldGenerator() { } -void MessageFieldGenerator::GenerateMembers(Writer* writer) { - writer->WriteLine("private bool has$0$;", property_name()); - writer->WriteLine("private $0$ $1$_;", type_name(), name()); - AddDeprecatedFlag(writer); - writer->WriteLine("public bool Has$0$ {", property_name()); - writer->WriteLine(" get { return has$0$; }", property_name()); - writer->WriteLine("}"); - AddDeprecatedFlag(writer); - writer->WriteLine("public $0$ $1$ {", type_name(), property_name()); - writer->WriteLine(" get { return $0$_ ?? $1$; }", name(), default_value()); - writer->WriteLine("}"); +void MessageFieldGenerator::GenerateMembers(io::Printer* printer) { + printer->Print( + variables_, + "private bool has$property_name$;\n" + "private $type_name$ $name$_;\n"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public bool Has$property_name$ {\n" + " get { return has$property_name$; }\n" + "}\n"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public $type_name$ $property_name$ {\n" + " get { return $name$_ ?? $default_value$; }\n" + "}\n"); } -void MessageFieldGenerator::GenerateBuilderMembers(Writer* writer) { - AddDeprecatedFlag(writer); - writer->WriteLine("public bool Has$0$ {", property_name()); - writer->WriteLine(" get { return result.has$0$; }", property_name()); - writer->WriteLine("}"); - AddDeprecatedFlag(writer); - writer->WriteLine("public $0$ $1$ {", type_name(), property_name()); - writer->WriteLine(" get { return result.$0$; }", property_name()); - 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.has$0$ = true;", property_name()); - writer->WriteLine(" result.$0$_ = value;", 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.has$0$ = true;", property_name()); - writer->WriteLine(" result.$0$_ = builderForValue.Build();", 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.has$0$ &&", property_name()); - writer->WriteLine(" result.$0$_ != $1$) {", name(), default_value()); - writer->WriteLine( - " result.$0$_ = $1$.CreateBuilder(result.$0$_).MergeFrom(value).BuildPartial();", - name(), type_name()); - writer->WriteLine(" } else {"); - writer->WriteLine(" result.$0$_ = value;", name()); - writer->WriteLine(" }"); - writer->WriteLine(" result.has$0$ = true;", property_name()); - writer->WriteLine(" return this;"); - writer->WriteLine("}"); - AddDeprecatedFlag(writer); - writer->WriteLine("public Builder Clear$0$() {", property_name()); - writer->WriteLine(" PrepareBuilder();"); - writer->WriteLine(" result.has$0$ = false;", property_name()); - writer->WriteLine(" result.$0$_ = null;", name()); - writer->WriteLine(" return this;"); - writer->WriteLine("}"); +void MessageFieldGenerator::GenerateBuilderMembers(io::Printer* printer) { + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public bool Has$property_name$ {\n" + " get { return result.has$property_name$; }\n" + "}\n"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public $type_name$ $property_name$ {\n" + " get { return result.$property_name$; }\n" + " set { Set$property_name$(value); }\n" + "}\n"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public Builder Set$property_name$($type_name$ value) {\n"); + AddNullCheck(printer); + printer->Print( + variables_, + " PrepareBuilder();\n" + " result.has$property_name$ = true;\n" + " result.$name$_ = value;\n" + " return this;\n" + "}\n"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public Builder Set$property_name$($type_name$.Builder builderForValue) {\n"); + AddNullCheck(printer, "builderForValue"); + printer->Print( + variables_, + " PrepareBuilder();\n" + " result.has$property_name$ = true;\n" + " result.$name$_ = builderForValue.Build();\n" + " return this;\n" + "}\n"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public Builder Merge$property_name$($type_name$ value) {\n"); + AddNullCheck(printer); + printer->Print( + variables_, + " PrepareBuilder();\n" + " if (result.has$property_name$ &&\n" + " result.$name$_ != $default_value$) {\n" + " result.$name$_ = $type_name$.CreateBuilder(result.$name$_).MergeFrom(value).BuildPartial();\n" + " } else {\n" + " result.$name$_ = value;\n" + " }\n" + " result.has$property_name$ = true;\n" + " return this;\n" + "}\n"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public Builder Clear$property_name$() {\n" + " PrepareBuilder();\n" + " result.has$property_name$ = false;\n" + " result.$name$_ = null;\n" + " return this;\n" + "}\n"); } -void MessageFieldGenerator::GenerateMergingCode(Writer* writer) { - writer->WriteLine("if (other.Has$0$) {", property_name()); - writer->WriteLine(" Merge$0$(other.$0$);", property_name()); - writer->WriteLine("}"); +void MessageFieldGenerator::GenerateMergingCode(io::Printer* printer) { + printer->Print( + variables_, + "if (other.Has$property_name$) {\n" + " Merge$property_name$(other.$property_name$);\n" + "}\n"); } -void MessageFieldGenerator::GenerateBuildingCode(Writer* writer) { +void MessageFieldGenerator::GenerateBuildingCode(io::Printer* printer) { // Nothing to do for singular fields } -void MessageFieldGenerator::GenerateParsingCode(Writer* writer) { - writer->WriteLine("$0$.Builder subBuilder = $0$.CreateBuilder();", - type_name()); - writer->WriteLine("if (result.has$0$) {", property_name()); - writer->WriteLine(" subBuilder.MergeFrom($0$);", property_name()); - writer->WriteLine("}"); +void MessageFieldGenerator::GenerateParsingCode(io::Printer* printer) { + printer->Print( + variables_, + "$type_name$.Builder subBuilder = $type_name$.CreateBuilder();\n" + "if (result.has$property_name$) {\n" + " subBuilder.MergeFrom($property_name$);\n" + "}\n"); if (descriptor_->type() == FieldDescriptor::TYPE_GROUP) { - writer->WriteLine("input.ReadGroup($0$, subBuilder, extensionRegistry);", - number()); + printer->Print( + variables_, + "input.ReadGroup($number$, subBuilder, extensionRegistry);\n"); } else { - writer->WriteLine("input.ReadMessage(subBuilder, extensionRegistry);"); + printer->Print("input.ReadMessage(subBuilder, extensionRegistry);\n"); } - writer->WriteLine("$0$ = subBuilder.BuildPartial();", property_name()); + printer->Print( + variables_, + "$property_name$ = subBuilder.BuildPartial();\n"); } -void MessageFieldGenerator::GenerateSerializationCode(Writer* writer) { - 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()); - writer->WriteLine("}"); +void MessageFieldGenerator::GenerateSerializationCode(io::Printer* printer) { + printer->Print( + variables_, + "if ($has_property_check$) {\n" + " output.Write$message_or_group$($number$, field_names[$field_ordinal$], $property_name$);\n" + "}\n"); } -void MessageFieldGenerator::GenerateSerializedSizeCode(Writer* writer) { - 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("}"); +void MessageFieldGenerator::GenerateSerializedSizeCode(io::Printer* printer) { + printer->Print( + variables_, + "if ($has_property_check$) {\n" + " size += pb::CodedOutputStream.Compute$message_or_group$Size($number$, $property_name$);\n" + "}\n"); } -void MessageFieldGenerator::WriteHash(Writer* writer) { - writer->WriteLine("if (has$0$) hash ^= $1$_.GetHashCode();", property_name(), - name()); +void MessageFieldGenerator::WriteHash(io::Printer* printer) { + printer->Print( + variables_, + "if (has$property_name$) hash ^= $name$_.GetHashCode();\n"); } -void MessageFieldGenerator::WriteEquals(Writer* writer) { - writer->WriteLine( - "if (has$0$ != other.has$0$ || (has$0$ && !$1$_.Equals(other.$1$_))) return false;", - property_name(), name()); +void MessageFieldGenerator::WriteEquals(io::Printer* printer) { + printer->Print( + variables_, + "if (has$property_name$ != other.has$property_name$ || (has$property_name$ && !$name$_.Equals(other.$name$_))) return false;\n"); } -void MessageFieldGenerator::WriteToString(Writer* writer) { - writer->WriteLine("PrintField(\"$2$\", has$0$, $1$_, writer);", - property_name(), name(), GetFieldName(descriptor_)); +void MessageFieldGenerator::WriteToString(io::Printer* printer) { + variables_["field_name"] = GetFieldName(descriptor_); + printer->Print( + variables_, + "PrintField(\"$field_name$\", has$property_name$, $name$_, writer);\n"); } MessageOneofFieldGenerator::MessageOneofFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal) : MessageFieldGenerator(descriptor, fieldOrdinal) { - has_property_check = oneof_name() + "Case_ == " + oneof_property_name() + - "OneofCase." + property_name(); + SetCommonOneofFieldVariables(&variables_); } MessageOneofFieldGenerator::~MessageOneofFieldGenerator() { } -void MessageOneofFieldGenerator::GenerateMembers(Writer* writer) { +void MessageOneofFieldGenerator::GenerateMembers(io::Printer* printer) { 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(printer); + printer->Print( + variables_, + "public bool Has$property_name$ {\n" + " get { return $has_property_check$; }\n" + "}\n"); } - 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("}"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public $type_name$ $property_name$ {\n" + " get { return $has_property_check$ ? ($type_name$) $oneof_name$_ : $default_value$; }\n" + "}\n"); } -void MessageOneofFieldGenerator::GenerateBuilderMembers(Writer* writer) { +void MessageOneofFieldGenerator::GenerateBuilderMembers(io::Printer* printer) { 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(printer); + printer->Print( + variables_, + "public bool Has$property_name$ {\n" + " get { return result.$has_property_check$; }\n" + "}\n"); } - 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("}"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public $type_name$ $property_name$ {\n" + " get { return result.$has_property_check$ ? ($type_name$) result.$oneof_name$_ : $default_value$; }\n" + " set { Set$property_name$(value); }\n" + "}\n"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public Builder Set$property_name$($type_name$ value) {\n"); + AddNullCheck(printer); + printer->Print( + variables_, + " PrepareBuilder();\n" + " result.$oneof_name$Case_ = $oneof_property_name$OneofCase.$property_name$;\n" + " result.$oneof_name$_ = value;\n" + " return this;\n" + "}\n"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public Builder Set$property_name$($type_name$.Builder builderForValue) {\n"); + AddNullCheck(printer, "builderForValue"); + printer->Print( + variables_, + " PrepareBuilder();\n" + " result.$oneof_name$Case_ = $oneof_property_name$OneofCase.$property_name$;\n" + " result.$oneof_name$_ = builderForValue.Build();\n" + " return this;\n" + "}\n"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public Builder Merge$property_name$($type_name$ value) {\n"); + AddNullCheck(printer); + printer->Print( + variables_, + " PrepareBuilder();\n" + " if (result.$has_property_check$ &&\n" + " result.$property_name$ != $default_value$) {\n" + " result.$oneof_name$_ = $type_name$.CreateBuilder(result.$property_name$).MergeFrom(value).BuildPartial();\n" + " } else {\n" + " result.$oneof_name$_ = value;\n" + " }\n" + " result.$oneof_name$Case_ = $oneof_property_name$OneofCase.$property_name$;\n" + " return this;\n" + "}\n"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public Builder Clear$property_name$() {\n" + " if (result.$has_property_check$) {\n" + " PrepareBuilder();\n" + " result.$oneof_name$Case_ = $oneof_property_name$OneofCase.None;\n" + " result.$oneof_name$_ = null;\n" + " }\n" + " return this;\n" + "}\n"); } -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("}"); +void MessageOneofFieldGenerator::GenerateParsingCode(io::Printer* printer) { + printer->Print( + variables_, + "$type_name$.Builder subBuilder = $type_name$.CreateBuilder();\n" + "if (result.$has_property_check$) {\n" + " subBuilder.MergeFrom($property_name$);\n" + "}\n"); if (descriptor_->type() == FieldDescriptor::TYPE_GROUP) { - writer->WriteLine("input.ReadGroup($0$, subBuilder, extensionRegistry);", - number()); + printer->Print( + variables_, + "input.ReadGroup($number$, subBuilder, extensionRegistry);\n"); } else { - writer->WriteLine("input.ReadMessage(subBuilder, extensionRegistry);"); + printer->Print("input.ReadMessage(subBuilder, extensionRegistry);\n"); } - writer->WriteLine("result.$0$_ = subBuilder.BuildPartial();", oneof_name()); - writer->WriteLine("result.$0$Case_ = $1$OneofCase.$2$;", - oneof_name(), oneof_property_name(), property_name()); + printer->Print( + variables_, + "result.$oneof_name$_ = subBuilder.BuildPartial();\n" + "result.$oneof_name$Case_ = $oneof_property_name$OneofCase.$property_name$;\n"); } -void MessageOneofFieldGenerator::WriteEquals(Writer* writer) { - writer->WriteLine("if (!$0$.Equals(other.$0$)) return false;", property_name()); +void MessageOneofFieldGenerator::WriteEquals(io::Printer* printer) { + printer->Print( + variables_, + "if (!$property_name$.Equals(other.$property_name$)) return false;\n"); } -void MessageOneofFieldGenerator::WriteToString(Writer* writer) { - writer->WriteLine("PrintField(\"$0$\", $1$, $2$_, writer);", - descriptor_->name(), has_property_check, oneof_name()); +void MessageOneofFieldGenerator::WriteToString(io::Printer* printer) { + printer->Print( + variables_, + "PrintField(\"$descriptor_name$\", $has_property_check$, $oneof_name$_, writer);\n"); } } // namespace csharp diff --git a/src/google/protobuf/compiler/csharp/csharp_message_field.h b/src/google/protobuf/compiler/csharp/csharp_message_field.h index d455ade5..d820908c 100644 --- a/src/google/protobuf/compiler/csharp/csharp_message_field.h +++ b/src/google/protobuf/compiler/csharp/csharp_message_field.h @@ -48,20 +48,17 @@ class MessageFieldGenerator : public FieldGeneratorBase { MessageFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal); ~MessageFieldGenerator(); - virtual void GenerateMembers(Writer* writer); - virtual void GenerateBuilderMembers(Writer* writer); - virtual void GenerateMergingCode(Writer* writer); - virtual void GenerateBuildingCode(Writer* writer); - virtual void GenerateParsingCode(Writer* writer); - virtual void GenerateSerializationCode(Writer* writer); - virtual void GenerateSerializedSizeCode(Writer* writer); - - virtual void WriteHash(Writer* writer); - virtual void WriteEquals(Writer* writer); - virtual void WriteToString(Writer* writer); - - protected: - string has_property_check; + virtual void GenerateMembers(io::Printer* printer); + virtual void GenerateBuilderMembers(io::Printer* printer); + virtual void GenerateMergingCode(io::Printer* printer); + virtual void GenerateBuildingCode(io::Printer* printer); + virtual void GenerateParsingCode(io::Printer* printer); + virtual void GenerateSerializationCode(io::Printer* printer); + virtual void GenerateSerializedSizeCode(io::Printer* printer); + + virtual void WriteHash(io::Printer* printer); + virtual void WriteEquals(io::Printer* printer); + virtual void WriteToString(io::Printer* printer); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageFieldGenerator); @@ -72,11 +69,11 @@ class MessageOneofFieldGenerator : public MessageFieldGenerator { MessageOneofFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal); ~MessageOneofFieldGenerator(); - virtual void GenerateMembers(Writer* writer); - virtual void GenerateBuilderMembers(Writer* writer); - virtual void WriteEquals(Writer* writer); - virtual void WriteToString(Writer* writer); - virtual void GenerateParsingCode(Writer* writer); + virtual void GenerateMembers(io::Printer* printer); + virtual void GenerateBuilderMembers(io::Printer* printer); + virtual void WriteEquals(io::Printer* printer); + virtual void WriteToString(io::Printer* printer); + virtual void GenerateParsingCode(io::Printer* printer); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageOneofFieldGenerator); diff --git a/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc b/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc index a54edfe3..652eb6b9 100644 --- a/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc +++ b/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc @@ -40,7 +40,6 @@ #include #include -#include namespace google { namespace protobuf { @@ -50,202 +49,232 @@ namespace csharp { PrimitiveFieldGenerator::PrimitiveFieldGenerator( const FieldDescriptor* descriptor, int fieldOrdinal) : FieldGeneratorBase(descriptor, fieldOrdinal) { - if (SupportFieldPresence(descriptor_->file())) { - has_property_check = "has" + property_name(); - } else { - has_property_check = property_name() + " != " + default_value(); - } } PrimitiveFieldGenerator::~PrimitiveFieldGenerator() { } -void PrimitiveFieldGenerator::GenerateMembers(Writer* writer) { +void PrimitiveFieldGenerator::GenerateMembers(io::Printer* printer) { if (SupportFieldPresence(descriptor_->file())) { - writer->WriteLine("private bool has$0$;", property_name()); + printer->Print(variables_, "private bool has$property_name$;\n"); } - writer->WriteLine("private $0$ $1$_$2$;", type_name(), name(), - has_default_value() ? " = " + default_value() : ""); - AddDeprecatedFlag(writer); + printer->Print( + variables_, + "private $type_name$ $name_def_message$;\n"); + AddDeprecatedFlag(printer); if (SupportFieldPresence(descriptor_->file())) { - writer->WriteLine("public bool Has$0$ {", property_name()); - writer->WriteLine(" get { return has$0$; }", property_name()); - writer->WriteLine("}"); + printer->Print( + variables_, + "public bool Has$property_name$ {\n" + " get { return has$property_name$; }\n" + "}\n"); } - AddPublicMemberAttributes(writer); - writer->WriteLine("public $0$ $1$ {", type_name(), property_name()); - writer->WriteLine(" get { return $0$_; }", name()); - writer->WriteLine("}"); + AddPublicMemberAttributes(printer); + printer->Print( + variables_, + "public $type_name$ $property_name$ {\n" + " get { return $name$_; }\n" + "}\n"); } -void PrimitiveFieldGenerator::GenerateBuilderMembers(Writer* writer) { - AddDeprecatedFlag(writer); +void PrimitiveFieldGenerator::GenerateBuilderMembers(io::Printer* printer) { + AddDeprecatedFlag(printer); if (SupportFieldPresence(descriptor_->file())) { - writer->WriteLine("public bool Has$0$ {", property_name()); - writer->WriteLine(" get { return result.has$0$; }", property_name()); - writer->WriteLine("}"); + printer->Print( + variables_, + "public bool Has$property_name$ {\n" + " get { return result.has$property_name$; }\n" + "}\n"); } - AddPublicMemberAttributes(writer); - writer->WriteLine("public $0$ $1$ {", type_name(), property_name()); - writer->WriteLine(" get { return result.$0$; }", property_name()); - writer->WriteLine(" set { Set$0$(value); }", property_name()); - writer->WriteLine("}"); - AddPublicMemberAttributes(writer); - writer->WriteLine("public Builder Set$0$($1$ value) {", property_name(), - type_name()); - AddNullCheck(writer); - writer->WriteLine(" PrepareBuilder();"); + AddPublicMemberAttributes(printer); + printer->Print( + variables_, + "public $type_name$ $property_name$ {\n" + " get { return result.$property_name$; }\n" + " set { Set$property_name$(value); }\n" + "}\n"); + AddPublicMemberAttributes(printer); + printer->Print( + variables_, + "public Builder Set$property_name$($type_name$ value) {\n"); + AddNullCheck(printer); + printer->Print(" PrepareBuilder();\n"); if (SupportFieldPresence(descriptor_->file())) { - writer->WriteLine(" result.has$0$ = true;", property_name()); + printer->Print( + variables_, + " result.has$property_name$ = true;\n"); } - writer->WriteLine(" result.$0$_ = value;", name()); - writer->WriteLine(" return this;"); - writer->WriteLine("}"); - AddDeprecatedFlag(writer); - writer->WriteLine("public Builder Clear$0$() {", property_name()); - writer->WriteLine(" PrepareBuilder();"); + printer->Print( + variables_, + " result.$name$_ = value;\n" + " return this;\n" + "}\n"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public Builder Clear$property_name$() {\n" + " PrepareBuilder();\n"); if (SupportFieldPresence(descriptor_->file())) { - writer->WriteLine(" result.has$0$ = false;", property_name()); + printer->Print( + variables_, + " result.has$property_name$ = false;\n"); } - writer->WriteLine(" result.$0$_ = $1$;", name(), default_value()); - writer->WriteLine(" return this;"); - writer->WriteLine("}"); + printer->Print( + variables_, + " result.$name$_ = $default_value$;\n" + " return this;\n" + "}\n"); } -void PrimitiveFieldGenerator::GenerateMergingCode(Writer* writer) { - if (SupportFieldPresence(descriptor_->file())) { - writer->WriteLine("if (other.Has$0$) {", property_name()); - } else { - writer->WriteLine("if (other.$0$ != $1$) {", property_name(), default_value()); - } - writer->WriteLine(" $0$ = other.$0$;", property_name()); - writer->WriteLine("}"); +void PrimitiveFieldGenerator::GenerateMergingCode(io::Printer* printer) { + printer->Print( + variables_, + "if ($other_has_property_check$) {\n" + " $property_name$ = other.$property_name$;\n" + "}\n"); } -void PrimitiveFieldGenerator::GenerateBuildingCode(Writer* writer) { +void PrimitiveFieldGenerator::GenerateBuildingCode(io::Printer* printer) { // Nothing to do here for primitive types } -void PrimitiveFieldGenerator::GenerateParsingCode(Writer* writer) { +void PrimitiveFieldGenerator::GenerateParsingCode(io::Printer* printer) { if (SupportFieldPresence(descriptor_->file())) { - writer->WriteLine("result.has$0$ = input.Read$1$(ref result.$2$_);", - property_name(), capitalized_type_name(), name()); + printer->Print( + variables_, + "result.has$property_name$ = input.Read$capitalized_type_name$(ref result.$name$_);\n"); } else { - writer->WriteLine("input.Read$0$(ref result.$1$_);", - capitalized_type_name(), name()); + printer->Print( + variables_, + "input.Read$capitalized_type_name$(ref result.$name$_);\n"); } } -void PrimitiveFieldGenerator::GenerateSerializationCode(Writer* writer) { - writer->WriteLine("if ($0$) {", has_property_check); - writer->WriteLine(" output.Write$0$($1$, field_names[$3$], $2$);", - capitalized_type_name(), number(), property_name(), - field_ordinal()); - writer->WriteLine("}"); +void PrimitiveFieldGenerator::GenerateSerializationCode(io::Printer* printer) { + printer->Print( + variables_, + "if ($has_property_check$) {\n" + " output.Write$capitalized_type_name$($number$, field_names[$field_ordinal$], $property_name$);\n" + "}\n"); } -void PrimitiveFieldGenerator::GenerateSerializedSizeCode(Writer* writer) { - writer->WriteLine("if ($0$) {", has_property_check); - writer->WriteLine(" size += pb::CodedOutputStream.Compute$0$Size($1$, $2$);", - capitalized_type_name(), number(), property_name()); - writer->WriteLine("}"); +void PrimitiveFieldGenerator::GenerateSerializedSizeCode(io::Printer* printer) { + printer->Print( + variables_, + "if ($has_property_check$) {\n" + " size += pb::CodedOutputStream.Compute$capitalized_type_name$Size($number$, $property_name$);\n" + "}\n"); } -void PrimitiveFieldGenerator::WriteHash(Writer* writer) { - writer->WriteLine("if ($0$) {", has_property_check); - writer->WriteLine(" hash ^= $0$_.GetHashCode();", name()); - writer->WriteLine("}"); +void PrimitiveFieldGenerator::WriteHash(io::Printer* printer) { + printer->Print( + variables_, + "if ($has_property_check$) {\n" + " hash ^= $name$_.GetHashCode();\n" + "}\n"); } -void PrimitiveFieldGenerator::WriteEquals(Writer* writer) { +void PrimitiveFieldGenerator::WriteEquals(io::Printer* printer) { if (SupportFieldPresence(descriptor_->file())) { - writer->WriteLine( - "if (has$0$ != other.has$0$ || (has$0$ && !$1$_.Equals(other.$1$_))) return false;", - property_name(), name()); + printer->Print( + variables_, + "if (has$property_name$ != other.has$property_name$ || (has$property_name$ && !$name$_.Equals(other.$name$_))) return false;\n"); } else { - writer->WriteLine( - "if (!$0$_.Equals(other.$0$_)) return false;", name()); + printer->Print( + variables_, + "if (!$name$_.Equals(other.$name$_)) return false;\n"); } } -void PrimitiveFieldGenerator::WriteToString(Writer* writer) { - writer->WriteLine("PrintField(\"$0$\", $1$, $2$_, writer);", - descriptor_->name(), has_property_check, name()); +void PrimitiveFieldGenerator::WriteToString(io::Printer* printer) { + printer->Print( + variables_, + "PrintField(\"$descriptor_name$\", $has_property_check$, $name$_, writer);\n"); } PrimitiveOneofFieldGenerator::PrimitiveOneofFieldGenerator( const FieldDescriptor* descriptor, int fieldOrdinal) : PrimitiveFieldGenerator(descriptor, fieldOrdinal) { - has_property_check = oneof_name() + "Case_ == " + oneof_property_name() + - "OneofCase." + property_name(); + SetCommonOneofFieldVariables(&variables_); } PrimitiveOneofFieldGenerator::~PrimitiveOneofFieldGenerator() { } -void PrimitiveOneofFieldGenerator::GenerateMembers(Writer* writer) { - AddDeprecatedFlag(writer); +void PrimitiveOneofFieldGenerator::GenerateMembers(io::Printer* printer) { + AddDeprecatedFlag(printer); if (SupportFieldPresence(descriptor_->file())) { - writer->WriteLine("public bool Has$0$ {", property_name()); - writer->WriteLine(" get { return $0$; }", has_property_check); - writer->WriteLine("}"); + printer->Print( + variables_, + "public bool Has$property_name$ {\n" + " get { return $has_property_check$; }\n" + "}\n"); } - AddPublicMemberAttributes(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("}"); + AddPublicMemberAttributes(printer); + printer->Print( + variables_, + "public $type_name$ $property_name$ {\n" + " get { return $has_property_check$ ? ($type_name$) $oneof_name$_ : $default_value$; }\n" + "}\n"); } -void PrimitiveOneofFieldGenerator::GenerateBuilderMembers(Writer* writer) { - AddDeprecatedFlag(writer); +void PrimitiveOneofFieldGenerator::GenerateBuilderMembers(io::Printer* printer) { + AddDeprecatedFlag(printer); if (SupportFieldPresence(descriptor_->file())) { - writer->WriteLine("public bool Has$0$ {", property_name()); - writer->WriteLine(" get { return result.$0$; }", has_property_check); - writer->WriteLine("}"); + printer->Print( + variables_, + "public bool Has$property_name$ {\n" + " get { return result.$has_property_check$; }\n" + "}\n"); } - AddPublicMemberAttributes(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("}"); - AddPublicMemberAttributes(writer); - writer->WriteLine("public Builder Set$0$($1$ value) {", property_name(), - type_name()); - AddNullCheck(writer); - writer->WriteLine(" PrepareBuilder();"); - writer->WriteLine(" result.$0$_ = value;", oneof_name()); - 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(" PrepareBuilder();"); - writer->WriteLine(" if (result.$0$) {", has_property_check); - writer->WriteLine(" result.$0$Case_ = $1$OneofCase.None;", - oneof_name(), oneof_property_name()); - writer->WriteLine(" }"); - writer->WriteLine(" return this;"); - writer->WriteLine("}"); -} - -void PrimitiveOneofFieldGenerator::WriteEquals(Writer* writer) { - writer->WriteLine("if (!$0$.Equals(other.$0$)) return false;", property_name()); -} -void PrimitiveOneofFieldGenerator::WriteToString(Writer* writer) { - writer->WriteLine("PrintField(\"$0$\", $1$, $2$_, writer);", - descriptor_->name(), has_property_check, oneof_name()); -} - -void PrimitiveOneofFieldGenerator::GenerateParsingCode(Writer* writer) { - writer->WriteLine("$0$ value = $1$;", type_name(), default_value()); - writer->WriteLine("if (input.Read$0$(ref value)) {", - capitalized_type_name()); - writer->WriteLine(" result.$0$_ = value;", oneof_name()); - writer->WriteLine(" result.$0$Case_ = $1$OneofCase.$2$;", - oneof_name(), oneof_property_name(), property_name()); - writer->WriteLine("}"); + AddPublicMemberAttributes(printer); + printer->Print( + variables_, + "public $type_name$ $property_name$ {\n" + " get { return result.$has_property_check$ ? ($type_name$) result.$oneof_name$_ : $default_value$; }\n" + " set { Set$property_name$(value); }\n" + "}\n"); + AddPublicMemberAttributes(printer); + printer->Print( + variables_, + "public Builder Set$property_name$($type_name$ value) {\n"); + AddNullCheck(printer); + printer->Print( + variables_, + " PrepareBuilder();\n" + " result.$oneof_name$_ = value;\n" + " result.$oneof_name$Case_ = $oneof_property_name$OneofCase.$property_name$;\n" + " return this;\n" + "}\n"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public Builder Clear$property_name$() {\n" + " PrepareBuilder();\n" + " if (result.$has_property_check$) {\n" + " result.$oneof_name$Case_ = $oneof_property_name$OneofCase.None;\n" + " }\n" + " return this;\n" + "}\n"); +} + +void PrimitiveOneofFieldGenerator::WriteEquals(io::Printer* printer) { + printer->Print( + variables_, + "if (!$property_name$.Equals(other.$property_name$)) return false;\n"); +} +void PrimitiveOneofFieldGenerator::WriteToString(io::Printer* printer) { + printer->Print(variables_, + "PrintField(\"$descriptor_name$\", $has_property_check$, $oneof_name$_, writer);\n"); +} + +void PrimitiveOneofFieldGenerator::GenerateParsingCode(io::Printer* printer) { + printer->Print( + variables_, + "$type_name$ value = $default_value$;\n" + "if (input.Read$capitalized_type_name$(ref value)) {\n" + " result.$oneof_name$_ = value;\n" + " result.$oneof_name$Case_ = $oneof_property_name$OneofCase.$property_name$;\n" + "}\n"); } } // namespace csharp diff --git a/src/google/protobuf/compiler/csharp/csharp_primitive_field.h b/src/google/protobuf/compiler/csharp/csharp_primitive_field.h index ecc6ed91..8a2d5020 100644 --- a/src/google/protobuf/compiler/csharp/csharp_primitive_field.h +++ b/src/google/protobuf/compiler/csharp/csharp_primitive_field.h @@ -48,20 +48,17 @@ class PrimitiveFieldGenerator : public FieldGeneratorBase { PrimitiveFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal); ~PrimitiveFieldGenerator(); - virtual void GenerateMembers(Writer* writer); - virtual void GenerateBuilderMembers(Writer* writer); - virtual void GenerateMergingCode(Writer* writer); - virtual void GenerateBuildingCode(Writer* writer); - virtual void GenerateParsingCode(Writer* writer); - virtual void GenerateSerializationCode(Writer* writer); - virtual void GenerateSerializedSizeCode(Writer* writer); - - virtual void WriteHash(Writer* writer); - virtual void WriteEquals(Writer* writer); - virtual void WriteToString(Writer* writer); - - protected: - string has_property_check; + virtual void GenerateMembers(io::Printer* printer); + virtual void GenerateBuilderMembers(io::Printer* printer); + virtual void GenerateMergingCode(io::Printer* printer); + virtual void GenerateBuildingCode(io::Printer* printer); + virtual void GenerateParsingCode(io::Printer* printer); + virtual void GenerateSerializationCode(io::Printer* printer); + virtual void GenerateSerializedSizeCode(io::Printer* printer); + + virtual void WriteHash(io::Printer* printer); + virtual void WriteEquals(io::Printer* printer); + virtual void WriteToString(io::Printer* printer); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(PrimitiveFieldGenerator); @@ -72,11 +69,11 @@ class PrimitiveOneofFieldGenerator : public PrimitiveFieldGenerator { PrimitiveOneofFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal); ~PrimitiveOneofFieldGenerator(); - virtual void GenerateMembers(Writer* writer); - virtual void GenerateBuilderMembers(Writer* writer); - virtual void WriteEquals(Writer* writer); - virtual void WriteToString(Writer* writer); - virtual void GenerateParsingCode(Writer* writer); + virtual void GenerateMembers(io::Printer* printer); + virtual void GenerateBuilderMembers(io::Printer* printer); + virtual void WriteEquals(io::Printer* printer); + virtual void WriteToString(io::Printer* printer); + virtual void GenerateParsingCode(io::Printer* printer); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(PrimitiveOneofFieldGenerator); diff --git a/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc b/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc index cc8745ae..f5ebcfb1 100644 --- a/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc +++ b/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc @@ -40,7 +40,6 @@ #include #include -#include namespace google { namespace protobuf { @@ -56,168 +55,193 @@ RepeatedEnumFieldGenerator::~RepeatedEnumFieldGenerator() { } -void RepeatedEnumFieldGenerator::GenerateMembers(Writer* writer) { +void RepeatedEnumFieldGenerator::GenerateMembers(io::Printer* printer) { if (descriptor_->is_packed() && optimize_speed()) { - writer->WriteLine("private int $0$MemoizedSerializedSize;", name()); + printer->Print(variables_, "private int $name$MemoizedSerializedSize;\n"); } - writer->WriteLine( - "private pbc::PopsicleList<$0$> $1$_ = new pbc::PopsicleList<$0$>();", - type_name(), name()); - AddDeprecatedFlag(writer); - writer->WriteLine("public scg::IList<$0$> $1$List {", type_name(), - property_name()); - writer->WriteLine(" get { return pbc::Lists.AsReadOnly($0$_); }", name()); - writer->WriteLine("}"); + printer->Print(variables_, + "private pbc::PopsicleList<$type_name$> $name$_ = new pbc::PopsicleList<$type_name$>();\n"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public scg::IList<$type_name$> $property_name$List {\n" + " get { return pbc::Lists.AsReadOnly($name$_); }\n" + "}\n"); // TODO(jonskeet): Redundant API calls? Possibly - include for portability though. Maybe create an option. - AddDeprecatedFlag(writer); - writer->WriteLine("public int $0$Count {", property_name()); - writer->WriteLine(" get { return $0$_.Count; }", name()); - writer->WriteLine("}"); - - AddDeprecatedFlag(writer); - writer->WriteLine("public $0$ Get$1$(int index) {", type_name(), - property_name()); - writer->WriteLine(" return $0$_[index];", name()); - writer->WriteLine("}"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public int $property_name$Count {\n" + " get { return $name$_.Count; }\n" + "}\n"); + + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public $type_name$ Get$property_name$(int index) {\n" + " return $name$_[index];\n" + "}\n"); } -void RepeatedEnumFieldGenerator::GenerateBuilderMembers(Writer* writer) { +void RepeatedEnumFieldGenerator::GenerateBuilderMembers(io::Printer* printer) { // Note: We can return the original list here, because we make it unmodifiable when we build // We return it via IPopsicleList so that collection initializers work more pleasantly. - AddDeprecatedFlag(writer); - writer->WriteLine("public pbc::IPopsicleList<$0$> $1$List {", type_name(), - property_name()); - writer->WriteLine(" get { return PrepareBuilder().$0$_; }", name()); - writer->WriteLine("}"); - AddDeprecatedFlag(writer); - writer->WriteLine("public int $0$Count {", property_name()); - writer->WriteLine(" get { return result.$0$Count; }", property_name()); - writer->WriteLine("}"); - AddDeprecatedFlag(writer); - writer->WriteLine("public $0$ Get$1$(int index) {", type_name(), - property_name()); - writer->WriteLine(" return result.Get$0$(index);", property_name()); - writer->WriteLine("}"); - AddDeprecatedFlag(writer); - writer->WriteLine("public Builder Set$0$(int index, $1$ value) {", - property_name(), type_name()); - writer->WriteLine(" PrepareBuilder();"); - writer->WriteLine(" result.$0$_[index] = value;", name()); - writer->WriteLine(" return this;"); - writer->WriteLine("}"); - AddDeprecatedFlag(writer); - writer->WriteLine("public Builder Add$0$($1$ value) {", property_name(), - type_name()); - writer->WriteLine(" PrepareBuilder();"); - writer->WriteLine(" result.$0$_.Add(value);", name(), type_name()); - writer->WriteLine(" return this;"); - writer->WriteLine("}"); - AddDeprecatedFlag(writer); - writer->WriteLine( - "public Builder AddRange$0$(scg::IEnumerable<$1$> values) {", - property_name(), type_name()); - writer->WriteLine(" PrepareBuilder();"); - writer->WriteLine(" result.$0$_.Add(values);", name()); - writer->WriteLine(" return this;"); - writer->WriteLine("}"); - AddDeprecatedFlag(writer); - writer->WriteLine("public Builder Clear$0$() {", property_name()); - writer->WriteLine(" PrepareBuilder();"); - writer->WriteLine(" result.$0$_.Clear();", name()); - writer->WriteLine(" return this;"); - writer->WriteLine("}"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public pbc::IPopsicleList<$type_name$> $property_name$List {\n" + " get { return PrepareBuilder().$name$_; }\n" + "}\n"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public int $property_name$Count {\n" + " get { return result.$property_name$Count; }\n" + "}\n"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public $type_name$ Get$property_name$(int index) {\n" + " return result.Get$property_name$(index);\n" + "}\n"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public Builder Set$property_name$(int index, $type_name$ value) {\n"); + printer->Print( + variables_, + " PrepareBuilder();\n" + " result.$name$_[index] = value;\n" + " return this;\n" + "}\n"); + AddDeprecatedFlag(printer); + printer->Print(variables_, + "public Builder Add$property_name$($type_name$ value) {\n"); + printer->Print( + variables_, + " PrepareBuilder();\n" + " result.$name$_.Add(value);\n" + " return this;\n" + "}\n"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public Builder AddRange$property_name$(scg::IEnumerable<$type_name$> values) {\n" + " PrepareBuilder();\n" + " result.$name$_.Add(values);\n" + " return this;\n" + "}\n"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public Builder Clear$property_name$() {\n" + " PrepareBuilder();\n" + " result.$name$_.Clear();\n" + " return this;\n" + "}\n"); } -void RepeatedEnumFieldGenerator::GenerateMergingCode(Writer* writer) { - writer->WriteLine("if (other.$0$_.Count != 0) {", name()); - writer->WriteLine(" result.$0$_.Add(other.$0$_);", name()); - writer->WriteLine("}"); +void RepeatedEnumFieldGenerator::GenerateMergingCode(io::Printer* printer) { + printer->Print( + variables_, + "if (other.$name$_.Count != 0) {\n" + " result.$name$_.Add(other.$name$_);\n" + "}\n"); } -void RepeatedEnumFieldGenerator::GenerateBuildingCode(Writer* writer) { - writer->WriteLine("$0$_.MakeReadOnly();", name()); +void RepeatedEnumFieldGenerator::GenerateBuildingCode(io::Printer* printer) { + printer->Print(variables_, "$name$_.MakeReadOnly();\n"); } -void RepeatedEnumFieldGenerator::GenerateParsingCode(Writer* writer) { - writer->WriteLine("scg::ICollection unknownItems;"); - writer->WriteLine( - "input.ReadEnumArray<$0$>(tag, field_name, result.$1$_, out unknownItems);", - type_name(), name()); +void RepeatedEnumFieldGenerator::GenerateParsingCode(io::Printer* printer) { + printer->Print( + variables_, + "scg::ICollection unknownItems;\n" + "input.ReadEnumArray<$type_name$>(tag, field_name, result.$name$_, out unknownItems);\n"); if (!use_lite_runtime()) { - writer->WriteLine("if (unknownItems != null) {"); - writer->WriteLine(" if (unknownFields == null) {"); - writer->WriteLine( - " unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);"); - writer->WriteLine(" }"); - writer->WriteLine(" foreach (object rawValue in unknownItems)"); - writer->WriteLine(" if (rawValue is int)"); - writer->WriteLine( - " unknownFields.MergeVarintField($0$, (ulong)(int)rawValue);", - number()); - writer->WriteLine("}"); + printer->Print( + variables_, + "if (unknownItems != null) {\n" + " if (unknownFields == null) {\n" + " unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);\n" + " }\n" + " foreach (object rawValue in unknownItems)\n" + " if (rawValue is int)\n" + " unknownFields.MergeVarintField($number$, (ulong)(int)rawValue);\n" + "}\n"); } } -void RepeatedEnumFieldGenerator::GenerateSerializationCode(Writer* writer) { - writer->WriteLine("if ($0$_.Count > 0) {", name()); - writer->Indent(); +void RepeatedEnumFieldGenerator::GenerateSerializationCode(io::Printer* printer) { + printer->Print(variables_, "if ($name$_.Count > 0) {\n"); + printer->Indent(); if (descriptor_->is_packed()) { - writer->WriteLine( - "output.WritePackedEnumArray($0$, field_names[$2$], $1$MemoizedSerializedSize, $1$_);", - number(), name(), field_ordinal()); + printer->Print( + variables_, + "output.WritePackedEnumArray($number$, field_names[$field_ordinal$], $name$MemoizedSerializedSize, $name$_);\n"); } else { - writer->WriteLine("output.WriteEnumArray($0$, field_names[$2$], $1$_);", - number(), name(), field_ordinal()); + printer->Print(variables_, + "output.WriteEnumArray($number$, field_names[$field_ordinal$], $name$_);\n"); } - writer->Outdent(); - writer->WriteLine("}"); + printer->Outdent(); + printer->Print("}\n"); } -void RepeatedEnumFieldGenerator::GenerateSerializedSizeCode(Writer* writer) { - writer->WriteLine("{"); - writer->Indent(); - writer->WriteLine("int dataSize = 0;"); - writer->WriteLine("if ($0$_.Count > 0) {", name()); - writer->Indent(); - writer->WriteLine("foreach ($0$ element in $1$_) {", type_name(), name()); - writer->WriteLine( - " dataSize += pb::CodedOutputStream.ComputeEnumSizeNoTag((int) element);"); - writer->WriteLine("}"); - writer->WriteLine("size += dataSize;"); +void RepeatedEnumFieldGenerator::GenerateSerializedSizeCode(io::Printer* printer) { + printer->Print("{\n"); + printer->Indent(); + printer->Print( + variables_, + "int dataSize = 0;\n" + "if ($name$_.Count > 0) {\n"); + printer->Indent(); + printer->Print( + variables_, + "foreach ($type_name$ element in $name$_) {\n" + " dataSize += pb::CodedOutputStream.ComputeEnumSizeNoTag((int) element);\n" + "}\n" + "size += dataSize;\n"); int tagSize = internal::WireFormat::TagSize(descriptor_->number(), descriptor_->type()); if (descriptor_->is_packed()) { - writer->WriteLine("size += $0$;", SimpleItoa(tagSize)); - writer->WriteLine( - "size += pb::CodedOutputStream.ComputeRawVarint32Size((uint) dataSize);"); + printer->Print( + "size += $tag_size$;\n" + "size += pb::CodedOutputStream.ComputeRawVarint32Size((uint) dataSize);\n", + "tag_size", SimpleItoa(tagSize)); } else { - writer->WriteLine("size += $0$ * $1$_.Count;", SimpleItoa(tagSize), name()); + printer->Print( + "size += $tag_size$ * $name$_.Count;\n", + "tag_size", SimpleItoa(tagSize), "name", name()); } - writer->Outdent(); - writer->WriteLine("}"); + printer->Outdent(); + printer->Print("}\n"); // cache the data size for packed fields. if (descriptor_->is_packed()) { - writer->WriteLine("$0$MemoizedSerializedSize = dataSize;", name()); + printer->Print(variables_, + "$name$MemoizedSerializedSize = dataSize;\n"); } - writer->Outdent(); - writer->WriteLine("}"); + printer->Outdent(); + printer->Print("}\n"); } -void RepeatedEnumFieldGenerator::WriteHash(Writer* writer) { - writer->WriteLine("foreach($0$ i in $1$_)", type_name(), name()); - writer->WriteLine(" hash ^= i.GetHashCode();"); +void RepeatedEnumFieldGenerator::WriteHash(io::Printer* printer) { + printer->Print( + variables_, + "foreach($type_name$ i in $name$_)\n" + " hash ^= i.GetHashCode();\n"); } -void RepeatedEnumFieldGenerator::WriteEquals(Writer* writer) { - writer->WriteLine("if($0$_.Count != other.$0$_.Count) return false;", name()); - writer->WriteLine("for(int ix=0; ix < $0$_.Count; ix++)", name()); - writer->WriteLine(" if(!$0$_[ix].Equals(other.$0$_[ix])) return false;", - name()); +void RepeatedEnumFieldGenerator::WriteEquals(io::Printer* printer) { + printer->Print( + variables_, + "if($name$_.Count != other.$name$_.Count) return false;\n" + "for(int ix=0; ix < $name$_.Count; ix++)\n" + " if(!$name$_[ix].Equals(other.$name$_[ix])) return false;\n"); } -void RepeatedEnumFieldGenerator::WriteToString(Writer* writer) { - writer->WriteLine("PrintField(\"$0$\", $1$_, writer);", descriptor_->name(), - name()); +void RepeatedEnumFieldGenerator::WriteToString(io::Printer* printer) { + printer->Print(variables_, + "PrintField(\"$descriptor_name$\", $name$_, writer);\n"); } } // namespace csharp diff --git a/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.h b/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.h index c872131c..68c3d6c9 100644 --- a/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.h +++ b/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.h @@ -48,17 +48,17 @@ class RepeatedEnumFieldGenerator : public FieldGeneratorBase { RepeatedEnumFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal); ~RepeatedEnumFieldGenerator(); - virtual void GenerateMembers(Writer* writer); - virtual void GenerateBuilderMembers(Writer* writer); - virtual void GenerateMergingCode(Writer* writer); - virtual void GenerateBuildingCode(Writer* writer); - virtual void GenerateParsingCode(Writer* writer); - virtual void GenerateSerializationCode(Writer* writer); - virtual void GenerateSerializedSizeCode(Writer* writer); + virtual void GenerateMembers(io::Printer* printer); + virtual void GenerateBuilderMembers(io::Printer* printer); + virtual void GenerateMergingCode(io::Printer* printer); + virtual void GenerateBuildingCode(io::Printer* printer); + virtual void GenerateParsingCode(io::Printer* printer); + virtual void GenerateSerializationCode(io::Printer* printer); + virtual void GenerateSerializedSizeCode(io::Printer* printer); - virtual void WriteHash(Writer* writer); - virtual void WriteEquals(Writer* writer); - virtual void WriteToString(Writer* writer); + virtual void WriteHash(io::Printer* printer); + virtual void WriteEquals(io::Printer* printer); + virtual void WriteToString(io::Printer* printer); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedEnumFieldGenerator); diff --git a/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc b/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc index 2dfcd402..2ae1d579 100644 --- a/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc +++ b/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc @@ -39,7 +39,6 @@ #include #include -#include namespace google { namespace protobuf { @@ -49,150 +48,177 @@ namespace csharp { RepeatedMessageFieldGenerator::RepeatedMessageFieldGenerator( const FieldDescriptor* descriptor, int fieldOrdinal) : FieldGeneratorBase(descriptor, fieldOrdinal) { + variables_["message_or_group"] = message_or_group(); } RepeatedMessageFieldGenerator::~RepeatedMessageFieldGenerator() { } -void RepeatedMessageFieldGenerator::GenerateMembers(Writer* writer) { - writer->WriteLine( - "private pbc::PopsicleList<$0$> $1$_ = new pbc::PopsicleList<$0$>();", - type_name(), name()); - AddDeprecatedFlag(writer); - writer->WriteLine("public scg::IList<$0$> $1$List {", type_name(), - property_name()); - writer->WriteLine(" get { return $0$_; }", name()); - writer->WriteLine("}"); +void RepeatedMessageFieldGenerator::GenerateMembers(io::Printer* printer) { + printer->Print( + variables_, + "private pbc::PopsicleList<$type_name$> $name$_ = new pbc::PopsicleList<$type_name$>();\n"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public scg::IList<$type_name$> $property_name$List {\n" + " get { return $name$_; }\n" + "}\n"); // TODO(jonskeet): Redundant API calls? Possibly - include for portability though. Maybe create an option. - AddDeprecatedFlag(writer); - writer->WriteLine("public int $0$Count {", property_name()); - writer->WriteLine(" get { return $0$_.Count; }", name()); - writer->WriteLine("}"); - - AddDeprecatedFlag(writer); - writer->WriteLine("public $0$ Get$1$(int index) {", type_name(), - property_name()); - writer->WriteLine(" return $0$_[index];", name()); - writer->WriteLine("}"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public int $property_name$Count {\n" + " get { return $name$_.Count; }\n" + "}\n"); + + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public $type_name$ Get$property_name$(int index) {\n" + " return $name$_[index];\n" + "}\n"); } -void RepeatedMessageFieldGenerator::GenerateBuilderMembers(Writer* writer) { +void RepeatedMessageFieldGenerator::GenerateBuilderMembers(io::Printer* printer) { // Note: We can return the original list here, because we make it unmodifiable when we build // We return it via IPopsicleList so that collection initializers work more pleasantly. - AddDeprecatedFlag(writer); - writer->WriteLine("public pbc::IPopsicleList<$0$> $1$List {", type_name(), - property_name()); - writer->WriteLine(" get { return PrepareBuilder().$0$_; }", name()); - writer->WriteLine("}"); - AddDeprecatedFlag(writer); - writer->WriteLine("public int $0$Count {", property_name()); - writer->WriteLine(" get { return result.$0$Count; }", property_name()); - writer->WriteLine("}"); - AddDeprecatedFlag(writer); - writer->WriteLine("public $0$ Get$1$(int index) {", type_name(), - property_name()); - writer->WriteLine(" return result.Get$0$(index);", property_name()); - writer->WriteLine("}"); - AddDeprecatedFlag(writer); - writer->WriteLine("public Builder Set$0$(int index, $1$ value) {", - property_name(), type_name()); - AddNullCheck(writer); - writer->WriteLine(" PrepareBuilder();"); - writer->WriteLine(" result.$0$_[index] = value;", name()); - writer->WriteLine(" return this;"); - writer->WriteLine("}"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public pbc::IPopsicleList<$type_name$> $property_name$List {\n" + " get { return PrepareBuilder().$name$_; }\n" + "}\n"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public int $property_name$Count {\n" + " get { return result.$property_name$Count; }\n" + "}\n"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public $type_name$ Get$property_name$(int index) {\n" + " return result.Get$property_name$(index);\n" + "}\n"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public Builder Set$property_name$(int index, $type_name$ value) {\n"); + AddNullCheck(printer); + printer->Print( + variables_, + " PrepareBuilder();\n" + " result.$name$_[index] = value;\n" + " return this;\n" + "}\n"); // Extra overload for builder (just on messages) - AddDeprecatedFlag(writer); - writer->WriteLine( - "public Builder Set$0$(int index, $1$.Builder builderForValue) {", - property_name(), type_name()); - AddNullCheck(writer, "builderForValue"); - writer->WriteLine(" PrepareBuilder();"); - writer->WriteLine(" result.$0$_[index] = builderForValue.Build();", name()); - writer->WriteLine(" return this;"); - writer->WriteLine("}"); - AddDeprecatedFlag(writer); - writer->WriteLine("public Builder Add$0$($1$ value) {", property_name(), - type_name()); - AddNullCheck(writer); - writer->WriteLine(" PrepareBuilder();"); - writer->WriteLine(" result.$0$_.Add(value);", name(), type_name()); - writer->WriteLine(" return this;"); - writer->WriteLine("}"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public Builder Set$property_name$(int index, $type_name$.Builder builderForValue) {\n"); + AddNullCheck(printer, "builderForValue"); + printer->Print( + variables_, + " PrepareBuilder();\n" + " result.$name$_[index] = builderForValue.Build();\n" + " return this;\n" + "}\n"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public Builder Add$property_name$($type_name$ value) {\n"); + AddNullCheck(printer); + printer->Print( + variables_, + " PrepareBuilder();\n" + " result.$name$_.Add(value);\n" + " return this;\n" + "}\n"); // Extra overload for builder (just on messages) - AddDeprecatedFlag(writer); - writer->WriteLine("public Builder Add$0$($1$.Builder builderForValue) {", - property_name(), type_name()); - AddNullCheck(writer, "builderForValue"); - writer->WriteLine(" PrepareBuilder();"); - writer->WriteLine(" result.$0$_.Add(builderForValue.Build());", name()); - writer->WriteLine(" return this;"); - writer->WriteLine("}"); - AddDeprecatedFlag(writer); - writer->WriteLine( - "public Builder AddRange$0$(scg::IEnumerable<$1$> values) {", - property_name(), type_name()); - writer->WriteLine(" PrepareBuilder();"); - writer->WriteLine(" result.$0$_.Add(values);", name()); - writer->WriteLine(" return this;"); - writer->WriteLine("}"); - AddDeprecatedFlag(writer); - writer->WriteLine("public Builder Clear$0$() {", property_name()); - writer->WriteLine(" PrepareBuilder();"); - writer->WriteLine(" result.$0$_.Clear();", name()); - writer->WriteLine(" return this;"); - writer->WriteLine("}"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public Builder Add$property_name$($type_name$.Builder builderForValue) {\n"); + AddNullCheck(printer, "builderForValue"); + printer->Print( + variables_, + " PrepareBuilder();\n" + " result.$name$_.Add(builderForValue.Build());\n" + " return this;\n" + "}\n"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public Builder AddRange$property_name$(scg::IEnumerable<$type_name$> values) {\n" + " PrepareBuilder();\n" + " result.$name$_.Add(values);\n" + " return this;\n" + "}\n"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public Builder Clear$property_name$() {\n" + " PrepareBuilder();\n" + " result.$name$_.Clear();\n" + " return this;\n" + "}\n"); } -void RepeatedMessageFieldGenerator::GenerateMergingCode(Writer* writer) { - writer->WriteLine("if (other.$0$_.Count != 0) {", name()); - writer->WriteLine(" result.$0$_.Add(other.$0$_);", name()); - writer->WriteLine("}"); +void RepeatedMessageFieldGenerator::GenerateMergingCode(io::Printer* printer) { + printer->Print( + variables_, + "if (other.$name$_.Count != 0) {\n" + " result.$name$_.Add(other.$name$_);\n" + "}\n"); } -void RepeatedMessageFieldGenerator::GenerateBuildingCode(Writer* writer) { - writer->WriteLine("$0$_.MakeReadOnly();", name()); +void RepeatedMessageFieldGenerator::GenerateBuildingCode(io::Printer* printer) { + printer->Print(variables_, "$name$_.MakeReadOnly();\n"); } -void RepeatedMessageFieldGenerator::GenerateParsingCode(Writer* writer) { - writer->WriteLine( - "input.Read$0$Array(tag, field_name, result.$1$_, $2$.DefaultInstance, extensionRegistry);", - message_or_group(), name(), type_name()); +void RepeatedMessageFieldGenerator::GenerateParsingCode(io::Printer* printer) { + printer->Print( + variables_, + "input.Read$message_or_group$Array(tag, field_name, result.$name$_, $type_name$.DefaultInstance, extensionRegistry);\n"); } -void RepeatedMessageFieldGenerator::GenerateSerializationCode(Writer* writer) { - writer->WriteLine("if ($0$_.Count > 0) {", name()); - writer->Indent(); - writer->WriteLine("output.Write$0$Array($1$, field_names[$3$], $2$_);", - message_or_group(), number(), name(), field_ordinal()); - writer->Outdent(); - writer->WriteLine("}"); +void RepeatedMessageFieldGenerator::GenerateSerializationCode(io::Printer* printer) { + printer->Print( + variables_, + "if ($name$_.Count > 0) {\n" + " output.Write$message_or_group$Array($number$, field_names[$field_ordinal$], $name$_);\n" + "}\n"); } -void RepeatedMessageFieldGenerator::GenerateSerializedSizeCode(Writer* writer) { - writer->WriteLine("foreach ($0$ element in $1$List) {", type_name(), - property_name()); - writer->WriteLine( - " size += pb::CodedOutputStream.Compute$0$Size($1$, element);", - message_or_group(), number()); - writer->WriteLine("}"); +void RepeatedMessageFieldGenerator::GenerateSerializedSizeCode(io::Printer* printer) { + printer->Print( + variables_, + "foreach ($type_name$ element in $property_name$List) {\n" + " size += pb::CodedOutputStream.Compute$message_or_group$Size($number$, element);\n" + "}\n"); } -void RepeatedMessageFieldGenerator::WriteHash(Writer* writer) { - writer->WriteLine("foreach($0$ i in $1$_)", type_name(), name()); - writer->WriteLine(" hash ^= i.GetHashCode();"); +void RepeatedMessageFieldGenerator::WriteHash(io::Printer* printer) { + printer->Print( + variables_, + "foreach($type_name$ i in $name$_)\n" + " hash ^= i.GetHashCode();\n"); } -void RepeatedMessageFieldGenerator::WriteEquals(Writer* writer) { - writer->WriteLine("if($0$_.Count != other.$0$_.Count) return false;", name()); - writer->WriteLine("for(int ix=0; ix < $0$_.Count; ix++)", name()); - writer->WriteLine(" if(!$0$_[ix].Equals(other.$0$_[ix])) return false;", - name()); +void RepeatedMessageFieldGenerator::WriteEquals(io::Printer* printer) { + printer->Print( + variables_, + "if($name$_.Count != other.$name$_.Count) return false;\n" + "for(int ix=0; ix < $name$_.Count; ix++)\n" + " if(!$name$_[ix].Equals(other.$name$_[ix])) return false;\n"); } -void RepeatedMessageFieldGenerator::WriteToString(Writer* writer) { - writer->WriteLine("PrintField(\"$0$\", $1$_, writer);", - GetFieldName(descriptor_), name()); +void RepeatedMessageFieldGenerator::WriteToString(io::Printer* printer) { + variables_["field_name"] = GetFieldName(descriptor_); + printer->Print( + variables_, + "PrintField(\"$field_name$\", $name$_, writer);\n"); } } // namespace csharp diff --git a/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.h b/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.h index 104274cb..9db76939 100644 --- a/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.h +++ b/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.h @@ -48,17 +48,17 @@ class RepeatedMessageFieldGenerator : public FieldGeneratorBase { RepeatedMessageFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal); ~RepeatedMessageFieldGenerator(); - virtual void GenerateMembers(Writer* writer); - virtual void GenerateBuilderMembers(Writer* writer); - virtual void GenerateMergingCode(Writer* writer); - virtual void GenerateBuildingCode(Writer* writer); - virtual void GenerateParsingCode(Writer* writer); - virtual void GenerateSerializationCode(Writer* writer); - virtual void GenerateSerializedSizeCode(Writer* writer); + virtual void GenerateMembers(io::Printer* printer); + virtual void GenerateBuilderMembers(io::Printer* printer); + virtual void GenerateMergingCode(io::Printer* printer); + virtual void GenerateBuildingCode(io::Printer* printer); + virtual void GenerateParsingCode(io::Printer* printer); + virtual void GenerateSerializationCode(io::Printer* printer); + virtual void GenerateSerializedSizeCode(io::Printer* printer); - virtual void WriteHash(Writer* writer); - virtual void WriteEquals(Writer* writer); - virtual void WriteToString(Writer* writer); + virtual void WriteHash(io::Printer* printer); + virtual void WriteEquals(io::Printer* printer); + virtual void WriteToString(io::Printer* printer); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedMessageFieldGenerator); diff --git a/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc b/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc index 8b285468..e27458bb 100644 --- a/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc +++ b/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc @@ -40,7 +40,6 @@ #include #include -#include namespace google { namespace protobuf { @@ -56,161 +55,182 @@ RepeatedPrimitiveFieldGenerator::~RepeatedPrimitiveFieldGenerator() { } -void RepeatedPrimitiveFieldGenerator::GenerateMembers(Writer* writer) { +void RepeatedPrimitiveFieldGenerator::GenerateMembers(io::Printer* printer) { if (descriptor_->is_packed() && optimize_speed()) { - writer->WriteLine("private int $0$MemoizedSerializedSize;", name()); + printer->Print(variables_, "private int $name$MemoizedSerializedSize;\n"); } - writer->WriteLine( - "private pbc::PopsicleList<$0$> $1$_ = new pbc::PopsicleList<$0$>();", - type_name(), name()); - AddPublicMemberAttributes(writer); - writer->WriteLine("public scg::IList<$0$> $1$List {", type_name(), - property_name()); - writer->WriteLine(" get { return pbc::Lists.AsReadOnly($0$_); }", name()); - writer->WriteLine("}"); + printer->Print(variables_, + "private pbc::PopsicleList<$type_name$> $name$_ = new pbc::PopsicleList<$type_name$>();\n"); + AddPublicMemberAttributes(printer); + printer->Print( + variables_, + "public scg::IList<$type_name$> $property_name$List {\n" + " get { return pbc::Lists.AsReadOnly($name$_); }\n" + "}\n"); // TODO(jonskeet): Redundant API calls? Possibly - include for portability though. Maybe create an option. - AddDeprecatedFlag(writer); - writer->WriteLine("public int $0$Count {", property_name()); - writer->WriteLine(" get { return $0$_.Count; }", name()); - writer->WriteLine("}"); - - AddPublicMemberAttributes(writer); - writer->WriteLine("public $0$ Get$1$(int index) {", type_name(), - property_name()); - writer->WriteLine(" return $0$_[index];", name()); - writer->WriteLine("}"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public int $property_name$Count {\n" + " get { return $name$_.Count; }\n" + "}\n"); + + AddPublicMemberAttributes(printer); + printer->Print( + variables_, + "public $type_name$ Get$property_name$(int index) {\n" + " return $name$_[index];\n" + "}\n"); } -void RepeatedPrimitiveFieldGenerator::GenerateBuilderMembers(Writer* writer) { +void RepeatedPrimitiveFieldGenerator::GenerateBuilderMembers(io::Printer* printer) { // Note: We can return the original list here, because we make it unmodifiable when we build // We return it via IPopsicleList so that collection initializers work more pleasantly. - AddPublicMemberAttributes(writer); - writer->WriteLine("public pbc::IPopsicleList<$0$> $1$List {", type_name(), - property_name()); - writer->WriteLine(" get { return PrepareBuilder().$0$_; }", name()); - writer->WriteLine("}"); - AddDeprecatedFlag(writer); - writer->WriteLine("public int $0$Count {", property_name()); - writer->WriteLine(" get { return result.$0$Count; }", property_name()); - writer->WriteLine("}"); - AddPublicMemberAttributes(writer); - writer->WriteLine("public $0$ Get$1$(int index) {", type_name(), - property_name()); - writer->WriteLine(" return result.Get$0$(index);", property_name()); - writer->WriteLine("}"); - AddPublicMemberAttributes(writer); - writer->WriteLine("public Builder Set$0$(int index, $1$ value) {", - property_name(), type_name()); - AddNullCheck(writer); - writer->WriteLine(" PrepareBuilder();"); - writer->WriteLine(" result.$0$_[index] = value;", name()); - writer->WriteLine(" return this;"); - writer->WriteLine("}"); - AddPublicMemberAttributes(writer); - writer->WriteLine("public Builder Add$0$($1$ value) {", property_name(), - type_name()); - AddNullCheck(writer); - writer->WriteLine(" PrepareBuilder();"); - writer->WriteLine(" result.$0$_.Add(value);", name(), type_name()); - writer->WriteLine(" return this;"); - writer->WriteLine("}"); - AddPublicMemberAttributes(writer); - writer->WriteLine( - "public Builder AddRange$0$(scg::IEnumerable<$1$> values) {", - property_name(), type_name()); - writer->WriteLine(" PrepareBuilder();"); - writer->WriteLine(" result.$0$_.Add(values);", name()); - writer->WriteLine(" return this;"); - writer->WriteLine("}"); - AddDeprecatedFlag(writer); - writer->WriteLine("public Builder Clear$0$() {", property_name()); - writer->WriteLine(" PrepareBuilder();"); - writer->WriteLine(" result.$0$_.Clear();", name()); - writer->WriteLine(" return this;"); - writer->WriteLine("}"); + AddPublicMemberAttributes(printer); + printer->Print( + variables_, + "public pbc::IPopsicleList<$type_name$> $property_name$List {\n" + " get { return PrepareBuilder().$name$_; }\n" + "}\n"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public int $property_name$Count {\n" + " get { return result.$property_name$Count; }\n" + "}\n"); + AddPublicMemberAttributes(printer); + printer->Print( + variables_, + "public $type_name$ Get$property_name$(int index) {\n" + " return result.Get$property_name$(index);\n" + "}\n"); + AddPublicMemberAttributes(printer); + printer->Print( + variables_, + "public Builder Set$property_name$(int index, $type_name$ value) {\n"); + AddNullCheck(printer); + printer->Print( + variables_, + " PrepareBuilder();\n" + " result.$name$_[index] = value;\n" + " return this;\n" + "}\n"); + AddPublicMemberAttributes(printer); + printer->Print( + variables_, + "public Builder Add$property_name$($type_name$ value) {\n"); + AddNullCheck(printer); + printer->Print( + variables_, + " PrepareBuilder();\n" + " result.$name$_.Add(value);\n" + " return this;\n" + "}\n"); + AddPublicMemberAttributes(printer); + printer->Print( + variables_, + "public Builder AddRange$property_name$(scg::IEnumerable<$type_name$> values) {\n" + " PrepareBuilder();\n" + " result.$name$_.Add(values);\n" + " return this;\n" + "}\n"); + AddDeprecatedFlag(printer); + printer->Print( + variables_, + "public Builder Clear$property_name$() {\n" + " PrepareBuilder();\n" + " result.$name$_.Clear();\n" + " return this;\n" + "}\n"); } -void RepeatedPrimitiveFieldGenerator::GenerateMergingCode(Writer* writer) { - writer->WriteLine("if (other.$0$_.Count != 0) {", name()); - writer->WriteLine(" result.$0$_.Add(other.$0$_);", name()); - writer->WriteLine("}"); +void RepeatedPrimitiveFieldGenerator::GenerateMergingCode(io::Printer* printer) { + printer->Print( + variables_, + "if (other.$name$_.Count != 0) {\n" + " result.$name$_.Add(other.$name$_);\n" + "}\n"); } -void RepeatedPrimitiveFieldGenerator::GenerateBuildingCode(Writer* writer) { - writer->WriteLine("$0$_.MakeReadOnly();", name()); +void RepeatedPrimitiveFieldGenerator::GenerateBuildingCode(io::Printer* printer) { + printer->Print(variables_, "$name$_.MakeReadOnly();\n"); } -void RepeatedPrimitiveFieldGenerator::GenerateParsingCode(Writer* writer) { - writer->WriteLine("input.Read$0$Array(tag, field_name, result.$1$_);", - capitalized_type_name(), name()); +void RepeatedPrimitiveFieldGenerator::GenerateParsingCode(io::Printer* printer) { + printer->Print(variables_, + "input.Read$capitalized_type_name$Array(tag, field_name, result.$name$_);\n"); } void RepeatedPrimitiveFieldGenerator::GenerateSerializationCode( - Writer* writer) { - writer->WriteLine("if ($0$_.Count > 0) {", name()); - writer->Indent(); + io::Printer* printer) { + printer->Print(variables_, "if ($name$_.Count > 0) {\n"); + printer->Indent(); if (descriptor_->is_packed()) { - writer->WriteLine( - "output.WritePacked$0$Array($1$, field_names[$3$], $2$MemoizedSerializedSize, $2$_);", - capitalized_type_name(), number(), name(), field_ordinal()); + printer->Print(variables_, + "output.WritePacked$capitalized_type_name$Array($number$, field_names[$field_ordinal$], $name$MemoizedSerializedSize, $name$_);\n"); } else { - writer->WriteLine("output.Write$0$Array($1$, field_names[$3$], $2$_);", - capitalized_type_name(), number(), name(), - field_ordinal()); + printer->Print(variables_, + "output.Write$capitalized_type_name$Array($number$, field_names[$field_ordinal$], $name$_);\n"); } - writer->Outdent(); - writer->WriteLine("}"); + printer->Outdent(); + printer->Print("}\n"); } void RepeatedPrimitiveFieldGenerator::GenerateSerializedSizeCode( - Writer* writer) { - writer->WriteLine("{"); - writer->Indent(); - writer->WriteLine("int dataSize = 0;"); + io::Printer* printer) { + printer->Print("{\n"); + printer->Indent(); + printer->Print("int dataSize = 0;\n"); int fixedSize = GetFixedSize(descriptor_->type()); if (fixedSize == -1) { - writer->WriteLine("foreach ($0$ element in $1$List) {", type_name(), - property_name()); - writer->WriteLine( - " dataSize += pb::CodedOutputStream.Compute$0$SizeNoTag(element);", - capitalized_type_name(), number()); - writer->WriteLine("}"); + printer->Print( + variables_, + "foreach ($type_name$ element in $property_name$List) {\n" + " dataSize += pb::CodedOutputStream.Compute$capitalized_type_name$SizeNoTag(element);\n" + "}\n"); } else { - writer->WriteLine("dataSize = $0$ * $1$_.Count;", SimpleItoa(fixedSize), name()); + printer->Print( + "dataSize = $size$ * $name$_.Count;\n", + "size", SimpleItoa(fixedSize), "name", name()); } - writer->WriteLine("size += dataSize;"); + printer->Print("size += dataSize;\n"); int tagSize = internal::WireFormat::TagSize(descriptor_->number(), descriptor_->type()); if (descriptor_->is_packed()) { - writer->WriteLine("if ($0$_.Count != 0) {", name()); - writer->WriteLine( - " size += $0$ + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);", - SimpleItoa(tagSize)); - writer->WriteLine("}"); + printer->Print( + "if ($name$_.Count != 0) {\n" + " size += $tag_size$ + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);\n" + "}\n", + "name", name(), "tag_size", SimpleItoa(tagSize)); } else { - writer->WriteLine("size += $0$ * $1$_.Count;", SimpleItoa(tagSize), name()); + printer->Print( + "size += $tag_size$ * $name$_.Count;\n", + "tag_size", SimpleItoa(tagSize), "name", name()); } // cache the data size for packed fields. if (descriptor_->is_packed()) { - writer->WriteLine("$0$MemoizedSerializedSize = dataSize;", name()); + printer->Print(variables_, "$name$MemoizedSerializedSize = dataSize;\n"); } - writer->Outdent(); - writer->WriteLine("}"); + printer->Outdent(); + printer->Print("}\n"); } -void RepeatedPrimitiveFieldGenerator::WriteHash(Writer* writer) { - writer->WriteLine("foreach($0$ i in $1$_)", type_name(), name()); - writer->WriteLine(" hash ^= i.GetHashCode();"); +void RepeatedPrimitiveFieldGenerator::WriteHash(io::Printer* printer) { + printer->Print( + variables_, + "foreach($type_name$ i in $name$_)\n" + " hash ^= i.GetHashCode();\n"); } -void RepeatedPrimitiveFieldGenerator::WriteEquals(Writer* writer) { - writer->WriteLine("if($0$_.Count != other.$0$_.Count) return false;", name()); - writer->WriteLine("for(int ix=0; ix < $0$_.Count; ix++)", name()); - writer->WriteLine(" if(!$0$_[ix].Equals(other.$0$_[ix])) return false;", - name()); +void RepeatedPrimitiveFieldGenerator::WriteEquals(io::Printer* printer) { + printer->Print( + variables_, + "if($name$_.Count != other.$name$_.Count) return false;\n" + "for(int ix=0; ix < $name$_.Count; ix++)\n" + " if(!$name$_[ix].Equals(other.$name$_[ix])) return false;\n"); } -void RepeatedPrimitiveFieldGenerator::WriteToString(Writer* writer) { - writer->WriteLine("PrintField(\"$0$\", $1$_, writer);", descriptor_->name(), - name()); +void RepeatedPrimitiveFieldGenerator::WriteToString(io::Printer* printer) { + printer->Print(variables_, + "PrintField(\"$descriptor_name$\", $name$_, writer);\n"); } } // namespace csharp diff --git a/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.h b/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.h index 07b12015..50af9dda 100644 --- a/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.h +++ b/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.h @@ -48,17 +48,17 @@ class RepeatedPrimitiveFieldGenerator : public FieldGeneratorBase { RepeatedPrimitiveFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal); ~RepeatedPrimitiveFieldGenerator(); - virtual void GenerateMembers(Writer* writer); - virtual void GenerateBuilderMembers(Writer* writer); - virtual void GenerateMergingCode(Writer* writer); - virtual void GenerateBuildingCode(Writer* writer); - virtual void GenerateParsingCode(Writer* writer); - virtual void GenerateSerializationCode(Writer* writer); - virtual void GenerateSerializedSizeCode(Writer* writer); + virtual void GenerateMembers(io::Printer* printer); + virtual void GenerateBuilderMembers(io::Printer* printer); + virtual void GenerateMergingCode(io::Printer* printer); + virtual void GenerateBuildingCode(io::Printer* printer); + virtual void GenerateParsingCode(io::Printer* printer); + virtual void GenerateSerializationCode(io::Printer* printer); + virtual void GenerateSerializedSizeCode(io::Printer* printer); - virtual void WriteHash(Writer* writer); - virtual void WriteEquals(Writer* writer); - virtual void WriteToString(Writer* writer); + virtual void WriteHash(io::Printer* printer); + virtual void WriteEquals(io::Printer* printer); + virtual void WriteToString(io::Printer* printer); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedPrimitiveFieldGenerator); diff --git a/src/google/protobuf/compiler/csharp/csharp_source_generator_base.cc b/src/google/protobuf/compiler/csharp/csharp_source_generator_base.cc index 8dfb41d4..c52f6092 100644 --- a/src/google/protobuf/compiler/csharp/csharp_source_generator_base.cc +++ b/src/google/protobuf/compiler/csharp/csharp_source_generator_base.cc @@ -39,7 +39,6 @@ #include #include -#include namespace google { namespace protobuf { @@ -61,7 +60,7 @@ SourceGeneratorBase::SourceGeneratorBase(const FileDescriptor* descriptor) SourceGeneratorBase::~SourceGeneratorBase() { } -void SourceGeneratorBase::WriteGeneratedCodeAttributes(Writer* writer) { +void SourceGeneratorBase::WriteGeneratedCodeAttributes(io::Printer* printer) { // This hook can be used to reintroduce generated code attributes in the future. } diff --git a/src/google/protobuf/compiler/csharp/csharp_source_generator_base.h b/src/google/protobuf/compiler/csharp/csharp_source_generator_base.h index 1955394e..61c19511 100644 --- a/src/google/protobuf/compiler/csharp/csharp_source_generator_base.h +++ b/src/google/protobuf/compiler/csharp/csharp_source_generator_base.h @@ -40,8 +40,6 @@ namespace protobuf { namespace compiler { namespace csharp { -class Writer; - class SourceGeneratorBase { protected: SourceGeneratorBase(const FileDescriptor* descriptor); @@ -62,7 +60,7 @@ class SourceGeneratorBase { return runtimeSuffix_; } - void WriteGeneratedCodeAttributes(Writer* writer); + void WriteGeneratedCodeAttributes(io::Printer* printer); private: const FileDescriptor* descriptor_; diff --git a/src/google/protobuf/compiler/csharp/csharp_umbrella_class.cc b/src/google/protobuf/compiler/csharp/csharp_umbrella_class.cc index 358cfa4f..b14bf5e8 100644 --- a/src/google/protobuf/compiler/csharp/csharp_umbrella_class.cc +++ b/src/google/protobuf/compiler/csharp/csharp_umbrella_class.cc @@ -42,7 +42,6 @@ #include #include #include -#include namespace google { namespace protobuf { @@ -60,218 +59,224 @@ UmbrellaClassGenerator::UmbrellaClassGenerator(const FileDescriptor* file) UmbrellaClassGenerator::~UmbrellaClassGenerator() { } -void UmbrellaClassGenerator::Generate(Writer* writer) { - WriteIntroduction(writer); - WriteExtensionRegistration(writer); +void UmbrellaClassGenerator::Generate(io::Printer* printer) { + WriteIntroduction(printer); + WriteExtensionRegistration(printer); // write children: Extensions if (file_->extension_count() > 0) { - writer->WriteLine("#region Extensions"); + printer->Print("#region Extensions\n"); for (int i = 0; i < file_->extension_count(); i++) { ExtensionGenerator extensionGenerator(file_->extension(i)); - extensionGenerator.Generate(writer); + extensionGenerator.Generate(printer); } - writer->WriteLine("#endregion"); - writer->WriteLine(); + printer->Print("#endregion\n"); + printer->Print("\n"); } - writer->WriteLine("#region Static variables"); + printer->Print("#region Static variables\n"); for (int i = 0; i < file_->message_type_count(); i++) { MessageGenerator messageGenerator(file_->message_type(i)); - messageGenerator.GenerateStaticVariables(writer); + messageGenerator.GenerateStaticVariables(printer); } - writer->WriteLine("#endregion"); + printer->Print("#endregion\n"); if (!use_lite_runtime()) { - WriteDescriptor(writer); + WriteDescriptor(printer); } else { - WriteLiteExtensions(writer); + WriteLiteExtensions(printer); } // Close the class declaration. - writer->Outdent(); - writer->WriteLine("}"); + printer->Outdent(); + printer->Print("}\n"); // Close the namespace around the umbrella class if defined if (!umbrellaNamespace_.empty()) { - writer->Outdent(); - writer->WriteLine("}"); + printer->Outdent(); + printer->Print("}\n"); } // write children: Enums if (file_->enum_type_count() > 0) { - writer->WriteLine("#region Enums"); + printer->Print("#region Enums\n"); for (int i = 0; i < file_->enum_type_count(); i++) { EnumGenerator enumGenerator(file_->enum_type(i)); - enumGenerator.Generate(writer); + enumGenerator.Generate(printer); } - writer->WriteLine("#endregion"); - writer->WriteLine(); + printer->Print("#endregion\n"); + printer->Print("\n"); } // write children: Messages if (file_->message_type_count() > 0) { - writer->WriteLine("#region Messages"); + printer->Print("#region Messages\n"); for (int i = 0; i < file_->message_type_count(); i++) { MessageGenerator messageGenerator(file_->message_type(i)); - messageGenerator.Generate(writer); + messageGenerator.Generate(printer); } - writer->WriteLine("#endregion"); - writer->WriteLine(); + printer->Print("#endregion\n"); + printer->Print("\n"); } // TODO(jtattermusch): add insertion point for services. if (!namespace_.empty()) { - writer->Outdent(); - writer->WriteLine("}"); + printer->Outdent(); + printer->Print("}\n"); } - writer->WriteLine(); - writer->WriteLine("#endregion Designer generated code"); + printer->Print("\n"); + printer->Print("#endregion Designer generated code\n"); } -void UmbrellaClassGenerator::WriteIntroduction(Writer* writer) { - writer->WriteLine( - "// Generated by the protocol buffer compiler. DO NOT EDIT!"); - writer->WriteLine("// source: $0$", file_->name()); - writer->WriteLine("#pragma warning disable 1591, 0612, 3021"); - writer->WriteLine("#region Designer generated code"); - - writer->WriteLine(); - writer->WriteLine("using pb = global::Google.ProtocolBuffers;"); - writer->WriteLine("using pbc = global::Google.ProtocolBuffers.Collections;"); - writer->WriteLine("using pbd = global::Google.ProtocolBuffers.Descriptors;"); - writer->WriteLine("using scg = global::System.Collections.Generic;"); +void UmbrellaClassGenerator::WriteIntroduction(io::Printer* printer) { + printer->Print( + "// Generated by the protocol buffer compiler. DO NOT EDIT!\n" + "// source: $file_name$\n" + "#pragma warning disable 1591, 0612, 3021\n" + "#region Designer generated code\n" + "\n" + "using pb = global::Google.ProtocolBuffers;\n" + "using pbc = global::Google.ProtocolBuffers.Collections;\n" + "using pbd = global::Google.ProtocolBuffers.Descriptors;\n" + "using scg = global::System.Collections.Generic;\n", + "file_name", file_->name()); if (!namespace_.empty()) { - writer->WriteLine("namespace $0$ {", namespace_); - writer->Indent(); - writer->WriteLine(); + printer->Print("namespace $namespace$ {\n", "namespace", namespace_); + printer->Indent(); + printer->Print("\n"); } // Add the namespace around the umbrella class if defined if (!umbrellaNamespace_.empty()) { - writer->WriteLine("namespace $0$ {", umbrellaNamespace_); - writer->Indent(); - writer->WriteLine(); + printer->Print("namespace $umbrella_namespace$ {\n", + "umbrella_namespace", umbrellaNamespace_); + printer->Indent(); + printer->Print("\n"); } - writer->WriteLine( - "[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]"); - WriteGeneratedCodeAttributes(writer); - writer->WriteLine("$0$ static partial class $1$ {", class_access_level(), - umbrellaClassname_); - writer->WriteLine(); - writer->Indent(); + printer->Print( + "[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n"); + WriteGeneratedCodeAttributes(printer); + printer->Print( + "$access_level$ static partial class $umbrella_class_name$ {\n" + "\n", + "access_level", class_access_level(), + "umbrella_class_name", umbrellaClassname_); + printer->Indent(); } -void UmbrellaClassGenerator::WriteExtensionRegistration(Writer* writer) { - writer->WriteLine("#region Extension registration"); - writer->WriteLine( - "public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {"); - writer->Indent(); +void UmbrellaClassGenerator::WriteExtensionRegistration(io::Printer* printer) { + printer->Print( + "#region Extension registration\n" + "public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {\n"); + printer->Indent(); for (int i = 0; i < file_->extension_count(); i++) { ExtensionGenerator extensionGenerator(file_->extension(i)); - extensionGenerator.GenerateExtensionRegistrationCode(writer); + extensionGenerator.GenerateExtensionRegistrationCode(printer); } for (int i = 0; i < file_->message_type_count(); i++) { MessageGenerator messageGenerator(file_->message_type(i)); - messageGenerator.GenerateExtensionRegistrationCode(writer); + messageGenerator.GenerateExtensionRegistrationCode(printer); } - writer->Outdent(); - writer->WriteLine("}"); - writer->WriteLine("#endregion"); + printer->Outdent(); + printer->Print("}\n"); + printer->Print("#endregion\n"); } -void UmbrellaClassGenerator::WriteDescriptor(Writer* writer) { - writer->WriteLine("#region Descriptor"); - - writer->WriteLine("public static pbd::FileDescriptor Descriptor {"); - writer->WriteLine(" get { return descriptor; }"); - writer->WriteLine("}"); - writer->WriteLine("private static pbd::FileDescriptor descriptor;"); - writer->WriteLine(); - writer->WriteLine("static $0$() {", umbrellaClassname_); - writer->Indent(); - writer->WriteLine( - "byte[] descriptorData = global::System.Convert.FromBase64String("); - writer->Indent(); - writer->Indent(); - writer->WriteLine("string.Concat("); - writer->Indent(); +void UmbrellaClassGenerator::WriteDescriptor(io::Printer* printer) { + printer->Print( + "#region Descriptor\n" + "public static pbd::FileDescriptor Descriptor {\n" + " get { return descriptor; }\n" + "}\n" + "private static pbd::FileDescriptor descriptor;\n" + "\n" + "static $umbrella_class_name$() {\n", + "umbrella_class_name", umbrellaClassname_); + printer->Indent(); + printer->Print( + "byte[] descriptorData = global::System.Convert.FromBase64String(\n"); + printer->Indent(); + printer->Indent(); + printer->Print("string.Concat(\n"); + printer->Indent(); // TODO(jonskeet): Consider a C#-escaping format here instead of just Base64. std::string base64 = FileDescriptorToBase64(file_); while (base64.size() > 60) { - writer->WriteLine("\"$0$\", ", base64.substr(0, 60)); + printer->Print("\"$base64$\", \n", "base64", base64.substr(0, 60)); base64 = base64.substr(60); } - writer->Outdent(); - writer->WriteLine("\"$0$\"));", base64); - writer->Outdent(); - writer->Outdent(); - writer->WriteLine( - "pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {"); - writer->Indent(); - writer->WriteLine("descriptor = root;"); + printer->Outdent(); + printer->Print("\"$base64$\"));\n", "base64", base64); + printer->Outdent(); + printer->Outdent(); + printer->Print( + "pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {\n"); + printer->Indent(); + printer->Print("descriptor = root;\n"); for (int i = 0; i < file_->message_type_count(); i++) { MessageGenerator messageGenerator(file_->message_type(i)); - messageGenerator.GenerateStaticVariableInitializers(writer); + messageGenerator.GenerateStaticVariableInitializers(printer); } for (int i = 0; i < file_->extension_count(); i++) { ExtensionGenerator extensionGenerator(file_->extension(i)); - extensionGenerator.GenerateStaticVariableInitializers(writer); + extensionGenerator.GenerateStaticVariableInitializers(printer); } if (uses_extensions()) { // Must construct an ExtensionRegistry containing all possible extensions // and return it. - writer->WriteLine( - "pb::ExtensionRegistry registry = pb::ExtensionRegistry.CreateInstance();"); - writer->WriteLine("RegisterAllExtensions(registry);"); + printer->Print( + "pb::ExtensionRegistry registry = pb::ExtensionRegistry.CreateInstance();\n"); + printer->Print("RegisterAllExtensions(registry);\n"); for (int i = 0; i < file_->dependency_count(); i++) { - writer->WriteLine("$0$.RegisterAllExtensions(registry);", - GetFullUmbrellaClassName(file_->dependency(i))); + printer->Print("$dependency$.RegisterAllExtensions(registry);\n", + "dependency", GetFullUmbrellaClassName(file_->dependency(i))); } - writer->WriteLine("return registry;"); + printer->Print("return registry;\n"); } else { - writer->WriteLine("return null;"); + printer->Print("return null;\n"); } - writer->Outdent(); - writer->WriteLine("};"); + printer->Outdent(); + printer->Print("};\n"); // ----------------------------------------------------------------- // Invoke internalBuildGeneratedFileFrom() to build the file. - writer->WriteLine( - "pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,"); - writer->WriteLine(" new pbd::FileDescriptor[] {"); + printer->Print( + "pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,\n"); + printer->Print(" new pbd::FileDescriptor[] {\n"); for (int i = 0; i < file_->dependency_count(); i++) { - writer->WriteLine(" $0$.Descriptor, ", - GetFullUmbrellaClassName(file_->dependency(i))); + printer->Print( + " $full_umbrella_class_name$.Descriptor, \n", + "full_umbrella_class_name", + GetFullUmbrellaClassName(file_->dependency(i))); } - writer->WriteLine(" }, assigner);"); - writer->Outdent(); - writer->WriteLine("}"); - writer->WriteLine("#endregion"); - writer->WriteLine(); + printer->Print(" }, assigner);\n"); + printer->Outdent(); + printer->Print("}\n"); + printer->Print("#endregion\n\n"); } -void UmbrellaClassGenerator::WriteLiteExtensions(Writer* writer) { - writer->WriteLine("#region Extensions"); - writer->WriteLine("internal static readonly object Descriptor;"); - writer->WriteLine("static $0$() {", umbrellaClassname_); - writer->Indent(); - writer->WriteLine("Descriptor = null;"); +void UmbrellaClassGenerator::WriteLiteExtensions(io::Printer* printer) { + printer->Print( + "#region Extensions\n" + "internal static readonly object Descriptor;\n" + "static $umbrella_class_name$() {\n", + "umbrella_class_name", umbrellaClassname_); + printer->Indent(); + printer->Print("Descriptor = null;\n"); for (int i = 0; i < file_->message_type_count(); i++) { MessageGenerator messageGenerator(file_->message_type(i)); - messageGenerator.GenerateStaticVariableInitializers(writer); + messageGenerator.GenerateStaticVariableInitializers(printer); } for (int i = 0; i < file_->extension_count(); i++) { ExtensionGenerator extensionGenerator(file_->extension(i)); - extensionGenerator.GenerateStaticVariableInitializers(writer); + extensionGenerator.GenerateStaticVariableInitializers(printer); } - writer->Outdent(); - writer->WriteLine("}"); - writer->WriteLine("#endregion"); - writer->WriteLine(); + printer->Outdent(); + printer->Print("}\n"); + printer->Print("#endregion\n\n"); } bool UmbrellaClassGenerator::uses_extensions() { diff --git a/src/google/protobuf/compiler/csharp/csharp_umbrella_class.h b/src/google/protobuf/compiler/csharp/csharp_umbrella_class.h index 757f8f91..83e1f347 100644 --- a/src/google/protobuf/compiler/csharp/csharp_umbrella_class.h +++ b/src/google/protobuf/compiler/csharp/csharp_umbrella_class.h @@ -48,7 +48,7 @@ class UmbrellaClassGenerator : public SourceGeneratorBase { UmbrellaClassGenerator(const FileDescriptor* file); ~UmbrellaClassGenerator(); - void Generate(Writer* write); + void Generate(io::Printer* printer); private: const FileDescriptor* file_; @@ -57,10 +57,10 @@ class UmbrellaClassGenerator : public SourceGeneratorBase { std::string umbrellaClassname_; std::string umbrellaNamespace_; - void WriteIntroduction(Writer* writer); - void WriteExtensionRegistration(Writer* writer); - void WriteDescriptor(Writer* writer); - void WriteLiteExtensions(Writer* write); + void WriteIntroduction(io::Printer* printer); + void WriteExtensionRegistration(io::Printer* printer); + void WriteDescriptor(io::Printer* printer); + void WriteLiteExtensions(io::Printer* printer); bool uses_extensions(); -- cgit v1.2.3