diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-07-26 15:24:30 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-07-26 15:24:30 +0000 |
commit | ea777403f999cba29ac23eee92fecbf996528a17 (patch) | |
tree | 67a789ae9ca0c783057d625e0b1a2bee5d15dce7 /clang/tools | |
parent | b84dc6bca84274dc03157bbddeb6b80450cc9a4c (diff) | |
download | bcm5719-llvm-ea777403f999cba29ac23eee92fecbf996528a17.tar.gz bcm5719-llvm-ea777403f999cba29ac23eee92fecbf996528a17.zip |
Add new libclang API, clang_codeCompleteGetObjCSelector(), which
provides the partial Objective-C selector used in a code
completion. From Connor Wakamo!
llvm-svn: 136084
Diffstat (limited to 'clang/tools')
-rw-r--r-- | clang/tools/c-index-test/c-index-test.c | 12 | ||||
-rw-r--r-- | clang/tools/libclang/CIndexCodeCompletion.cpp | 33 | ||||
-rw-r--r-- | clang/tools/libclang/libclang.darwin.exports | 1 | ||||
-rw-r--r-- | clang/tools/libclang/libclang.exports | 1 |
4 files changed, 44 insertions, 3 deletions
diff --git a/clang/tools/c-index-test/c-index-test.c b/clang/tools/c-index-test/c-index-test.c index 6d7bf5bb15a..b737a38229e 100644 --- a/clang/tools/c-index-test/c-index-test.c +++ b/clang/tools/c-index-test/c-index-test.c @@ -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); diff --git a/clang/tools/libclang/CIndexCodeCompletion.cpp b/clang/tools/libclang/CIndexCodeCompletion.cpp index 59636bf2d85..84050b2cfdc 100644 --- a/clang/tools/libclang/CIndexCodeCompletion.cpp +++ b/clang/tools/libclang/CIndexCodeCompletion.cpp @@ -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" diff --git a/clang/tools/libclang/libclang.darwin.exports b/clang/tools/libclang/libclang.darwin.exports index 96108649a10..59905364d8d 100644 --- a/clang/tools/libclang/libclang.darwin.exports +++ b/clang/tools/libclang/libclang.darwin.exports @@ -10,6 +10,7 @@ _clang_codeCompleteGetNumDiagnostics _clang_codeCompleteGetContainerKind _clang_codeCompleteGetContainerUSR _clang_codeCompleteGetContexts +_clang_codeCompleteGetObjCSelector _clang_constructUSR_ObjCCategory _clang_constructUSR_ObjCClass _clang_constructUSR_ObjCIvar diff --git a/clang/tools/libclang/libclang.exports b/clang/tools/libclang/libclang.exports index 329ae5a5589..ab9face5ec3 100644 --- a/clang/tools/libclang/libclang.exports +++ b/clang/tools/libclang/libclang.exports @@ -10,6 +10,7 @@ clang_codeCompleteGetNumDiagnostics clang_codeCompleteGetContainerKind clang_codeCompleteGetContainerUSR clang_codeCompleteGetContexts +clang_codeCompleteGetObjCSelector clang_constructUSR_ObjCCategory clang_constructUSR_ObjCClass clang_constructUSR_ObjCIvar |