diff options
| author | Ilya Biryukov <ibiryukov@google.com> | 2018-11-23 15:21:19 +0000 |
|---|---|---|
| committer | Ilya Biryukov <ibiryukov@google.com> | 2018-11-23 15:21:19 +0000 |
| commit | 19d75608f8c646df4cb89b83ef7004c0e4a437aa (patch) | |
| tree | 57cc6433b8ef0e612d8de1aa87097ff397ad8735 /clang-tools-extra/clangd/AST.cpp | |
| parent | 0fc5dcd1c8826fcbf68348cb0081518eb5411480 (diff) | |
| download | bcm5719-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.cpp | 43 |
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)) |

