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

Reply via email to