Skip to content

Commit d1b6f8c

Browse files
committed
[ObjC] Deprecate GPBTextFormatForUnknownFieldSet().
`GPBTextFormatForMessage()` will contain any information for unknown fields. And it clears the way for `GPBUnknownFieldSet` to eventually be deprecated also. PiperOrigin-RevId: 655184316
1 parent 9b16ee4 commit d1b6f8c

File tree

4 files changed

+138
-10
lines changed

4 files changed

+138
-10
lines changed

objectivec/GPBUnknownFieldSet.m

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,10 @@ - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)output {
154154
- (NSString *)description {
155155
NSMutableString *description =
156156
[NSMutableString stringWithFormat:@"<%@ %p>: TextFormat: {\n", [self class], self];
157+
#pragma clang diagnostic push
158+
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
157159
NSString *textFormat = GPBTextFormatForUnknownFieldSet(self, @" ");
160+
#pragma clang diagnostic pop
158161
[description appendString:textFormat];
159162
[description appendString:@"}"];
160163
return description;

objectivec/GPBUtilities.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ NSString *GPBTextFormatForMessage(GPBMessage *message, NSString *__nullable line
4040
* @return An NSString with the TextFormat of the unknown field set.
4141
**/
4242
NSString *GPBTextFormatForUnknownFieldSet(GPBUnknownFieldSet *__nullable unknownSet,
43-
NSString *__nullable lineIndent);
43+
NSString *__nullable lineIndent)
44+
__attribute__((deprecated("Use GPBTextFormatForMessage will include the unknown fields, and "
45+
"GPBUnknownFieldSet it going away.")));
4446

4547
/**
4648
* Checks if the given field number is set on a message.

objectivec/GPBUtilities.m

Lines changed: 80 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
// license that can be found in the LICENSE file or at
66
// https://developers.google.com/open-source/licenses/bsd
77

8-
#import "GPBUtilities_PackagePrivate.h"
8+
#import "GPBUtilities.h"
99

1010
#import <objc/runtime.h>
1111

@@ -15,6 +15,9 @@
1515
#import "GPBMessage_PackagePrivate.h"
1616
#import "GPBUnknownField.h"
1717
#import "GPBUnknownFieldSet.h"
18+
#import "GPBUnknownField_PackagePrivate.h"
19+
#import "GPBUnknownFields.h"
20+
#import "GPBUtilities_PackagePrivate.h"
1821

1922
// Direct access is use for speed, to avoid even internally declaring things
2023
// read/write, etc. The warning is enabled in the project to ensure code calling
@@ -1929,6 +1932,78 @@ static void AppendTextFormatForMessageExtensionRange(GPBMessage *message, NSArra
19291932
} // for..in(activeExtensions)
19301933
}
19311934

1935+
static void AppendTextFormatForUnknownFields(GPBUnknownFields *ufs, NSMutableString *toStr,
1936+
NSString *lineIndent) {
1937+
#if defined(DEBUG) && DEBUG
1938+
NSCAssert(!ufs.empty, @"Internal Error: No unknown fields to format.");
1939+
#endif
1940+
// Extract the fields and sort them by field number. Use a stable sort and sort just by the field
1941+
// numbers, that way the output will still show the order the different types were added as well
1942+
// as maintaining the order within a give number/type pair (i.e. - repeated fields say in order).
1943+
NSMutableArray *sortedFields = [[NSMutableArray alloc] initWithCapacity:ufs.count];
1944+
for (GPBUnknownField *field in ufs) {
1945+
[sortedFields addObject:field];
1946+
}
1947+
[sortedFields
1948+
sortWithOptions:NSSortStable
1949+
usingComparator:^NSComparisonResult(GPBUnknownField *field1, GPBUnknownField *field2) {
1950+
int32_t fieldNumber1 = field1->number_;
1951+
int32_t fieldNumber2 = field2->number_;
1952+
if (fieldNumber1 < fieldNumber2) {
1953+
return NSOrderedAscending;
1954+
} else if (fieldNumber1 > fieldNumber2) {
1955+
return NSOrderedDescending;
1956+
} else {
1957+
return NSOrderedSame;
1958+
}
1959+
}];
1960+
1961+
NSString *subIndent = nil;
1962+
1963+
for (GPBUnknownField *field in sortedFields) {
1964+
int32_t fieldNumber = field->number_;
1965+
switch (field->type_) {
1966+
case GPBUnknownFieldTypeVarint:
1967+
[toStr appendFormat:@"%@%d: %llu\n", lineIndent, fieldNumber, field->storage_.intValue];
1968+
break;
1969+
case GPBUnknownFieldTypeFixed32:
1970+
[toStr appendFormat:@"%@%d: 0x%X\n", lineIndent, fieldNumber,
1971+
(uint32_t)field->storage_.intValue];
1972+
break;
1973+
case GPBUnknownFieldTypeFixed64:
1974+
[toStr appendFormat:@"%@%d: 0x%llX\n", lineIndent, fieldNumber, field->storage_.intValue];
1975+
break;
1976+
case GPBUnknownFieldTypeLengthDelimited:
1977+
[toStr appendFormat:@"%@%d: ", lineIndent, fieldNumber];
1978+
AppendBufferAsString(field->storage_.lengthDelimited, toStr);
1979+
[toStr appendString:@"\n"];
1980+
break;
1981+
case GPBUnknownFieldTypeGroup: {
1982+
GPBUnknownFields *group = field->storage_.group;
1983+
if (group.empty) {
1984+
[toStr appendFormat:@"%@%d: {}\n", lineIndent, fieldNumber];
1985+
} else {
1986+
[toStr appendFormat:@"%@%d: {\n", lineIndent, fieldNumber];
1987+
if (subIndent == nil) {
1988+
subIndent = [lineIndent stringByAppendingString:@" "];
1989+
}
1990+
AppendTextFormatForUnknownFields(group, toStr, subIndent);
1991+
[toStr appendFormat:@"%@}\n", lineIndent];
1992+
}
1993+
} break;
1994+
case GPBUnknownFieldTypeLegacy:
1995+
#if defined(DEBUG) && DEBUG
1996+
NSCAssert(
1997+
NO,
1998+
@"Internal error: Shouldn't have gotten a legacy field type in the unknown fields.");
1999+
#endif
2000+
break;
2001+
}
2002+
}
2003+
[subIndent release];
2004+
[sortedFields release];
2005+
}
2006+
19322007
static void AppendTextFormatForMessage(GPBMessage *message, NSMutableString *toStr,
19332008
NSString *lineIndent) {
19342009
GPBDescriptor *descriptor = [message descriptor];
@@ -1951,11 +2026,12 @@ static void AppendTextFormatForMessage(GPBMessage *message, NSMutableString *toS
19512026
}
19522027
}
19532028

1954-
NSString *unknownFieldsStr = GPBTextFormatForUnknownFieldSet(message.unknownFields, lineIndent);
1955-
if ([unknownFieldsStr length] > 0) {
2029+
GPBUnknownFields *ufs = [[GPBUnknownFields alloc] initFromMessage:message];
2030+
if (ufs.count > 0) {
19562031
[toStr appendFormat:@"%@# --- Unknown fields ---\n", lineIndent];
1957-
[toStr appendString:unknownFieldsStr];
2032+
AppendTextFormatForUnknownFields(ufs, toStr, lineIndent);
19582033
}
2034+
[ufs release];
19592035
}
19602036

19612037
NSString *GPBTextFormatForMessage(GPBMessage *message, NSString *lineIndent) {

objectivec/Tests/GPBUtilitiesTests.m

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,16 @@
66
// https://developers.google.com/open-source/licenses/bsd
77

88
#import <XCTest/XCTest.h>
9-
10-
#import "GPBUtilities_PackagePrivate.h"
11-
129
#import <objc/runtime.h>
1310

14-
#import "GPBTestUtilities.h"
15-
1611
#import "GPBDescriptor.h"
1712
#import "GPBDescriptor_PackagePrivate.h"
1813
#import "GPBMessage.h"
14+
#import "GPBTestUtilities.h"
15+
#import "GPBUnknownField.h"
1916
#import "GPBUnknownField_PackagePrivate.h"
17+
#import "GPBUtilities.h"
18+
#import "GPBUtilities_PackagePrivate.h"
2019

2120
#import "objectivec/Tests/MapUnittest.pbobjc.h"
2221
#import "objectivec/Tests/Unittest.pbobjc.h"
@@ -168,6 +167,54 @@ - (void)testTextFormatExtensions {
168167
[expected release];
169168
}
170169

170+
- (void)testTextFormatUnknownFields {
171+
GPBUnknownFields *ufs = [[[GPBUnknownFields alloc] init] autorelease];
172+
[ufs addFieldNumber:100 varint:5];
173+
[ufs addFieldNumber:100 varint:4];
174+
[ufs addFieldNumber:10 varint:1];
175+
[ufs addFieldNumber:300 fixed32:0x50];
176+
[ufs addFieldNumber:300 fixed32:0x40];
177+
[ufs addFieldNumber:10 fixed32:0x10];
178+
[ufs addFieldNumber:200 fixed64:0x5000];
179+
[ufs addFieldNumber:200 fixed64:0x4000];
180+
[ufs addFieldNumber:10 fixed64:0x1000];
181+
[ufs addFieldNumber:10 lengthDelimited:DataFromCStr("foo")];
182+
[ufs addFieldNumber:10 lengthDelimited:DataFromCStr("bar")];
183+
GPBUnknownFields *group = [ufs addGroupWithFieldNumber:150];
184+
[group addFieldNumber:2 varint:2];
185+
[group addFieldNumber:1 varint:1];
186+
group = [ufs addGroupWithFieldNumber:150];
187+
[group addFieldNumber:1 varint:1];
188+
[group addFieldNumber:3 fixed32:0x3];
189+
[group addFieldNumber:2 fixed64:0x2];
190+
TestEmptyMessage *message = [TestEmptyMessage message];
191+
[message mergeUnknownFields:ufs extensionRegistry:nil];
192+
193+
NSString *expected = @"# --- Unknown fields ---\n"
194+
@"10: 1\n"
195+
@"10: 0x10\n"
196+
@"10: 0x1000\n"
197+
@"10: \"foo\"\n"
198+
@"10: \"bar\"\n"
199+
@"100: 5\n"
200+
@"100: 4\n"
201+
@"150: {\n"
202+
@" 1: 1\n"
203+
@" 2: 2\n"
204+
@"}\n"
205+
@"150: {\n"
206+
@" 1: 1\n"
207+
@" 2: 0x2\n"
208+
@" 3: 0x3\n"
209+
@"}\n"
210+
@"200: 0x5000\n"
211+
@"200: 0x4000\n"
212+
@"300: 0x50\n"
213+
@"300: 0x40\n";
214+
NSString *result = GPBTextFormatForMessage(message, nil);
215+
XCTAssertEqualObjects(expected, result);
216+
}
217+
171218
- (void)testSetRepeatedFields {
172219
TestAllTypes *message = [TestAllTypes message];
173220

0 commit comments

Comments
 (0)