diff --git a/clang-tools-extra/clangd/refactor/tweaks/AddUsing.cpp b/clang-tools-extra/clangd/refactor/tweaks/AddUsing.cpp --- a/clang-tools-extra/clangd/refactor/tweaks/AddUsing.cpp +++ b/clang-tools-extra/clangd/refactor/tweaks/AddUsing.cpp @@ -278,8 +278,13 @@ if (!QualifierToRemove) return false; - auto SpelledTokens = - TB.spelledForExpanded(TB.expandedTokens(E.getSourceRange())); + auto NameRange = E.getSourceRange(); + if (auto T = E.getNamedTypeLoc().getAs()) { + // Remove the template arguments from the name. + NameRange.setEnd(T.getLAngleLoc().getLocWithOffset(-1)); + } + + auto SpelledTokens = TB.spelledForExpanded(TB.expandedTokens(NameRange)); if (!SpelledTokens) return false; auto SpelledRange = syntax::Token::range(SM, SpelledTokens->front(), diff --git a/clang-tools-extra/clangd/unittests/tweaks/AddUsingTests.cpp b/clang-tools-extra/clangd/unittests/tweaks/AddUsingTests.cpp --- a/clang-tools-extra/clangd/unittests/tweaks/AddUsingTests.cpp +++ b/clang-tools-extra/clangd/unittests/tweaks/AddUsingTests.cpp @@ -444,6 +444,17 @@ #include "test.hpp" using one::two::cc;using one::two::ee::ee_one; cc c; +)cpp"}, + // Template (like std::vector). + {R"cpp( +#include "test.hpp" +one::v^ec foo; +)cpp", + R"cpp( +#include "test.hpp" +using one::vec; + +vec foo; )cpp"}}; llvm::StringMap EditedFiles; for (const auto &Case : Cases) { @@ -461,6 +472,7 @@ }; } using uu = two::cc; +template struct vec {}; })cpp"; EXPECT_EQ(apply(SubCase, &EditedFiles), Case.ExpectedSource); }