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 @@ -33,18 +33,16 @@ REGISTER_TWEAK(AnnotateHighlightings) Expected AnnotateHighlightings::apply(const Selection &Inputs) { - // TUDecl is always the root ancestor. - const Decl *CommonDecl = - Inputs.ASTSelection.root().ASTNode.get(); + const Decl *CommonDecl = nullptr; for (auto N = Inputs.ASTSelection.commonAncestor(); N && !CommonDecl; N = N->Parent) CommonDecl = N->ASTNode.get(); std::vector HighlightingTokens; if (llvm::isa(CommonDecl)) { - // We only annotate tokens in the main file, if CommonDecl is a TUDecl, - // we use the default traversal scope (which is the top level decls of the - // main file). + // Now we hit the TUDecl case where commonAncestor() returns null intently. + // We only annotate tokens in the main file, so use the default traversal + // scope (which is the top level decls of the main file). HighlightingTokens = getSemanticHighlightings(Inputs.AST); } else { // Store the existing scopes. 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 @@ -571,6 +571,17 @@ R"cpp( void /* entity.name.function.cpp */f1(); void /* entity.name.function.cpp */f2(); +)cpp"); + + checkTransform(ID, + R"cpp( +void f1(); +void f2() {^}; +)cpp", + + R"cpp( +void f1(); +void /* entity.name.function.cpp */f2() {}; )cpp"); }