Index: third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_map_field.cc |
diff --git a/third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_map_field.cc b/third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_map_field.cc |
index 2987f3db88d01b02c51907d69dd5a89ff2863a8a..ac5d8aea217917729e6bc316413adfe24ececaa2 100644 |
--- a/third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_map_field.cc |
+++ b/third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_map_field.cc |
@@ -84,13 +84,14 @@ const char* MapEntryTypeName(const FieldDescriptor* descriptor, bool isKey) { |
} // namespace |
-MapFieldGenerator::MapFieldGenerator(const FieldDescriptor* descriptor) |
- : RepeatedFieldGenerator(descriptor) { |
+MapFieldGenerator::MapFieldGenerator(const FieldDescriptor* descriptor, |
+ const Options& options) |
+ : RepeatedFieldGenerator(descriptor, options) { |
const FieldDescriptor* key_descriptor = |
descriptor->message_type()->FindFieldByName("key"); |
const FieldDescriptor* value_descriptor = |
descriptor->message_type()->FindFieldByName("value"); |
- value_field_generator_.reset(FieldGenerator::Make(value_descriptor)); |
+ value_field_generator_.reset(FieldGenerator::Make(value_descriptor, options)); |
// Pull over some variables_ from the value. |
variables_["field_type"] = value_field_generator_->variable("field_type"); |
@@ -117,46 +118,62 @@ MapFieldGenerator::MapFieldGenerator(const FieldDescriptor* descriptor) |
variables_["fieldflags"] = BuildFlagsString(field_flags); |
ObjectiveCType value_objc_type = GetObjectiveCType(value_descriptor); |
- if ((GetObjectiveCType(key_descriptor) == OBJECTIVECTYPE_STRING) && |
+ const bool value_is_object_type = |
((value_objc_type == OBJECTIVECTYPE_STRING) || |
(value_objc_type == OBJECTIVECTYPE_DATA) || |
- (value_objc_type == OBJECTIVECTYPE_MESSAGE))) { |
+ (value_objc_type == OBJECTIVECTYPE_MESSAGE)); |
+ if ((GetObjectiveCType(key_descriptor) == OBJECTIVECTYPE_STRING) && |
+ value_is_object_type) { |
variables_["array_storage_type"] = "NSMutableDictionary"; |
+ variables_["array_property_type"] = |
+ "NSMutableDictionary<NSString*, " + |
+ value_field_generator_->variable("storage_type") + "*>"; |
} else { |
- string base_name = MapEntryTypeName(key_descriptor, true); |
- base_name += MapEntryTypeName(value_descriptor, false); |
- base_name += "Dictionary"; |
- variables_["array_storage_type"] = "GPB" + base_name; |
+ string class_name("GPB"); |
+ class_name += MapEntryTypeName(key_descriptor, true); |
+ class_name += MapEntryTypeName(value_descriptor, false); |
+ class_name += "Dictionary"; |
+ variables_["array_storage_type"] = class_name; |
+ if (value_is_object_type) { |
+ variables_["array_property_type"] = |
+ class_name + "<" + |
+ value_field_generator_->variable("storage_type") + "*>"; |
+ } |
} |
+ |
+ variables_["dataTypeSpecific_name"] = |
+ value_field_generator_->variable("dataTypeSpecific_name"); |
+ variables_["dataTypeSpecific_value"] = |
+ value_field_generator_->variable("dataTypeSpecific_value"); |
} |
MapFieldGenerator::~MapFieldGenerator() {} |
void MapFieldGenerator::FinishInitialization(void) { |
RepeatedFieldGenerator::FinishInitialization(); |
- // Use the array_comment suport in RepeatedFieldGenerator to output what the |
+ // Use the array_comment support in RepeatedFieldGenerator to output what the |
// values in the map are. |
const FieldDescriptor* value_descriptor = |
descriptor_->message_type()->FindFieldByName("value"); |
- ObjectiveCType value_objc_type = GetObjectiveCType(value_descriptor); |
- if ((value_objc_type == OBJECTIVECTYPE_MESSAGE) || |
- (value_objc_type == OBJECTIVECTYPE_DATA) || |
- (value_objc_type == OBJECTIVECTYPE_STRING) || |
- (value_objc_type == OBJECTIVECTYPE_ENUM)) { |
+ if (GetObjectiveCType(value_descriptor) == OBJECTIVECTYPE_ENUM) { |
variables_["array_comment"] = |
"// |" + variables_["name"] + "| values are |" + value_field_generator_->variable("storage_type") + "|\n"; |
- } else { |
- variables_["array_comment"] = ""; |
} |
} |
-void MapFieldGenerator::GenerateFieldDescriptionTypeSpecific( |
- io::Printer* printer) const { |
- // Relay it to the value generator to provide enum validator, message |
- // class, etc. |
- value_field_generator_->GenerateFieldDescriptionTypeSpecific(printer); |
+void MapFieldGenerator::DetermineForwardDeclarations( |
+ set<string>* fwd_decls) const { |
+ RepeatedFieldGenerator::DetermineForwardDeclarations(fwd_decls); |
+ const FieldDescriptor* value_descriptor = |
+ descriptor_->message_type()->FindFieldByName("value"); |
+ if (GetObjectiveCType(value_descriptor) == OBJECTIVECTYPE_MESSAGE) { |
+ const string& value_storage_type = |
+ value_field_generator_->variable("storage_type"); |
+ fwd_decls->insert("@class " + value_storage_type); |
+ } |
} |
+ |
} // namespace objectivec |
} // namespace compiler |
} // namespace protobuf |