nridge updated this revision to Diff 284245. nridge added a comment. Address review comments
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D85503/new/ https://reviews.llvm.org/D85503 Files: clang-tools-extra/clangd/FindTarget.cpp clang-tools-extra/clangd/Selection.cpp clang-tools-extra/clangd/unittests/FindTargetTests.cpp Index: clang-tools-extra/clangd/unittests/FindTargetTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/FindTargetTests.cpp +++ clang-tools-extra/clangd/unittests/FindTargetTests.cpp @@ -376,6 +376,14 @@ {"template<> class Foo<int *>", Rel::TemplateInstantiation}, {"template <typename T> class Foo<T *>", Rel::TemplatePattern}); + Code = R"cpp( + // Default argument of template template parameter. + template<typename T> struct Vector {}; + template <template <typename> class Container = [[Vector]]> + struct A {}; + )cpp"; + EXPECT_DECLS("TemplateArgumentLoc", {"template <typename T> struct Vector"}); + Flags.push_back("-std=c++17"); // for CTAD tests Code = R"cpp( Index: clang-tools-extra/clangd/Selection.cpp =================================================================== --- clang-tools-extra/clangd/Selection.cpp +++ clang-tools-extra/clangd/Selection.cpp @@ -479,6 +479,10 @@ bool TraverseTypeLoc(TypeLoc X) { return traverseNode(&X, [&] { return Base::TraverseTypeLoc(X); }); } + bool TraverseTemplateArgumentLoc(const TemplateArgumentLoc &X) { + return traverseNode(&X, + [&] { return Base::TraverseTemplateArgumentLoc(X); }); + } bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc X) { return traverseNode( &X, [&] { return Base::TraverseNestedNameSpecifierLoc(X); }); Index: clang-tools-extra/clangd/FindTarget.cpp =================================================================== --- clang-tools-extra/clangd/FindTarget.cpp +++ clang-tools-extra/clangd/FindTarget.cpp @@ -590,6 +590,19 @@ add(CCI->getAnyMember(), Flags); // Constructor calls contain a TypeLoc node, so we don't handle them here. } + + void add(const TemplateArgument &Arg, RelSet Flags) { + // Only used for template template arguments. + // For type and non-type template arguments, SelectionTree + // will hit a more specific node (e.g. a TypeLoc or a + // DeclRefExpr). + if (Arg.getKind() == TemplateArgument::Template || + Arg.getKind() == TemplateArgument::TemplateExpansion) { + if (TemplateDecl *TD = Arg.getAsTemplate().getAsTemplateDecl()) { + report(TD, Flags); + } + } + } }; } // namespace @@ -613,6 +626,8 @@ Finder.add(*QT, Flags); else if (const CXXCtorInitializer *CCI = N.get<CXXCtorInitializer>()) Finder.add(CCI, Flags); + else if (const TemplateArgumentLoc *TAL = N.get<TemplateArgumentLoc>()) + Finder.add(TAL->getArgument(), Flags); return Finder.takeDecls(); }
Index: clang-tools-extra/clangd/unittests/FindTargetTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/FindTargetTests.cpp +++ clang-tools-extra/clangd/unittests/FindTargetTests.cpp @@ -376,6 +376,14 @@ {"template<> class Foo<int *>", Rel::TemplateInstantiation}, {"template <typename T> class Foo<T *>", Rel::TemplatePattern}); + Code = R"cpp( + // Default argument of template template parameter. + template<typename T> struct Vector {}; + template <template <typename> class Container = [[Vector]]> + struct A {}; + )cpp"; + EXPECT_DECLS("TemplateArgumentLoc", {"template <typename T> struct Vector"}); + Flags.push_back("-std=c++17"); // for CTAD tests Code = R"cpp( Index: clang-tools-extra/clangd/Selection.cpp =================================================================== --- clang-tools-extra/clangd/Selection.cpp +++ clang-tools-extra/clangd/Selection.cpp @@ -479,6 +479,10 @@ bool TraverseTypeLoc(TypeLoc X) { return traverseNode(&X, [&] { return Base::TraverseTypeLoc(X); }); } + bool TraverseTemplateArgumentLoc(const TemplateArgumentLoc &X) { + return traverseNode(&X, + [&] { return Base::TraverseTemplateArgumentLoc(X); }); + } bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc X) { return traverseNode( &X, [&] { return Base::TraverseNestedNameSpecifierLoc(X); }); Index: clang-tools-extra/clangd/FindTarget.cpp =================================================================== --- clang-tools-extra/clangd/FindTarget.cpp +++ clang-tools-extra/clangd/FindTarget.cpp @@ -590,6 +590,19 @@ add(CCI->getAnyMember(), Flags); // Constructor calls contain a TypeLoc node, so we don't handle them here. } + + void add(const TemplateArgument &Arg, RelSet Flags) { + // Only used for template template arguments. + // For type and non-type template arguments, SelectionTree + // will hit a more specific node (e.g. a TypeLoc or a + // DeclRefExpr). + if (Arg.getKind() == TemplateArgument::Template || + Arg.getKind() == TemplateArgument::TemplateExpansion) { + if (TemplateDecl *TD = Arg.getAsTemplate().getAsTemplateDecl()) { + report(TD, Flags); + } + } + } }; } // namespace @@ -613,6 +626,8 @@ Finder.add(*QT, Flags); else if (const CXXCtorInitializer *CCI = N.get<CXXCtorInitializer>()) Finder.add(CCI, Flags); + else if (const TemplateArgumentLoc *TAL = N.get<TemplateArgumentLoc>()) + Finder.add(TAL->getArgument(), Flags); return Finder.takeDecls(); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits