forked from OSchip/llvm-project
[DeclPrinter] Honor TerseOutput for constructors
Patch by Nikolai Kosjar! Differential Revision: https://reviews.llvm.org/D39957 llvm-svn: 318365
This commit is contained in:
parent
fe059c782f
commit
35019dbe6b
|
@ -608,6 +608,7 @@ void DeclPrinter::VisitFunctionDecl(FunctionDecl *D) {
|
|||
}
|
||||
|
||||
if (CDecl) {
|
||||
if (!Policy.TerseOutput) {
|
||||
bool HasInitializerList = false;
|
||||
for (const auto *BMInitializer : CDecl->inits()) {
|
||||
if (BMInitializer->isInClassMemberInitializer())
|
||||
|
@ -625,7 +626,8 @@ void DeclPrinter::VisitFunctionDecl(FunctionDecl *D) {
|
|||
FieldDecl *FD = BMInitializer->getAnyMember();
|
||||
Out << *FD;
|
||||
} else {
|
||||
Out << QualType(BMInitializer->getBaseClass(), 0).getAsString(Policy);
|
||||
Out << QualType(BMInitializer->getBaseClass(), 0)
|
||||
.getAsString(Policy);
|
||||
}
|
||||
|
||||
Out << "(";
|
||||
|
@ -644,8 +646,8 @@ void DeclPrinter::VisitFunctionDecl(FunctionDecl *D) {
|
|||
if (ParenListExpr *ParenList = dyn_cast<ParenListExpr>(Init)) {
|
||||
Args = ParenList->getExprs();
|
||||
NumArgs = ParenList->getNumExprs();
|
||||
} else if (CXXConstructExpr *Construct
|
||||
= dyn_cast<CXXConstructExpr>(Init)) {
|
||||
} else if (CXXConstructExpr *Construct =
|
||||
dyn_cast<CXXConstructExpr>(Init)) {
|
||||
Args = Construct->getArgs();
|
||||
NumArgs = Construct->getNumArgs();
|
||||
} else
|
||||
|
@ -669,6 +671,7 @@ void DeclPrinter::VisitFunctionDecl(FunctionDecl *D) {
|
|||
if (BMInitializer->isPackExpansion())
|
||||
Out << "...";
|
||||
}
|
||||
}
|
||||
} else if (!ConversionDecl && !isa<CXXDestructorDecl>(D)) {
|
||||
if (FT && FT->hasTrailingReturn()) {
|
||||
if (!GuideDecl)
|
||||
|
@ -712,7 +715,7 @@ void DeclPrinter::VisitFunctionDecl(FunctionDecl *D) {
|
|||
if (D->getBody())
|
||||
D->getBody()->printPretty(Out, nullptr, SubPolicy, Indentation);
|
||||
} else {
|
||||
if (isa<CXXConstructorDecl>(*D))
|
||||
if (!Policy.TerseOutput && isa<CXXConstructorDecl>(*D))
|
||||
Out << " {}";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -46,7 +46,7 @@ protected:
|
|||
data* reserved;
|
||||
};
|
||||
// CHECK: <Declaration>class Test {}</Declaration>
|
||||
// CHECK: <Declaration>Test() : reserved(new Test::data()) {}</Declaration>
|
||||
// CHECK: <Declaration>Test()</Declaration>
|
||||
// CHECK: <Declaration>unsigned int getID() const</Declaration>
|
||||
// CHECK: <Declaration>~Test(){{( noexcept)?}}</Declaration>
|
||||
// CHECK: <Declaration>Test::data *reserved</Declaration>
|
||||
|
|
|
@ -31,18 +31,25 @@ using namespace tooling;
|
|||
|
||||
namespace {
|
||||
|
||||
void PrintDecl(raw_ostream &Out, const ASTContext *Context, const Decl *D) {
|
||||
using PrintingPolicyModifier = void (*)(PrintingPolicy &policy);
|
||||
|
||||
void PrintDecl(raw_ostream &Out, const ASTContext *Context, const Decl *D,
|
||||
PrintingPolicyModifier PolicyModifier) {
|
||||
PrintingPolicy Policy = Context->getPrintingPolicy();
|
||||
Policy.TerseOutput = true;
|
||||
if (PolicyModifier)
|
||||
PolicyModifier(Policy);
|
||||
D->print(Out, Policy, /*Indentation*/ 0, /*PrintInstantiation*/ false);
|
||||
}
|
||||
|
||||
class PrintMatch : public MatchFinder::MatchCallback {
|
||||
SmallString<1024> Printed;
|
||||
unsigned NumFoundDecls;
|
||||
PrintingPolicyModifier PolicyModifier;
|
||||
|
||||
public:
|
||||
PrintMatch() : NumFoundDecls(0) {}
|
||||
PrintMatch(PrintingPolicyModifier PolicyModifier)
|
||||
: NumFoundDecls(0), PolicyModifier(PolicyModifier) {}
|
||||
|
||||
void run(const MatchFinder::MatchResult &Result) override {
|
||||
const Decl *D = Result.Nodes.getNodeAs<Decl>("id");
|
||||
|
@ -53,7 +60,7 @@ public:
|
|||
return;
|
||||
|
||||
llvm::raw_svector_ostream Out(Printed);
|
||||
PrintDecl(Out, Result.Context, D);
|
||||
PrintDecl(Out, Result.Context, D, PolicyModifier);
|
||||
}
|
||||
|
||||
StringRef getPrinted() const {
|
||||
|
@ -65,13 +72,12 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
::testing::AssertionResult PrintedDeclMatches(
|
||||
StringRef Code,
|
||||
const std::vector<std::string> &Args,
|
||||
::testing::AssertionResult
|
||||
PrintedDeclMatches(StringRef Code, const std::vector<std::string> &Args,
|
||||
const DeclarationMatcher &NodeMatch,
|
||||
StringRef ExpectedPrinted,
|
||||
StringRef FileName) {
|
||||
PrintMatch Printer;
|
||||
StringRef ExpectedPrinted, StringRef FileName,
|
||||
PrintingPolicyModifier PolicyModifier = nullptr) {
|
||||
PrintMatch Printer(PolicyModifier);
|
||||
MatchFinder Finder;
|
||||
Finder.addMatcher(NodeMatch, &Printer);
|
||||
std::unique_ptr<FrontendActionFactory> Factory(
|
||||
|
@ -109,16 +115,17 @@ public:
|
|||
"input.cc");
|
||||
}
|
||||
|
||||
::testing::AssertionResult PrintedDeclCXX98Matches(
|
||||
StringRef Code,
|
||||
const DeclarationMatcher &NodeMatch,
|
||||
StringRef ExpectedPrinted) {
|
||||
::testing::AssertionResult
|
||||
PrintedDeclCXX98Matches(StringRef Code, const DeclarationMatcher &NodeMatch,
|
||||
StringRef ExpectedPrinted,
|
||||
PrintingPolicyModifier PolicyModifier = nullptr) {
|
||||
std::vector<std::string> Args(1, "-std=c++98");
|
||||
return PrintedDeclMatches(Code,
|
||||
Args,
|
||||
NodeMatch,
|
||||
ExpectedPrinted,
|
||||
"input.cc");
|
||||
"input.cc",
|
||||
PolicyModifier);
|
||||
}
|
||||
|
||||
::testing::AssertionResult PrintedDeclCXX11Matches(StringRef Code,
|
||||
|
@ -478,6 +485,27 @@ TEST(DeclPrinter, TestCXXConstructorDecl4) {
|
|||
"A(const A &a, int = 0)"));
|
||||
}
|
||||
|
||||
TEST(DeclPrinter, TestCXXConstructorDeclWithMemberInitializer) {
|
||||
ASSERT_TRUE(PrintedDeclCXX98Matches(
|
||||
"struct A {"
|
||||
" int m;"
|
||||
" A() : m(2) {}"
|
||||
"};",
|
||||
cxxConstructorDecl(ofClass(hasName("A"))).bind("id"),
|
||||
"A()"));
|
||||
}
|
||||
|
||||
TEST(DeclPrinter, TestCXXConstructorDeclWithMemberInitializer_NoTerseOutput) {
|
||||
ASSERT_TRUE(PrintedDeclCXX98Matches(
|
||||
"struct A {"
|
||||
" int m;"
|
||||
" A() : m(2) {}"
|
||||
"};",
|
||||
cxxConstructorDecl(ofClass(hasName("A"))).bind("id"),
|
||||
"A() : m(2) {\n}\n",
|
||||
[](PrintingPolicy &Policy){ Policy.TerseOutput = false; }));
|
||||
}
|
||||
|
||||
TEST(DeclPrinter, TestCXXConstructorDecl5) {
|
||||
ASSERT_TRUE(PrintedDeclCXX11Matches(
|
||||
"struct A {"
|
||||
|
@ -540,7 +568,7 @@ TEST(DeclPrinter, TestCXXConstructorDecl11) {
|
|||
" A(T&&... ts) : T(ts)... {}"
|
||||
"};",
|
||||
cxxConstructorDecl(ofClass(hasName("A"))).bind("id"),
|
||||
"A<T...>(T &&...ts) : T(ts)... {}"));
|
||||
"A<T...>(T &&...ts)"));
|
||||
}
|
||||
|
||||
TEST(DeclPrinter, TestCXXDestructorDecl1) {
|
||||
|
|
Loading…
Reference in New Issue