From: Douglas Gregor Date: Sat, 30 Jul 2011 08:17:44 +0000 (+0000) Subject: When producing code completion results for variadic macros, fold the X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e42447021239015db97202fb04c304d82e84135f;p=clang When producing code completion results for variadic macros, fold the variadic bit (", ..." or ", args...") into the prior placeholder, like we do with functions and methods. Fixes . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@136563 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaCodeComplete.cpp b/lib/Sema/SemaCodeComplete.cpp index 15a54f8d0a..9f5befd96e 100644 --- a/lib/Sema/SemaCodeComplete.cpp +++ b/lib/Sema/SemaCodeComplete.cpp @@ -2368,19 +2368,24 @@ CodeCompletionResult::CreateCodeCompletionString(Sema &S, // Format a function-like macro with placeholders for the arguments. Result.AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); - for (MacroInfo::arg_iterator A = MI->arg_begin(), AEnd = MI->arg_end(); - A != AEnd; ++A) { + bool CombineVariadicArgument = false; + MacroInfo::arg_iterator A = MI->arg_begin(), AEnd = MI->arg_end(); + if (MI->isVariadic() && AEnd - A > 1) { + AEnd -= 2; + CombineVariadicArgument = true; + } + for (MacroInfo::arg_iterator A = MI->arg_begin(); A != AEnd; ++A) { if (A != MI->arg_begin()) Result.AddChunk(Chunk(CodeCompletionString::CK_Comma)); - if (!MI->isVariadic() || A != AEnd - 1) { + if (!MI->isVariadic() || A + 1 != AEnd) { // Non-variadic argument. Result.AddPlaceholderChunk( Result.getAllocator().CopyString((*A)->getName())); continue; } - // Variadic argument; cope with the different between GNU and C99 + // Variadic argument; cope with the difference between GNU and C99 // variadic macros, providing a single placeholder for the rest of the // arguments. if ((*A)->isStr("__VA_ARGS__")) @@ -2391,6 +2396,18 @@ CodeCompletionResult::CreateCodeCompletionString(Sema &S, Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg)); } } + + if (CombineVariadicArgument) { + // Handle the next-to-last argument, combining it with the variadic + // argument. + std::string LastArg = (*A)->getName(); + ++A; + if ((*A)->isStr("__VA_ARGS__")) + LastArg += ", ..."; + else + LastArg += ", " + (*A)->getName().str() + "..."; + Result.AddPlaceholderChunk(Result.getAllocator().CopyString(LastArg)); + } Result.AddChunk(Chunk(CodeCompletionString::CK_RightParen)); return Result.TakeString(); } diff --git a/test/Index/complete-macros.c b/test/Index/complete-macros.c index eff42cad75..f1c1346a7d 100644 --- a/test/Index/complete-macros.c +++ b/test/Index/complete-macros.c @@ -15,6 +15,15 @@ void f2() { g(nil); } +#define variadic1(...) +#define variadic2(args...) +#define variadic3(args, ...) +#define variadic4(first, second, args, ...) + +void test_variadic() { + +} + // RUN: c-index-test -code-completion-at=%s:7:1 %s | FileCheck -check-prefix=CHECK-CC1 %s // RUN: env CINDEXTEST_EDITING=1 CINDEXTEST_COMPLETION_CACHING=1 c-index-test -code-completion-at=%s:7:1 %s | FileCheck -check-prefix=CHECK-CC1 %s // CHECK-CC1: macro definition:{TypedText FOO}{LeftParen (}{Placeholder Arg1}{Comma , }{Placeholder Arg2}{RightParen )} @@ -25,3 +34,8 @@ void f2() { // RUN: c-index-test -code-completion-at=%s:15:5 %s | FileCheck -check-prefix=CHECK-CC3 %s // RUN: env CINDEXTEST_EDITING=1 CINDEXTEST_COMPLETION_CACHING=1 c-index-test -code-completion-at=%s:15:5 %s | FileCheck -check-prefix=CHECK-CC3 %s // CHECK-CC3: macro definition:{TypedText nil} (65) +// RUN: env CINDEXTEST_EDITING=1 CINDEXTEST_COMPLETION_CACHING=1 c-index-test -code-completion-at=%s:24:2 %s | FileCheck -check-prefix=CHECK-VARIADIC %s +// CHECK-VARIADIC: macro definition:{TypedText variadic1}{LeftParen (}{Placeholder ...}{RightParen )} (70) +// CHECK-VARIADIC: macro definition:{TypedText variadic2}{LeftParen (}{Placeholder args...}{RightParen )} (70) +// CHECK-VARIADIC: macro definition:{TypedText variadic3}{LeftParen (}{Placeholder args, ...}{RightParen )} (70) +// CHECK-VARIADIC: macro definition:{TypedText variadic4}{LeftParen (}{Placeholder first}{Comma , }{Placeholder second...}{Placeholder first, second...}{RightParen )} (70)