[CodeCompletion] Show protocol properties that are accessed through qualified id

This commit improves code completion for properties that are declared in
Objective-C protocols by making sure that properties show up in completions
when they are accessed through a qualified id.

rdar://24426041

Differential Revision: https://reviews.llvm.org/D25436

llvm-svn: 284007
This commit is contained in:
Alex Lorenz 2016-10-12 11:40:15 +00:00
parent a9fcc1d2a4
commit 06cfa99268
2 changed files with 36 additions and 11 deletions

View File

@ -3720,20 +3720,21 @@ void Sema::CodeCompleteMemberReferenceExpr(Scope *S, Expr *Base,
Results.AddResult(Result("template"));
}
}
} else if (!IsArrow && BaseType->getAsObjCInterfacePointerType()) {
} else if (!IsArrow && BaseType->isObjCObjectPointerType()) {
// Objective-C property reference.
AddedPropertiesSet AddedProperties;
if (const ObjCObjectPointerType *ObjCPtr =
BaseType->getAsObjCInterfacePointerType()) {
// Add property results based on our interface.
const ObjCObjectPointerType *ObjCPtr
= BaseType->getAsObjCInterfacePointerType();
assert(ObjCPtr && "Non-NULL pointer guaranteed above!");
AddObjCProperties(CCContext, ObjCPtr->getInterfaceDecl(), true,
/*AllowNullaryMethods=*/true, CurContext,
AddedProperties, Results);
}
// Add properties from the protocols in a qualified interface.
for (auto *I : ObjCPtr->quals())
for (auto *I : BaseType->getAs<ObjCObjectPointerType>()->quals())
AddObjCProperties(CCContext, I, true, /*AllowNullaryMethods=*/true,
CurContext, AddedProperties, Results);
} else if ((IsArrow && BaseType->isObjCObjectPointerType()) ||

View File

@ -0,0 +1,24 @@
// Note: the run lines follow their respective tests, since line/column
// matter in this test.
@protocol Bar
@property (readonly) int bar;
@end
@protocol Foo <Bar>
@property (nonatomic, readonly) int foo;
- (void)foobar: (int)x;
@end
int getFoo(id object) {
id<Foo> modelObject = (id<Foo>)object;
int foo = modelObject.;
return foo;
}
// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:17:25 %s -o - | FileCheck %s
// CHECK: bar : [#int#]bar
// CHECK: foo : [#int#]foo
// CHECK-NOT: foobar