diff options
author | Douglas Gregor <dgregor@apple.com> | 2012-01-23 15:59:30 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2012-01-23 15:59:30 +0000 |
commit | f5cd27d7eef3fd4021545dd76a1faf7152fda344 (patch) | |
tree | d1faa19acf986601103a00540c7bfba1de659312 | |
parent | f96241dedab95d633f090191c93250b347b84f53 (diff) |
Handle pseudo-object expressions (and any other placeholder
expression) when code-completing member access expressions. Fixes
<rdar://problem/10717172>.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@148703 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaCodeComplete.cpp | 10 | ||||
-rw-r--r-- | test/Index/complete-member-access.m | 17 |
2 files changed, 23 insertions, 4 deletions
diff --git a/lib/Sema/SemaCodeComplete.cpp b/lib/Sema/SemaCodeComplete.cpp index 5a553513b4..623e68b8a5 100644 --- a/lib/Sema/SemaCodeComplete.cpp +++ b/lib/Sema/SemaCodeComplete.cpp @@ -3351,15 +3351,19 @@ static void AddObjCProperties(ObjCContainerDecl *Container, } } -void Sema::CodeCompleteMemberReferenceExpr(Scope *S, Expr *BaseE, +void Sema::CodeCompleteMemberReferenceExpr(Scope *S, Expr *Base, SourceLocation OpLoc, bool IsArrow) { - if (!BaseE || !CodeCompleter) + if (!Base || !CodeCompleter) return; + ExprResult ConvertedBase = PerformMemberExprBaseConversion(Base, IsArrow); + if (ConvertedBase.isInvalid()) + return; + Base = ConvertedBase.get(); + typedef CodeCompletionResult Result; - Expr *Base = static_cast<Expr *>(BaseE); QualType BaseType = Base->getType(); if (IsArrow) { diff --git a/test/Index/complete-member-access.m b/test/Index/complete-member-access.m index 48156d93ff..5e40be1eac 100644 --- a/test/Index/complete-member-access.m +++ b/test/Index/complete-member-access.m @@ -34,6 +34,14 @@ int test_more_props(Sub *s) { return s.myOtherPropLikeThing; } +@interface Other +@property Sub *sub; +@end + +int test_two_levels(Other *other) { + return other.sub.myProp; +} + // RUN: c-index-test -code-completion-at=%s:21:7 %s | FileCheck -check-prefix=CHECK-CC1 %s // CHECK-CC1: ObjCPropertyDecl:{ResultType int}{TypedText prop1} // CHECK-CC1: ObjCPropertyDecl:{ResultType float}{TypedText ProtoProp} @@ -59,4 +67,11 @@ int test_more_props(Sub *s) { // CHECK-CC3-NEXT: Objective-C property access // CHECK-CC3-NEXT: Container Kind: ObjCInterfaceDecl // CHECK-CC3-NEXT: Container is complete -// CHECK-CC3-NEXT: Container USR: c:objc(cs)Sub
\ No newline at end of file +// CHECK-CC3-NEXT: Container USR: c:objc(cs)Sub + +// RUN: c-index-test -code-completion-at=%s:42:20 %s | FileCheck -check-prefix=CHECK-CC4 %s +// CHECK-CC4: ObjCInstanceMethodDecl:{ResultType int}{TypedText myOtherPropLikeThing} (37) +// CHECK-CC4-NEXT: ObjCPropertyDecl:{ResultType int}{TypedText myProp} (35) +// CHECK-CC4-NEXT: ObjCPropertyDecl:{ResultType int}{TypedText prop1} (35) +// CHECK-CC4-NEXT: ObjCPropertyDecl:{ResultType float}{TypedText ProtoProp} (35) + |