Author: dgregor
Date: Mon Oct 18 16:05:04 2010
New Revision: 116746

URL: http://llvm.org/viewvc/llvm-project?rev=116746&view=rev
Log:
Introduce code completion results for Objective-C methods, both when
declaring methods and when sending messages to them, by bringing all
of the selector into TypedCheck chunks in the completion result. This
way, we can improve the sorting of these results to account for the
full selector name rather than just the first chunk.

Modified:
    cfe/trunk/lib/Sema/SemaCodeComplete.cpp
    cfe/trunk/test/Index/complete-method-decls.m
    cfe/trunk/test/Index/complete-objc-message.m
    cfe/trunk/tools/libclang/CIndexCodeCompletion.cpp

Modified: cfe/trunk/lib/Sema/SemaCodeComplete.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCodeComplete.cpp?rev=116746&r1=116745&r2=116746&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaCodeComplete.cpp (original)
+++ cfe/trunk/lib/Sema/SemaCodeComplete.cpp Mon Oct 18 16:05:04 2010
@@ -2306,10 +2306,8 @@
         Keyword += ":";
         if (Idx < StartParameter || AllParametersAreInformative)
           Result->AddInformativeChunk(Keyword);
-        else if (Idx == StartParameter)
+        else 
           Result->AddTypedTextChunk(Keyword);
-        else
-          Result->AddTextChunk(Keyword);
       }
       
       // If we're before the starting parameter, skip the placeholder.
@@ -2523,6 +2521,7 @@
   typedef CodeCompletionResult Result;
   
   Results.EnterNewScope();
+  
   for (Preprocessor::macro_iterator M = PP.macro_begin(), 
                                  MEnd = PP.macro_end();
        M != MEnd; ++M) {
@@ -2531,7 +2530,9 @@
                                                    PP.getLangOptions(),
                                                    TargetTypeIsPointer)));
   }
+  
   Results.ExitScope();
+  
 }
 
 static void AddPrettyFunctionResults(const LangOptions &LangOpts, 
@@ -2539,6 +2540,7 @@
   typedef CodeCompletionResult Result;
   
   Results.EnterNewScope();
+  
   Results.AddResult(Result("__PRETTY_FUNCTION__", CCP_Constant));
   Results.AddResult(Result("__FUNCTION__", CCP_Constant));
   if (LangOpts.C99 || LangOpts.CPlusPlus0x)
@@ -5300,11 +5302,11 @@
          P != PEnd; (void)++P, ++I) {
       // Add the part of the selector name.
       if (I == 0)
-        Pattern->AddChunk(CodeCompletionString::CK_Colon);
+        Pattern->AddTypedTextChunk(":");
       else if (I < Sel.getNumArgs()) {
         Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace);
-        Pattern->AddTextChunk(Sel.getIdentifierInfoForSlot(I)->getName());
-        Pattern->AddChunk(CodeCompletionString::CK_Colon);
+        Pattern->AddTypedTextChunk((Sel.getIdentifierInfoForSlot(I)->getName()
+                                    + ":").str());
       } else
         break;
 

Modified: cfe/trunk/test/Index/complete-method-decls.m
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/complete-method-decls.m?rev=116746&r1=116745&r2=116746&view=diff
==============================================================================
--- cfe/trunk/test/Index/complete-method-decls.m (original)
+++ cfe/trunk/test/Index/complete-method-decls.m Mon Oct 18 16:05:04 2010
@@ -64,45 +64,45 @@
 // CHECK-CC1: ObjCInstanceMethodDecl:{LeftParen (}{Text id}{RightParen 
)}{TypedText abc}
 // CHECK-CC1: ObjCInstanceMethodDecl:{LeftParen (}{Text int}{RightParen 
)}{TypedText getInt}
 // CHECK-CC1: ObjCInstanceMethodDecl:{LeftParen (}{Text id}{RightParen 
)}{TypedText getSelf}
-// CHECK-CC1: ObjCInstanceMethodDecl:{LeftParen (}{Text id}{RightParen 
)}{TypedText initWithInt}{Colon :}{LeftParen (}{Text int}{RightParen )}{Text x}
-// CHECK-CC1: ObjCInstanceMethodDecl:{LeftParen (}{Text id}{RightParen 
)}{TypedText initWithTwoInts}{Colon :}{LeftParen (}{Text int}{RightParen 
)}{Text x}{HorizontalSpace  }{Text second}{Colon :}{LeftParen (}{Text 
int}{RightParen )}{Text y}
+// CHECK-CC1: ObjCInstanceMethodDecl:{LeftParen (}{Text id}{RightParen 
)}{TypedText initWithInt}{TypedText :}{LeftParen (}{Text int}{RightParen 
)}{Text x}
+// CHECK-CC1: ObjCInstanceMethodDecl:{LeftParen (}{Text id}{RightParen 
)}{TypedText initWithTwoInts}{TypedText :}{LeftParen (}{Text int}{RightParen 
)}{Text x}{HorizontalSpace  }{TypedText second:}{LeftParen (}{Text 
int}{RightParen )}{Text y}
 // RUN: c-index-test -code-completion-at=%s:17:7 %s | FileCheck 
