diff options
author | Jisi Liu <jisi.liu@gmail.com> | 2015-02-02 21:06:59 -0800 |
---|---|---|
committer | Jisi Liu <jisi.liu@gmail.com> | 2015-02-02 21:06:59 -0800 |
commit | 4d64e65f0974f56310dacd3c6f6a7425ff8e9bf3 (patch) | |
tree | 8e3409f6e78959c694a09f3df6986302264f44a6 /src/google | |
parent | 0f2a7d3feaaa9f570911a9c68c1c4fc53ffe92e2 (diff) | |
download | protobuf-4d64e65f0974f56310dacd3c6f6a7425ff8e9bf3.tar.gz protobuf-4d64e65f0974f56310dacd3c6f6a7425ff8e9bf3.tar.bz2 protobuf-4d64e65f0974f56310dacd3c6f6a7425ff8e9bf3.zip |
Parsing for Maps in JavaNano
Diffstat (limited to 'src/google')
-rw-r--r-- | src/google/protobuf/compiler/javanano/javanano_map_field.cc | 98 | ||||
-rw-r--r-- | src/google/protobuf/compiler/javanano/javanano_map_field.h | 11 |
2 files changed, 93 insertions, 16 deletions
diff --git a/src/google/protobuf/compiler/javanano/javanano_map_field.cc b/src/google/protobuf/compiler/javanano/javanano_map_field.cc index 5dcc37f4..4453cdfa 100644 --- a/src/google/protobuf/compiler/javanano/javanano_map_field.cc +++ b/src/google/protobuf/compiler/javanano/javanano_map_field.cc @@ -42,19 +42,69 @@ namespace javanano { namespace { +string TypeName(const Params& params, const FieldDescriptor* field, + bool boxed) { + JavaType java_type = GetJavaType(field); + switch (java_type) { + case JAVATYPE_MESSAGE: + return ClassName(params, field->message_type()); + case JAVATYPE_INT: + case JAVATYPE_LONG: + case JAVATYPE_FLOAT: + case JAVATYPE_DOUBLE: + case JAVATYPE_BOOLEAN: + case JAVATYPE_STRING: + case JAVATYPE_BYTES: + case JAVATYPE_ENUM: + if (boxed) { + return BoxedPrimitiveTypeName(java_type); + } else { + return PrimitiveTypeName(java_type); + } + // No default because we want the compiler to complain if any new JavaTypes + // are added.. + } + + GOOGLE_LOG(FATAL) << "should not reach here."; + return ""; +} + +const FieldDescriptor* KeyField(const FieldDescriptor* descriptor) { + GOOGLE_CHECK_EQ(FieldDescriptor::TYPE_MESSAGE, descriptor->type()); + const Descriptor* message = descriptor->message_type(); + GOOGLE_CHECK(message->options().map_entry()); + return message->FindFieldByName("key"); +} + +const FieldDescriptor* ValueField(const FieldDescriptor* descriptor) { + GOOGLE_CHECK_EQ(FieldDescriptor::TYPE_MESSAGE, descriptor->type()); + const Descriptor* message = descriptor->message_type(); + GOOGLE_CHECK(message->options().map_entry()); + return message->FindFieldByName("value"); +} + void SetMapVariables(const Params& params, const FieldDescriptor* descriptor, map<string, string>* variables) { + const FieldDescriptor* key = KeyField(descriptor); + const FieldDescriptor* value = ValueField(descriptor); (*variables)["name"] = RenameJavaKeywords(UnderscoresToCamelCase(descriptor)); - (*variables)["capitalized_name"] = - RenameJavaKeywords(UnderscoresToCapitalizedCamelCase(descriptor)); - (*variables)["number"] = SimpleItoa(descriptor->number()); - (*variables)["type"] = "java.lang.Integer"; - (*variables)["default"] = "null"; - (*variables)["tag"] = SimpleItoa(internal::WireFormat::MakeTag(descriptor)); - (*variables)["tag_size"] = SimpleItoa( - internal::WireFormat::TagSize(descriptor->number(), descriptor->type())); - (*variables)["message_name"] = descriptor->containing_type()->name(); + (*variables)["key_type"] = TypeName(params, key, false); + (*variables)["boxed_key_type"] = TypeName(params,key, true); + (*variables)["key_desc_type"] = + "TYPE_" + ToUpper(FieldDescriptor::TypeName(key->type())); + (*variables)["key_tag"] = SimpleItoa(internal::WireFormat::MakeTag(key)); + (*variables)["value_type"] = TypeName(params, value, false); + (*variables)["boxed_value_type"] = TypeName(params, value, true); + (*variables)["value_desc_type"] = + "TYPE_" + ToUpper(FieldDescriptor::TypeName(value->type())); + (*variables)["value_tag"] = SimpleItoa(internal::WireFormat::MakeTag(value)); + (*variables)["type_parameters"] = + (*variables)["boxed_key_type"] + ", " + (*variables)["boxed_value_type"]; + (*variables)["value_default"] = + value->type() == FieldDescriptor::TYPE_MESSAGE + ? "new " + (*variables)["value_type"] + "()" + : "null"; } } // namespace @@ -70,7 +120,7 @@ MapFieldGenerator::~MapFieldGenerator() {} void MapFieldGenerator:: GenerateMembers(io::Printer* printer, bool /* unused lazy_init */) const { printer->Print(variables_, - "public $type$ $name$;\n"); + "public java.util.Map<$type_parameters$> $name$;\n"); } void MapFieldGenerator:: @@ -79,6 +129,34 @@ GenerateClearCode(io::Printer* printer) const { "$name$ = null;\n"); } +void MapFieldGenerator:: +GenerateMergingCode(io::Printer* printer) const { + printer->Print(variables_, + "$name$ = com.google.protobuf.nano.MapUtil.mergeEntry(\n" + " $name$, input,\n" + " com.google.protobuf.nano.InternalNano.$key_desc_type$,\n" + " com.google.protobuf.nano.InternalNano.$value_desc_type$,\n" + " $value_default$,\n" + " $key_tag$, $value_tag$);\n" + "\n"); +} + +void MapFieldGenerator:: +GenerateSerializationCode(io::Printer* printer) const { +} + +void MapFieldGenerator:: +GenerateSerializedSizeCode(io::Printer* printer) const { +} + +void MapFieldGenerator:: +GenerateEqualsCode(io::Printer* printer) const { +} + +void MapFieldGenerator:: +GenerateHashCodeCode(io::Printer* printer) const { +} + } // namespace javanano } // namespace compiler } // namespace protobuf diff --git a/src/google/protobuf/compiler/javanano/javanano_map_field.h b/src/google/protobuf/compiler/javanano/javanano_map_field.h index 4987945d..c01bde38 100644 --- a/src/google/protobuf/compiler/javanano/javanano_map_field.h +++ b/src/google/protobuf/compiler/javanano/javanano_map_field.h @@ -50,16 +50,15 @@ class MapFieldGenerator : public FieldGenerator { // implements FieldGenerator --------------------------------------- void GenerateMembers(io::Printer* printer, bool lazy_init) const; void GenerateClearCode(io::Printer* printer) const; - // void GenerateMergingCode(io::Printer* printer) const; - // void GenerateSerializationCode(io::Printer* printer) const; - // void GenerateSerializedSizeCode(io::Printer* printer) const; - // void GenerateEqualsCode(io::Printer* printer) const; - // void GenerateHashCodeCode(io::Printer* printer) const; + void GenerateMergingCode(io::Printer* printer) const; + void GenerateSerializationCode(io::Printer* printer) const; + void GenerateSerializedSizeCode(io::Printer* printer) const; + void GenerateEqualsCode(io::Printer* printer) const; + void GenerateHashCodeCode(io::Printer* printer) const; private: const FieldDescriptor* descriptor_; map<string, string> variables_; - vector<string> canonical_values_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapFieldGenerator); }; |