From: Douglas Gregor Date: Sat, 2 Oct 2010 23:49:58 +0000 (+0000) Subject: When providing a block literal as a code completion for a X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c2760bc8e99510c4b3848fcd21323afd711ee269;p=clang When providing a block literal as a code completion for a function/method argument, include the parameter name and always include parentheses (even for zero-parameter blocks). Otherwise, the block literal placeholder '^' can look very weird. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@115444 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaCodeComplete.cpp b/lib/Sema/SemaCodeComplete.cpp index 64a96dbff7..ae82ceb334 100644 --- a/lib/Sema/SemaCodeComplete.cpp +++ b/lib/Sema/SemaCodeComplete.cpp @@ -1910,6 +1910,8 @@ static std::string FormatFunctionParameter(ASTContext &Context, if (Block->getNumArgs() == 0) { if (Block->getTypePtr()->isVariadic()) Result += "(...)"; + else + Result += "(void)"; } else { Result += "("; for (unsigned I = 0, N = Block->getNumArgs(); I != N; ++I) { @@ -1923,6 +1925,9 @@ static std::string FormatFunctionParameter(ASTContext &Context, Result += ")"; } + if (Param->getIdentifier()) + Result += Param->getIdentifier()->getName(); + return Result; } diff --git a/test/Index/complete-blocks.m b/test/Index/complete-blocks.m index 281b5e63f0..61e363e375 100644 --- a/test/Index/complete-blocks.m +++ b/test/Index/complete-blocks.m @@ -25,11 +25,21 @@ void test_B(B *b) { [b method3:^int(void){ return 0; }]; } +@interface C +- method4:(void(^)(void))arg { }; +@end + +void test_C(C *c) { + [c method4:^{}]; +} + // RUN: c-index-test -code-completion-at=%s:8:1 %s | FileCheck -check-prefix=CHECK-CC1 %s -// CHECK-CC1: FunctionDecl:{ResultType void}{TypedText f}{LeftParen (}{Placeholder ^int(int x, int y)}{RightParen )} (50) -// CHECK-CC1: FunctionDecl:{ResultType void}{TypedText g}{LeftParen (}{Placeholder ^(float f, double d)}{RightParen )} (50) +// CHECK-CC1: FunctionDecl:{ResultType void}{TypedText f}{LeftParen (}{Placeholder ^int(int x, int y)block}{RightParen )} (50) +// CHECK-CC1: FunctionDecl:{ResultType void}{TypedText g}{LeftParen (}{Placeholder ^(float f, double d)b}{RightParen )} (50) // RUN: c-index-test -code-completion-at=%s:17:6 %s | FileCheck -check-prefix=CHECK-CC2 %s -// CHECK-CC2: ObjCInstanceMethodDecl:{ResultType id}{TypedText method2:}{Placeholder ^(float f, double d)} (20) -// CHECK-CC2: ObjCInstanceMethodDecl:{ResultType id}{TypedText method:}{Placeholder ^int(int x, int y)} (20) +// CHECK-CC2: ObjCInstanceMethodDecl:{ResultType id}{TypedText method2:}{Placeholder ^(float f, double d)b} (20) +// CHECK-CC2: ObjCInstanceMethodDecl:{ResultType id}{TypedText method:}{Placeholder ^int(int x, int y)b} (20) // RUN: c-index-test -code-completion-at=%s:25:6 %s | FileCheck -check-prefix=CHECK-CC3 %s -// CHECK-CC3: ObjCInstanceMethodDecl:{ResultType id}{TypedText method3:}{Placeholder ^int} (20) +// CHECK-CC3: ObjCInstanceMethodDecl:{ResultType id}{TypedText method3:}{Placeholder ^int(void)b} (20) +// RUN: c-index-test -code-completion-at=%s:33:6 %s | FileCheck -check-prefix=CHECK-CC4 %s +// CHECK-CC4: ObjCInstanceMethodDecl:{ResultType id}{TypedText method4:}{Placeholder ^(void)arg} (20)