ObjC: Preserve unknown fields in proto3 syntax files.

As announced: https://groups.google.com/forum/#!topic/protobuf/VX5qEmTW3y0

The ObjC side of https://github.com/google/protobuf/issues/272
This commit is contained in:
Thomas Van Lenten 2017-06-06 09:10:27 -04:00
parent 516a81a424
commit 1d0988b8ef
3 changed files with 5 additions and 44 deletions

View File

@ -286,10 +286,6 @@ uint32_t GPBFieldTag(GPBFieldDescriptor *self);
// would be the wire type for packed.
uint32_t GPBFieldAlternateTag(GPBFieldDescriptor *self);
GPB_INLINE BOOL GPBPreserveUnknownFields(GPBFileSyntax syntax) {
return syntax != GPBFileSyntaxProto3;
}
GPB_INLINE BOOL GPBHasPreservingUnknownEnumSemantics(GPBFileSyntax syntax) {
return syntax == GPBFileSyntaxProto3;
}

View File

@ -2372,17 +2372,11 @@ static void MergeRepeatedNotPackedFieldFromCodedInputStream(
// zero signals EOF / limit reached
return;
} else {
if (GPBPreserveUnknownFields(syntax)) {
if (![self parseUnknownField:input
extensionRegistry:extensionRegistry
tag:tag]) {
// it's an endgroup tag
return;
}
} else {
if (![input skipField:tag]) {
return;
}
if (![self parseUnknownField:input
extensionRegistry:extensionRegistry
tag:tag]) {
// it's an endgroup tag
return;
}
}
} // if(!merged)

View File

@ -113,35 +113,6 @@ static NSData *DataFromCStr(const char *str) {
[msg release];
}
- (void)testProto3DroppingUnknownFields {
DropUnknownsFooWithExtraFields *fooWithExtras =
[[DropUnknownsFooWithExtraFields alloc] init];
fooWithExtras.int32Value = 1;
fooWithExtras.enumValue = DropUnknownsFooWithExtraFields_NestedEnum_Baz;
fooWithExtras.extraInt32Value = 2;
NSData *data = [fooWithExtras data];
XCTAssertNotNil(data);
DropUnknownsFoo *foo = [DropUnknownsFoo parseFromData:data error:NULL];
XCTAssertEqual(foo.int32Value, 1);
XCTAssertEqual(foo.enumValue, DropUnknownsFoo_NestedEnum_Baz);
// Nothing should end up in the unknowns.
XCTAssertEqual([foo.unknownFields countOfFields], 0U);
[fooWithExtras release];
data = [foo data];
fooWithExtras =
[DropUnknownsFooWithExtraFields parseFromData:data error:NULL];
XCTAssertEqual(fooWithExtras.int32Value, 1);
XCTAssertEqual(fooWithExtras.enumValue,
DropUnknownsFooWithExtraFields_NestedEnum_Baz);
// And the extra value is gone (back to the default).
XCTAssertEqual(fooWithExtras.extraInt32Value, 0);
XCTAssertEqual([foo.unknownFields countOfFields], 0U);
}
- (void)testProto2UnknownEnumToUnknownField {
Message3 *orig = [[Message3 alloc] init];