Skip to content

Commit 2aae07e

Browse files
mkruskal-googlecopybara-github
authored andcommitted
Emit hassers for oneofs in objectivec.
This conforms to our other implementations which emit hassers for oneofs and already do track presence. PiperOrigin-RevId: 816837388
1 parent d65bf80 commit 2aae07e

File tree

4 files changed

+26
-10
lines changed

4 files changed

+26
-10
lines changed

objectivec/GPBMessage.m

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3475,10 +3475,8 @@ GPB_INLINE BOOL GPBIsSetSelForField(const char *selName, size_t selNameLength,
34753475

34763476
GPB_INLINE BOOL GPBFieldHasHas(GPBFieldDescriptor *descriptor) {
34773477
// It gets has/setHas selectors if...
3478-
// - not in a oneof (negative has index)
34793478
// - not clearing on zero
3480-
return (descriptor->description_->hasIndex >= 0) &&
3481-
((descriptor->description_->flags & GPBFieldClearHasIvarOnZero) == 0);
3479+
return ((descriptor->description_->flags & GPBFieldClearHasIvarOnZero) == 0);
34823480
}
34833481

34843482
GPB_INLINE BOOL GPBIsHasSelForField(const char *selName, size_t selNameLength,

objectivec/Tests/GPBMessageTests+Runtime.m

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -95,14 +95,14 @@ - (void)testProto2HasMethodSupport {
9595
XCTAssertTrue([Message2 instancesRespondToSelector:countSel], @"field: %@", name);
9696
}
9797

98-
// OneOf fields - no has*/setHas*
98+
// OneOf fields - has*/setHas* is valid.
9999

100100
for (NSString *name in names) {
101101
// build the selector, i.e. - hasOneofInt32/setHasOneofInt32:
102102
SEL hasSel = NSSelectorFromString([NSString stringWithFormat:@"hasOneof%@", name]);
103103
SEL setHasSel = NSSelectorFromString([NSString stringWithFormat:@"setHasOneof%@:", name]);
104-
XCTAssertFalse([Message2 instancesRespondToSelector:hasSel], @"field: %@", name);
105-
XCTAssertFalse([Message2 instancesRespondToSelector:setHasSel], @"field: %@", name);
104+
XCTAssertTrue([Message2 instancesRespondToSelector:hasSel], @"field: %@", name);
105+
XCTAssertTrue([Message2 instancesRespondToSelector:setHasSel], @"field: %@", name);
106106
}
107107

108108
// map<> fields
@@ -186,14 +186,14 @@ - (void)testProto3HasMethodSupport {
186186
XCTAssertTrue([Message3 instancesRespondToSelector:countSel], @"field: %@", name);
187187
}
188188

189-
// OneOf fields - no has*/setHas*
189+
// OneOf fields - has*/setHas* is valid.
190190

191191
for (NSString *name in names) {
192192
// build the selector, i.e. - hasOneofInt32/setHasOneofInt32:
193193
SEL hasSel = NSSelectorFromString([NSString stringWithFormat:@"hasOneof%@", name]);
194194
SEL setHasSel = NSSelectorFromString([NSString stringWithFormat:@"setHasOneof%@:", name]);
195-
XCTAssertFalse([Message3 instancesRespondToSelector:hasSel], @"field: %@", name);
196-
XCTAssertFalse([Message3 instancesRespondToSelector:setHasSel], @"field: %@", name);
195+
XCTAssertTrue([Message3 instancesRespondToSelector:hasSel], @"field: %@", name);
196+
XCTAssertTrue([Message3 instancesRespondToSelector:setHasSel], @"field: %@", name);
197197
}
198198

199199
// Single Optional fields

objectivec/Tests/GPBMessageTests.m

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,24 @@ - (void)testSetter {
583583
XCTAssertFalse(message.hasOptionalString);
584584
XCTAssertEqualObjects(message.optionalString, @"");
585585

586+
// Test oneof.
587+
XCTAssertFalse(message.hasOneofUint32);
588+
XCTAssertEqual(message.oneofUint32, 0U);
589+
XCTAssertEqual(message.oneofFieldOneOfCase, TestAllTypes_OneofField_OneOfCase_GPBUnsetOneOfCase);
590+
XCTAssertFalse(message.hasOneofUint32);
591+
[message setHasOneofUint32:NO];
592+
XCTAssertFalse(message.hasOneofUint32);
593+
XCTAssertEqual(message.oneofUint32, 0U);
594+
XCTAssertEqual(message.oneofFieldOneOfCase, TestAllTypes_OneofField_OneOfCase_GPBUnsetOneOfCase);
595+
message.oneofUint32 = 1;
596+
XCTAssertEqual(message.oneofUint32, 1);
597+
XCTAssertTrue(message.hasOneofUint32);
598+
XCTAssertEqual(message.oneofFieldOneOfCase, TestAllTypes_OneofField_OneOfCase_OneofUint32);
599+
[message setHasOneofUint32:NO];
600+
XCTAssertFalse(message.hasOneofUint32);
601+
XCTAssertEqual(message.oneofUint32, 0);
602+
XCTAssertEqual(message.oneofFieldOneOfCase, TestAllTypes_OneofField_OneOfCase_GPBUnsetOneOfCase);
603+
586604
// Test optional data.
587605
XCTAssertFalse(message.hasOptionalBytes);
588606
XCTAssertEqualObjects(message.optionalBytes, GPBEmptyNSData());

src/google/protobuf/compiler/objectivec/field.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ void FieldGenerator::SetOneofIndexBase(int index_base) {
275275
}
276276

277277
bool FieldGenerator::WantsHasProperty() const {
278-
return descriptor_->has_presence() && !descriptor_->real_containing_oneof();
278+
return descriptor_->has_presence();
279279
}
280280

281281
SingleFieldGenerator::SingleFieldGenerator(

0 commit comments

Comments
 (0)