[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