diff --git a/clang-tools-extra/clangd/refactor/tweaks/AnnotateHighlightings.cpp b/clang-tools-extra/clangd/refactor/tweaks/AnnotateHighlightings.cpp --- a/clang-tools-extra/clangd/refactor/tweaks/AnnotateHighlightings.cpp +++ b/clang-tools-extra/clangd/refactor/tweaks/AnnotateHighlightings.cpp @@ -24,6 +24,7 @@ const char *id() const override final; bool prepare(const Selection &Inputs) override { + InterestedDecl = Inputs.ASTSelection.root().ASTNode.get(); for (auto N = Inputs.ASTSelection.commonAncestor(); N && !InterestedDecl; N = N->Parent) InterestedDecl = N->ASTNode.get(); @@ -41,15 +42,22 @@ REGISTER_TWEAK(AnnotateHighlightings) Expected AnnotateHighlightings::apply(const Selection &Inputs) { - // Store the existing scopes. - const auto &BackupScopes = Inputs.AST.getASTContext().getTraversalScope(); - // Narrow the traversal scope to the selected node. - Inputs.AST.getASTContext().setTraversalScope( - {const_cast(InterestedDecl)}); - auto HighlightingTokens = getSemanticHighlightings(Inputs.AST); - // Restore the traversal scope. - Inputs.AST.getASTContext().setTraversalScope(BackupScopes); - + std::vector HighlightingTokens; + if (llvm::isa(InterestedDecl)) { + // We only annotate tokens in the main file, if InterestedDecl is a TUDecl, + // we use the default traversal scope (which is the top level decls of the + // main file). + HighlightingTokens = getSemanticHighlightings(Inputs.AST); + } else { + // Store the existing scopes. + const auto &BackupScopes = Inputs.AST.getASTContext().getTraversalScope(); + // Narrow the traversal scope to the selected node. + Inputs.AST.getASTContext().setTraversalScope( + {const_cast(InterestedDecl)}); + HighlightingTokens = getSemanticHighlightings(Inputs.AST); + // Restore the traversal scope. + Inputs.AST.getASTContext().setTraversalScope(BackupScopes); + } auto &SM = Inputs.AST.getSourceManager(); tooling::Replacements Result; for (const auto &Token : HighlightingTokens) { diff --git a/clang-tools-extra/clangd/unittests/TweakTests.cpp b/clang-tools-extra/clangd/unittests/TweakTests.cpp --- a/clang-tools-extra/clangd/unittests/TweakTests.cpp +++ b/clang-tools-extra/clangd/unittests/TweakTests.cpp @@ -487,6 +487,7 @@ TEST(TweakTest, AnnotateHighlightings) { llvm::StringLiteral ID = "AnnotateHighlightings"; checkAvailable(ID, "^vo^id^ ^f(^) {^}^"); // available everywhere. + checkAvailable(ID, "[[int a; int b;]]"); const char *Input = "void ^f() {}"; const char *Output = "void /* entity.name.function.cpp */f() {}"; checkTransform(ID, Input, Output);