adamcz created this revision. Herald added subscribers: usaxena95, kadircet, arphaman. adamcz requested review of this revision. Herald added subscribers: cfe-commits, MaskRay, ilya-biryukov. Herald added a project: clang-tools-extra.
Before this change, we would add "using std::vector<int>" instead of just "using std::vector;", which would not even compile. Fixes https://github.com/clangd/clangd/issues/904 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D112530 Files: clang-tools-extra/clangd/refactor/tweaks/AddUsing.cpp clang-tools-extra/clangd/unittests/tweaks/AddUsingTests.cpp Index: clang-tools-extra/clangd/unittests/tweaks/AddUsingTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/tweaks/AddUsingTests.cpp +++ 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<int> foo; +)cpp", + R"cpp( +#include "test.hpp" +using one::vec; + +vec<int> foo; )cpp"}}; llvm::StringMap<std::string> EditedFiles; for (const auto &Case : Cases) { @@ -461,6 +472,7 @@ }; } using uu = two::cc; +template<typename T> struct vec {}; })cpp"; EXPECT_EQ(apply(SubCase, &EditedFiles), Case.ExpectedSource); } Index: clang-tools-extra/clangd/refactor/tweaks/AddUsing.cpp =================================================================== --- clang-tools-extra/clangd/refactor/tweaks/AddUsing.cpp +++ clang-tools-extra/clangd/refactor/tweaks/AddUsing.cpp @@ -278,8 +278,14 @@ if (!QualifierToRemove) return false; - auto SpelledTokens = - TB.spelledForExpanded(TB.expandedTokens(E.getSourceRange())); + auto NameRange = E.getSourceRange(); + if (auto T = E.getNamedTypeLoc().getAs<TemplateSpecializationTypeLoc>()) { + // Remove the template arguments from the name. + NameRange = SourceRange(NameRange.getBegin(), + T.getLAngleLoc().getLocWithOffset(-1)); + } + + auto SpelledTokens = TB.spelledForExpanded(TB.expandedTokens(NameRange)); if (!SpelledTokens) return false; auto SpelledRange = syntax::Token::range(SM, SpelledTokens->front(),
Index: clang-tools-extra/clangd/unittests/tweaks/AddUsingTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/tweaks/AddUsingTests.cpp +++ 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<int> foo; +)cpp", + R"cpp( +#include "test.hpp" +using one::vec; + +vec<int> foo; )cpp"}}; llvm::StringMap<std::string> EditedFiles; for (const auto &Case : Cases) { @@ -461,6 +472,7 @@ }; } using uu = two::cc; +template<typename T> struct vec {}; })cpp"; EXPECT_EQ(apply(SubCase, &EditedFiles), Case.ExpectedSource); } Index: clang-tools-extra/clangd/refactor/tweaks/AddUsing.cpp =================================================================== --- clang-tools-extra/clangd/refactor/tweaks/AddUsing.cpp +++ clang-tools-extra/clangd/refactor/tweaks/AddUsing.cpp @@ -278,8 +278,14 @@ if (!QualifierToRemove) return false; - auto SpelledTokens = - TB.spelledForExpanded(TB.expandedTokens(E.getSourceRange())); + auto NameRange = E.getSourceRange(); + if (auto T = E.getNamedTypeLoc().getAs<TemplateSpecializationTypeLoc>()) { + // Remove the template arguments from the name. + NameRange = SourceRange(NameRange.getBegin(), + T.getLAngleLoc().getLocWithOffset(-1)); + } + + auto SpelledTokens = TB.spelledForExpanded(TB.expandedTokens(NameRange)); if (!SpelledTokens) return false; auto SpelledRange = syntax::Token::range(SM, SpelledTokens->front(),
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits