aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/google/protobuf/compiler/csharp/csharp_message.cc
diff options
context:
space:
mode:
authorGravatar Jon Skeet <jonskeet@google.com>2015-07-15 13:36:56 +0100
committerGravatar Jon Skeet <jonskeet@google.com>2015-07-15 22:04:45 +0100
commit541b442b99e1e9a1c514e2aacfe1e83561a9ab68 (patch)
treeea2efa102b0c12dc3c6e7ee453bb961682c13d85 /src/google/protobuf/compiler/csharp/csharp_message.cc
parentf8281604543697f1543938e4319a7f8cbda6510a (diff)
Don't create nested types (or field accessors) for map types.
I'm sure I've implemented this before, but somehow it's been lost in a maze of twisty little branches, all alike.
Diffstat (limited to 'src/google/protobuf/compiler/csharp/csharp_message.cc')
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_message.cc27
1 files changed, 25 insertions, 2 deletions
diff --git a/src/google/protobuf/compiler/csharp/csharp_message.cc b/src/google/protobuf/compiler/csharp/csharp_message.cc
index 4acc899b..5a72b2e7 100644
--- a/src/google/protobuf/compiler/csharp/csharp_message.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_message.cc
@@ -121,6 +121,9 @@ void MessageGenerator::GenerateStaticVariables(io::Printer* printer) {
"full_class_name", full_class_name());
for (int i = 0; i < descriptor_->nested_type_count(); i++) {
+ // Don't generate accessor table fields for maps...
+ if (IsMapEntryMessage(descriptor_->nested_type(i))) continue;
+
MessageGenerator messageGenerator(descriptor_->nested_type(i));
messageGenerator.GenerateStaticVariables(printer);
}
@@ -159,8 +162,10 @@ void MessageGenerator::GenerateStaticVariableInitializers(io::Printer* printer)
}
printer->Print("});\n");
- // Generate static member initializers for all nested types.
+ // Generate static member initializers for all non-map-entry nested types.
for (int i = 0; i < descriptor_->nested_type_count(); i++) {
+ if (IsMapEntryMessage(descriptor_->nested_type(i))) continue;
+
MessageGenerator messageGenerator(descriptor_->nested_type(i));
messageGenerator.GenerateStaticVariableInitializers(printer);
}
@@ -285,7 +290,7 @@ void MessageGenerator::Generate(io::Printer* printer) {
GenerateMergingMethods(printer);
// Nested messages and enums
- if (descriptor_->enum_type_count() + descriptor_->nested_type_count() > 0) {
+ if (HasNestedGeneratedTypes()) {
printer->Print("#region Nested types\n"
"[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n");
WriteGeneratedCodeAttributes(printer);
@@ -296,6 +301,9 @@ void MessageGenerator::Generate(io::Printer* printer) {
enumGenerator.Generate(printer);
}
for (int i = 0; i < descriptor_->nested_type_count(); i++) {
+ // Don't generate nested types for maps...
+ if (IsMapEntryMessage(descriptor_->nested_type(i))) continue;
+
MessageGenerator messageGenerator(descriptor_->nested_type(i));
messageGenerator.Generate(printer);
}
@@ -310,6 +318,21 @@ void MessageGenerator::Generate(io::Printer* printer) {
printer->Print("\n");
}
+// Helper to work out whether we need to generate a class to hold nested types/enums.
+// Only tricky because we don't want to generate map entry types.
+bool MessageGenerator::HasNestedGeneratedTypes()
+{
+ if (descriptor_->enum_type_count() > 0) {
+ return true;
+ }
+ for (int i = 0; i < descriptor_->nested_type_count(); i++) {
+ if (!IsMapEntryMessage(descriptor_->nested_type(i))) {
+ return true;
+ }
+ }
+ return false;
+}
+
void MessageGenerator::GenerateCloningCode(io::Printer* printer) {
map<string, string> vars;
vars["class_name"] = class_name();