hokein created this revision.
hokein added reviewers: sammccall, jvikstrom.
Herald added subscribers: kadircet, arphaman, jkorous, MaskRay, ilya-biryukov, 
mgorny.
Herald added a project: clang.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D64137

Files:
  clang-tools-extra/clangd/refactor/tweaks/AnnotateHighlightings.cpp
  clang-tools-extra/clangd/refactor/tweaks/CMakeLists.txt
  clang-tools-extra/clangd/unittests/TweakTests.cpp

Index: clang-tools-extra/clangd/unittests/TweakTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/TweakTests.cpp
+++ clang-tools-extra/clangd/unittests/TweakTests.cpp
@@ -278,6 +278,14 @@
   EXPECT_THAT(getMessage(ID, Input), ::testing::HasSubstr("0 |   int x"));
 }
 
+TEST(TweakTest, AnnotateHighlightings) {
+  llvm::StringLiteral ID = "AnnotateHighlightings";
+  checkAvailable(ID, "^vo^id^ ^f(^) {^}^"); // available everywhere.
+  const char *Input = "void ^f() {}";
+  const char *Output = "void /* Function */f() {}";
+  checkTransform(ID, Input, Output);
+}
+
 } // namespace
 } // namespace clangd
 } // namespace clang
Index: clang-tools-extra/clangd/refactor/tweaks/CMakeLists.txt
===================================================================
--- clang-tools-extra/clangd/refactor/tweaks/CMakeLists.txt
+++ clang-tools-extra/clangd/refactor/tweaks/CMakeLists.txt
@@ -12,6 +12,7 @@
 # $<TARGET_OBJECTS:obj.clangDaemonTweaks> to a list of sources, see
 # clangd/tool/CMakeLists.txt for an example.
 add_clang_library(clangDaemonTweaks OBJECT
+  AnnotateHighlightings.cpp
   DumpAST.cpp
   RawStringLiteral.cpp
   SwapIfBranches.cpp
Index: clang-tools-extra/clangd/refactor/tweaks/AnnotateHighlightings.cpp
===================================================================
--- /dev/null
+++ clang-tools-extra/clangd/refactor/tweaks/AnnotateHighlightings.cpp
@@ -0,0 +1,69 @@
+//===--- AnnotateHighlightings.cpp -------------------------------*- C++-*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+#include "SemanticHighlighting.h"
+#include "refactor/Tweak.h"
+
+namespace clang {
+namespace clangd {
+namespace {
+
+llvm::StringRef highlightingKindToString(HighlightingKind Kind) {
+  switch (Kind) {
+  case HighlightingKind::Variable:
+    return "Variable";
+  case HighlightingKind::Function:
+    return "Function";
+  }
+  llvm_unreachable("unhandled HighlightingKind");
+}
+
+/// Annotate all highlighting tokens in the current file. This is a hidden tweak
+/// which is used to debug semantic highlightings.
+/// Before:
+///   void f() { int abc; }
+///   ^^^^^^^^^^^^^^^^^^^^^
+/// After:
+///   void /* Function */ f() { int /* Variable */ abc; }
+class AnnotateHighlightings : public Tweak {
+public:
+  const char *id() const override final;
+
+  bool prepare(const Selection &Inputs) override {
+    return Inputs.ASTSelection.root();
+  }
+  Expected<Effect> apply(const Selection &Inputs) override;
+
+  std::string title() const override { return "Annotate highlighting tokens"; }
+  Intent intent() const override { return Refactor; }
+  bool hidden() const override { return true; }
+};
+REGISTER_TWEAK(AnnotateHighlightings)
+
+Expected<Tweak::Effect> AnnotateHighlightings::apply(const Selection &Inputs) {
+  auto HighlightingTokens = getSemanticHighlightings(Inputs.AST);
+  auto &SM = Inputs.AST.getSourceManager();
+  tooling::Replacements Result;
+  for (const auto &Token : HighlightingTokens) {
+    assert(Token.R.start.line == Token.R.end.line &&
+           "Token must be at the same line");
+    auto InsertOffset = positionToOffset(Inputs.Code, Token.R.start);
+    if (!InsertOffset)
+      return InsertOffset.takeError();
+
+    auto InsertReplacement = tooling::Replacement(
+        SM.getFileEntryForID(SM.getMainFileID())->getName(), *InsertOffset, 0,
+        ("/* " + highlightingKindToString(Token.Kind) + " */").str());
+    if (auto Err = Result.add(InsertReplacement))
+      return std::move(Err);
+  }
+  return Effect::applyEdit(Result);
+}
+
+} // namespace
+} // namespace clangd
+} // namespace clang
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to