aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJon Skeet <skeet@pobox.com>2015-07-15 22:05:17 +0100
committerJon Skeet <skeet@pobox.com>2015-07-15 22:05:17 +0100
commit385baaa87c52abf5339b0be7dccf8a4131667117 (patch)
tree7a1b6c5d7047946443c6ad9b531e717552413c62 /src
parentf8281604543697f1543938e4319a7f8cbda6510a (diff)
parentdb52c9dd585da7d5c9063409117b8a5680e384db (diff)
downloadprotobuf-385baaa87c52abf5339b0be7dccf8a4131667117.tar.gz
protobuf-385baaa87c52abf5339b0be7dccf8a4131667117.tar.bz2
protobuf-385baaa87c52abf5339b0be7dccf8a4131667117.zip
Merge pull request #599 from jskeet/no-map-entries
Don't generate types for map entry messages
Diffstat (limited to 'src')
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_helpers.h6
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_message.cc39
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_message.h2
3 files changed, 39 insertions, 8 deletions
diff --git a/src/google/protobuf/compiler/csharp/csharp_helpers.h b/src/google/protobuf/compiler/csharp/csharp_helpers.h
index bd3d6e7d..a7c2395b 100644
--- a/src/google/protobuf/compiler/csharp/csharp_helpers.h
+++ b/src/google/protobuf/compiler/csharp/csharp_helpers.h
@@ -105,6 +105,12 @@ uint FixedMakeTag(const FieldDescriptor* descriptor);
FieldGeneratorBase* CreateFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal);
+// Determines whether the given message is a map entry message, i.e. one implicitly created
+// by protoc due to a map<key, value> field.
+inline bool IsMapEntryMessage(const Descriptor* descriptor) {
+ return descriptor->options().map_entry();
+}
+
// Determines whether we're generating code for the proto representation of descriptors etc,
// for use in the runtime. This is the only type which is allowed to use proto2 syntax,
// and it generates internal classes.
diff --git a/src/google/protobuf/compiler/csharp/csharp_message.cc b/src/google/protobuf/compiler/csharp/csharp_message.cc
index 4acc899b..79b762d1 100644
--- a/src/google/protobuf/compiler/csharp/csharp_message.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_message.cc
@@ -121,8 +121,11 @@ void MessageGenerator::GenerateStaticVariables(io::Printer* printer) {
"full_class_name", full_class_name());
for (int i = 0; i < descriptor_->nested_type_count(); i++) {
- MessageGenerator messageGenerator(descriptor_->nested_type(i));
- messageGenerator.GenerateStaticVariables(printer);
+ // Don't generate accessor table fields for maps...
+ if (!IsMapEntryMessage(descriptor_->nested_type(i))) {
+ MessageGenerator messageGenerator(descriptor_->nested_type(i));
+ messageGenerator.GenerateStaticVariables(printer);
+ }
}
}
@@ -159,10 +162,12 @@ 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++) {
- MessageGenerator messageGenerator(descriptor_->nested_type(i));
- messageGenerator.GenerateStaticVariableInitializers(printer);
+ if (!IsMapEntryMessage(descriptor_->nested_type(i))) {
+ 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,8 +301,11 @@ void MessageGenerator::Generate(io::Printer* printer) {
enumGenerator.Generate(printer);
}
for (int i = 0; i < descriptor_->nested_type_count(); i++) {
- MessageGenerator messageGenerator(descriptor_->nested_type(i));
- messageGenerator.Generate(printer);
+ // Don't generate nested types for maps...
+ if (!IsMapEntryMessage(descriptor_->nested_type(i))) {
+ MessageGenerator messageGenerator(descriptor_->nested_type(i));
+ messageGenerator.Generate(printer);
+ }
}
printer->Outdent();
printer->Print("}\n"
@@ -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();
diff --git a/src/google/protobuf/compiler/csharp/csharp_message.h b/src/google/protobuf/compiler/csharp/csharp_message.h
index 6c7153aa..fbe8a3be 100644
--- a/src/google/protobuf/compiler/csharp/csharp_message.h
+++ b/src/google/protobuf/compiler/csharp/csharp_message.h
@@ -69,6 +69,8 @@ class MessageGenerator : public SourceGeneratorBase {
FieldGeneratorBase* CreateFieldGeneratorInternal(
const FieldDescriptor* descriptor);
+ bool HasNestedGeneratedTypes();
+
std::string class_name();
std::string full_class_name();