forked from OSchip/llvm-project
When provide code completions for a variadic Objective-C method
declaration send or a variadic function call, collapse the ", ..." into the parameter before it, so that we don't get a second placeholder. llvm-svn: 112579
This commit is contained in:
parent
f5d453d067
commit
400f59763b
|
@ -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.
|
||||
|
|
|
@ -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, ...#>)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)}
|
||||
|
|
Loading…
Reference in New Issue