diff options
author | Feng Xiao <xfxyjwf@gmail.com> | 2014-10-02 17:40:47 -0700 |
---|---|---|
committer | Feng Xiao <xfxyjwf@gmail.com> | 2014-10-02 17:40:47 -0700 |
commit | 0dd3fef8431591637459f330db61e8c1485495a3 (patch) | |
tree | 2f5cf4c0faaf877f02a9638c71186530dbe27f15 | |
parent | eb223ed4f72408c46696e42b9f5606241b11eff6 (diff) | |
parent | f5691a617ee2e72bac6a0eb97764497a223702d9 (diff) | |
download | protobuf-0dd3fef8431591637459f330db61e8c1485495a3.tar.gz protobuf-0dd3fef8431591637459f330db61e8c1485495a3.tar.bz2 protobuf-0dd3fef8431591637459f330db61e8c1485495a3.zip |
Merge pull request #39 from xfxyjwf/fix24
Fix descriptor validation logic for packed enum fields.
-rw-r--r-- | java/src/main/java/com/google/protobuf/Descriptors.java | 14 | ||||
-rw-r--r-- | java/src/test/java/com/google/protobuf/DescriptorsTest.java | 27 |
2 files changed, 34 insertions, 7 deletions
diff --git a/java/src/main/java/com/google/protobuf/Descriptors.java b/java/src/main/java/com/google/protobuf/Descriptors.java index 3dd49c64..caae0f77 100644 --- a/java/src/main/java/com/google/protobuf/Descriptors.java +++ b/java/src/main/java/com/google/protobuf/Descriptors.java @@ -1103,13 +1103,6 @@ public final class Descriptors { "Field numbers must be positive integers."); } - // Only repeated primitive fields may be packed. - if (proto.getOptions().getPacked() && !isPackable()) { - throw new DescriptorValidationException(this, - "[packed = true] can only be specified for repeated primitive " + - "fields."); - } - if (isExtension) { if (!proto.hasExtendee()) { throw new DescriptorValidationException(this, @@ -1218,6 +1211,13 @@ public final class Descriptors { } } + // Only repeated primitive fields may be packed. + if (proto.getOptions().getPacked() && !isPackable()) { + throw new DescriptorValidationException(this, + "[packed = true] can only be specified for repeated primitive " + + "fields."); + } + // We don't attempt to parse the default value until here because for // enums we need the enum type's descriptor. if (proto.hasDefaultValue()) { diff --git a/java/src/test/java/com/google/protobuf/DescriptorsTest.java b/java/src/test/java/com/google/protobuf/DescriptorsTest.java index 13da1e81..0092771b 100644 --- a/java/src/test/java/com/google/protobuf/DescriptorsTest.java +++ b/java/src/test/java/com/google/protobuf/DescriptorsTest.java @@ -705,4 +705,31 @@ public class DescriptorsTest extends TestCase { assertFalse(TestMultipleExtensionRanges.getDescriptor().isExtensionNumber(4142)); assertTrue(TestMultipleExtensionRanges.getDescriptor().isExtensionNumber(4143)); } + + public void testPackedEnumField() throws Exception { + FileDescriptorProto fileDescriptorProto = FileDescriptorProto.newBuilder() + .setName("foo.proto") + .addEnumType(EnumDescriptorProto.newBuilder() + .setName("Enum") + .addValue(EnumValueDescriptorProto.newBuilder() + .setName("FOO") + .setNumber(1) + .build()) + .build()) + .addMessageType(DescriptorProto.newBuilder() + .setName("Message") + .addField(FieldDescriptorProto.newBuilder() + .setName("foo") + .setTypeName("Enum") + .setNumber(1) + .setLabel(FieldDescriptorProto.Label.LABEL_REPEATED) + .setOptions(DescriptorProtos.FieldOptions.newBuilder() + .setPacked(true) + .build()) + .build()) + .build()) + .build(); + Descriptors.FileDescriptor.buildFrom( + fileDescriptorProto, new FileDescriptor[0]); + } } |