aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJisi Liu <jisi.liu@gmail.com>2015-02-17 21:15:20 -0800
committerJisi Liu <jisi.liu@gmail.com>2015-02-19 16:43:07 -0800
commitc72d3d51ff70944d7f9f5f8b1173920ca246d5b3 (patch)
tree5ff42e4eb7df0dc0316fdd0b0d946c90a0b8f0e3
parent7794a98ff43776491d4f3434ea3ec32c8146970a (diff)
downloadprotobuf-c72d3d51ff70944d7f9f5f8b1173920ca246d5b3.tar.gz
protobuf-c72d3d51ff70944d7f9f5f8b1173920ca246d5b3.tar.bz2
protobuf-c72d3d51ff70944d7f9f5f8b1173920ca246d5b3.zip
Oneof message level elements (consts, case getter/clear) and messsage type field oneof support.
-rw-r--r--javanano/src/test/java/com/google/protobuf/nano/unittest_nano.proto2
-rw-r--r--src/google/protobuf/compiler/javanano/javanano_field.cc8
-rw-r--r--src/google/protobuf/compiler/javanano/javanano_message.cc28
-rw-r--r--src/google/protobuf/compiler/javanano/javanano_message_field.cc63
-rw-r--r--src/google/protobuf/compiler/javanano/javanano_message_field.h8
-rw-r--r--src/google/protobuf/compiler/javanano/javanano_primitive_field.cc15
6 files changed, 106 insertions, 18 deletions
diff --git a/javanano/src/test/java/com/google/protobuf/nano/unittest_nano.proto b/javanano/src/test/java/com/google/protobuf/nano/unittest_nano.proto
index cc3717d3..842959a7 100644
--- a/javanano/src/test/java/com/google/protobuf/nano/unittest_nano.proto
+++ b/javanano/src/test/java/com/google/protobuf/nano/unittest_nano.proto
@@ -170,7 +170,7 @@ message TestAllTypesNano {
oneof oneof_field {
uint32 oneof_uint32 = 111;
- // NestedMessage oneof_nested_message = 112;
+ NestedMessage oneof_nested_message = 112;
// string oneof_string = 123;
// bytes oneof_bytes = 124;
fixed64 oneof_fixed64 = 115;
diff --git a/src/google/protobuf/compiler/javanano/javanano_field.cc b/src/google/protobuf/compiler/javanano/javanano_field.cc
index 2c7261f9..5565781c 100644
--- a/src/google/protobuf/compiler/javanano/javanano_field.cc
+++ b/src/google/protobuf/compiler/javanano/javanano_field.cc
@@ -159,11 +159,13 @@ void SetCommonOneofVariables(const FieldDescriptor* descriptor,
(*variables)["oneof_index"] =
SimpleItoa(descriptor->containing_oneof()->index());
(*variables)["set_oneof_case"] =
- (*variables)["oneof_name"] + "Case_ = " + SimpleItoa(descriptor->number());
+ "this." + (*variables)["oneof_name"] +
+ "Case_ = " + SimpleItoa(descriptor->number());
(*variables)["clear_oneof_case"] =
- (*variables)["oneof_name"] + "Case_ = 0";
+ "this." + (*variables)["oneof_name"] + "Case_ = 0";
(*variables)["has_oneof_case"] =
- (*variables)["oneof_name"] + "Case_ == " + SimpleItoa(descriptor->number());
+ "this." + (*variables)["oneof_name"] + "Case_ == " +
+ SimpleItoa(descriptor->number());
}
} // namespace javanano
diff --git a/src/google/protobuf/compiler/javanano/javanano_message.cc b/src/google/protobuf/compiler/javanano/javanano_message.cc
index 75e2573b..6b31c3bf 100644
--- a/src/google/protobuf/compiler/javanano/javanano_message.cc
+++ b/src/google/protobuf/compiler/javanano/javanano_message.cc
@@ -167,16 +167,36 @@ void MessageGenerator::Generate(io::Printer* printer) {
// oneof
map<string, string> vars;
+ vars["message_name"] = descriptor_->name();
for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
- vars["oneof_name"] = UnderscoresToCamelCase(descriptor_->oneof_decl(i));
+ const OneofDescriptor* oneof_desc = descriptor_->oneof_decl(i);
+ vars["oneof_name"] = UnderscoresToCamelCase(oneof_desc);
vars["oneof_capitalized_name"] =
- UnderscoresToCapitalizedCamelCase(descriptor_->oneof_decl(i));
- vars["oneof_index"] = SimpleItoa(descriptor_->oneof_decl(i)->index());
+ UnderscoresToCapitalizedCamelCase(oneof_desc);
+ vars["oneof_index"] = SimpleItoa(oneof_desc->index());
+ // Oneof Constants
+ for (int j = 0; j < oneof_desc->field_count(); j++) {
+ const FieldDescriptor* field = oneof_desc->field(j);
+ vars["number"] = SimpleItoa(field->number());
+ vars["cap_field_name"] = ToUpper(field->name());
+ printer->Print(vars,
+ "public static final int $cap_field_name$_FIELD_NUMBER = $number$;\n");
+ }
// oneofCase_ and oneof_
printer->Print(vars,
"private int $oneof_name$Case_ = 0;\n"
"private java.lang.Object $oneof_name$_;\n");
- // OneofCase enum
+ printer->Print(vars,
+ "public int get$oneof_capitalized_name$Case() {\n"
+ " return this.$oneof_name$Case_;\n"
+ "}\n");
+ // Oneof clear
+ printer->Print(vars,
+ "public $message_name$ clear$oneof_capitalized_name$() {\n"
+ " this.$oneof_name$Case_ = 0;\n"
+ " this.$oneof_name$_ = null;\n"
+ " return this;\n"
+ "}\n");
}
// Lazy initialization of otherwise static final fields can help prevent the
diff --git a/src/google/protobuf/compiler/javanano/javanano_message_field.cc b/src/google/protobuf/compiler/javanano/javanano_message_field.cc
index 425f7ae3..63bc7195 100644
--- a/src/google/protobuf/compiler/javanano/javanano_message_field.cc
+++ b/src/google/protobuf/compiler/javanano/javanano_message_field.cc
@@ -157,6 +157,69 @@ MessageOneofFieldGenerator::MessageOneofFieldGenerator(
MessageOneofFieldGenerator::~MessageOneofFieldGenerator() {}
+void MessageOneofFieldGenerator::
+GenerateMembers(io::Printer* printer, bool /* unused lazy_init */) const {
+ printer->Print(variables_,
+ "public boolean has$capitalized_name$() {\n"
+ " return $has_oneof_case$;\n"
+ "}\n"
+ "public $type$ get$capitalized_name$() {\n"
+ " if ($has_oneof_case$) {\n"
+ " return ($type$) this.$oneof_name$_;\n"
+ " }\n"
+ " return null;\n"
+ "}\n"
+ "public $message_name$ set$capitalized_name$($type$ value) {\n"
+ " if (value == null) { throw new java.lang.NullPointerException(); }\n"
+ " $set_oneof_case$;\n"
+ " this.$oneof_name$_ = value;\n"
+ " return this;\n"
+ "}\n");
+}
+
+void MessageOneofFieldGenerator::
+GenerateClearCode(io::Printer* printer) const {
+ // No clear method for oneof fields.
+}
+
+void MessageOneofFieldGenerator::
+GenerateMergingCode(io::Printer* printer) const {
+ printer->Print(variables_,
+ "if (!($has_oneof_case$)) {\n"
+ " this.$oneof_name$_ = new $type$();\n"
+ "}\n"
+ "input.readMessage(\n"
+ " (com.google.protobuf.nano.MessageNano) this.$oneof_name$_);\n"
+ "$set_oneof_case$;\n");
+}
+
+void MessageOneofFieldGenerator::
+GenerateSerializationCode(io::Printer* printer) const {
+ printer->Print(variables_,
+ "if ($has_oneof_case$) {\n"
+ " output.writeMessage($number$,\n"
+ " (com.google.protobuf.nano.MessageNano) this.$oneof_name$_);\n"
+ "}\n");
+}
+
+void MessageOneofFieldGenerator::
+GenerateSerializedSizeCode(io::Printer* printer) const {
+ printer->Print(variables_,
+ "if ($has_oneof_case$) {\n"
+ " size += com.google.protobuf.nano.CodedOutputByteBufferNano\n"
+ " .computeMessageSize($number$,\n"
+ " (com.google.protobuf.nano.MessageNano) this.$oneof_name$_);\n"
+ "}\n");
+}
+
+void MessageOneofFieldGenerator::
+GenerateEqualsCode(io::Printer* printer) const {
+}
+
+void MessageOneofFieldGenerator::
+GenerateHashCodeCode(io::Printer* printer) const {
+}
+
// ===================================================================
RepeatedMessageFieldGenerator::RepeatedMessageFieldGenerator(
diff --git a/src/google/protobuf/compiler/javanano/javanano_message_field.h b/src/google/protobuf/compiler/javanano/javanano_message_field.h
index 7c3b7399..6c615f5e 100644
--- a/src/google/protobuf/compiler/javanano/javanano_message_field.h
+++ b/src/google/protobuf/compiler/javanano/javanano_message_field.h
@@ -73,6 +73,14 @@ class MessageOneofFieldGenerator : public FieldGenerator {
~MessageOneofFieldGenerator();
// 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;
+
private:
const FieldDescriptor* descriptor_;
map<string, string> variables_;
diff --git a/src/google/protobuf/compiler/javanano/javanano_primitive_field.cc b/src/google/protobuf/compiler/javanano/javanano_primitive_field.cc
index 99cb89ec..4bbaec82 100644
--- a/src/google/protobuf/compiler/javanano/javanano_primitive_field.cc
+++ b/src/google/protobuf/compiler/javanano/javanano_primitive_field.cc
@@ -723,18 +723,13 @@ void PrimitiveOneofFieldGenerator::GenerateMembers(
"}\n"
"public $type$ get$capitalized_name$() {\n"
" if ($has_oneof_case$) {\n"
- " return ($type$) ($boxed_type$) $oneof_name$_;\n"
+ " return ($type$) ($boxed_type$) this.$oneof_name$_;\n"
" }\n"
" return $default$;\n"
"}\n"
"public $message_name$ set$capitalized_name$($type$ value) {\n"
" $set_oneof_case$;\n"
- " $oneof_name$_ = value;\n"
- " return this;\n"
- "}\n"
- "public $message_name$ clear$capitalized_name$() {\n"
- " $clear_oneof_case$;\n"
- " $oneof_name$_ = null;\n"
+ " this.$oneof_name$_ = value;\n"
" return this;\n"
"}\n");
}
@@ -747,7 +742,7 @@ void PrimitiveOneofFieldGenerator::GenerateClearCode(
void PrimitiveOneofFieldGenerator::GenerateMergingCode(
io::Printer* printer) const {
printer->Print(variables_,
- "$oneof_name$_ = input.read$capitalized_type$();\n"
+ "this.$oneof_name$_ = input.read$capitalized_type$();\n"
"$set_oneof_case$;\n");
}
@@ -756,7 +751,7 @@ void PrimitiveOneofFieldGenerator::GenerateSerializationCode(
printer->Print(variables_,
"if ($has_oneof_case$) {\n"
" output.write$capitalized_type$(\n"
- " $number$, ($boxed_type$) $oneof_name$_);\n"
+ " $number$, ($boxed_type$) this.$oneof_name$_);\n"
"}\n");
}
@@ -766,7 +761,7 @@ void PrimitiveOneofFieldGenerator::GenerateSerializedSizeCode(
"if ($has_oneof_case$) {\n"
" size += com.google.protobuf.nano.CodedOutputByteBufferNano\n"
" .compute$capitalized_type$Size(\n"
- " $number$, ($boxed_type$) $oneof_name$_);\n"
+ " $number$, ($boxed_type$) this.$oneof_name$_);\n"
"}\n");
}