-check-prefix=CHECK-CC2 %s
 // CHECK-CC2: ObjCInstanceMethodDecl:{TypedText abc}
 // CHECK-CC2-NEXT: ObjCInstanceMethodDecl:{TypedText getSelf}
-// CHECK-CC2: ObjCInstanceMethodDecl:{TypedText initWithInt}{Colon 
:}{LeftParen (}{Text int}{RightParen )}{Text x}
-// CHECK-CC2: ObjCInstanceMethodDecl:{TypedText initWithTwoInts}{Colon 
:}{LeftParen (}{Text int}{RightParen )}{Text x}{HorizontalSpace  }{Text 
second}{Colon :}{LeftParen (}{Text int}{RightParen )}{Text y}
+// CHECK-CC2: ObjCInstanceMethodDecl:{TypedText initWithInt}{TypedText 
:}{LeftParen (}{Text int}{RightParen )}{Text x}
+// CHECK-CC2: ObjCInstanceMethodDecl:{TypedText initWithTwoInts}{TypedText 
:}{LeftParen (}{Text int}{RightParen )}{Text x}{HorizontalSpace  }{TypedText 
second:}{LeftParen (}{Text int}{RightParen )}{Text y}
 // RUN: c-index-test -code-completion-at=%s:24:7 %s | FileCheck 
-check-prefix=CHECK-CC3 %s
 // CHECK-CC3: ObjCInstanceMethodDecl:{TypedText abc}
 // CHECK-CC3-NEXT: ObjCInstanceMethodDecl:{TypedText getSelf}
 // CHECK-CC3: ObjCInstanceMethodDecl:{TypedText init}
-// CHECK-CC3: ObjCInstanceMethodDecl:{TypedText initWithInt}{Colon 
:}{LeftParen (}{Text int}{RightParen )}{Text x}
-// CHECK-CC3: ObjCInstanceMethodDecl:{TypedText initWithTwoInts}{Colon 
:}{LeftParen (}{Text int}{RightParen )}{Text x}{HorizontalSpace  }{Text 
second}{Colon :}{LeftParen (}{Text int}{RightParen )}{Text y}
+// CHECK-CC3: ObjCInstanceMethodDecl:{TypedText initWithInt}{TypedText 
:}{LeftParen (}{Text int}{RightParen )}{Text x}
+// CHECK-CC3: ObjCInstanceMethodDecl:{TypedText initWithTwoInts}{TypedText 
:}{LeftParen (}{Text int}{RightParen )}{Text x}{HorizontalSpace  }{TypedText 
second:}{LeftParen (}{Text int}{RightParen )}{Text y}
 // RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test 
