forked from OSchip/llvm-project
[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:
parent
a9fcc1d2a4
commit
06cfa99268
|
@ -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;
|
||||
|
||||
// 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);
|
||||
|
||||
|
||||
if (const ObjCObjectPointerType *ObjCPtr =
|
||||
BaseType->getAsObjCInterfacePointerType()) {
|
||||
// Add property results based on our interface.
|
||||
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()) ||
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue