<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div><br></div><div>On Jul 25, 2011, at 11:10 AM, Douglas Gregor wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div><br>On Jul 22, 2011, at 5:30 PM, Connor Wakamo wrote:<br><br><blockquote type="cite">I am submitting for review a patch with a new API function for libclang:<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">CXString clang_codeCompleteGetObjCSelector(CXCodeCompleteResults *)<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">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:".<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">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.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Please let me know what else I need to do with this patch.<br></blockquote><br>Cool. A couple comments:<br><br>Index: tools/libclang/CIndexCodeCompletion.cpp<br>===================================================================<br>--- tools/libclang/CIndexCodeCompletion.cpp<span class="Apple-tab-span" style="white-space:pre">        </span>(revision 135677)<br>+++ tools/libclang/CIndexCodeCompletion.cpp<span class="Apple-tab-span" style="white-space:pre">      </span>(working copy)<br>@@ -247,10 +247,17 @@<br>   /// current context.<br>   unsigned long long Contexts;<br><br>+  /// \brief The kind of the container for the current context for completions.<br>   enum CXCursorKind ContainerKind;<br>+  /// \brief The USR of the container for the current context for completions.<br>   CXString ContainerUSR;<br>+  /// \brief a boolean value indicating whether there is complete information<br>+  /// about the container<br>+  unsigned ContainerIsIncomplete;<br><br>-  unsigned ContainerIsIncomplete;<br>+  /// \brief A string containing the Objective-C selector entered thus far for a<br>+  /// message send.<br>+  char *Selector;<br> };<br><br>Please use a std::string for Selector, so we don't have to manually manage the memory.<br><br>+      if (Context.getNumSelIdents() > 0) {<br>+        printf("We have selector parts to save!\n");<br><br>Please drop the printf.<br><br>+        size_t selectorLength = 0;<br>+        for (unsigned i = 0; i < Context.getNumSelIdents(); i++) {<br>+          StringRef selectorString = Context.getSelIdents()[i]->getName();<br>+          selectorLength += selectorString.size();<br>+        }<br><br>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<br><br><span class="Apple-tab-span" style="white-space:pre">      </span>foo::bar:<br><br>+        char *selectorString = (char *)malloc(selectorLength +<br>+                                              Context.getNumSelIdents() + 1);<br>+        if (selectorString) {<br>+          for (unsigned i = 0; i < Context.getNumSelIdents(); i++) {<br>+            strcat(selectorString, Context.getSelIdents()[i]->getName().data());<br>+            strcat(selectorString, ":");<br>+          }<br>+        }<br>+        AllocatedResults.Selector = selectorString;<br><br>This will be way easier with std::string :)<br><br>Index: tools/libclang/libclang.darwin.exports<br>===================================================================<br>--- tools/libclang/libclang.darwin.exports<span class="Apple-tab-span" style="white-space:pre">     </span>(revision 135677)<br>+++ tools/libclang/libclang.darwin.exports<span class="Apple-tab-span" style="white-space:pre">       </span>(working copy)<br>@@ -9,6 +9,9 @@<br> _clang_codeCompleteGetContainerKind<br> _clang_codeCompleteGetContainerUSR<br> _clang_codeCompleteGetContexts<br>+_clang_codeCompleteGetContainerKind<br>+_clang_codeCompleteGetContainerUSR<br>+_clang_codeCompleteGetObjCSelector<br> _clang_constructUSR_ObjCCategory<br> _clang_constructUSR_ObjCClass<br> _clang_constructUSR_ObjCIvar<br>Index: tools/libclang/libclang.exports<br>===================================================================<br>--- tools/libclang/libclang.exports<span class="Apple-tab-span" style="white-space:pre">     </span>(revision 135677)<br>+++ tools/libclang/libclang.exports<span class="Apple-tab-span" style="white-space:pre">      </span>(working copy)<br>@@ -9,6 +9,9 @@<br> clang_codeCompleteGetContainerKind<br> clang_codeCompleteGetContainerUSR<br> clang_codeCompleteGetContexts<br>+clang_codeCompleteGetContainerKind<br>+clang_codeCompleteGetContainerUSR<br>+clang_codeCompleteGetObjCSelector<br> clang_constructUSR_ObjCCategory<br> clang_constructUSR_ObjCClass<br> clang_constructUSR_ObjCIvar<br><br>Some extraneous exports here from a prior patch.<br><br><span class="Apple-tab-span" style="white-space:pre">        </span>- Doug<br><br></div></blockquote></div><br></body></html>