소스 검색

Merge "Don't serialize required fields whose 'has' flags are unset."

Max Cai 11 년 전
부모
커밋
2fb3cdf9bb

+ 6 - 1
java/src/test/java/com/google/protobuf/NanoTest.java

@@ -2202,6 +2202,7 @@ public class NanoTest extends TestCase {
       assertFalse(msg.hasDefaultFloatNan);
       assertFalse(msg.hasDefaultNestedEnum);
       assertFalse(msg.hasId);
+      assertFalse(msg.hasRequiredEnum);
       msg.optionalInt32 = 123;
       msg.optionalNestedMessage = new TestAllTypesNanoHas.NestedMessage();
       msg.optionalNestedMessage.bb = 2;
@@ -2211,7 +2212,7 @@ public class NanoTest extends TestCase {
     byte [] result = MessageNano.toByteArray(msg);
     int msgSerializedSize = msg.getSerializedSize();
     //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
-    assertTrue(msgSerializedSize == 13);
+    assertTrue(msgSerializedSize == 10);
     assertEquals(result.length, msgSerializedSize);
 
     // Has fields true upon parse.
@@ -2237,6 +2238,8 @@ public class NanoTest extends TestCase {
     msg.hasDefaultBytes = true;
     msg.hasDefaultFloatNan = true;
     msg.hasDefaultNestedEnum = true;
+    msg.hasId = true;
+    msg.hasRequiredEnum = true;
 
     byte [] result = MessageNano.toByteArray(msg);
     int msgSerializedSize = msg.getSerializedSize();
@@ -2255,6 +2258,7 @@ public class NanoTest extends TestCase {
     assertTrue(newMsg.hasDefaultFloatNan);
     assertTrue(newMsg.hasDefaultNestedEnum);
     assertTrue(newMsg.hasId);
+    assertTrue(newMsg.hasRequiredEnum);
     assertEquals(0, newMsg.optionalInt32);
     assertEquals(0, newMsg.optionalString.length());
     assertEquals(0, newMsg.optionalBytes.length);
@@ -2266,6 +2270,7 @@ public class NanoTest extends TestCase {
     assertEquals(TestAllTypesNanoHas.BAR, newMsg.defaultNestedEnum);
     assertEquals(Float.NaN, newMsg.defaultFloatNan);
     assertEquals(0, newMsg.id);
+    assertEquals(TestAllTypesNanoHas.FOO, newMsg.requiredEnum);
   }
 
   public void testNanoWithAccessorsBasic() throws Exception {

+ 3 - 2
src/google/protobuf/compiler/javanano/javanano_enum_field.cc

@@ -121,7 +121,8 @@ GenerateMergingCode(io::Printer* printer) const {
 
 void EnumFieldGenerator::
 GenerateSerializationCode(io::Printer* printer) const {
-  if (descriptor_->is_required()) {
+  if (descriptor_->is_required() && !params_.generate_has()) {
+    // Always serialize a required field if we don't have the 'has' signal.
     printer->Print(variables_,
       "output.writeInt32($number$, this.$name$);\n");
   } else {
@@ -140,7 +141,7 @@ GenerateSerializationCode(io::Printer* printer) const {
 
 void EnumFieldGenerator::
 GenerateSerializedSizeCode(io::Printer* printer) const {
-  if (descriptor_->is_required()) {
+  if (descriptor_->is_required() && !params_.generate_has()) {
     printer->Print(variables_,
       "size += com.google.protobuf.nano.CodedOutputByteBufferNano\n"
       "  .computeInt32Size($number$, this.$name$);\n");

+ 4 - 3
src/google/protobuf/compiler/javanano/javanano_primitive_field.cc

@@ -342,7 +342,7 @@ GenerateMembers(io::Printer* printer, bool lazy_init) const {
 
   if (params_.generate_has()) {
     printer->Print(variables_,
-      "public boolean has$capitalized_name$ = false;\n");
+      "public boolean has$capitalized_name$;\n");
   }
 }
 
@@ -401,7 +401,8 @@ GenerateSerializationConditional(io::Printer* printer) const {
 
 void PrimitiveFieldGenerator::
 GenerateSerializationCode(io::Printer* printer) const {
-  if (descriptor_->is_required()) {
+  if (descriptor_->is_required() && !params_.generate_has()) {
+    // Always serialize a required field if we don't have the 'has' signal.
     printer->Print(variables_,
       "output.write$capitalized_type$($number$, this.$name$);\n");
   } else {
@@ -414,7 +415,7 @@ GenerateSerializationCode(io::Printer* printer) const {
 
 void PrimitiveFieldGenerator::
 GenerateSerializedSizeCode(io::Printer* printer) const {
-  if (descriptor_->is_required()) {
+  if (descriptor_->is_required() && !params_.generate_has()) {
     printer->Print(variables_,
       "size += com.google.protobuf.nano.CodedOutputByteBufferNano\n"
       "    .compute$capitalized_type$Size($number$, this.$name$);\n");

+ 2 - 0
src/google/protobuf/unittest_has_nano.proto

@@ -75,4 +75,6 @@ message TestAllTypesNanoHas {
   optional NestedEnum default_nested_enum = 81 [default = BAR];
 
   required int32 id = 86;
+  required NestedEnum required_enum = 87;
+
 }