summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-08-31 05:13:43 +0000
committerDouglas Gregor <dgregor@apple.com>2010-08-31 05:13:43 +0000
commit400f59763b701164bf1e18bc626a2d0ce4816d19 (patch)
treeed921737eb3dfe133854d8ca90f625c98961b883 /clang/lib
parentf5d453d067df9020d04a0c823712468e7a30269d (diff)
downloadbcm5719-llvm-400f59763b701164bf1e18bc626a2d0ce4816d19.tar.gz
bcm5719-llvm-400f59763b701164bf1e18bc626a2d0ce4816d19.zip
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
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Sema/SemaCodeComplete.cpp39
1 files changed, 24 insertions, 15 deletions
diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp
index 25de61a3f56..cef3546cc10 100644
--- a/clang/lib/Sema/SemaCodeComplete.cpp
+++ b/clang/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.
OpenPOWER on IntegriCloud