Index: include/clang/AST/TextNodeDumper.h =================================================================== --- include/clang/AST/TextNodeDumper.h +++ include/clang/AST/TextNodeDumper.h @@ -60,6 +60,7 @@ void dumpName(const NamedDecl *ND); void dumpAccessSpecifier(AccessSpecifier AS); void dumpCXXTemporary(const CXXTemporary *Temporary); + void dumpFunctionDeclParameters(const FunctionDecl *D); void dumpDeclRef(const Decl *D, const char *Label = nullptr); Index: lib/AST/ASTDumper.cpp =================================================================== --- lib/AST/ASTDumper.cpp +++ lib/AST/ASTDumper.cpp @@ -95,6 +95,12 @@ void dumpDeclContext(const DeclContext *DC); void dumpLookups(const DeclContext *DC, bool DumpDecls); void dumpAttr(const Attr *A); + void dumpFunctionDeclParameters(const FunctionDecl *D) { + NodeDumper.dumpFunctionDeclParameters(D); + if (D->param_begin() || !D->getNumParams()) + for (const ParmVarDecl *Parameter : D->parameters()) + dumpDecl(Parameter); + } // C++ Utilities void dumpCXXCtorInitializer(const CXXCtorInitializer *Init); @@ -901,11 +907,7 @@ D->getTemplateSpecializationInfo()) dumpTemplateArgumentList(*FTSI->TemplateArguments); - if (!D->param_begin() && D->getNumParams()) - dumpChild([=] { OS << "<getNumParams() << ">>"; }); - else - for (const ParmVarDecl *Parameter : D->parameters()) - dumpDecl(Parameter); + dumpFunctionDeclParameters(D); if (const CXXConstructorDecl *C = dyn_cast(D)) for (CXXConstructorDecl::init_const_iterator I = C->init_begin(), Index: lib/AST/TextNodeDumper.cpp =================================================================== --- lib/AST/TextNodeDumper.cpp +++ lib/AST/TextNodeDumper.cpp @@ -162,6 +162,12 @@ OS << ")"; } +void TextNodeDumper::dumpFunctionDeclParameters(const FunctionDecl *D) { + if (!D->param_begin() && D->getNumParams()) + TreeStructure.addChild( + [=] { OS << "<getNumParams() << ">>"; }); +} + void TextNodeDumper::dumpDeclRef(const Decl *D, const char *Label) { if (!D) return;