From 80b0cdde0ffc4ca59e99fed3dcb18412ff97568c Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Mon, 28 Oct 2019 16:27:42 +0100 Subject: [PATCH] [clangd] Add a hidden tweak to dump symbol under the cursor. Summary: This provides a convenient way to see the SymbolID/USR of the symbol, mainly for debugging purpose. Reviewers: ilya-biryukov Subscribers: MaskRay, jkorous, arphaman, kadircet, usaxena95, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D69517 --- .../clangd/refactor/tweaks/DumpAST.cpp | 27 ++++++++++++++++++++++ clang-tools-extra/clangd/unittests/TweakTests.cpp | 9 ++++++++ 2 files changed, 36 insertions(+) diff --git a/clang-tools-extra/clangd/refactor/tweaks/DumpAST.cpp b/clang-tools-extra/clangd/refactor/tweaks/DumpAST.cpp index 9baa8fa..ed3725b 100644 --- a/clang-tools-extra/clangd/refactor/tweaks/DumpAST.cpp +++ b/clang-tools-extra/clangd/refactor/tweaks/DumpAST.cpp @@ -9,6 +9,7 @@ // Some of these are fairly clang-specific and hidden (e.g. textual AST dumps). // Others are more generally useful (class layout) and are exposed by default. //===----------------------------------------------------------------------===// +#include "XRefs.h" #include "refactor/Tweak.h" #include "clang/AST/ASTTypeTraits.h" #include "clang/AST/Type.h" @@ -94,6 +95,32 @@ public: }; REGISTER_TWEAK(ShowSelectionTree) +/// Dumps the symbol under the cursor. +/// Inputs: +/// void foo(); +/// ^^^ +/// Message: +/// foo - +/// {"containerName":null,"id":"CA2EBE44A1D76D2A","name":"foo","usr":"c:@F@foo#"} +class DumpSymbol : public Tweak { + const char *id() const override final; + bool prepare(const Selection &Inputs) override { return true; } + Expected apply(const Selection &Inputs) override { + std::string Storage; + llvm::raw_string_ostream Out(Storage); + + for (auto &Sym : getSymbolInfo( + Inputs.AST, + sourceLocToPosition(Inputs.AST.getSourceManager(), Inputs.Cursor))) + Out << Sym; + return Effect::showMessage(Out.str()); + } + std::string title() const override { return "Dump symbol under the cursor"; } + Intent intent() const override { return Info; } + bool hidden() const override { return true; } +}; +REGISTER_TWEAK(DumpSymbol) + /// Shows the layout of the RecordDecl under the cursor. /// Input: /// struct X { int foo; }; diff --git a/clang-tools-extra/clangd/unittests/TweakTests.cpp b/clang-tools-extra/clangd/unittests/TweakTests.cpp index f68dff1..f14383b 100644 --- a/clang-tools-extra/clangd/unittests/TweakTests.cpp +++ b/clang-tools-extra/clangd/unittests/TweakTests.cpp @@ -133,6 +133,15 @@ TEST_F(DumpASTTest, Test) { HasSubstr(" 'int' 2"))); } +TWEAK_TEST(DumpSymbol); +TEST_F(DumpSymbolTest, Test) { + std::string ID = R"("id":"CA2EBE44A1D76D2A")"; + std::string USR = R"("usr":"c:@F@foo#")"; + EXPECT_THAT(apply("void f^oo();"), + AllOf(StartsWith("message:"), testing::HasSubstr(ID), + testing::HasSubstr(USR))); +} + TWEAK_TEST(ShowSelectionTree); TEST_F(ShowSelectionTreeTest, Test) { EXPECT_AVAILABLE("^int f^oo() { re^turn 2 ^+ 2; }"); -- 2.7.4