]> granicus.if.org Git - clang/commitdiff
Add new libclang API, clang_codeCompleteGetObjCSelector(), which
authorDouglas Gregor <dgregor@apple.com>
Tue, 26 Jul 2011 15:24:30 +0000 (15:24 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 26 Jul 2011 15:24:30 +0000 (15:24 +0000)
provides the partial Objective-C selector used in a code
completion. From Connor Wakamo!

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

include/clang-c/Index.h
include/clang/Sema/CodeCompleteConsumer.h
lib/Sema/SemaCodeComplete.cpp
test/Index/complete-objc-message.m
tools/c-index-test/c-index-test.c
tools/libclang/CIndexCodeCompletion.cpp
tools/libclang/libclang.darwin.exports
tools/libclang/libclang.exports

index d4fa9a2453e24cee6266c06b847aa0eda727d798..0a73a644a3ddb7190812fca598cef74b1fe58a4b 100644 (file)
@@ -3234,6 +3234,21 @@ enum CXCursorKind clang_codeCompleteGetContainerKind(
 CINDEX_LINKAGE
 CXString clang_codeCompleteGetContainerUSR(CXCodeCompleteResults *Results);
   
+  
+/**
+ * \brief Returns the currently-entered selector for an Objective-C message
+ * send, formatted like "initWithFoo:bar:". Only guaranteed to return a
+ * non-empty string for CXCompletionContext_ObjCInstanceMessage and
+ * CXCompletionContext_ObjCClassMessage.
+ *
+ * \param Results the code completion results to query
+ *
+ * \returns the selector (or partial selector) that has been entered thus far
+ * for an Objective-C message send.
+ */
+CINDEX_LINKAGE
+CXString clang_codeCompleteGetObjCSelector(CXCodeCompleteResults *Results);
+  
 /**
  * @}
  */
index 9b5564853c24ce21c62dbe4eda7f26cb85064af9..8c7a00280b546bfaeb51dba354ec0162fa6d8896 100644 (file)
@@ -268,12 +268,23 @@ private:
   /// \brief The type of the base object in a member access expression.
   QualType BaseType;
   
+  /// \brief The identifiers for Objective-C selector parts.
+  IdentifierInfo **SelIdents;
+  
+  /// \brief The number of Objective-C selector parts.
+  unsigned NumSelIdents;
+  
 public:
   /// \brief Construct a new code-completion context of the given kind.
-  CodeCompletionContext(enum Kind Kind) : Kind(Kind) { }
+  CodeCompletionContext(enum Kind Kind) : Kind(Kind), SelIdents(NULL), 
+                                          NumSelIdents(0) { }
   
   /// \brief Construct a new code-completion context of the given kind.
-  CodeCompletionContext(enum Kind Kind, QualType T) : Kind(Kind) { 
+  CodeCompletionContext(enum Kind Kind, QualType T,
+                        IdentifierInfo **SelIdents = NULL,
+                        unsigned NumSelIdents = 0) : Kind(Kind),
+                                                     SelIdents(SelIdents),
+                                                    NumSelIdents(NumSelIdents) { 
     if (Kind == CCC_DotMemberAccess || Kind == CCC_ArrowMemberAccess ||
         Kind == CCC_ObjCPropertyAccess || Kind == CCC_ObjCClassMessage ||
         Kind == CCC_ObjCInstanceMessage)
@@ -293,6 +304,12 @@ public:
   /// \brief Retrieve the type of the base object in a member-access 
   /// expression.
   QualType getBaseType() const { return BaseType; }
+  
+  /// \brief Retrieve the Objective-C selector identifiers.
+  IdentifierInfo **getSelIdents() const { return SelIdents; }
+  
+  /// \brief Retrieve the number of Objective-C selector identifiers.
+  unsigned getNumSelIdents() const { return NumSelIdents; }
 
   /// \brief Determines whether we want C++ constructors as results within this
   /// context.
index a60fafe29c40755b52e435c684a48b4e6808e623..01e95174e2cd4e96b986600fbd5c6b908c5e1d16 100644 (file)
@@ -4960,7 +4960,7 @@ void Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver,
   
   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
               CodeCompletionContext(CodeCompletionContext::CCC_ObjCClassMessage,
-                                    T));
+                                    T, SelIdents, NumSelIdents));
     
   AddClassMessageCompletions(*this, S, Receiver, SelIdents, NumSelIdents, 
                              AtArgumentExpression, IsSuper, Results);
@@ -5025,7 +5025,7 @@ void Sema::CodeCompleteObjCInstanceMessage(Scope *S, ExprTy *Receiver,
   // Build the set of methods we can see.
   ResultBuilder Results(*this, CodeCompleter->getAllocator(),
            CodeCompletionContext(CodeCompletionContext::CCC_ObjCInstanceMessage,
-                                 ReceiverType));
+                                 ReceiverType, SelIdents, NumSelIdents));
   
   Results.EnterNewScope();
 