-code-completion-at=%s:33:3 %s | FileCheck -check-prefix=CHECK-CC4 %s
 // CHECK-CC4: ObjCInstanceMethodDecl:{LeftParen (}{Text id}{RightParen 
)}{TypedText abc}{HorizontalSpace  }{LeftBrace {}{VerticalSpace  }{Text 
return}{HorizontalSpace  }{Placeholder expression}{SemiColon ;}{VerticalSpace  
}{RightBrace }} (32)
 // CHECK-CC4: ObjCInstanceMethodDecl:{LeftParen (}{Text int}{RightParen 
)}{TypedText getInt}{HorizontalSpace  }{LeftBrace {}{VerticalSpace
 // CHECK-CC4: ObjCInstanceMethodDecl:{LeftParen (}{Text int}{RightParen 
)}{TypedText getSecondValue}{HorizontalSpace  }{LeftBrace {}{VerticalSpace
 // CHECK-CC4: ObjCInstanceMethodDecl:{LeftParen (}{Text id}{RightParen 
)}{TypedText getSelf}{HorizontalSpace  }{LeftBrace {}{VerticalSpace  }{Text 
return}{HorizontalSpace  }{Placeholder expression}{SemiColon ;}{VerticalSpace  
}{RightBrace }} (30)
-// CHECK-CC4: ObjCInstanceMethodDecl:{LeftParen (}{Text id}{RightParen 
)}{TypedText initWithInt}{Colon :}{LeftParen (}{Text int}{RightParen )}{Text 
x}{HorizontalSpace  }{LeftBrace {}{VerticalSpace
-// CHECK-CC4: ObjCInstanceMethodDecl:{LeftParen (}{Text id}{RightParen 
)}{TypedText initWithTwoInts}{Colon :}{LeftParen (}{Text int}{RightParen 
)}{Text x}{HorizontalSpace  }{Text second}{Colon :}{LeftParen (}{Text 
int}{RightParen )}{Text y}{HorizontalSpace  }{LeftBrace {}{VerticalSpace
-// CHECK-CC4: ObjCInstanceMethodDecl:{LeftParen (}{Text int}{RightParen 
)}{TypedText setValue}{Colon :}{LeftParen (}{Text int}{RightParen )}{Text 
x}{HorizontalSpace  }{LeftBrace {}{VerticalSpace
+// CHECK-CC4: ObjCInstanceMethodDecl:{LeftParen (}{Text id}{RightParen 
)}{TypedText initWithInt}{TypedText :}{LeftParen (}{Text int}{RightParen 
)}{Text x}{HorizontalSpace  }{LeftBrace {}{VerticalSpace
+// CHECK-CC4: ObjCInstanceMethodDecl:{LeftParen (}{Text id}{RightParen 
)}{TypedText initWithTwoInts}{TypedText :}{LeftParen (}{Text int}{RightParen 
)}{Text x}{HorizontalSpace  }{TypedText second:}{LeftParen (}{Text 
int}{RightParen )}{Text y}{HorizontalSpace  }{LeftBrace {}{VerticalSpace
+// CHECK-CC4: ObjCInstanceMethodDecl:{LeftParen (}{Text int}{RightParen 
)}{TypedText setValue}{TypedText :}{LeftParen (}{Text int}{RightParen )}{Text 
x}{HorizontalSpace  }{LeftBrace {}{VerticalSpace
 // RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test 
-code-completion-at=%s:33:8 %s | FileCheck -check-prefix=CHECK-CC5 %s
 // CHECK-CC5: ObjCInstanceMethodDecl:{TypedText getInt}{HorizontalSpace  
}{LeftBrace {}{VerticalSpace
 // CHECK-CC5: ObjCInstanceMethodDecl:{TypedText 
getSecondValue}{HorizontalSpace  }{LeftBrace {}{VerticalSpace
 // CHECK-CC5-NOT: {TypedText getSelf}{HorizontalSpace  }{LeftBrace 
{}{VerticalSpace
-// CHECK-CC5: ObjCInstanceMethodDecl:{TypedText setValue}{Colon :}{LeftParen 
(}{Text int}{RightParen )}{Text x}{HorizontalSpace  }{LeftBrace {}{VerticalSpace
+// CHECK-CC5: ObjCInstanceMethodDecl:{TypedText setValue}{TypedText 
:}{LeftParen (}{Text int}{RightParen )}{Text x}{HorizontalSpace  }{LeftBrace 
{}{VerticalSpace
 // RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test 
-code-completion-at=%s:37:7 %s | FileCheck -check-prefix=CHECK-CC6 %s
 // CHECK-CC6: ObjCInstanceMethodDecl:{TypedText abc}{HorizontalSpace  
}{LeftBrace {}{VerticalSpace 
 // CHECK-CC6: ObjCInstanceMethodDecl:{TypedText getSelf}{HorizontalSpace  
}{LeftBrace {}{VerticalSpace  }{Text return}{HorizontalSpace  }{Placeholder 
expression}{SemiColon ;}{VerticalSpace  }{RightBrace }} (30)
-// CHECK-CC6: ObjCInstanceMethodDecl:{TypedText initWithInt}{Colon 
:}{LeftParen (}{Text int}{RightParen )}{Text x}{HorizontalSpace  }{LeftBrace 
{}{VerticalSpace 
-// CHECK-CC6: ObjCInstanceMethodDecl:{TypedText initWithTwoInts}{Colon 
:}{LeftParen (}{Text int}{RightParen )}{Text x}{HorizontalSpace  }{Text 
second}{Colon :}{LeftParen (}{Text int}{RightParen )}{Text y}{HorizontalSpace  
}{LeftBrace {}{VerticalSpace 
+// CHECK-CC6: ObjCInstanceMethodDecl:{TypedText initWithInt}{TypedText 
:}{LeftParen (}{Text int}{RightParen )}{Text x}{HorizontalSpace  }{LeftBrace 
{}{VerticalSpace 
+// CHECK-CC6: ObjCInstanceMethodDecl:{TypedText initWithTwoInts}{TypedText 
:}{LeftParen (}{Text int}{RightParen )}{Text x}{HorizontalSpace  }{TypedText 
second:}{LeftParen (}{Text int}{RightParen )}{Text y}{HorizontalSpace  
}{LeftBrace {}{VerticalSpace 
 // RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test 
-code-completion-at=%s:42:3 %s | FileCheck -check-prefix=CHECK-CC7 %s
 // CHECK-CC7: ObjCInstanceMethodDecl:{LeftParen (}{Text id}{RightParen 
)}{TypedText abc}{HorizontalSpace  }{LeftBrace {}{VerticalSpace  }{Text 
return}{HorizontalSpace  }{Placeholder expression}{SemiColon ;}{VerticalSpace  
}{RightBrace }} (32)
-// CHECK-CC7: ObjCInstanceMethodDecl:{LeftParen (}{Text id}{RightParen 
)}{TypedText categoryFunction}{Colon :}{LeftParen (}{Text int}{RightParen 
)}{Text x}{HorizontalSpace  }{LeftBrace {}{VerticalSpace 
+// CHECK-CC7: ObjCInstanceMethodDecl:{LeftParen (}{Text id}{RightParen 
)}{TypedText categoryFunction}{TypedText :}{LeftParen (}{Text int}{RightParen 
)}{Text x}{HorizontalSpace  }{LeftBrace {}{VerticalSpace 
 // CHECK-CC7: ObjCInstanceMethodDecl:{LeftParen (}{Text id}{RightParen 
)}{TypedText getSelf}{HorizontalSpace  }{LeftBrace {}{VerticalSpace  }{Text 
return}{HorizontalSpace  }{Placeholder expression}{SemiColon ;}{VerticalSpace  
}{RightBrace }} (32)
 // RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test 
-code-completion-at=%s:52:21 %s | FileCheck -check-prefix=CHECK-CC8 %s
-// CHECK-CC8: ObjCInstanceMethodDecl:{ResultType id}{Informative 
first:}{TypedText second2:}{Text (float)y2}{HorizontalSpace  }{Text 
third:}{Text (double)z} (20)
-// CHECK-CC8: ObjCInstanceMethodDecl:{ResultType void *}{Informative 
first:}{TypedText second3:}{Text (float)y3}{HorizontalSpace  }{Text 
third:}{Text (double)z} (20)
-// CHECK-CC8: ObjCInstanceMethodDecl:{ResultType int}{Informative 
first:}{TypedText second:}{Text (float)y}{HorizontalSpace  }{Text third:}{Text 
(double)z} (5)
+// CHECK-CC8: ObjCInstanceMethodDecl:{ResultType id}{Informative 
first:}{TypedText second2:}{Text (float)y2}{HorizontalSpace  }{TypedText 
third:}{Text (double)z} (20)
+// CHECK-CC8: ObjCInstanceMethodDecl:{ResultType void *}{Informative 
first:}{TypedText second3:}{Text (float)y3}{HorizontalSpace  }{TypedText 
third:}{Text (double)z} (20)
+// CHECK-CC8: ObjCInstanceMethodDecl:{ResultType int}{Informative 
first:}{TypedText second:}{Text (float)y}{HorizontalSpace  }{TypedText 
third:}{Text (double)z} (5)
 // RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test 
-code-completion-at=%s:52:19 %s | FileCheck -check-prefix=CHECK-CC9 %s
 // CHECK-CC9: NotImplemented:{TypedText x} (30)
 // CHECK-CC9: NotImplemented:{TypedText xx} (30)
@@ -110,15 +110,14 @@
 // RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test 
-code-completion-at=%s:52:36 %s | FileCheck -check-prefix=CHECK-CCA %s
 // CHECK-CCA: NotImplemented:{TypedText y2} (30)
 // RUN: c-index-test -code-completion-at=%s:56:3 %s | FileCheck 
-check-prefix=CHECK-CCB %s
-// CHECK-CCB: ObjCInstanceMethodDecl:{LeftParen (}{Text int}{RightParen 
)}{TypedText first}{Colon :}{LeftParen (}{Text int}{RightParen )}{Text 
x}{HorizontalSpace  }{Text second2}{Colon :}{LeftParen (}{Text 
float}{RightParen )}{Text y}{HorizontalSpace  }{Text third}{Colon :}{LeftParen 
(}{Text double}{RightParen )}{Text z} (30)
+// CHECK-CCB: ObjCInstanceMethodDecl:{LeftParen (}{Text int}{RightParen 
)}{TypedText first}{TypedText :}{LeftParen (}{Text int}{RightParen )}{Text 
x}{HorizontalSpace  }{TypedText second2:}{LeftParen (}{Text float}{RightParen 
)}{Text y}{HorizontalSpace  }{TypedText third:}{LeftParen (}{Text 
double}{RightParen )}{Text z} (30)
 // RUN: c-index-test -code-completion-at=%s:56:8 %s | FileCheck 
