From fba329d6d51220f9e70c0c24919a84379772d5c0 Mon Sep 17 00:00:00 2001 From: Max Cai Date: Wed, 16 Oct 2013 16:26:50 +0100 Subject: [PATCH] Feature request: set() and clear() accessors return this Also pre-inlines set() and has() in serialization code. This could theoretically help ProGuard: the message class size is usually large, and because of this only, it may refuse to inline an accessor into the serialization code, and as a result keeps the accessor intact. Chances are, after pre-inlining all accessor calls within the message class, those accessors become unused or single-use, so there are more reasons for ProGuard to inline and then remove them. Change-Id: I57decbe0b2533c1be21439de0aad15f49c7024dd --- .../test/java/com/google/protobuf/NanoTest.java | 6 ++++++ .../compiler/javanano/javanano_enum_field.cc | 13 ++++++++----- .../compiler/javanano/javanano_message_field.cc | 14 ++++++++------ .../javanano/javanano_primitive_field.cc | 17 +++++++++++------ 4 files changed, 33 insertions(+), 17 deletions(-) diff --git a/java/src/test/java/com/google/protobuf/NanoTest.java b/java/src/test/java/com/google/protobuf/NanoTest.java index d4e9dfcbe..1149c40bc 100644 --- a/java/src/test/java/com/google/protobuf/NanoTest.java +++ b/java/src/test/java/com/google/protobuf/NanoTest.java @@ -2322,6 +2322,12 @@ public class NanoTest extends TestCase { assertFalse(msg.hasOptionalString()); assertFalse(msg.hasDefaultString()); assertFalse(msg.hasBitFieldCheck()); + + // Test set() and clear() returns itself (compiles = success) + msg.clear() + .setOptionalInt32(3) + .clearDefaultBytes() + .setOptionalString("4"); } public void testNanoWithAccessorsParseFrom() throws Exception { diff --git a/src/google/protobuf/compiler/javanano/javanano_enum_field.cc b/src/google/protobuf/compiler/javanano/javanano_enum_field.cc index 436616176..3c4b97890 100644 --- a/src/google/protobuf/compiler/javanano/javanano_enum_field.cc +++ b/src/google/protobuf/compiler/javanano/javanano_enum_field.cc @@ -182,16 +182,18 @@ GenerateMembers(io::Printer* printer) const { "public int get$capitalized_name$() {\n" " return $name$_;\n" "}\n" - "public void set$capitalized_name$(int value) {\n" + "public $message_name$ set$capitalized_name$(int value) {\n" " $name$_ = value;\n" " $set_has$;\n" + " return this;\n" "}\n" "public boolean has$capitalized_name$() {\n" " return $get_has$;\n" "}\n" - "public void clear$capitalized_name$() {\n" + "public $message_name$ clear$capitalized_name$() {\n" " $name$_ = $default$;\n" " $clear_has$;\n" + " return this;\n" "}\n"); } @@ -204,13 +206,14 @@ GenerateClearCode(io::Printer* printer) const { void AccessorEnumFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { printer->Print(variables_, - "set$capitalized_name$(input.readInt32());\n"); + "$name$_ = input.readInt32();\n" + "$set_has$;\n"); } void AccessorEnumFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, - "if (has$capitalized_name$()) {\n" + "if ($get_has$) {\n" " output.writeInt32($number$, $name$_);\n" "}\n"); } @@ -218,7 +221,7 @@ GenerateSerializationCode(io::Printer* printer) const { void AccessorEnumFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, - "if (has$capitalized_name$()) {\n" + "if ($get_has$) {\n" " size += com.google.protobuf.nano.CodedOutputByteBufferNano\n" " .computeInt32Size($number$, $name$_);\n" "}\n"); diff --git a/src/google/protobuf/compiler/javanano/javanano_message_field.cc b/src/google/protobuf/compiler/javanano/javanano_message_field.cc index 225cf42c6..02253f976 100644 --- a/src/google/protobuf/compiler/javanano/javanano_message_field.cc +++ b/src/google/protobuf/compiler/javanano/javanano_message_field.cc @@ -148,17 +148,19 @@ GenerateMembers(io::Printer* printer) const { "public $type$ get$capitalized_name$() {\n" " return $name$_;\n" "}\n" - "public void set$capitalized_name$($type$ value) {\n" + "public $message_name$ set$capitalized_name$($type$ value) {\n" " if (value == null) {\n" " throw new java.lang.NullPointerException();\n" " }\n" " $name$_ = value;\n" + " return this;\n" "}\n" "public boolean has$capitalized_name$() {\n" " return $name$_ != null;\n" "}\n" - "public void clear$capitalized_name$() {\n" + "public $message_name$ clear$capitalized_name$() {\n" " $name$_ = null;\n" + " return this;" "}\n"); } @@ -171,8 +173,8 @@ GenerateClearCode(io::Printer* printer) const { void AccessorMessageFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { printer->Print(variables_, - "if (!has$capitalized_name$()) {\n" - " set$capitalized_name$(new $type$());\n" + "if ($name$_ == null) {\n" + " $name$_ = new $type$();\n" "}\n"); if (descriptor_->type() == FieldDescriptor::TYPE_GROUP) { @@ -187,7 +189,7 @@ GenerateMergingCode(io::Printer* printer) const { void AccessorMessageFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, - "if (has$capitalized_name$()) {\n" + "if ($name$_ != null) {\n" " output.write$group_or_message$($number$, $name$_);\n" "}\n"); } @@ -195,7 +197,7 @@ GenerateSerializationCode(io::Printer* printer) const { void AccessorMessageFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, - "if (has$capitalized_name$()) {\n" + "if ($name$_ != null) {\n" " size += com.google.protobuf.nano.CodedOutputByteBufferNano\n" " .compute$group_or_message$Size($number$, $name$_);\n" "}\n"); diff --git a/src/google/protobuf/compiler/javanano/javanano_primitive_field.cc b/src/google/protobuf/compiler/javanano/javanano_primitive_field.cc index 0562a6e08..0f7512a24 100644 --- a/src/google/protobuf/compiler/javanano/javanano_primitive_field.cc +++ b/src/google/protobuf/compiler/javanano/javanano_primitive_field.cc @@ -431,21 +431,25 @@ GenerateMembers(io::Printer* printer) const { "public $type$ get$capitalized_name$() {\n" " return $name$_;\n" "}\n" - "public void set$capitalized_name$($type$ value) {\n"); + "public $message_name$ set$capitalized_name$($type$ value) {\n"); if (IsReferenceType(GetJavaType(descriptor_))) { printer->Print(variables_, - " if (value == null) throw new java.lang.NullPointerException();\n"); + " if (value == null) {\n" + " throw new java.lang.NullPointerException();\n" + " }\n"); } printer->Print(variables_, " $name$_ = value;\n" " $set_has$;\n" + " return this;\n" "}\n" "public boolean has$capitalized_name$() {\n" " return $get_has$;\n" "}\n" - "public void clear$capitalized_name$() {\n" + "public $message_name$ clear$capitalized_name$() {\n" " $name$_ = $default_copy_if_needed$;\n" " $clear_has$;\n" + " return this;\n" "}\n"); } @@ -458,13 +462,14 @@ GenerateClearCode(io::Printer* printer) const { void AccessorPrimitiveFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { printer->Print(variables_, - "set$capitalized_name$(input.read$capitalized_type$());\n"); + "$name$_ = input.read$capitalized_type$();\n" + "$set_has$;\n"); } void AccessorPrimitiveFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, - "if (has$capitalized_name$()) {\n" + "if ($get_has$) {\n" " output.write$capitalized_type$($number$, $name$_);\n" "}\n"); } @@ -472,7 +477,7 @@ GenerateSerializationCode(io::Printer* printer) const { void AccessorPrimitiveFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, - "if (has$capitalized_name$()) {\n" + "if ($get_has$) {\n" " size += com.google.protobuf.nano.CodedOutputByteBufferNano\n" " .compute$capitalized_type$Size($number$, $name$_);\n" "}\n");