Index: clang-tools-extra/trunk/clangd/refactor/tweaks/AnnotateHighlightings.cpp =================================================================== --- clang-tools-extra/trunk/clangd/refactor/tweaks/AnnotateHighlightings.cpp +++ clang-tools-extra/trunk/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). + if (!CommonDecl) { + // Now we hit the TUDecl case where commonAncestor() returns null + // intendedly. 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. Index: clang-tools-extra/trunk/clangd/unittests/TweakTests.cpp =================================================================== --- clang-tools-extra/trunk/clangd/unittests/TweakTests.cpp +++ clang-tools-extra/trunk/clangd/unittests/TweakTests.cpp @@ -572,6 +572,17 @@ 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"); } TEST(TweakTest, ExpandMacro) {