-check-prefix=CHECK-CCC %s
-// CHECK-CCC: ObjCInstanceMethodDecl:{TypedText first}{Colon :}{LeftParen 
(}{Text int}{RightParen )}{Text x}{HorizontalSpace  }{Text second2}{Colon 
:}{LeftParen (}{Text float}{RightParen )}{Text y}{HorizontalSpace  }{Text 
third}{Colon :}{LeftParen (}{Text double}{RightParen )}{Text z} (30)
+// CHECK-CCC: ObjCInstanceMethodDecl:{TypedText first}{TypedText :}{LeftParen 
(}{Text int}{RightParen )}{Text x}{HorizontalSpace  }{TypedText 
second2:}{LeftParen (}{Text float}{RightParen )}{Text y}{HorizontalSpace  
}{TypedText third:}{LeftParen (}{Text double}{RightParen )}{Text z} (30)
 // RUN: c-index-test -code-completion-at=%s:56:21 %s | FileCheck 
-check-prefix=CHECK-CCD %s
-// FIXME: These results could be more precise.
-// CHECK-CCD: ObjCInstanceMethodDecl:{ResultType id}{Informative 
first:}{TypedText second2:}{Text (float)y2}{HorizontalSpace  }{Text 
third:}{Text (double)z} (20)
-// CHECK-CCD: ObjCInstanceMethodDecl:{ResultType int}{Informative 
first:}{TypedText second2:}{Text (float)y}{HorizontalSpace  }{Text third:}{Text 
(double)z} (5)
-// CHECK-CCD: ObjCInstanceMethodDecl:{ResultType void *}{Informative 
first:}{TypedText second3:}{Text (float)y3}{HorizontalSpace  }{Text 
third:}{Text (double)z} (20)
-// CHECK-CCD: ObjCInstanceMethodDecl:{ResultType int}{Informative 
first:}{TypedText second:}{Text (float)y}{HorizontalSpace  }{Text third:}{Text 
(double)z} (5)
+// CHECK-CCD: ObjCInstanceMethodDecl:{ResultType id}{Informative 
first:}{TypedText second2:}{Text (float)y2}{HorizontalSpace  }{TypedText 
third:}{Text (double)z} (20)
+// CHECK-CCD: ObjCInstanceMethodDecl:{ResultType int}{Informative 
first:}{TypedText second2:}{Text (float)y}{HorizontalSpace  }{TypedText 
third:}{Text (double)z} (5)
+// CHECK-CCD: ObjCInstanceMethodDecl:{ResultType void *}{Informative 
first:}{TypedText second3:}{Text (float)y3}{HorizontalSpace  }{TypedText 
third:}{Text (double)z} (20)
+// CHECK-CCD: ObjCInstanceMethodDecl:{ResultType int}{Informative 
first:}{TypedText second:}{Text (float)y}{HorizontalSpace  }{TypedText 
third:}{Text (double)z} (5)
 // RUN: c-index-test -code-completion-at=%s:56:38 %s | FileCheck 
