From 1bf4b38f29d6cc3f24ad1e0b6c3339420bd719be Mon Sep 17 00:00:00 2001 From: Thomas Van Lenten Date: Tue, 8 Mar 2016 09:29:49 -0500 Subject: Fix up handing of fields with leading names that should be all caps. Add a compile test to confirm things are working as expected. --- Makefile.am | 1 + objectivec/Tests/GPBMessageTests.m | 18 ++++++++++++++++++ objectivec/Tests/unittest_objc.proto | 12 ++++++++++++ .../protobuf/compiler/objectivec/objectivec_helpers.cc | 15 +++++++++------ 4 files changed, 40 insertions(+), 6 deletions(-) diff --git a/Makefile.am b/Makefile.am index 3e21db89..064efdfb 100644 --- a/Makefile.am +++ b/Makefile.am @@ -413,6 +413,7 @@ objectivec_EXTRA_DIST= \ objectivec/GPBCodedInputStream_PackagePrivate.h \ objectivec/GPBCodedOutputStream.h \ objectivec/GPBCodedOutputStream.m \ + objectivec/GPBCodedOutputStream_PackagePrivate.h \ objectivec/GPBDescriptor.h \ objectivec/GPBDescriptor.m \ objectivec/GPBDescriptor_PackagePrivate.h \ diff --git a/objectivec/Tests/GPBMessageTests.m b/objectivec/Tests/GPBMessageTests.m index 7b37ca95..43546156 100644 --- a/objectivec/Tests/GPBMessageTests.m +++ b/objectivec/Tests/GPBMessageTests.m @@ -1820,6 +1820,24 @@ XCTAssertEqualObjects(enumDescriptor, expectedDescriptor); } +- (void)testPropertyNaming { + // objectivec_helpers.cc has some special handing to get proper all caps + // for a few cases to meet objc developer expectations. + // + // This "test" confirms that the expected names are generated, otherwise the + // test itself will fail to compile. + ObjCPropertyNaming *msg = [ObjCPropertyNaming message]; + // On their own, at the end, in the middle. + msg.URL = @"good"; + msg.thumbnailURL = @"good"; + msg.URLFoo = @"good"; + msg.someURLBlah = @"good"; + msg.HTTP = @"good"; + msg.HTTPS = @"good"; + // No caps since it was "urls". + [msg.urlsArray addObject:@"good"]; +} + - (void)testEnumNaming { // objectivec_helpers.cc has some interesting cases to deal with in // EnumValueName/EnumValueShortName. Confirm that things generated as diff --git a/objectivec/Tests/unittest_objc.proto b/objectivec/Tests/unittest_objc.proto index 3bb92761..9483cb1d 100644 --- a/objectivec/Tests/unittest_objc.proto +++ b/objectivec/Tests/unittest_objc.proto @@ -112,6 +112,18 @@ enum retain { serializedSize = 6; } +message ObjCPropertyNaming { + // Test that the properties properly get things all caps. + optional string url = 1; + optional string thumbnail_url = 2; + optional string url_foo = 3; + optional string some_url_blah = 4; + optional string http = 5; + optional string https = 6; + // This one doesn't. + repeated string urls = 7; +} + // EnumValueShortName: The short names shouldn't get suffixes/prefixes. enum Foo { SERIALIZED_SIZE = 1; diff --git a/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc b/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc index 24ff2b56..613a511c 100644 --- a/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc +++ b/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc @@ -124,9 +124,14 @@ string UnderscoresToCamelCase(const string& input, bool first_capitalized) { } values.push_back(current); + string result; + bool first_segment_forces_upper = false; for (vector::iterator i = values.begin(); i != values.end(); ++i) { string value = *i; bool all_upper = (kUpperSegments.count(value) > 0); + if (all_upper && (result.length() == 0)) { + first_segment_forces_upper = true; + } for (int j = 0; j < value.length(); j++) { if (j == 0 || all_upper) { value[j] = ascii_toupper(value[j]); @@ -134,13 +139,11 @@ string UnderscoresToCamelCase(const string& input, bool first_capitalized) { // Nothing, already in lower. } } - *i = value; - } - string result; - for (vector::iterator i = values.begin(); i != values.end(); ++i) { - result += *i; + result += value; } - if ((result.length() != 0) && !first_capitalized) { + if ((result.length() != 0) && + !first_capitalized && + !first_segment_forces_upper) { result[0] = ascii_tolower(result[0]); } return result; -- cgit v1.2.3