aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Jie Luo <anandolee@gmail.com>2015-06-04 16:15:23 -0700
committerGravatar Jie Luo <anandolee@gmail.com>2015-06-04 16:15:23 -0700
commit8fe039a69a11764e981f59d8b61119565ad70c58 (patch)
treeb5a62ed19db72eec3f6ec25b6f75004cac4a1b6c /src
parent42f109d7bcc98e1288b4881fd37734782f7cbab5 (diff)
parent90da3514cdc372b8221a32f9fc97da0d4e047e92 (diff)
Merge pull request #462 from anandolee/master
Migrate writer to printer for C#
Diffstat (limited to 'src')
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_enum.cc25
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_enum.h4
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_enum_field.cc107
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_enum_field.h14
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_extension.cc138
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_extension.h28
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_field_base.cc54
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_field_base.h33
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_generator.cc8
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_message.cc1119
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_message.h26
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_message_field.cc419
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_message_field.h35
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_primitive_field.cc313
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_primitive_field.h35
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc278
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.h20
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc260
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_repeated_message_field.h20
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc256
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.h20
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_source_generator_base.cc3
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_source_generator_base.h4
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_umbrella_class.cc249
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_umbrella_class.h10
25 files changed, 1846 insertions, 1632 deletions
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 <google/protobuf/compiler/csharp/csharp_enum.h>
#include <google/protobuf/compiler/csharp/csharp_helpers.h>
-#include <google/protobuf/compiler/csharp/csharp_writer.h>
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 <google/protobuf/compiler/csharp/csharp_helpers.h>
#include <google/protobuf/compiler/csharp/csharp_enum_field.h>
-#include <google/protobuf/compiler/csharp/csharp_writer.h>
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 <google/protobuf/compiler/csharp/csharp_extension.h>
#include <google/protobuf/compiler/csharp/csharp_helpers.h>
-#include <google/protobuf/compiler/csharp/csharp_writer.h>
#include <google/protobuf/compiler/csharp/csharp_field_base.h>
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<scg::IList<$1$>> $2$;",
- class_access_level(), type_name(), property_name());
+ printer->Print(
+ variables_,
+ "$access_level$ static pb::GeneratedExtensionBase<scg::IList<$type_name$>> $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 <google/protobuf/compiler/csharp/csharp_field_base.h>
#include <google/protobuf/compiler/csharp/csharp_helpers.h>
-#include <google/protobuf/compiler/csharp/csharp_writer.h>
using google::protobuf::internal::scoped_ptr;
@@ -50,35 +49,72 @@ namespace protobuf {
namespace compiler {
namespace csharp {
+void FieldGeneratorBase::SetCommonFieldVariables(
+ map<string, string>* 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<string, string>* 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<string, string> 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<string, string>* 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<string, string>* 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 <google/protobuf/compiler/csharp/csharp_generator.h>
#include <google/protobuf/compiler/csharp/csharp_umbrella_class.h>
#include <google/protobuf/compiler/csharp/csharp_helpers.h>
-#include <google/protobuf/compiler/csharp/csharp_writer.h>
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<io::ZeroCopyOutputStream> 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 <sstream>
#include <algorithm>
+#include <map>
#include <google/protobuf/compiler/code_generator.h>
#include <google/protobuf/compiler/plugin.h>
@@ -46,7 +47,6 @@
#include <google/protobuf/compiler/csharp/csharp_message.h>
#include <google/protobuf/compiler/csharp/csharp_helpers.h>
#include <google/protobuf/compiler/csharp/csharp_field_base.h>
-#include <google/protobuf/compiler/csharp/csharp_writer.h>
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<string, string> 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<string, string> 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<std::string> 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<FieldGeneratorBase> 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<string, string> 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<FieldGeneratorBase> 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<FieldGeneratorBase> 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<FieldGeneratorBase> 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<const Descriptor::ExtensionRange*> 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<FieldGeneratorBase> 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<FieldGeneratorBase> 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<string, string> 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<string, string> 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<FieldGeneratorBase> 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<FieldGeneratorBase> 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<string, string> 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<FieldGeneratorBase> 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<FieldGeneratorBase> 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<std::string> field_names_;
std::vector<const FieldDescriptor*> 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 <google/protobuf/compiler/csharp/csharp_helpers.h>
#include <google/protobuf/compiler/csharp/csharp_message_field.h>
-#include <google/protobuf/compiler/csharp/csharp_writer.h>
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 <google/protobuf/compiler/csharp/csharp_helpers.h>
#include <google/protobuf/compiler/csharp/csharp_primitive_field.h>
-#include <google/protobuf/compiler/csharp/csharp_writer.h>
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 <google/protobuf/compiler/csharp/csharp_helpers.h>
#include <google/protobuf/compiler/csharp/csharp_repeated_enum_field.h>
-#include <google/protobuf/compiler/csharp/csharp_writer.h>
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<object> 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<object> 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 <google/protobuf/compiler/csharp/csharp_helpers.h>
#include <google/protobuf/compiler/csharp/csharp_repeated_message_field.h>
-#include <google/protobuf/compiler/csharp/csharp_writer.h>
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 <google/protobuf/compiler/csharp/csharp_helpers.h>
#include <google/protobuf/compiler/csharp/csharp_repeated_primitive_field.h>
-#include <google/protobuf/compiler/csharp/csharp_writer.h>
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 <google/protobuf/compiler/csharp/csharp_source_generator_base.h>
#include <google/protobuf/compiler/csharp/csharp_helpers.h>
-#include <google/protobuf/compiler/csharp/csharp_writer.h>
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 <google/protobuf/compiler/csharp/csharp_extension.h>
#include <google/protobuf/compiler/csharp/csharp_helpers.h>
#include <google/protobuf/compiler/csharp/csharp_message.h>
-#include <google/protobuf/compiler/csharp/csharp_writer.h>
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();