-check-prefix=CHECK-CCE %s
 // CHECK-CCE: ObjCInstanceMethodDecl:{ResultType id}{Informative 
first:}{Informative second2:}{TypedText third:}{Text (double)z} (20)
 // CHECK-CCE: ObjCInstanceMethodDecl:{ResultType int}{Informative 
first:}{Informative second2:}{TypedText third:}{Text (double)z} (5)

Modified: cfe/trunk/test/Index/complete-objc-message.m
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/complete-objc-message.m?rev=116746&r1=116745&r2=116746&view=diff
==============================================================================
--- cfe/trunk/test/Index/complete-objc-message.m (original)
+++ cfe/trunk/test/Index/complete-objc-message.m Mon Oct 18 16:05:04 2010
@@ -152,7 +152,7 @@
 
 // RUN: c-index-test -code-completion-at=%s:23:19 %s | FileCheck 
-check-prefix=CHECK-CC1 %s
 // CHECK-CC1: {TypedText categoryClassMethod}
-// CHECK-CC1: {TypedText classMethod1:}{Placeholder (id)}{HorizontalSpace  
}{Text withKeyword:}{Placeholder (int)}
+// CHECK-CC1: {TypedText classMethod1:}{Placeholder (id)}{HorizontalSpace  
}{TypedText withKeyword:}{Placeholder (int)}
 // CHECK-CC1: {TypedText classMethod2}
 // CHECK-CC1: {TypedText new}
 // CHECK-CC1: {TypedText protocolClassMethod}
@@ -164,10 +164,10 @@
 // CHECK-CC3: ObjCClassMethodDecl:{ResultType int}{TypedText 
MyClassMethod:}{Placeholder (id)}
 // CHECK-CC3: ObjCClassMethodDecl:{ResultType int}{TypedText MyPrivateMethod}
 // RUN: c-index-test -code-completion-at=%s:65:16 %s | FileCheck 
-check-prefix=CHECK-CC4 %s
-// CHECK-CC4: ObjCInstanceMethodDecl:{ResultType int}{TypedText 
MyInstMethod:}{Placeholder (id)}{HorizontalSpace  }{Text second:}{Placeholder 
(id)}
+// CHECK-CC4: ObjCInstanceMethodDecl:{ResultType int}{TypedText 
MyInstMethod:}{Placeholder (id)}{HorizontalSpace  }{TypedText 
second:}{Placeholder (id)}
 // CHECK-CC4: ObjCInstanceMethodDecl:{ResultType int}{TypedText 
MyPrivateInstMethod}
 // RUN: c-index-test -code-completion-at=%s:74:9 %s | FileCheck 
-check-prefix=CHECK-CC5 %s
-// CHECK-CC5: ObjCInstanceMethodDecl:{ResultType int}{TypedText 
MyInstMethod:}{Placeholder (id)}{HorizontalSpace  }{Text second:}{Placeholder 
(id)}
+// CHECK-CC5: ObjCInstanceMethodDecl:{ResultType int}{TypedText 
MyInstMethod:}{Placeholder (id)}{HorizontalSpace  }{TypedText 
second:}{Placeholder (id)}
 // CHECK-CC5: ObjCInstanceMethodDecl:{ResultType int}{TypedText 
MySubInstMethod}
 // RUN: c-index-test -code-completion-at=%s:82:8 %s | FileCheck 
-check-prefix=CHECK-CC6 %s
 // CHECK-CC6: ObjCInstanceMethodDecl:{ResultType id}{TypedText 
protocolInstanceMethod:}{Placeholder (int)}
@@ -175,15 +175,15 @@
 // RUN: c-index-test -code-completion-at=%s:95:8 %s | FileCheck 
-check-prefix=CHECK-CC7 %s
 // CHECK-CC7: ObjCInstanceMethodDecl:{ResultType int}{TypedText Method}
 // CHECK-CC7: ObjCInstanceMethodDecl:{ResultType int}{TypedText 
