Skip to content

Commit c45fb35

Browse files
committed
[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
1 parent a57ad00 commit c45fb35

File tree

3 files changed

+51
-36
lines changed

3 files changed

+51
-36
lines changed

clang-tools-extra/clangd/unittests/FindTargetTests.cpp

+3-6
Original file line numberDiff line numberDiff line change
@@ -215,8 +215,7 @@ TEST_F(TargetDeclTest, NestedNameSpecifier) {
215215
template <typename T>
216216
int x = [[T::]]y;
217217
)cpp";
218-
// FIXME: We don't do a good job printing TemplateTypeParmDecls, apparently!
219-
EXPECT_DECLS("NestedNameSpecifierLoc", "");
218+
EXPECT_DECLS("NestedNameSpecifierLoc", "typename T");
220219

221220
Code = R"cpp(
222221
namespace a { int x; }
@@ -256,8 +255,7 @@ TEST_F(TargetDeclTest, Types) {
256255
template<class T>
257256
void foo() { [[T]] x; }
258257
)cpp";
259-
// FIXME: We don't do a good job printing TemplateTypeParmDecls, apparently!
260-
EXPECT_DECLS("TemplateTypeParmTypeLoc", "");
258+
EXPECT_DECLS("TemplateTypeParmTypeLoc", "class T");
261259
Flags.clear();
262260

263261
// FIXME: Auto-completion in a template requires disabling delayed template
@@ -290,8 +288,7 @@ TEST_F(TargetDeclTest, Types) {
290288
static const int size = sizeof...([[E]]);
291289
};
292290
)cpp";
293-
// FIXME: We don't do a good job printing TemplateTypeParmDecls, apparently!
294-
EXPECT_DECLS("SizeOfPackExpr", "");
291+
EXPECT_DECLS("SizeOfPackExpr", "typename ...E");
295292

296293
Code = R"cpp(
297294
template <typename T>

clang/lib/AST/DeclPrinter.cpp

+38-30
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ namespace {
105105
void VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl *D);
106106
void VisitOMPDeclareMapperDecl(OMPDeclareMapperDecl *D);
107107
void VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D);
108+
void VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *TTP);
109+
void VisitNonTypeTemplateParmDecl(const NonTypeTemplateParmDecl *NTTP);
108110

109111
void printTemplateParameters(const TemplateParameterList *Params,
110112
bool OmitTemplateKW = false);
@@ -1051,37 +1053,10 @@ void DeclPrinter::printTemplateParameters(const TemplateParameterList *Params,
10511053
else
10521054
NeedComma = true;
10531055

1054-
if (auto TTP = dyn_cast<TemplateTypeParmDecl>(Param)) {
1055-
1056-
if (const TypeConstraint *TC = TTP->getTypeConstraint())
1057-
TC->print(Out, Policy);
1058-
else if (TTP->wasDeclaredWithTypename())
1059-
Out << "typename";
1060-
else
1061-
Out << "class";
1062-
1063-
if (TTP->isParameterPack())
1064-
Out << " ...";
1065-
else if (!TTP->getName().empty())
1066-
Out << ' ';
1067-
1068-
Out << *TTP;
1069-
1070-
if (TTP->hasDefaultArgument()) {
1071-
Out << " = ";
1072-
Out << TTP->getDefaultArgument().getAsString(Policy);
1073-
};
1056+
if (const auto *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) {
1057+
VisitTemplateTypeParmDecl(TTP);
10741058
} else if (auto NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
1075-
StringRef Name;
1076-
if (IdentifierInfo *II = NTTP->getIdentifier())
1077-
Name = II->getName();
1078-
printDeclType(NTTP->getType(), Name, NTTP->isParameterPack());
1079-
1080-
if (NTTP->hasDefaultArgument()) {
1081-
Out << " = ";
1082-
NTTP->getDefaultArgument()->printPretty(Out, nullptr, Policy,
1083-
Indentation);
1084-
}
1059+
VisitNonTypeTemplateParmDecl(NTTP);
10851060
} else if (auto TTPD = dyn_cast<TemplateTemplateParmDecl>(Param)) {
10861061
VisitTemplateDecl(TTPD);
10871062
// FIXME: print the default argument, if present.
@@ -1705,3 +1680,36 @@ void DeclPrinter::VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D) {
17051680
D->getInit()->printPretty(Out, nullptr, Policy, Indentation);
17061681
}
17071682

1683+
void DeclPrinter::VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *TTP) {
1684+
if (const TypeConstraint *TC = TTP->getTypeConstraint())
1685+
TC->print(Out, Policy);
1686+
else if (TTP->wasDeclaredWithTypename())
1687+
Out << "typename";
1688+
else
1689+
Out << "class";
1690+
1691+
if (TTP->isParameterPack())
1692+
Out << " ...";
1693+
else if (!TTP->getName().empty())
1694+
Out << ' ';
1695+
1696+
Out << *TTP;
1697+
1698+
if (TTP->hasDefaultArgument()) {
1699+
Out << " = ";
1700+
Out << TTP->getDefaultArgument().getAsString(Policy);
1701+
}
1702+
}
1703+
1704+
void DeclPrinter::VisitNonTypeTemplateParmDecl(
1705+
const NonTypeTemplateParmDecl *NTTP) {
1706+
StringRef Name;
1707+
if (IdentifierInfo *II = NTTP->getIdentifier())
1708+
Name = II->getName();
1709+
printDeclType(NTTP->getType(), Name, NTTP->isParameterPack());
1710+
1711+
if (NTTP->hasDefaultArgument()) {
1712+
Out << " = ";
1713+
NTTP->getDefaultArgument()->printPretty(Out, nullptr, Policy, Indentation);
1714+
}
1715+
}

clang/unittests/AST/DeclPrinterTest.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "clang/ASTMatchers/ASTMatchFinder.h"
2323
#include "clang/Tooling/Tooling.h"
2424
#include "llvm/ADT/SmallString.h"
25+
#include "llvm/ADT/StringRef.h"
2526
#include "gtest/gtest.h"
2627

2728
using namespace clang;
@@ -1273,6 +1274,15 @@ TEST(DeclPrinter, TestTemplateArgumentList15) {
12731274
// Should be: with semicolon
12741275
}
12751276

1277+
TEST(DeclPrinter, TestTemplateArgumentList16) {
1278+
llvm::StringLiteral Code = "template<typename T1, int NT1, typename T2 = "
1279+
"bool, int NT2 = 5> struct Z {};";
1280+
ASSERT_TRUE(PrintedDeclCXX11Matches(Code, "T1", "typename T1"));
1281+
ASSERT_TRUE(PrintedDeclCXX11Matches(Code, "T2", "typename T2 = bool"));
1282+
ASSERT_TRUE(PrintedDeclCXX11Matches(Code, "NT1", "int NT1"));
1283+
ASSERT_TRUE(PrintedDeclCXX11Matches(Code, "NT2", "int NT2 = 5"));
1284+
}
1285+
12761286
TEST(DeclPrinter, TestStaticAssert1) {
12771287
ASSERT_TRUE(PrintedDeclCXX1ZMatches(
12781288
"static_assert(true);",

0 commit comments

Comments
 (0)