diff --git a/java/src/test/java/com/google/protobuf/NanoTest.java b/java/src/test/java/com/google/protobuf/NanoTest.java index 49348441b9..bb95a1778c 100644 --- a/java/src/test/java/com/google/protobuf/NanoTest.java +++ b/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 { diff --git a/src/google/protobuf/compiler/javanano/javanano_enum_field.cc b/src/google/protobuf/compiler/javanano/javanano_enum_field.cc index 5d3511bd92..eb732324fa 100644 --- a/src/google/protobuf/compiler/javanano/javanano_enum_field.cc +++ b/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"); diff --git a/src/google/protobuf/compiler/javanano/javanano_primitive_field.cc b/src/google/protobuf/compiler/javanano/javanano_primitive_field.cc index 3428f69cd4..b6c98b4ef7 100644 --- a/src/google/protobuf/compiler/javanano/javanano_primitive_field.cc +++ b/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"); diff --git a/src/google/protobuf/unittest_has_nano.proto b/src/google/protobuf/unittest_has_nano.proto index 3a1e5b5d22..61800f259e 100644 --- a/src/google/protobuf/unittest_has_nano.proto +++ b/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; + }