Method:}{Placeholder (int)}
-// CHECK-CC7: ObjCInstanceMethodDecl:{ResultType int}{TypedText 
Method:}{Placeholder (float)}{HorizontalSpace  }{Text Arg1:}{Placeholder 
(int)}{HorizontalSpace  }{Text Arg2:}{Placeholder (int)}
-// CHECK-CC7: ObjCInstanceMethodDecl:{ResultType int}{TypedText 
Method:}{Placeholder (float)}{HorizontalSpace  }{Text Arg1:}{Placeholder 
(int)}{HorizontalSpace  }{Text OtherArg:}{Placeholder (id)}
-// CHECK-CC7: ObjCInstanceMethodDecl:{ResultType int}{TypedText 
Method:}{Placeholder (float)}{HorizontalSpace  }{Text SomeArg:}{Placeholder 
(int)}{HorizontalSpace  }{Text OtherArg:}{Placeholder (id)}
-// CHECK-CC7: ObjCInstanceMethodDecl:{ResultType int}{TypedText 
OtherMethod:}{Placeholder (float)}{HorizontalSpace  }{Text Arg1:}{Placeholder 
(int)}{HorizontalSpace  }{Text Arg2:}{Placeholder (int)}
+// CHECK-CC7: ObjCInstanceMethodDecl:{ResultType int}{TypedText 
Method:}{Placeholder (float)}{HorizontalSpace  }{TypedText Arg1:}{Placeholder 
(int)}{HorizontalSpace  }{TypedText Arg2:}{Placeholder (int)}
+// CHECK-CC7: ObjCInstanceMethodDecl:{ResultType int}{TypedText 
Method:}{Placeholder (float)}{HorizontalSpace  }{TypedText Arg1:}{Placeholder 
(int)}{HorizontalSpace  }{TypedText OtherArg:}{Placeholder (id)}
+// CHECK-CC7: ObjCInstanceMethodDecl:{ResultType int}{TypedText 
Method:}{Placeholder (float)}{HorizontalSpace  }{TypedText 
SomeArg:}{Placeholder (int)}{HorizontalSpace  }{TypedText 
OtherArg:}{Placeholder (id)}
+// CHECK-CC7: ObjCInstanceMethodDecl:{ResultType int}{TypedText 
OtherMethod:}{Placeholder (float)}{HorizontalSpace  }{TypedText 
Arg1:}{Placeholder (int)}{HorizontalSpace  }{TypedText Arg2:}{Placeholder (int)}
 // RUN: c-index-test -code-completion-at=%s:95:17 %s | FileCheck 
-check-prefix=CHECK-CC8 %s
+// CHECK-CC8: ObjCInstanceMethodDecl:{ResultType int}{Informative 
Method:}{TypedText Arg1:}{Placeholder (int)}{HorizontalSpace  }{TypedText 
Arg2:}{Placeholder (int)}
+// CHECK-CC8: ObjCInstanceMethodDecl:{ResultType int}{Informative 
Method:}{TypedText Arg1:}{Placeholder (int)}{HorizontalSpace  }{TypedText 
OtherArg:}{Placeholder (id)}
+// CHECK-CC8: ObjCInstanceMethodDecl:{ResultType int}{Informative 
Method:}{TypedText SomeArg:}{Placeholder (int)}{HorizontalSpace  }{TypedText 
OtherArg:}{Placeholder (id)}
 // CHECK-CC8: ObjCInstanceMethodDecl:{ResultType int}{Informative 
Method:}{TypedText }
-// CHECK-CC8: ObjCInstanceMethodDecl:{ResultType int}{Informative 
Method:}{TypedText Arg1:}{Placeholder (int)}{HorizontalSpace  }{Text 
Arg2:}{Placeholder (int)}
-// CHECK-CC8: ObjCInstanceMethodDecl:{ResultType int}{Informative 
Method:}{TypedText Arg1:}{Placeholder (int)}{HorizontalSpace  }{Text 
OtherArg:}{Placeholder (id)}
-// CHECK-CC8: ObjCInstanceMethodDecl:{ResultType int}{Informative 
Method:}{TypedText SomeArg:}{Placeholder (int)}{HorizontalSpace  }{Text 
OtherArg:}{Placeholder (id)}
 // RUN: c-index-test -code-completion-at=%s:95:24 %s | FileCheck 
-check-prefix=CHECK-CC9 %s
 // CHECK-CC9: ObjCInstanceMethodDecl:{ResultType int}{Informative 
Method:}{Informative Arg1:}{TypedText Arg2:}{Placeholder (int)}
 // CHECK-CC9: ObjCInstanceMethodDecl:{ResultType int}{Informative 
Method:}{Informative Arg1:}{TypedText OtherArg:}{Placeholder (id)}
@@ -203,15 +203,15 @@
 // 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)}
