Skip to content

Commit e837d88

Browse files
authored
Revert "[ObjC Interop] Map Swift @objc properties named isFoo to ObjC Cocoa conventions" (#3254)
It sounds good on paper, but in practice we ended up breaking Core Data projects (because people name their boolean properties 'isFoo' rather than the Objective-C 'foo'), forcing an Objective-C-side change when a mixed-source project upgrades to Swift 3, and causing collisions when there are properties named both 'foo' and 'isFoo'. If people care about their Swift boolean properties strictly following the Objective-C Cocoa naming conventions, they'll have to specify them manually. (We do have a bug to make it easier to rename the getter of a stored property exposed to Objective-C: rdar://problem/21261564.) This reverts commit 6fe6266. rdar://problem/26847223
1 parent d01eff0 commit e837d88

File tree

5 files changed

+18
-21
lines changed

5 files changed

+18
-21
lines changed

include/swift/AST/Decl.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4322,6 +4322,11 @@ class VarDecl : public AbstractStorageDecl {
43224322
/// Return the Objective-C runtime name for this property.
43234323
Identifier getObjCPropertyName() const;
43244324

4325+
/// Retrieve the default Objective-C selector for the getter of a
4326+
/// property of the given name.
4327+
static ObjCSelector getDefaultObjCGetterSelector(ASTContext &ctx,
4328+
Identifier propertyName);
4329+
43254330
/// Retrieve the default Objective-C selector for the setter of a
43264331
/// property of the given name.
43274332
static ObjCSelector getDefaultObjCSetterSelector(ASTContext &ctx,

lib/AST/Decl.cpp

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3222,14 +3222,9 @@ ObjCSelector AbstractStorageDecl::getObjCGetterSelector(
32223222
}
32233223
}
32243224

3225-
// If the Swift name starts with the word "is", use that Swift name as the
3226-
// getter name.
3227-
auto var = cast<VarDecl>(this);
3228-
if (camel_case::getFirstWord(var->getName().str()) == "is")
3229-
return ObjCSelector(ctx, 0, { var->getName() });
3230-
32313225
// The getter selector is the property name itself.
3232-
return ObjCSelector(ctx, 0, { var->getObjCPropertyName() });
3226+
auto var = cast<VarDecl>(this);
3227+
return VarDecl::getDefaultObjCGetterSelector(ctx, var->getObjCPropertyName());
32333228
}
32343229

32353230
ObjCSelector AbstractStorageDecl::getObjCSetterSelector(
@@ -3515,25 +3510,21 @@ Identifier VarDecl::getObjCPropertyName() const {
35153510
return name->getSelectorPieces()[0];
35163511
}
35173512

3518-
// If the Swift property name starts with the word "is", strip the
3519-
// "is" and lowercase the rest when forming the Objective-C property
3520-
// name.
3521-
ASTContext &ctx = getASTContext();
3522-
StringRef nameStr = getName().str();
3523-
if (camel_case::getFirstWord(nameStr) == "is") {
3524-
SmallString<16> scratch;
3525-
return ctx.getIdentifier(camel_case::toLowercaseWord(nameStr.substr(2),
3526-
scratch));
3527-
}
3528-
35293513
return getName();
35303514
}
35313515

3516+
ObjCSelector VarDecl::getDefaultObjCGetterSelector(ASTContext &ctx,
3517+
Identifier propertyName) {
3518+
return ObjCSelector(ctx, 0, propertyName);
3519+
}
3520+
3521+
35323522
ObjCSelector VarDecl::getDefaultObjCSetterSelector(ASTContext &ctx,
35333523
Identifier propertyName) {
35343524
llvm::SmallString<16> scratch;
35353525
scratch += "set";
35363526
camel_case::appendSentenceCase(scratch, propertyName.str());
3527+
35373528
return ObjCSelector(ctx, 1, ctx.getIdentifier(scratch));
35383529
}
35393530

lib/PrintAsObjC/PrintAsObjC.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -667,7 +667,8 @@ class ObjCPrinter : private DeclVisitor<ObjCPrinter>,
667667
// Handle custom accessor names.
668668
llvm::SmallString<64> buffer;
669669
if (hasReservedName ||
670-
VD->getObjCGetterSelector() != ObjCSelector(ctx, 0, { objCName })) {
670+
VD->getObjCGetterSelector() !=
671+
VarDecl::getDefaultObjCGetterSelector(ctx, objCName)) {
671672
os << ", getter=" << VD->getObjCGetterSelector().getString(buffer);
672673
}
673674
if (isSettable) {

test/PrintAsObjC/classes.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ public class NonObjCClass { }
420420
// CHECK-NEXT: + (NSDictionary<NSString *, NSString *> * _Nonnull)staticDictionary;
421421
// CHECK-NEXT: @property (nonatomic, strong) Properties * _Nullable wobble;
422422
// CHECK-NEXT: @property (nonatomic, getter=isEnabled, setter=setIsEnabled:) BOOL enabled;
423-
// CHECK-NEXT: @property (nonatomic, getter=isAnimated) BOOL animated;
423+
// CHECK-NEXT: @property (nonatomic) BOOL isAnimated;
424424
// CHECK-NEXT: @property (nonatomic, getter=register, setter=setRegister:) BOOL register_;
425425
// CHECK-NEXT: @property (nonatomic, readonly, strong, getter=this) Properties * _Nonnull this_;
426426
// CHECK-NEXT: @property (nonatomic, readonly) NSInteger privateSetter;

test/SILGen/objc_selector.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ func createSelector(foo: Foo) -> Selector {
2121

2222
// CHECK-LABEL: sil hidden @{{.*}}createGetterSelector
2323
func createGetterSelector() -> Selector {
24-
// CHECK: string_literal objc_selector "isProperty"
24+
// CHECK: string_literal objc_selector "property"
2525
return #selector(getter: Foo.isProperty)
2626
}
2727

0 commit comments

Comments
 (0)