зеркало из https://github.com/microsoft/clang.git
Add a new libclang API to return a CXCompletionString for an arbitrary
cursor, from Connor Wakamo! Addresses <rdar://problem/9087798>. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@136911 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
0e7bf40027
Коммит
8fa0a80b44
|
@ -2898,6 +2898,18 @@ clang_getCompletionPriority(CXCompletionString completion_string);
|
|||
CINDEX_LINKAGE enum CXAvailabilityKind
|
||||
clang_getCompletionAvailability(CXCompletionString completion_string);
|
||||
|
||||
/**
|
||||
* \brief Retrieve a completion string for an arbitrary declaration or macro
|
||||
* definition cursor.
|
||||
*
|
||||
* \param cursor The cursor to query.
|
||||
*
|
||||
* \returns A non-context-sensitive completion string for declaration and macro
|
||||
* definition cursors, or NULL for other kinds of cursors.
|
||||
*/
|
||||
CINDEX_LINKAGE CXCompletionString
|
||||
clang_getCursorCompletionString(CXCursor cursor);
|
||||
|
||||
/**
|
||||
* \brief Contains the results of code-completion.
|
||||
*
|
||||
|
|
|
@ -310,10 +310,24 @@ public:
|
|||
return CachedCompletionAllocator;
|
||||
}
|
||||
|
||||
/// \brief Retrieve the allocator used to cache global code completions.
|
||||
/// Creates the allocator if it doesn't already exist.
|
||||
llvm::IntrusiveRefCntPtr<GlobalCodeCompletionAllocator>
|
||||
getCursorCompletionAllocator() {
|
||||
if (!CursorCompletionAllocator.getPtr()) {
|
||||
CursorCompletionAllocator = new GlobalCodeCompletionAllocator;
|
||||
}
|
||||
return CursorCompletionAllocator;
|
||||
}
|
||||
|
||||
private:
|
||||
/// \brief Allocator used to store cached code completions.
|
||||
llvm::IntrusiveRefCntPtr<GlobalCodeCompletionAllocator>
|
||||
CachedCompletionAllocator;
|
||||
|
||||
/// \brief Allocator used to store code completions for arbitrary cursors.
|
||||
llvm::IntrusiveRefCntPtr<GlobalCodeCompletionAllocator>
|
||||
CursorCompletionAllocator;
|
||||
|
||||
/// \brief The set of cached code-completion results.
|
||||
std::vector<CachedCodeCompletionResult> CachedCompletionResults;
|
||||
|
|
|
@ -1903,6 +1903,10 @@ bool ASTUnit::Reparse(RemappedFile *RemappedFiles, unsigned NumRemappedFiles) {
|
|||
CurrentTopLevelHashValue != CompletionCacheTopLevelHashValue)
|
||||
CacheCodeCompletionResults();
|
||||
|
||||
// We now need to clear out the completion allocator for
|
||||
// clang_getCursorCompletionString; it'll be recreated if necessary.
|
||||
CursorCompletionAllocator = 0;
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
|
|
|
@ -35,6 +35,14 @@ void test() {
|
|||
X foo;
|
||||
}
|
||||
|
||||
// RUN: c-index-test -cursor-at=%s:6:4 %s | FileCheck -check-prefix=CHECK-COMPLETION-1 %s
|
||||
// CHECK-COMPLETION-1: CXXConstructor=X:6:3
|
||||
// CHECK-COMPLETION-1-NEXT: Completion string: {TypedText X}{LeftParen (}{Placeholder int}{Comma , }{Placeholder int}{RightParen )}
|
||||
|
||||
// RUN: c-index-test -cursor-at=%s:31:16 %s | FileCheck -check-prefix=CHECK-COMPLETION-2 %s
|
||||
// CHECK-COMPLETION-2: CXXMethod=getAnotherX:31:5 (Definition)
|
||||
// CHECK-COMPLETION-2-NEXT: Completion string: {ResultType X}{TypedText getAnotherX}{LeftParen (}{RightParen )}
|
||||
|
||||
// RUN: c-index-test -cursor-at=%s:12:20 %s | FileCheck -check-prefix=CHECK-VALUE-REF %s
|
||||
// RUN: c-index-test -cursor-at=%s:13:21 %s | FileCheck -check-prefix=CHECK-VALUE-REF %s
|
||||
// RUN: c-index-test -cursor-at=%s:13:28 %s | FileCheck -check-prefix=CHECK-VALUE-REF %s
|
||||
|
@ -68,3 +76,7 @@ void test() {
|
|||
|
||||
// RUN: c-index-test -cursor-at=%s:35:5 %s | FileCheck -check-prefix=CHECK-DECL %s
|
||||
// CHECK-DECL: VarDecl=foo:35:5
|
||||
|
||||
// RUN: c-index-test -cursor-at=%s:21:3 %s | FileCheck -check-prefix=CHECK-MEMBER %s
|
||||
// CHECK-MEMBER: FieldDecl=member:21:7 (Definition)
|
||||
// CHECK-MEMBER-NEXT: Completion string: {ResultType int}{TypedText member}
|
||||
|
|
|
@ -1333,7 +1333,13 @@ int inspect_cursor_at(int argc, const char **argv) {
|
|||
clang_getLocation(TU, file, Locations[Loc].line,
|
||||
Locations[Loc].column));
|
||||
if (I + 1 == Repeats) {
|
||||
CXCompletionString completionString = clang_getCursorCompletionString(
|
||||
Cursor);
|
||||
PrintCursor(TU, Cursor);
|
||||
if (completionString != NULL) {
|
||||
printf("\nCompletion string: ");
|
||||
print_completion_string(completionString, stdout);
|
||||
}
|
||||
printf("\n");
|
||||
free(Locations[Loc].filename);
|
||||
}
|
||||
|
|
|
@ -577,4 +577,40 @@ unsigned clang_CXCursorSet_insert(CXCursorSet set, CXCursor cursor) {
|
|||
entry = 1;
|
||||
return flag;
|
||||
}
|
||||
|
||||
CXCompletionString clang_getCursorCompletionString(CXCursor cursor) {
|
||||
enum CXCursorKind kind = clang_getCursorKind(cursor);
|
||||
if (clang_isDeclaration(kind)) {
|
||||
Decl *decl = getCursorDecl(cursor);
|
||||
if (isa<NamedDecl>(decl)) {
|
||||
NamedDecl *namedDecl = (NamedDecl *)decl;
|
||||
ASTUnit *unit = getCursorASTUnit(cursor);
|
||||
if (unit->hasSema()) {
|
||||
Sema &S = unit->getSema();
|
||||
CodeCompletionAllocator *Allocator
|
||||
= unit->getCursorCompletionAllocator().getPtr();
|
||||
CodeCompletionResult Result(namedDecl);
|
||||
CodeCompletionString *String
|
||||
= Result.CreateCodeCompletionString(S, *Allocator);
|
||||
return String;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (kind == CXCursor_MacroDefinition) {
|
||||
MacroDefinition *definition = getCursorMacroDefinition(cursor);
|
||||
const IdentifierInfo *MacroInfo = definition->getName();
|
||||
ASTUnit *unit = getCursorASTUnit(cursor);
|
||||
if (unit->hasSema()) {
|
||||
Sema &S = unit->getSema();
|
||||
CodeCompletionAllocator *Allocator
|
||||
= unit->getCursorCompletionAllocator().getPtr();
|
||||
CodeCompletionResult Result((IdentifierInfo *)MacroInfo);
|
||||
CodeCompletionString *String
|
||||
= Result.CreateCodeCompletionString(S, *Allocator);
|
||||
return String;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
} // end: extern "C"
|
||||
|
|
|
@ -55,6 +55,7 @@ _clang_getCompletionChunkText
|
|||
_clang_getCompletionPriority
|
||||
_clang_getCursor
|
||||
_clang_getCursorAvailability
|
||||
_clang_getCursorCompletionString
|
||||
_clang_getCursorDefinition
|
||||
_clang_getCursorDisplayName
|
||||
_clang_getCursorExtent
|
||||
|
|
|
@ -55,6 +55,7 @@ clang_getCompletionChunkText
|
|||
clang_getCompletionPriority
|
||||
clang_getCursor
|
||||
clang_getCursorAvailability
|
||||
clang_getCursorCompletionString
|
||||
clang_getCursorDefinition
|
||||
clang_getCursorDisplayName
|
||||
clang_getCursorExtent
|
||||
|
|
Загрузка…
Ссылка в новой задаче