[clang-tools-extra] c45fb35 - [clang][DeclPrinter] Implement visitors for {TemplateType,NonTypeTemplate}Parms
Kadir Cetinkaya via cfe-commits
cfe-commits at lists.llvm.org
Fri Feb 14 04:24:18 PST 2020
Author: Kadir Cetinkaya
Date: 2020-02-14T13:20:34+01:00
New Revision: c45fb35b5e0b45357a9bfae500ec5403545dbc77
URL: https://github.com/llvm/llvm-project/commit/c45fb35b5e0b45357a9bfae500ec5403545dbc77
DIFF: https://github.com/llvm/llvm-project/commit/c45fb35b5e0b45357a9bfae500ec5403545dbc77.diff
LOG: [clang][DeclPrinter] Implement visitors for {TemplateType,NonTypeTemplate}Parms
Reviewers: sammccall, hokein
Subscribers: kristof.beyls, jkorous, arphaman, usaxena95, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D73693
Added:
Modified:
clang-tools-extra/clangd/unittests/FindTargetTests.cpp
clang/lib/AST/DeclPrinter.cpp
clang/unittests/AST/DeclPrinterTest.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clangd/unittests/FindTargetTests.cpp b/clang-tools-extra/clangd/unittests/FindTargetTests.cpp
index be4b37c8f453..fa091b2a2503 100644
--- a/clang-tools-extra/clangd/unittests/FindTargetTests.cpp
+++ b/clang-tools-extra/clangd/unittests/FindTargetTests.cpp
@@ -215,8 +215,7 @@ TEST_F(TargetDeclTest, NestedNameSpecifier) {
template <typename T>
int x = [[T::]]y;
)cpp";
- // FIXME: We don't do a good job printing TemplateTypeParmDecls, apparently!
- EXPECT_DECLS("NestedNameSpecifierLoc", "");
+ EXPECT_DECLS("NestedNameSpecifierLoc", "typename T");
Code = R"cpp(
namespace a { int x; }
@@ -256,8 +255,7 @@ TEST_F(TargetDeclTest, Types) {
template<class T>
void foo() { [[T]] x; }
)cpp";
- // FIXME: We don't do a good job printing TemplateTypeParmDecls, apparently!
- EXPECT_DECLS("TemplateTypeParmTypeLoc", "");
+ EXPECT_DECLS("TemplateTypeParmTypeLoc", "class T");
Flags.clear();
// FIXME: Auto-completion in a template requires disabling delayed template
@@ -290,8 +288,7 @@ TEST_F(TargetDeclTest, Types) {
static const int size = sizeof...([[E]]);
};
)cpp";
- // FIXME: We don't do a good job printing TemplateTypeParmDecls, apparently!
- EXPECT_DECLS("SizeOfPackExpr", "");
+ EXPECT_DECLS("SizeOfPackExpr", "typename ...E");
Code = R"cpp(
template <typename T>
diff --git a/clang/lib/AST/DeclPrinter.cpp b/clang/lib/AST/DeclPrinter.cpp
index 4cedcbed0644..23dc9e562d4f 100644
--- a/clang/lib/AST/DeclPrinter.cpp
+++ b/clang/lib/AST/DeclPrinter.cpp
@@ -105,6 +105,8 @@ namespace {
void VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl *D);
void VisitOMPDeclareMapperDecl(OMPDeclareMapperDecl *D);
void VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D);
+ void VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *TTP);
+ void VisitNonTypeTemplateParmDecl(const NonTypeTemplateParmDecl *NTTP);
void printTemplateParameters(const TemplateParameterList *Params,
bool OmitTemplateKW = false);
@@ -1051,37 +1053,10 @@ void DeclPrinter::printTemplateParameters(const TemplateParameterList *Params,
else
NeedComma = true;
- if (auto TTP = dyn_cast<TemplateTypeParmDecl>(Param)) {
-
- if (const TypeConstraint *TC = TTP->getTypeConstraint())
- TC->print(Out, Policy);
- else if (TTP->wasDeclaredWithTypename())
- Out << "typename";
- else
- Out << "class";
-
- if (TTP->isParameterPack())
- Out << " ...";
- else if (!TTP->getName().empty())
- Out << ' ';
-
- Out << *TTP;
-
- if (TTP->hasDefaultArgument()) {
- Out << " = ";
- Out << TTP->getDefaultArgument().getAsString(Policy);
- };
+ if (const auto *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) {
+ VisitTemplateTypeParmDecl(TTP);
} else if (auto NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
- StringRef Name;
- if (IdentifierInfo *II = NTTP->getIdentifier())
- Name = II->getName();
- printDeclType(NTTP->getType(), Name, NTTP->isParameterPack());
-
- if (NTTP->hasDefaultArgument()) {
- Out << " = ";
- NTTP->getDefaultArgument()->printPretty(Out, nullptr, Policy,
- Indentation);
- }
+ VisitNonTypeTemplateParmDecl(NTTP);
} else if (auto TTPD = dyn_cast<TemplateTemplateParmDecl>(Param)) {
VisitTemplateDecl(TTPD);
// FIXME: print the default argument, if present.
@@ -1705,3 +1680,36 @@ void DeclPrinter::VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D) {
D->getInit()->printPretty(Out, nullptr, Policy, Indentation);
}
+void DeclPrinter::VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *TTP) {
+ if (const TypeConstraint *TC = TTP->getTypeConstraint())
+ TC->print(Out, Policy);
+ else if (TTP->wasDeclaredWithTypename())
+ Out << "typename";
+ else
+ Out << "class";
+
+ if (TTP->isParameterPack())
+ Out << " ...";
+ else if (!TTP->getName().empty())
+ Out << ' ';
+
+ Out << *TTP;
+
+ if (TTP->hasDefaultArgument()) {
+ Out << " = ";
+ Out << TTP->getDefaultArgument().getAsString(Policy);
+ }
+}
+
+void DeclPrinter::VisitNonTypeTemplateParmDecl(
+ const NonTypeTemplateParmDecl *NTTP) {
+ StringRef Name;
+ if (IdentifierInfo *II = NTTP->getIdentifier())
+ Name = II->getName();
+ printDeclType(NTTP->getType(), Name, NTTP->isParameterPack());
+
+ if (NTTP->hasDefaultArgument()) {
+ Out << " = ";
+ NTTP->getDefaultArgument()->printPretty(Out, nullptr, Policy, Indentation);
+ }
+}
diff --git a/clang/unittests/AST/DeclPrinterTest.cpp b/clang/unittests/AST/DeclPrinterTest.cpp
index f85358b8f6c8..e6732cc3f315 100644
--- a/clang/unittests/AST/DeclPrinterTest.cpp
+++ b/clang/unittests/AST/DeclPrinterTest.cpp
@@ -22,6 +22,7 @@
#include "clang/ASTMatchers/ASTMatchFinder.h"
#include "clang/Tooling/Tooling.h"
#include "llvm/ADT/SmallString.h"
+#include "llvm/ADT/StringRef.h"
#include "gtest/gtest.h"
using namespace clang;
@@ -1273,6 +1274,15 @@ TEST(DeclPrinter, TestTemplateArgumentList15) {
// Should be: with semicolon
}
+TEST(DeclPrinter, TestTemplateArgumentList16) {
+ llvm::StringLiteral Code = "template<typename T1, int NT1, typename T2 = "
+ "bool, int NT2 = 5> struct Z {};";
+ ASSERT_TRUE(PrintedDeclCXX11Matches(Code, "T1", "typename T1"));
+ ASSERT_TRUE(PrintedDeclCXX11Matches(Code, "T2", "typename T2 = bool"));
+ ASSERT_TRUE(PrintedDeclCXX11Matches(Code, "NT1", "int NT1"));
+ ASSERT_TRUE(PrintedDeclCXX11Matches(Code, "NT2", "int NT2 = 5"));
+}
+
TEST(DeclPrinter, TestStaticAssert1) {
ASSERT_TRUE(PrintedDeclCXX1ZMatches(
"static_assert(true);",
More information about the cfe-commits
mailing list