[PATCH] D29967: Get class property selectors from property decl if it exists
David Herzka via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Feb 15 19:14:30 PST 2017
herzka updated this revision to Diff 88650.
herzka added a comment.
Added test, used auto
https://reviews.llvm.org/D29967
Files:
lib/Sema/SemaExprObjC.cpp
test/SemaObjC/objc-class-property.m
Index: test/SemaObjC/objc-class-property.m
===================================================================
--- test/SemaObjC/objc-class-property.m
+++ test/SemaObjC/objc-class-property.m
@@ -21,22 +21,31 @@
@property (class) int c2; // expected-note {{property declared here}} \
// expected-note {{property declared here}}
@property (class) int x;
+ at property (class, setter=customSetA:) int customSetterProperty;
+ at property (class, getter=customGetB) int customGetterProperty;
@end
@implementation A // expected-warning {{class property 'c2' requires method 'c2' to be defined}} \
// expected-warning {{class property 'c2' requires method 'setC2:' to be defined}}
@dynamic x; // refers to the instance property
@dynamic (class) x; // refers to the class property
@synthesize z, c2; // expected-error {{@synthesize not allowed on a class property 'c2'}}
@dynamic c; // refers to the class property
+ at dynamic customSetterProperty;
+ at dynamic customGetterProperty;
@end
int test() {
A *a = [[A alloc] init];
a.c; // expected-error {{property 'c' is a class property; did you mean to access it with class 'A'}}
return a.x + A.c;
}
+void customSelectors() {
+ A.customSetterProperty = 1;
+ (void)A.customGetterProperty;
+}
+
void message_id(id me) {
[me y];
}
Index: lib/Sema/SemaExprObjC.cpp
===================================================================
--- lib/Sema/SemaExprObjC.cpp
+++ lib/Sema/SemaExprObjC.cpp
@@ -1984,13 +1984,26 @@
}
}
+ Selector GetterSel;
+ Selector SetterSel;
+ if (auto PD = IFace->FindPropertyDeclaration(
+ &propertyName, ObjCPropertyQueryKind::OBJC_PR_query_class)) {
+ GetterSel = PD->getGetterName();
+ SetterSel = PD->getSetterName();
+ } else {
+ GetterSel = PP.getSelectorTable().getNullarySelector(&propertyName);
+ SetterSel =
+ SelectorTable::constructSetterSelector(PP.getIdentifierTable(),
+ PP.getSelectorTable(),
+ &propertyName);
+ }
+
// Search for a declared property first.
- Selector Sel = PP.getSelectorTable().getNullarySelector(&propertyName);
- ObjCMethodDecl *Getter = IFace->lookupClassMethod(Sel);
+ ObjCMethodDecl *Getter = IFace->lookupClassMethod(GetterSel);
// If this reference is in an @implementation, check for 'private' methods.
if (!Getter)
- Getter = IFace->lookupPrivateClassMethod(Sel);
+ Getter = IFace->lookupPrivateClassMethod(GetterSel);
if (Getter) {
// FIXME: refactor/share with ActOnMemberReference().
@@ -2000,11 +2013,6 @@
}
// Look for the matching setter, in case it is needed.
- Selector SetterSel =
- SelectorTable::constructSetterSelector(PP.getIdentifierTable(),
- PP.getSelectorTable(),
- &propertyName);
-
ObjCMethodDecl *Setter = IFace->lookupClassMethod(SetterSel);
if (!Setter) {
// If this reference is in an @implementation, also check for 'private'
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D29967.88650.patch
Type: text/x-patch
Size: 3091 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170216/4cd4eb2b/attachment.bin>
More information about the cfe-commits
mailing list