summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKrasimir Georgiev <krasimir@google.com>2017-04-11 13:27:15 +0000
committerKrasimir Georgiev <krasimir@google.com>2017-04-11 13:27:15 +0000
commitf7d501743e191fdd600e4291cfbb377fcf470513 (patch)
treec4024caea9116c6915f3128056f584c1b3187ad5
parent01056042ef7967e983af7baad4f2017eb290031a (diff)
downloadclang-tools-extra-f7d501743e191fdd600e4291cfbb377fcf470513.tar.gz
[clangd] Implement item kind for completion results
Summary: The patch implements the conversion method from CXCursorKind to clangd::CompletionItemKind. Contributed by stanionascu! Reviewers: cfe-commits, bkramer, krasimir Reviewed By: krasimir Tags: #clang-tools-extra Differential Revision: https://reviews.llvm.org/D31853 git-svn-id: https://llvm.org/svn/llvm-project/clang-tools-extra/trunk@299935 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--clangd/ASTManager.cpp47
-rw-r--r--clangd/Protocol.cpp2
-rw-r--r--test/clangd/completion.test6
3 files changed, 50 insertions, 5 deletions
diff --git a/clangd/ASTManager.cpp b/clangd/ASTManager.cpp
index b85d0d82..04cbf582 100644
--- a/clangd/ASTManager.cpp
+++ b/clangd/ASTManager.cpp
@@ -76,6 +76,49 @@ static int getSeverity(DiagnosticsEngine::Level L) {
llvm_unreachable("Unknown diagnostic level!");
}
+static CompletionItemKind getKind(CXCursorKind K) {
+ switch (K) {
+ case CXCursor_MacroInstantiation:
+ case CXCursor_MacroDefinition:
+ return CompletionItemKind::Text;
+ case CXCursor_CXXMethod:
+ return CompletionItemKind::Method;
+ case CXCursor_FunctionDecl:
+ case CXCursor_FunctionTemplate:
+ return CompletionItemKind::Function;
+ case CXCursor_Constructor:
+ case CXCursor_Destructor:
+ return CompletionItemKind::Constructor;
+ case CXCursor_FieldDecl:
+ return CompletionItemKind::Field;
+ case CXCursor_VarDecl:
+ case CXCursor_ParmDecl:
+ return CompletionItemKind::Variable;
+ case CXCursor_ClassDecl:
+ case CXCursor_StructDecl:
+ case CXCursor_UnionDecl:
+ case CXCursor_ClassTemplate:
+ case CXCursor_ClassTemplatePartialSpecialization:
+ return CompletionItemKind::Class;
+ case CXCursor_Namespace:
+ case CXCursor_NamespaceAlias:
+ case CXCursor_NamespaceRef:
+ return CompletionItemKind::Module;
+ case CXCursor_EnumConstantDecl:
+ return CompletionItemKind::Value;
+ case CXCursor_EnumDecl:
+ return CompletionItemKind::Enum;
+ case CXCursor_TypeAliasDecl:
+ case CXCursor_TypeAliasTemplateDecl:
+ case CXCursor_TypedefDecl:
+ case CXCursor_MemberRef:
+ case CXCursor_TypeRef:
+ return CompletionItemKind::Reference;
+ default:
+ return CompletionItemKind::Missing;
+ }
+}
+
ASTManager::ASTManager(JSONOutput &Output, DocumentStore &Store,
bool RunSynchronously)
: Output(Output), Store(Store), RunSynchronously(RunSynchronously),
@@ -334,13 +377,15 @@ public:
CodeCompletionResult *Results,
unsigned NumResults) override {
for (unsigned I = 0; I != NumResults; ++I) {
- CodeCompletionString *CCS = Results[I].CreateCodeCompletionString(
+ CodeCompletionResult &Result = Results[I];
+ CodeCompletionString *CCS = Result.CreateCodeCompletionString(
S, Context, *Allocator, CCTUInfo,
CodeCompleteOpts.IncludeBriefComments);
if (CCS) {
CompletionItem Item;
assert(CCS->getTypedText());
Item.label = CCS->getTypedText();
+ Item.kind = getKind(Result.CursorKind);
if (CCS->getBriefComment())
Item.documentation = CCS->getBriefComment();
Items->push_back(std::move(Item));
diff --git a/clangd/Protocol.cpp b/clangd/Protocol.cpp
index 6e3fadc0..5c5d3a27 100644
--- a/clangd/Protocol.cpp
+++ b/clangd/Protocol.cpp
@@ -672,7 +672,7 @@ std::string CompletionItem::unparse(const CompletionItem &CI) {
assert(!CI.label.empty() && "completion item label is required");
Os << R"("label":")" << llvm::yaml::escape(CI.label) << R"(",)";
if (CI.kind != CompletionItemKind::Missing)
- Os << R"("kind":)" << static_cast<int>(CI.kind) << R"(",)";
+ Os << R"("kind":)" << static_cast<int>(CI.kind) << R"(,)";
if (!CI.detail.empty())
Os << R"("detail":")" << llvm::yaml::escape(CI.detail) << R"(",)";
if (!CI.documentation.empty())
diff --git a/test/clangd/completion.test b/test/clangd/completion.test
index bf5e2ab8..3d004a3d 100644
--- a/test/clangd/completion.test
+++ b/test/clangd/completion.test
@@ -16,9 +16,9 @@ Content-Length: 148
# nondeterministic, so we check regardless of order.
#
# CHECK: {"jsonrpc":"2.0","id":1,"result":[
-# CHECK-DAG: {"label":"a"}
-# CHECK-DAG: {"label":"bb"}
-# CHECK-DAG: {"label":"ccc"}
+# CHECK-DAG: {"label":"a","kind":5}
+# CHECK-DAG: {"label":"bb","kind":5}
+# CHECK-DAG: {"label":"ccc","kind":5}
# CHECK: ]}
Content-Length: 44