]> granicus.if.org Git - clang/commitdiff
When provide code completions for a variadic Objective-C method
authorDouglas Gregor <dgregor@apple.com>
Tue, 31 Aug 2010 05:13:43 +0000 (05:13 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 31 Aug 2010 05:13:43 +0000 (05:13 +0000)
declaration send or a variadic function call, collapse the ", ..."
into the parameter before it, so that we don't get a second
placeholder.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@112579 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaCodeComplete.cpp
test/CodeCompletion/functions.cpp
test/Index/complete-exprs.c
test/Index/complete-objc-message.m

index 25de61a3f56a85b0d362475c8dc4004ee5622ab4..cef3546cc10b6dc48f4ce2fb3da1f19b93903c37 100644 (file)
@@ -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.
index 6838de36e84645e58bc2c5f4b5bf562a1b25d7d8..fcab3dcbe12080b0a6cf42fa031d23da13644dc0 100644 (file)
@@ -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, ...#>)
index 35fe40405ee8f1a8d89abbb00e0e034bd5491d2d..2a7a1e2121220c420e9907d6959ba1fd770b5d25 100644 (file)
@@ -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)
index 58445f37bbce175e14da6154f36fd34ad1ec15a3..f9d671037ba5a1c35a7c5e2ebb1abb825132a43d 100644 (file)
@@ -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)}