jvikstrom created this revision. jvikstrom added reviewers: hokein, ilya-biryukov. Herald added subscribers: cfe-commits, kadircet, arphaman, jkorous, MaskRay. Herald added a project: clang.
printTemplateSpecializationArgs was not printing partial variable specialization args. This adds an additional If clause where we check if it's a VariableTemplatePartialSpecializationDecl and returns the ArgumentLocs if that's the case. Also adds tests for printTemplateSpecializationArgs in ASTTests.cpp. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D65926 Files: clang-tools-extra/clangd/AST.cpp clang-tools-extra/clangd/unittests/ASTTests.cpp clang-tools-extra/clangd/unittests/ClangdUnitTests.cpp Index: clang-tools-extra/clangd/unittests/ClangdUnitTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/ClangdUnitTests.cpp +++ clang-tools-extra/clangd/unittests/ClangdUnitTests.cpp @@ -188,7 +188,7 @@ AllOf(DeclNamed("foo"), WithTemplateArgs("")), AllOf(DeclNamed("i"), WithTemplateArgs("")), AllOf(DeclNamed("d"), WithTemplateArgs("")), - AllOf(DeclNamed("foo"), WithTemplateArgs("<>")), + AllOf(DeclNamed("foo"), WithTemplateArgs("<T *>")), AllOf(DeclNamed("foo"), WithTemplateArgs("<bool>"))})); } Index: clang-tools-extra/clangd/unittests/ASTTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/ASTTests.cpp +++ clang-tools-extra/clangd/unittests/ASTTests.cpp @@ -8,6 +8,7 @@ #include "AST.h" #include "gtest/gtest.h" +#include "TestTU.h" namespace clang { namespace clangd { @@ -36,6 +37,44 @@ "testns1::TestClass<testns1::OtherClass>", "testns1")); } +TEST(PrintTemplateSpecializationArgs, PrintsTemplateArgs) { + TestTU TU; + TU.Code = R"cpp( + template<class T> + void foo(T) {} + template<> + void foo<int>(int) {} + + template<class T, class U> + struct K {}; + template<class J> + struct K<int, J> {}; + template<> + struct K<int, double> {}; + + template<class T> + T S = T(10); + + template <class T> + int S<T*> = 0; + template <> + int S<double> = 0; + )cpp"; + + // The expected template args string representation for every top level decl + // in the TU. + std::vector<std::string> ExpectedTemplateDeclArgs{ + "", "<int>", "", "<int, J>", "<int, double>", "", "<T *>", "<double>"}; + + std::vector<Decl *> TopLevel = TU.build().getLocalTopLevelDecls(); + std::vector<std::string> ActualTemplateArgs; + for (const Decl *D : TopLevel) { + if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) + ActualTemplateArgs.push_back(printTemplateSpecializationArgs(*ND)); + } + + EXPECT_EQ(ExpectedTemplateDeclArgs, ActualTemplateArgs); +} } // namespace } // namespace clangd Index: clang-tools-extra/clangd/AST.cpp =================================================================== --- clang-tools-extra/clangd/AST.cpp +++ clang-tools-extra/clangd/AST.cpp @@ -36,6 +36,10 @@ llvm::dyn_cast<ClassTemplatePartialSpecializationDecl>(&ND)) { if (auto *Args = Cls->getTemplateArgsAsWritten()) return Args->arguments(); + } else if (auto *Var = + llvm::dyn_cast<VarTemplatePartialSpecializationDecl>(&ND)) { + if (auto *Args = Var->getTemplateArgsAsWritten()) + return Args->arguments(); } else if (auto *Var = llvm::dyn_cast<VarTemplateSpecializationDecl>(&ND)) return Var->getTemplateArgsInfo().arguments(); // We return None for ClassTemplateSpecializationDecls because it does not
Index: clang-tools-extra/clangd/unittests/ClangdUnitTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/ClangdUnitTests.cpp +++ clang-tools-extra/clangd/unittests/ClangdUnitTests.cpp @@ -188,7 +188,7 @@ AllOf(DeclNamed("foo"), WithTemplateArgs("")), AllOf(DeclNamed("i"), WithTemplateArgs("")), AllOf(DeclNamed("d"), WithTemplateArgs("")), - AllOf(DeclNamed("foo"), WithTemplateArgs("<>")), + AllOf(DeclNamed("foo"), WithTemplateArgs("<T *>")), AllOf(DeclNamed("foo"), WithTemplateArgs("<bool>"))})); } Index: clang-tools-extra/clangd/unittests/ASTTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/ASTTests.cpp +++ clang-tools-extra/clangd/unittests/ASTTests.cpp @@ -8,6 +8,7 @@ #include "AST.h" #include "gtest/gtest.h" +#include "TestTU.h" namespace clang { namespace clangd { @@ -36,6 +37,44 @@ "testns1::TestClass<testns1::OtherClass>", "testns1")); } +TEST(PrintTemplateSpecializationArgs, PrintsTemplateArgs) { + TestTU TU; + TU.Code = R"cpp( + template<class T> + void foo(T) {} + template<> + void foo<int>(int) {} + + template<class T, class U> + struct K {}; + template<class J> + struct K<int, J> {}; + template<> + struct K<int, double> {}; + + template<class T> + T S = T(10); + + template <class T> + int S<T*> = 0; + template <> + int S<double> = 0; + )cpp"; + + // The expected template args string representation for every top level decl + // in the TU. + std::vector<std::string> ExpectedTemplateDeclArgs{ + "", "<int>", "", "<int, J>", "<int, double>", "", "<T *>", "<double>"}; + + std::vector<Decl *> TopLevel = TU.build().getLocalTopLevelDecls(); + std::vector<std::string> ActualTemplateArgs; + for (const Decl *D : TopLevel) { + if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) + ActualTemplateArgs.push_back(printTemplateSpecializationArgs(*ND)); + } + + EXPECT_EQ(ExpectedTemplateDeclArgs, ActualTemplateArgs); +} } // namespace } // namespace clangd Index: clang-tools-extra/clangd/AST.cpp =================================================================== --- clang-tools-extra/clangd/AST.cpp +++ clang-tools-extra/clangd/AST.cpp @@ -36,6 +36,10 @@ llvm::dyn_cast<ClassTemplatePartialSpecializationDecl>(&ND)) { if (auto *Args = Cls->getTemplateArgsAsWritten()) return Args->arguments(); + } else if (auto *Var = + llvm::dyn_cast<VarTemplatePartialSpecializationDecl>(&ND)) { + if (auto *Args = Var->getTemplateArgsAsWritten()) + return Args->arguments(); } else if (auto *Var = llvm::dyn_cast<VarTemplateSpecializationDecl>(&ND)) return Var->getTemplateArgsInfo().arguments(); // We return None for ClassTemplateSpecializationDecls because it does not
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits