Skip to content

Commit

Permalink
[CodeCompletion] Show protocol properties that are accessed through q…
Browse files Browse the repository at this point in the history
…ualified 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
  • Loading branch information
hyp committed Oct 12, 2016
1 parent a9fcc1d commit 06cfa99
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 11 deletions.
23 changes: 12 additions & 11 deletions clang/lib/Sema/SemaCodeComplete.cpp
Expand Up @@ -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()) ||
Expand Down
24 changes: 24 additions & 0 deletions clang/test/CodeCompletion/objc-protocol-member-access.m
@@ -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

0 comments on commit 06cfa99

Please sign in to comment.