summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/clangd/AST.cpp
diff options
context:
space:
mode:
authorIlya Biryukov <ibiryukov@google.com>2018-11-23 15:21:19 +0000
committerIlya Biryukov <ibiryukov@google.com>2018-11-23 15:21:19 +0000
commit19d75608f8c646df4cb89b83ef7004c0e4a437aa (patch)
tree57cc6433b8ef0e612d8de1aa87097ff397ad8735 /clang-tools-extra/clangd/AST.cpp
parent0fc5dcd1c8826fcbf68348cb0081518eb5411480 (diff)
downloadbcm5719-llvm-19d75608f8c646df4cb89b83ef7004c0e4a437aa.tar.gz
bcm5719-llvm-19d75608f8c646df4cb89b83ef7004c0e4a437aa.zip
[clangd] Add support for hierarchical documentSymbol
Reviewers: ioeric, sammccall, simark Reviewed By: sammccall Subscribers: MaskRay, jkorous, arphaman, kadircet, cfe-commits Differential Revision: https://reviews.llvm.org/D52311 llvm-svn: 347498
Diffstat (limited to 'clang-tools-extra/clangd/AST.cpp')
-rw-r--r--clang-tools-extra/clangd/AST.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/clang-tools-extra/clangd/AST.cpp b/clang-tools-extra/clangd/AST.cpp
index 12c8f9f7a5d..e9cf2ffe9d1 100644
--- a/clang-tools-extra/clangd/AST.cpp
+++ b/clang-tools-extra/clangd/AST.cpp
@@ -11,9 +11,12 @@
#include "clang/AST/ASTContext.h"
#include "clang/AST/Decl.h"
+#include "clang/AST/DeclTemplate.h"
#include "clang/Basic/SourceLocation.h"
#include "clang/Basic/SourceManager.h"
#include "clang/Index/USRGeneration.h"
+#include "llvm/Support/Casting.h"
+#include "llvm/Support/ScopedPrinter.h"
using namespace llvm;
namespace clang {
@@ -61,6 +64,46 @@ std::string printQualifiedName(const NamedDecl &ND) {
return QName;
}
+static const TemplateArgumentList *
+getTemplateSpecializationArgs(const NamedDecl &ND) {
+ if (auto *Func = llvm::dyn_cast<FunctionDecl>(&ND))
+ return Func->getTemplateSpecializationArgs();
+ if (auto *Cls = llvm::dyn_cast<ClassTemplateSpecializationDecl>(&ND))
+ return &Cls->getTemplateInstantiationArgs();
+ if (auto *Var = llvm::dyn_cast<VarTemplateSpecializationDecl>(&ND))
+ return &Var->getTemplateInstantiationArgs();
+ return nullptr;
+}
+
+std::string printName(const ASTContext &Ctx, const NamedDecl &ND) {
+ std::string Name;
+ llvm::raw_string_ostream Out(Name);
+ PrintingPolicy PP(Ctx.getLangOpts());
+ // Handle 'using namespace'. They all have the same name - <using-directive>.
+ if (auto *UD = llvm::dyn_cast<UsingDirectiveDecl>(&ND)) {
+ Out << "using namespace ";
+ if (auto *Qual = UD->getQualifier())
+ Qual->print(Out, PP);
+ UD->getNominatedNamespaceAsWritten()->printName(Out);
+ return Out.str();
+ }
+ ND.getDeclName().print(Out, PP);
+ if (!Out.str().empty()) {
+ // FIXME(ibiryukov): do not show args not explicitly written by the user.
+ if (auto *ArgList = getTemplateSpecializationArgs(ND))
+ printTemplateArgumentList(Out, ArgList->asArray(), PP);
+ return Out.str();
+ }
+ // The name was empty, so present an anonymous entity.
+ if (auto *NS = llvm::dyn_cast<NamespaceDecl>(&ND))
+ return "(anonymous namespace)";
+ if (auto *Cls = llvm::dyn_cast<RecordDecl>(&ND))
+ return ("(anonymous " + Cls->getKindName() + ")").str();
+ if (auto *En = llvm::dyn_cast<EnumDecl>(&ND))
+ return "(anonymous enum)";
+ return "(anonymous)";
+}
+
std::string printNamespaceScope(const DeclContext &DC) {
for (const auto *Ctx = &DC; Ctx != nullptr; Ctx = Ctx->getParent())
if (const auto *NS = dyn_cast<NamespaceDecl>(Ctx))
OpenPOWER on IntegriCloud