-// CHECK-CCC: ObjCClassMethodDecl:{ResultType int}{TypedText 
Method:}{Placeholder (float)}{HorizontalSpace  }{Text Arg1:}{Placeholder 
(int)}{HorizontalSpace  }{Text Arg2:}{Placeholder (int)}
-// CHECK-CCC: ObjCClassMethodDecl:{ResultType int}{TypedText 
Method:}{Placeholder (float)}{HorizontalSpace  }{Text Arg1:}{Placeholder 
(int)}{HorizontalSpace  }{Text OtherArg:}{Placeholder (id)}
-// CHECK-CCC: ObjCClassMethodDecl:{ResultType int}{TypedText 
Method:}{Placeholder (float)}{HorizontalSpace  }{Text SomeArg:}{Placeholder 
(int)}{HorizontalSpace  }{Text OtherArg:}{Placeholder (id)}
-// CHECK-CCC: ObjCClassMethodDecl:{ResultType int}{TypedText 
OtherMethod:}{Placeholder (float)}{HorizontalSpace  }{Text Arg1:}{Placeholder 
(int)}{HorizontalSpace  }{Text Arg2:}{Placeholder (int)}
+// CHECK-CCC: ObjCClassMethodDecl:{ResultType int}{TypedText 
Method:}{Placeholder (float)}{HorizontalSpace  }{TypedText Arg1:}{Placeholder 
(int)}{HorizontalSpace  }{TypedText Arg2:}{Placeholder (int)}
+// CHECK-CCC: ObjCClassMethodDecl:{ResultType int}{TypedText 
Method:}{Placeholder (float)}{HorizontalSpace  }{TypedText Arg1:}{Placeholder 
(int)}{HorizontalSpace  }{TypedText OtherArg:}{Placeholder (id)}
+// CHECK-CCC: ObjCClassMethodDecl:{ResultType int}{TypedText 
Method:}{Placeholder (float)}{HorizontalSpace  }{TypedText 
SomeArg:}{Placeholder (int)}{HorizontalSpace  }{TypedText 
OtherArg:}{Placeholder (id)}
+// CHECK-CCC: ObjCClassMethodDecl:{ResultType int}{TypedText 
OtherMethod:}{Placeholder (float)}{HorizontalSpace  }{TypedText 
Arg1:}{Placeholder (int)}{HorizontalSpace  }{TypedText Arg2:}{Placeholder (int)}
 // RUN: c-index-test -code-completion-at=%s:116:23 %s | FileCheck 
-check-prefix=CHECK-CCD %s
+// CHECK-CCD: ObjCClassMethodDecl:{ResultType int}{Informative 
Method:}{TypedText Arg1:}{Placeholder (int)}{HorizontalSpace  }{TypedText 
Arg2:}{Placeholder (int)}
+// CHECK-CCD: ObjCClassMethodDecl:{ResultType int}{Informative 
Method:}{TypedText Arg1:}{Placeholder (int)}{HorizontalSpace  }{TypedText 
OtherArg:}{Placeholder (id)}
+// CHECK-CCD: ObjCClassMethodDecl:{ResultType int}{Informative 
Method:}{TypedText SomeArg:}{Placeholder (int)}{HorizontalSpace  }{TypedText 
OtherArg:}{Placeholder (id)}
 // CHECK-CCD: ObjCClassMethodDecl:{ResultType int}{Informative 
Method:}{TypedText }
-// CHECK-CCD: ObjCClassMethodDecl:{ResultType int}{Informative 
Method:}{TypedText Arg1:}{Placeholder (int)}{HorizontalSpace  }{Text 
Arg2:}{Placeholder (int)}
-// CHECK-CCD: ObjCClassMethodDecl:{ResultType int}{Informative 
Method:}{TypedText Arg1:}{Placeholder (int)}{HorizontalSpace  }{Text 
OtherArg:}{Placeholder (id)}
-// CHECK-CCD: ObjCClassMethodDecl:{ResultType int}{Informative 
Method:}{TypedText SomeArg:}{Placeholder (int)}{HorizontalSpace  }{Text 
OtherArg:}{Placeholder (id)}
 // RUN: c-index-test -code-completion-at=%s:116:30 %s | FileCheck 
-check-prefix=CHECK-CCE %s
 // CHECK-CCE: ObjCClassMethodDecl:{ResultType int}{Informative 
Method:}{Informative Arg1:}{TypedText Arg2:}{Placeholder (int)}
 // CHECK-CCE: ObjCClassMethodDecl:{ResultType int}{Informative 
Method:}{Informative Arg1:}{TypedText OtherArg:}{Placeholder (id)}
@@ -228,7 +228,7 @@
 // CHECK-CCG: ObjCInstanceMethodDecl:{ResultType id}{TypedText 
categoryInstanceMethod}
 // CHECK-CCG: ObjCInstanceMethodDecl:{ResultType id}{TypedText instanceMethod1}
 // CHECK-CCG: ObjCInstanceMethodDecl:{ResultType int}{TypedText Method}
-// CHECK-CCG: ObjCInstanceMethodDecl:{ResultType int}{TypedText 
MyInstMethod:}{Placeholder (id)}{HorizontalSpace  }{Text second:}{Placeholder 
(id)}
+// CHECK-CCG: ObjCInstanceMethodDecl:{ResultType int}{TypedText 
MyInstMethod:}{Placeholder (id)}{HorizontalSpace  }{TypedText 
second:}{Placeholder (id)}
 // CHECK-CCG: ObjCInstanceMethodDecl:{ResultType int}{TypedText 
MyPrivateInstMethod}
 // CHECK-CCG: ObjCInstanceMethodDecl:{ResultType int}{TypedText 
MySubInstMethod}
 // CHECK-CCG: ObjCInstanceMethodDecl:{ResultType id}{TypedText 
protocolInstanceMethod:}{Placeholder (int)}
@@ -236,7 +236,7 @@
 // RUN: c-index-test -code-completion-at=%s:121:14 %s | FileCheck 
-check-prefix=CHECK-CCG %s
 // RUN: c-index-test -code-completion-at=%s:122:7 %s | FileCheck 
-check-prefix=CHECK-CCH %s
 // CHECK-CCH: ObjCClassMethodDecl:{ResultType id}{TypedText 