index e80243a3005729a070f3a2a8c1f5ebd1c55e66f1..7477f3f09ac23072b858e19a989691c6148b72b9 100644 (file)
@@ -228,6 +228,7 @@ void test_block_invoke(A *(^block1)(int),
 // 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)}
+// CHECK-CC9: Objective-C selector: Method:Arg1:
 // RUN: c-index-test -code-completion-at=%s:61:11 %s | FileCheck -check-prefix=CHECK-CCA %s
 // CHECK-CCA: TypedefDecl:{TypedText Class}
 // CHECK-CCA-NEXT: ObjCInterfaceDecl:{TypedText Foo}
@@ -253,6 +254,7 @@ void test_block_invoke(A *(^block1)(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-NOT: ObjCClassMethodDecl:{ResultType int}{Informative Method:}{TypedText }
+// CHECK-CCD: Objective-C selector: Method:
 // 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)}
index 6d7bf5bb15a08f023ba90e989ae6e421ac653039..b737a38229e965cae901ec0d015dd346f7ef761a 100644 (file)
@@ -1201,6 +1201,8 @@ int perform_code_completion(int argc, const char **argv, int timing_only) {
     unsigned i, n = results->NumResults, containerIsIncomplete = 0;
     unsigned long long contexts;
     enum CXCursorKind containerKind;
+    CXString objCSelector;
+    const char *selectorString;
     if (!timing_only) {      
       /* Sort the code-completion results based on the typed text. */
       clang_sortCodeCompletionResults(results->Results, results->NumResults);
@@ -1218,7 +1220,8 @@ int perform_code_completion(int argc, const char **argv, int timing_only) {
     contexts = clang_codeCompleteGetContexts(results);
     print_completion_contexts(contexts, stdout);
     
-    containerKind = clang_codeCompleteGetContainerKind(results, &containerIsIncomplete);
+    containerKind = clang_codeCompleteGetContainerKind(results,
+                                                       &containerIsIncomplete);
     
     if (containerKind != CXCursor_InvalidCode) {
       /* We have found a container */
@@ -1239,6 +1242,13 @@ int perform_code_completion(int argc, const char **argv, int timing_only) {
       clang_disposeString(containerUSR);
     }
     
+    objCSelector = clang_codeCompleteGetObjCSelector(results);
+    selectorString = clang_getCString(objCSelector);
+    if (selectorString && strlen(selectorString) > 0) {
+      printf("Objective-C selector: %s\n", selectorString);
+    }
+    clang_disposeString(objCSelector);
+    
     clang_disposeCodeCompleteResults(results);
   }
   clang_disposeTranslationUnit(TU);
index 59636bf2d850c9fab8165df5d4acf1fa5abd586c..84050b2cfdcaee6c604aa6ea963ee3146d520e15 100644 (file)
@@ -247,10 +247,17 @@ struct AllocatedCXCodeCompleteResults : public CXCodeCompleteResults {
   /// current context.
   unsigned long long Contexts;
   
+  /// \brief The kind of the container for the current context for completions.
   enum CXCursorKind ContainerKind;
+  /// \brief The USR of the container for the current context for completions.
   CXString ContainerUSR;
-  
+  /// \brief a boolean value indicating whether there is complete information
+  /// about the container
   unsigned ContainerIsIncomplete;
+  
+  /// \brief A string containing the Objective-C selector entered thus far for a
+  /// message send.
+  std::string Selector;
 };
 
 /// \brief Tracks the number of code-completion result objects that are 
@@ -495,6 +502,18 @@ namespace {
       AllocatedResults.ContextKind = contextKind;
       AllocatedResults.Contexts = getContextsForContextKind(contextKind, S);
       
+      AllocatedResults.Selector = "";
+      if (Context.getNumSelIdents() > 0) {
+        for (unsigned i = 0; i < Context.getNumSelIdents(); i++) {
+          IdentifierInfo *selIdent = Context.getSelIdents()[i];
+          if (selIdent != NULL) {
+            StringRef selectorString = Context.getSelIdents()[i]->getName();
+            AllocatedResults.Selector += selectorString.str();
+          }
+          AllocatedResults.Selector += ":";
+        }
+      }
+      
       QualType baseType = Context.getBaseType();
       NamedDecl *D = NULL;
       
@@ -677,7 +696,7 @@ void clang_codeCompleteAt_Impl(void *UserData) {
         }
         pchName.push_back('\0');
         struct stat stat_results;
-        if (stat(pchName.data(), &stat_results) == 0)
+        if (stat(pchName.str().c_str(), &stat_results) == 0)
           usesPCH = true;
         continue;
       }
@@ -810,6 +829,16 @@ CXString clang_codeCompleteGetContainerUSR(CXCodeCompleteResults *ResultsIn) {
   
   return createCXString(clang_getCString(Results->ContainerUSR));
 }
+
+  
+CXString clang_codeCompleteGetObjCSelector(CXCodeCompleteResults *ResultsIn) {
+  AllocatedCXCodeCompleteResults *Results =
+    static_cast<AllocatedCXCodeCompleteResults *>(ResultsIn);
+  if (!Results)
+    return createCXString("");
+  
+  return createCXString(Results->Selector);
+}
   
 } // end extern "C"
 
index 96108649a10362571d9af362204f4a68957a194d..59905364d8dd07b576421d9ab22e89f430abe07e 100644 (file)
@@ -10,6 +10,7 @@ _clang_codeCompleteGetNumDiagnostics
 _clang_codeCompleteGetContainerKind
 _clang_codeCompleteGetContainerUSR
 _clang_codeCompleteGetContexts
+_clang_codeCompleteGetObjCSelector
 _clang_constructUSR_ObjCCategory
 _clang_constructUSR_ObjCClass
 _clang_constructUSR_ObjCIvar
index 329ae5a55898120910460ad363f2e8a43cebad77..ab9face5ec38c9f7f1c66d175a1d197b27fb1736 100644 (file)
@@ -10,6 +10,7 @@ clang_codeCompleteGetNumDiagnostics
 clang_codeCompleteGetContainerKind
 clang_codeCompleteGetContainerUSR
 clang_codeCompleteGetContexts
+clang_codeCompleteGetObjCSelector
 clang_constructUSR_ObjCCategory
 clang_constructUSR_ObjCClass
 clang_constructUSR_ObjCIvar