diff options
-rw-r--r-- | lib/Sema/SemaCodeComplete.cpp | 39 | ||||
-rw-r--r-- | test/CodeCompletion/functions.cpp | 2 | ||||
-rw-r--r-- | test/Index/complete-exprs.c | 2 | ||||
-rw-r--r-- | test/Index/complete-objc-message.m | 4 |
4 files changed, 28 insertions, 19 deletions
diff --git a/lib/Sema/SemaCodeComplete.cpp b/lib/Sema/SemaCodeComplete.cpp index 25de61a3f5..cef3546cc1 100644 --- a/lib/Sema/SemaCodeComplete.cpp +++ b/lib/Sema/SemaCodeComplete.cpp @@ -1839,13 +1839,13 @@ static std::string FormatFunctionParameter(ASTContext &Context, if (I) Result += ", "; Result += FormatFunctionParameter(Context, Block->getArg(I)); - } - if (Block->getTypePtr()->isVariadic()) { - if (Block->getNumArgs() > 0) + + if (I == N - 1 && Block->getTypePtr()->isVariadic()) Result += ", ..."; - else - Result += "..."; - } else if (Block->getNumArgs() == 0 && !Context.getLangOptions().CPlusPlus) + } + if (Block->getTypePtr()->isVariadic() && Block->getNumArgs() == 0) + Result += "..."; + else if (Block->getNumArgs() == 0 && !Context.getLangOptions().CPlusPlus) Result += "void"; Result += ")"; @@ -1879,6 +1879,9 @@ static void AddFunctionParameterChunks(ASTContext &Context, // Format the placeholder string. std::string PlaceholderStr = FormatFunctionParameter(Context, Param); + if (Function->isVariadic() && P == N - 1) + PlaceholderStr += ", ..."; + // Add the placeholder string. CCStr->AddPlaceholderChunk(PlaceholderStr); } @@ -1886,7 +1889,8 @@ static void AddFunctionParameterChunks(ASTContext &Context, if (const FunctionProtoType *Proto = Function->getType()->getAs<FunctionProtoType>()) if (Proto->isVariadic()) { - CCStr->AddPlaceholderChunk(", ..."); + if (Proto->getNumArgs() == 0) + CCStr->AddPlaceholderChunk("..."); MaybeAddSentinel(Context, Function, CCStr); } @@ -2198,6 +2202,9 @@ CodeCompletionResult::CreateCodeCompletionString(Sema &S, Arg += II->getName().str(); } + if (Method->isVariadic() && (P + 1) == PEnd) + Arg += ", ..."; + if (DeclaringEntity) Result->AddTextChunk(Arg); else if (AllParametersAreInformative) @@ -2207,12 +2214,14 @@ CodeCompletionResult::CreateCodeCompletionString(Sema &S, } if (Method->isVariadic()) { - if (DeclaringEntity) - Result->AddTextChunk(", ..."); - else if (AllParametersAreInformative) - Result->AddInformativeChunk(", ..."); - else - Result->AddPlaceholderChunk(", ..."); + if (Method->param_size() == 0) { + if (DeclaringEntity) + Result->AddTextChunk(", ..."); + else if (AllParametersAreInformative) + Result->AddInformativeChunk(", ..."); + else + Result->AddPlaceholderChunk(", ..."); + } MaybeAddSentinel(S.Context, Method, Result); } @@ -4955,14 +4964,14 @@ void Sema::CodeCompleteObjCMethodDecl(Scope *S, Pattern->AddChunk(CodeCompletionString::CK_RightParen); if (IdentifierInfo *Id = (*P)->getIdentifier()) - Pattern->AddTextChunk(Id->getName()); + Pattern->AddTextChunk(Id->getName()); } if (Method->isVariadic()) { if (Method->param_size() > 0) Pattern->AddChunk(CodeCompletionString::CK_Comma); Pattern->AddTextChunk("..."); - } + } if (IsInImplementation && Results.includeCodePatterns()) { // We will be defining the method here, so add a compound statement. diff --git a/test/CodeCompletion/functions.cpp b/test/CodeCompletion/functions.cpp index 6838de36e8..fcab3dcbe1 100644 --- a/test/CodeCompletion/functions.cpp +++ b/test/CodeCompletion/functions.cpp @@ -5,4 +5,4 @@ void test() { :: // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:5:5 %s -o - | FileCheck -check-prefix=CC1 %s // CHECK-CC1: f(<#int i#>{#, <#int j#>{#, <#int k#>#}#}) - // CHECK-CC1: f(<#float x#>, <#float y#><#, ...#>) + // CHECK-CC1: f(<#float x#>, <#float y, ...#>) diff --git a/test/Index/complete-exprs.c b/test/Index/complete-exprs.c index 35fe40405e..2a7a1e2121 100644 --- a/test/Index/complete-exprs.c +++ b/test/Index/complete-exprs.c @@ -48,6 +48,6 @@ void f4(const char* str) { // CHECK-CC4: VarDecl:{ResultType struct X}{TypedText f1} (50) (deprecated) // RUN: c-index-test -code-completion-at=%s:19:3 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC6 %s -// CHECK-CC6: FunctionDecl:{ResultType void}{TypedText f3}{LeftParen (}{Placeholder char const *}{Placeholder , ...}{Text , NULL}{RightParen )} (45) +// CHECK-CC6: FunctionDecl:{ResultType void}{TypedText f3}{LeftParen (}{Placeholder char const *, ...}{Text , NULL}{RightParen )} (45) // CHECK-CC6: NotImplemented:{TypedText void} (65) // CHECK-CC6: NotImplemented:{TypedText volatile} (65) diff --git a/test/Index/complete-objc-message.m b/test/Index/complete-objc-message.m index 58445f37bb..f9d671037b 100644 --- a/test/Index/complete-objc-message.m +++ b/test/Index/complete-objc-message.m @@ -182,8 +182,8 @@ void test_ranking(B *b) { // CHECK-CCA: {ResultType Class}{TypedText self} // CHECK-CCA: {TypedText super} // RUN: c-index-test -code-completion-at=%s:103:6 %s | FileCheck -check-prefix=CHECK-CCB %s -// CHECK-CCB: ObjCInstanceMethodDecl:{ResultType int}{TypedText Method:}{Placeholder (int)}{Placeholder , ...} -// CHECK-CCB: ObjCInstanceMethodDecl:{ResultType int}{TypedText SentinelMethod:}{Placeholder (int)}{Placeholder , ...}{Text , nil} +// CHECK-CCB: ObjCInstanceMethodDecl:{ResultType int}{TypedText Method:}{Placeholder (int), ...} +// CHECK-CCB: ObjCInstanceMethodDecl:{ResultType int}{TypedText SentinelMethod:}{Placeholder (int), ...}{Text , nil} // RUN: c-index-test -code-completion-at=%s:116:14 %s | FileCheck -check-prefix=CHECK-CCC %s // CHECK-CCC: ObjCClassMethodDecl:{ResultType int}{TypedText Method} // CHECK-CCC: ObjCClassMethodDecl:{ResultType int}{TypedText Method:}{Placeholder (int)} |