categoryClassMethod}
-// CHECK-CCH: ObjCClassMethodDecl:{ResultType int}{TypedText 
classMethod1:}{Placeholder (id)}{HorizontalSpace  }{Text 
withKeyword:}{Placeholder (int)}
+// CHECK-CCH: ObjCClassMethodDecl:{ResultType int}{TypedText 
classMethod1:}{Placeholder (id)}{HorizontalSpace  }{TypedText 
withKeyword:}{Placeholder (int)}
 // CHECK-CCH: ObjCClassMethodDecl:{ResultType void}{TypedText classMethod2}
 // CHECK-CCH: ObjCClassMethodDecl:{ResultType int}{TypedText Method}
 // CHECK-CCH: ObjCClassMethodDecl:{ResultType int}{TypedText 
Method:}{Placeholder (int)}
@@ -245,7 +245,7 @@
 // CHECK-CCH: ObjCClassMethodDecl:{ResultType int}{TypedText MySubClassMethod}
 // CHECK-CCH: ObjCClassMethodDecl:{ResultType int}{TypedText 
MySubPrivateMethod}
 // CHECK-CCH: ObjCClassMethodDecl:{ResultType id}{TypedText new}
-// CHECK-CCH: ObjCClassMethodDecl:{ResultType int}{TypedText 
OtherMethod:}{Placeholder (float)}{HorizontalSpace  }{Text Arg1:}{Placeholder 
(int)}{HorizontalSpace  }{Text Arg2:}{Placeholder (int)}
+// CHECK-CCH: ObjCClassMethodDecl:{ResultType int}{TypedText 
OtherMethod:}{Placeholder (float)}{HorizontalSpace  }{TypedText 
Arg1:}{Placeholder (int)}{HorizontalSpace  }{TypedText Arg2:}{Placeholder (int)}
 // CHECK-CCH: ObjCClassMethodDecl:{ResultType id}{TypedText 
protocolClassMethod}
 // RUN: c-index-test -code-completion-at=%s:134:6 %s | FileCheck 
-check-prefix=CHECK-CCI %s
 // CHECK-CCI: ObjCInstanceMethodDecl:{ResultType void}{TypedText method1} (22)

Modified: cfe/trunk/tools/libclang/CIndexCodeCompletion.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndexCodeCompletion.cpp?rev=116746&r1=116745&r2=116746&view=diff
==============================================================================
--- cfe/trunk/tools/libclang/CIndexCodeCompletion.cpp (original)
+++ cfe/trunk/tools/libclang/CIndexCodeCompletion.cpp Mon Oct 18 16:05:04 2010
@@ -523,6 +523,49 @@
 
 } // end extern "C"
 
+/// \brief Simple utility function that appends a \p New string to the given
+/// \p Old string, using the \p Buffer for storage.
+///
+/// \param Old The string to which we are appending. This parameter will be
+/// updated to reflect the complete string.
+///
+///
+/// \param New The string to append to \p Old.
+///
+/// \param Buffer A buffer that stores the actual, concatenated string. It will
+/// be used if the old string is already-non-empty.
+static void AppendToString(llvm::StringRef &Old, llvm::StringRef New,
+                           llvm::SmallString<256> &Buffer) {
+  if (Old.empty()) {
+    Old = New;
+    return;
+  }
+  
+  if (Buffer.empty())
+    Buffer.append(Old.begin(), Old.end());
+  Buffer.append(New.begin(), New.end());
+  Old = Buffer.str();
+}
+
+/// \brief Get the typed-text blocks from the given code-completion string
+/// and return them as a single string.
+///
+/// \param String The code-completion string whose typed-text blocks will be
+/// concatenated.
+///
+/// \param Buffer A buffer used for storage of the completed name.
+static llvm::StringRef GetTypedName(CodeCompletionString *String,
+                                    llvm::SmallString<256> &Buffer) {
+  llvm::StringRef Result;
+  for (CodeCompletionString::iterator C = String->begin(), CEnd = 
String->end();
+       C != CEnd; ++C) {
+    if (C->Kind == CodeCompletionString::CK_TypedText)
+      AppendToString(Result, C->Text, Buffer);
+  }
+  
+  return Result;
+}
+
 namespace {
   struct OrderCompletionResults {
     bool operator()(const CXCompletionResult &XR, 
@@ -532,18 +575,21 @@
       CXStoredCodeCompletionString *Y
         = (CXStoredCodeCompletionString *)YR.CompletionString;
       
-      const char *XText = X->getTypedText();
-      const char *YText = Y->getTypedText();
-      if (!XText || !YText)
-        return XText != 0;
+      llvm::SmallString<256> XBuffer;
+      llvm::StringRef XText = GetTypedName(X, XBuffer);
+      llvm::SmallString<256> YBuffer;      
+      llvm::StringRef YText = GetTypedName(Y, YBuffer);
       
-      int result = llvm::StringRef(XText).compare_lower(YText);
+      if (XText.empty() || YText.empty())
+        return !XText.empty();
+            
+      int result = XText.compare_lower(YText);
       if (result < 0)
         return true;
       if (result > 0)
         return false;
       
-      result = llvm::StringRef(XText).compare(YText);
+      result = XText.compare(YText);
       return result < 0;
     }
   };


_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to