forked from OSchip/llvm-project
Objective-C. Patch to allow use of dot syntax on class
objects to fund root class's instance methods. // rdar://16650575 llvm-svn: 206781
This commit is contained in:
parent
b0b7b18e8c
commit
29cdbc6319
|
@ -1762,10 +1762,7 @@ ActOnClassPropertyRefExpr(IdentifierInfo &receiverName,
|
|||
|
||||
// If this reference is in an @implementation, check for 'private' methods.
|
||||
if (!Getter)
|
||||
if (ObjCMethodDecl *CurMeth = getCurMethodDecl())
|
||||
if (ObjCInterfaceDecl *ClassDecl = CurMeth->getClassInterface())
|
||||
if (ObjCImplementationDecl *ImpDecl = ClassDecl->getImplementation())
|
||||
Getter = ImpDecl->getClassMethod(Sel);
|
||||
Getter = IFace->lookupPrivateClassMethod(Sel);
|
||||
|
||||
if (Getter) {
|
||||
// FIXME: refactor/share with ActOnMemberReference().
|
||||
|
@ -1784,10 +1781,7 @@ ActOnClassPropertyRefExpr(IdentifierInfo &receiverName,
|
|||
if (!Setter) {
|
||||
// If this reference is in an @implementation, also check for 'private'
|
||||
// methods.
|
||||
if (ObjCMethodDecl *CurMeth = getCurMethodDecl())
|
||||
if (ObjCInterfaceDecl *ClassDecl = CurMeth->getClassInterface())
|
||||
if (ObjCImplementationDecl *ImpDecl = ClassDecl->getImplementation())
|
||||
Setter = ImpDecl->getClassMethod(SetterSel);
|
||||
Setter = IFace->lookupPrivateClassMethod(SetterSel);
|
||||
}
|
||||
// Look through local category implementations associated with the class.
|
||||
if (!Setter)
|
||||
|
|
|
@ -681,7 +681,8 @@ ExprResult ObjCPropertyOpBuilder::buildGet() {
|
|||
|
||||
// Build a message-send.
|
||||
ExprResult msg;
|
||||
if (Getter->isInstanceMethod() || RefExpr->isObjectReceiver()) {
|
||||
if ((Getter->isInstanceMethod() && !RefExpr->isClassReceiver()) ||
|
||||
RefExpr->isObjectReceiver()) {
|
||||
assert(InstanceReceiver || RefExpr->isSuperReceiver());
|
||||
msg = S.BuildInstanceMessageImplicit(InstanceReceiver, receiverType,
|
||||
GenericLoc, Getter->getSelector(),
|
||||
|
@ -750,7 +751,8 @@ ExprResult ObjCPropertyOpBuilder::buildSet(Expr *op, SourceLocation opcLoc,
|
|||
|
||||
// Build a message-send.
|
||||
ExprResult msg;
|
||||
if (Setter->isInstanceMethod() || RefExpr->isObjectReceiver()) {
|
||||
if ((Setter->isInstanceMethod() && !RefExpr->isClassReceiver()) ||
|
||||
RefExpr->isObjectReceiver()) {
|
||||
msg = S.BuildInstanceMessageImplicit(InstanceReceiver, receiverType,
|
||||
GenericLoc, SetterSelector, Setter,
|
||||
MultiExprArg(args, 1));
|
||||
|
|
|
@ -11,3 +11,46 @@ int main ()
|
|||
return Test.one.two;
|
||||
}
|
||||
|
||||
// rdar://16650575
|
||||
__attribute__((objc_root_class))
|
||||
@interface RootClass {
|
||||
Class isa;
|
||||
}
|
||||
|
||||
@property int property;
|
||||
-(int)method;
|
||||
- (void) setMethod : (int)arg;
|
||||
+(int)classMethod;
|
||||
@end
|
||||
|
||||
@interface Subclass : RootClass @end
|
||||
void Test1() {
|
||||
// now okay
|
||||
(void)RootClass.property;
|
||||
(void)Subclass.property;
|
||||
(void)RootClass.method;
|
||||
(void)Subclass.method;
|
||||
|
||||
RootClass.property = 1;
|
||||
Subclass.property = 2;
|
||||
RootClass.method = 3;
|
||||
Subclass.method = 4;
|
||||
|
||||
// okay
|
||||
(void)RootClass.classMethod;
|
||||
(void)Subclass.classMethod;
|
||||
|
||||
// also okay
|
||||
[RootClass property];
|
||||
[Subclass property];
|
||||
[RootClass method];
|
||||
[Subclass method];
|
||||
[RootClass classMethod];
|
||||
[Subclass classMethod];
|
||||
|
||||
// also okay
|
||||
[RootClass setProperty : 1];
|
||||
[Subclass setProperty : 2];
|
||||
[RootClass setMethod : 3];
|
||||
[Subclass setMethod : 4];
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue