From: Douglas Gregor Date: Tue, 7 Jul 2015 06:20:27 +0000 (+0000) Subject: [libclang] Replace ObjC generic parameters when code-completing method implementations. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=490a031b05b269e7834ce8df8c6d25c11a90e261;p=clang [libclang] Replace ObjC generic parameters when code-completing method implementations. rdar://20643768 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241559 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h index 7262253115..ad037acbdf 100644 --- a/include/clang/AST/DeclObjC.h +++ b/include/clang/AST/DeclObjC.h @@ -333,9 +333,7 @@ public: /// \brief Determine the type of an expression that sends a message to this /// function. - QualType getSendResultType() const { - return getReturnType().getNonLValueExprType(getASTContext()); - } + QualType getSendResultType() const; /// Determine the type of an expression that sends a message to this /// function with the given receiver type. diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp index b540e37cd0..11a66c9c8c 100644 --- a/lib/AST/DeclObjC.cpp +++ b/lib/AST/DeclObjC.cpp @@ -1022,6 +1022,12 @@ SourceRange ObjCMethodDecl::getReturnTypeSourceRange() const { return SourceRange(); } +QualType ObjCMethodDecl::getSendResultType() const { + ASTContext &Ctx = getASTContext(); + return getReturnType().getNonLValueExprType(Ctx) + .substObjCTypeArgs(Ctx, {}, ObjCSubstitutionContext::Result); +} + QualType ObjCMethodDecl::getSendResultType(QualType receiverType) const { // FIXME: Handle related result types here. diff --git a/lib/Sema/SemaCodeComplete.cpp b/lib/Sema/SemaCodeComplete.cpp index 7d898d8ac1..252e30563e 100644 --- a/lib/Sema/SemaCodeComplete.cpp +++ b/lib/Sema/SemaCodeComplete.cpp @@ -7076,7 +7076,8 @@ void Sema::CodeCompleteObjCMethodDecl(Scope *S, // If the result type was not already provided, add it to the // pattern as (type). if (ReturnType.isNull()) - AddObjCPassingTypeChunk(Method->getReturnType(), + AddObjCPassingTypeChunk(Method->getSendResultType() + .stripObjCKindOfType(Context), Method->getObjCDeclQualifier(), Context, Policy, Builder); @@ -7107,6 +7108,8 @@ void Sema::CodeCompleteObjCMethodDecl(Scope *S, ParamType = (*P)->getType(); else ParamType = (*P)->getOriginalType(); + ParamType = ParamType.substObjCTypeArgs(Context, {}, + ObjCSubstitutionContext::Parameter); AddObjCPassingTypeChunk(ParamType, (*P)->getObjCDeclQualifier(), Context, Policy, diff --git a/test/Index/complete-parameterized-classes.m b/test/Index/complete-parameterized-classes.m index 978f42b400..c7d273ac1e 100644 --- a/test/Index/complete-parameterized-classes.m +++ b/test/Index/complete-parameterized-classes.m @@ -11,7 +11,7 @@ } -(U)getit:(T)val; -(void)apply:(void(^)(T, U))block; --(void)apply2:(void(^__nonnull)(T, U))block; +-(void)apply2:(void(^_Nonnull)(T, U))block; @property (strong) T prop; @end @@ -33,6 +33,10 @@ void test2(Test *obj) { obj->; } +@implementation Test +-(id)getit:(id)val {} +@end + // RUN: c-index-test -code-completion-at=%s:25:8 %s | FileCheck -check-prefix=CHECK-CC0 %s // CHECK-CC0: ObjCInstanceMethodDecl:{ResultType void}{TypedText apply2:}{Placeholder ^(MyClsA *, MyClsB *)block} (35) // CHECK-CC0: ObjCInstanceMethodDecl:{ResultType void}{TypedText apply:}{Placeholder ^(MyClsA *, MyClsB *)block} (35) @@ -54,3 +58,9 @@ void test2(Test *obj) { // RUN: c-index-test -code-completion-at=%s:33:8 %s | FileCheck -check-prefix=CHECK-CC5 %s // CHECK-CC5: ObjCIvarDecl:{ResultType __kindof NSObject *}{TypedText myVar} (35) + +// RUN: c-index-test -code-completion-at=%s:37:2 %s | FileCheck -check-prefix=CHECK-CC6 %s +// CHECK-CC6: ObjCInstanceMethodDecl:{LeftParen (}{Text void}{RightParen )}{TypedText apply2}{TypedText :}{LeftParen (}{Text void (^ _Nonnull)(id, NSObject *)}{RightParen )}{Text block} (40) +// CHECK-CC6: ObjCInstanceMethodDecl:{LeftParen (}{Text void}{RightParen )}{TypedText apply}{TypedText :}{LeftParen (}{Text void (^)(id, NSObject *)}{RightParen )}{Text block} (40) +// CHECK-CC6: ObjCInstanceMethodDecl:{LeftParen (}{Text NSObject *}{RightParen )}{TypedText getit}{TypedText :}{LeftParen (}{Text id}{RightParen )}{Text val} (40) +// CHECK-CC6: ObjCInstanceMethodDecl:{LeftParen (}{Text id}{RightParen )}{TypedText prop} (40)