forked from OSchip/llvm-project
[DeclPrinter] Extract function PrintConstructorInitializers, NFC
Patch by Nikolai Kosjar! Differential Revision: https://reviews.llvm.org/D40066 llvm-svn: 318367
This commit is contained in:
parent
9994581395
commit
dc616faa44
|
@ -37,6 +37,8 @@ namespace {
|
|||
void ProcessDeclGroup(SmallVectorImpl<Decl*>& Decls);
|
||||
|
||||
void Print(AccessSpecifier AS);
|
||||
void PrintConstructorInitializers(CXXConstructorDecl *CDecl,
|
||||
std::string &Proto);
|
||||
|
||||
/// Print an Objective-C method type in parentheses.
|
||||
///
|
||||
|
@ -274,6 +276,71 @@ void DeclPrinter::Print(AccessSpecifier AS) {
|
|||
}
|
||||
}
|
||||
|
||||
void DeclPrinter::PrintConstructorInitializers(CXXConstructorDecl *CDecl,
|
||||
std::string &Proto) {
|
||||
bool HasInitializerList = false;
|
||||
for (const auto *BMInitializer : CDecl->inits()) {
|
||||
if (BMInitializer->isInClassMemberInitializer())
|
||||
continue;
|
||||
|
||||
if (!HasInitializerList) {
|
||||
Proto += " : ";
|
||||
Out << Proto;
|
||||
Proto.clear();
|
||||
HasInitializerList = true;
|
||||
} else
|
||||
Out << ", ";
|
||||
|
||||
if (BMInitializer->isAnyMemberInitializer()) {
|
||||
FieldDecl *FD = BMInitializer->getAnyMember();
|
||||
Out << *FD;
|
||||
} else {
|
||||
Out << QualType(BMInitializer->getBaseClass(), 0).getAsString(Policy);
|
||||
}
|
||||
|
||||
Out << "(";
|
||||
if (!BMInitializer->getInit()) {
|
||||
// Nothing to print
|
||||
} else {
|
||||
Expr *Init = BMInitializer->getInit();
|
||||
if (ExprWithCleanups *Tmp = dyn_cast<ExprWithCleanups>(Init))
|
||||
Init = Tmp->getSubExpr();
|
||||
|
||||
Init = Init->IgnoreParens();
|
||||
|
||||
Expr *SimpleInit = nullptr;
|
||||
Expr **Args = nullptr;
|
||||
unsigned NumArgs = 0;
|
||||
if (ParenListExpr *ParenList = dyn_cast<ParenListExpr>(Init)) {
|
||||
Args = ParenList->getExprs();
|
||||
NumArgs = ParenList->getNumExprs();
|
||||
} else if (CXXConstructExpr *Construct =
|
||||
dyn_cast<CXXConstructExpr>(Init)) {
|
||||
Args = Construct->getArgs();
|
||||
NumArgs = Construct->getNumArgs();
|
||||
} else
|
||||
SimpleInit = Init;
|
||||
|
||||
if (SimpleInit)
|
||||
SimpleInit->printPretty(Out, nullptr, Policy, Indentation);
|
||||
else {
|
||||
for (unsigned I = 0; I != NumArgs; ++I) {
|
||||
assert(Args[I] != nullptr && "Expected non-null Expr");
|
||||
if (isa<CXXDefaultArgExpr>(Args[I]))
|
||||
break;
|
||||
|
||||
if (I)
|
||||
Out << ", ";
|
||||
Args[I]->printPretty(Out, nullptr, Policy, Indentation);
|
||||
}
|
||||
}
|
||||
}
|
||||
Out << ")";
|
||||
if (BMInitializer->isPackExpansion())
|
||||
Out << "...";
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Common C declarations
|
||||
//----------------------------------------------------------------------------
|
||||
|
@ -608,70 +675,8 @@ void DeclPrinter::VisitFunctionDecl(FunctionDecl *D) {
|
|||
}
|
||||
|
||||
if (CDecl) {
|
||||
if (!Policy.TerseOutput) {
|
||||
bool HasInitializerList = false;
|
||||
for (const auto *BMInitializer : CDecl->inits()) {
|
||||
if (BMInitializer->isInClassMemberInitializer())
|
||||
continue;
|
||||
|
||||
if (!HasInitializerList) {
|
||||
Proto += " : ";
|
||||
Out << Proto;
|
||||
Proto.clear();
|
||||
HasInitializerList = true;
|
||||
} else
|
||||
Out << ", ";
|
||||
|
||||
if (BMInitializer->isAnyMemberInitializer()) {
|
||||
FieldDecl *FD = BMInitializer->getAnyMember();
|
||||
Out << *FD;
|
||||
} else {
|
||||
Out << QualType(BMInitializer->getBaseClass(), 0)
|
||||
.getAsString(Policy);
|
||||
}
|
||||
|
||||
Out << "(";
|
||||
if (!BMInitializer->getInit()) {
|
||||
// Nothing to print
|
||||
} else {
|
||||
Expr *Init = BMInitializer->getInit();
|
||||
if (ExprWithCleanups *Tmp = dyn_cast<ExprWithCleanups>(Init))
|
||||
Init = Tmp->getSubExpr();
|
||||
|
||||
Init = Init->IgnoreParens();
|
||||
|
||||
Expr *SimpleInit = nullptr;
|
||||
Expr **Args = nullptr;
|
||||
unsigned NumArgs = 0;
|
||||
if (ParenListExpr *ParenList = dyn_cast<ParenListExpr>(Init)) {
|
||||
Args = ParenList->getExprs();
|
||||
NumArgs = ParenList->getNumExprs();
|
||||
} else if (CXXConstructExpr *Construct =
|
||||
dyn_cast<CXXConstructExpr>(Init)) {
|
||||
Args = Construct->getArgs();
|
||||
NumArgs = Construct->getNumArgs();
|
||||
} else
|
||||
SimpleInit = Init;
|
||||
|
||||
if (SimpleInit)
|
||||
SimpleInit->printPretty(Out, nullptr, Policy, Indentation);
|
||||
else {
|
||||
for (unsigned I = 0; I != NumArgs; ++I) {
|
||||
assert(Args[I] != nullptr && "Expected non-null Expr");
|
||||
if (isa<CXXDefaultArgExpr>(Args[I]))
|
||||
break;
|
||||
|
||||
if (I)
|
||||
Out << ", ";
|
||||
Args[I]->printPretty(Out, nullptr, Policy, Indentation);
|
||||
}
|
||||
}
|
||||
}
|
||||
Out << ")";
|
||||
if (BMInitializer->isPackExpansion())
|
||||
Out << "...";
|
||||
}
|
||||
}
|
||||
if (!Policy.TerseOutput)
|
||||
PrintConstructorInitializers(CDecl, Proto);
|
||||
} else if (!ConversionDecl && !isa<CXXDestructorDecl>(D)) {
|
||||
if (FT && FT->hasTrailingReturn()) {
|
||||
if (!GuideDecl)
|
||||
|
|
Loading…
Reference in New Issue