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

Connor Wakamo cwakamo at apple.com
Mon Jul 25 16:13:49 PDT 2011


I've incorporated the changes that you suggested.  Please let me know if there is anything else I need to change.

Thanks,
Connor Wakamo
cwakamo at apple.com



On Jul 25, 2011, at 11:10 AM, Douglas Gregor wrote:

> 
> 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
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20110725/915b5cf8/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: clang_codeCompleteGetObjCSelector.patch
Type: application/octet-stream
Size: 11655 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20110725/915b5cf8/attachment.obj>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20110725/915b5cf8/attachment-0001.html>


More information about the cfe-commits mailing list