[cfe-commits] [PATCH] New libclang API function, clang_codeCompleteGetObjCSelector

Douglas Gregor dgregor at apple.com
Mon Jul 25 11:10:28 PDT 2011


On Jul 22, 2011, at 5:30 PM, Connor Wakamo wrote:

> I am submitting for review a patch with a new API function for libclang:
> 
> CXString clang_codeCompleteGetObjCSelector(CXCodeCompleteResults *)
> 
> This function returns a string containing the selector parts that have been typed thus far when code completion is requested for an Objective-C message.  For instance, if you're asking for completions after "[Foo initWithBar:bar object:obj", it'll return "initWithBar:object:".
> 
> I've also added some additional output to c-index-test and added a couple of checks in test/Index/complete-objc-message.m for both class and instance messages.
> 
> Please let me know what else I need to do with this patch.

Cool. A couple comments:

Index: tools/libclang/CIndexCodeCompletion.cpp
===================================================================
--- tools/libclang/CIndexCodeCompletion.cpp	(revision 135677)
+++ tools/libclang/CIndexCodeCompletion.cpp	(working copy)
@@ -247,10 +247,17 @@
   /// 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;
   
-  unsigned ContainerIsIncomplete;
+  /// \brief A string containing the Objective-C selector entered thus far for a
+  /// message send.
+  char *Selector;
 };

Please use a std::string for Selector, so we don't have to manually manage the memory.

+      if (Context.getNumSelIdents() > 0) {
+        printf("We have selector parts to save!\n");

Please drop the printf.

+        size_t selectorLength = 0;
+        for (unsigned i = 0; i < Context.getNumSelIdents(); i++) {
+          StringRef selectorString = Context.getSelIdents()[i]->getName();
+          selectorLength += selectorString.size();
+        }

the IdentifierInfo* within a selector can actually be NULL, so make sure you check for it first. That's how we represent such ill-advised selectors as

	foo::bar:

+        char *selectorString = (char *)malloc(selectorLength +
+                                              Context.getNumSelIdents() + 1);
+        if (selectorString) {
+          for (unsigned i = 0; i < Context.getNumSelIdents(); i++) {
+            strcat(selectorString, Context.getSelIdents()[i]->getName().data());
+            strcat(selectorString, ":");
+          }
+        }
+        AllocatedResults.Selector = selectorString;

This will be way easier with std::string :)

Index: tools/libclang/libclang.darwin.exports
===================================================================
--- tools/libclang/libclang.darwin.exports	(revision 135677)
+++ tools/libclang/libclang.darwin.exports	(working copy)
@@ -9,6 +9,9 @@
 _clang_codeCompleteGetContainerKind
 _clang_codeCompleteGetContainerUSR
 _clang_codeCompleteGetContexts
+_clang_codeCompleteGetContainerKind
+_clang_codeCompleteGetContainerUSR
+_clang_codeCompleteGetObjCSelector
 _clang_constructUSR_ObjCCategory
 _clang_constructUSR_ObjCClass
 _clang_constructUSR_ObjCIvar
Index: tools/libclang/libclang.exports
===================================================================
--- tools/libclang/libclang.exports	(revision 135677)
+++ tools/libclang/libclang.exports	(working copy)
@@ -9,6 +9,9 @@
 clang_codeCompleteGetContainerKind
 clang_codeCompleteGetContainerUSR
 clang_codeCompleteGetContexts
+clang_codeCompleteGetContainerKind
+clang_codeCompleteGetContainerUSR
+clang_codeCompleteGetObjCSelector
 clang_constructUSR_ObjCCategory
 clang_constructUSR_ObjCClass
 clang_constructUSR_ObjCIvar

Some extraneous exports here from a prior patch.

	- Doug




More information about the cfe-commits mailing list