From: Douglas Gregor Date: Mon, 23 Jan 2012 15:59:30 +0000 (+0000) Subject: Handle pseudo-object expressions (and any other placeholder X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f5cd27d7eef3fd4021545dd76a1faf7152fda344;p=clang Handle pseudo-object expressions (and any other placeholder expression) when code-completing member access expressions. Fixes . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@148703 91177308-0d34-0410-b5e6-96231b3b80d8 --- 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(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) +