steveire created this revision. steveire added a reviewer: aaron.ballman. Herald added a subscriber: cfe-commits.
Use it to add optional label nodes to Stmt dumps. This preserves behavior of InitExprList dump: // CHECK-NEXT: `-InitListExpr {{.+}} <col:13, col:15> 'U [3]' // CHECK-NEXT: |-array filler // CHECK-NEXT: | `-InitListExpr {{.+}} <col:15> 'U' field Field {{.+}} 'i' 'int' // CHECK-NEXT: `-InitListExpr {{.+}} <col:14> 'U' field Field {{.+}} 'i' 'int' // CHECK-NEXT: `-IntegerLiteral {{.+}} <col:14> 'int' 1 Repository: rC Clang https://reviews.llvm.org/D55488 Files: include/clang/AST/ASTDumperUtils.h lib/AST/ASTDumper.cpp Index: lib/AST/ASTDumper.cpp =================================================================== --- lib/AST/ASTDumper.cpp +++ lib/AST/ASTDumper.cpp @@ -63,6 +63,9 @@ template<typename Fn> void dumpChild(Fn doDumpChild) { TreeStructure.addChild(doDumpChild); } + template <typename Fn> void dumpChild(const char *label, Fn doDumpChild) { + TreeStructure.addChild(label, doDumpChild); + } public: ASTDumper(raw_ostream &OS, const CommandTraits *Traits, @@ -83,7 +86,7 @@ void setDeserialize(bool D) { Deserialize = D; } void dumpDecl(const Decl *D); - void dumpStmt(const Stmt *S); + void dumpStmt(const Stmt *S, const char *label = nullptr); // Utilities void dumpType(QualType T) { NodeDumper.dumpType(T); } @@ -1711,8 +1714,8 @@ // Stmt dumping methods. //===----------------------------------------------------------------------===// -void ASTDumper::dumpStmt(const Stmt *S) { - dumpChild([=] { +void ASTDumper::dumpStmt(const Stmt *S, const char *label) { + dumpChild(label, [=] { if (!S) { ColorScope Color(OS, ShowColors, NullColor); OS << "<<<NULL>>>"; @@ -1978,10 +1981,7 @@ NodeDumper.dumpBareDeclRef(Field); } if (auto *Filler = ILE->getArrayFiller()) { - dumpChild([=] { - OS << "array filler"; - dumpStmt(Filler); - }); + dumpStmt(Filler, "array filler"); } } Index: include/clang/AST/ASTDumperUtils.h =================================================================== --- include/clang/AST/ASTDumperUtils.h +++ include/clang/AST/ASTDumperUtils.h @@ -109,6 +109,16 @@ std::string Prefix; public: + /// Add a child of the current node with a label. + /// Calls doAddChild without arguments + template <typename Fn> void addChild(const char *label, Fn doAddChild) { + if (!label) + return addChild(doAddChild); + addChild([=] { + OS << label; + addChild(doAddChild); + }); + } /// Add a child of the current node. Calls doAddChild without arguments template <typename Fn> void addChild(Fn doAddChild) { // If we're at the top level, there's nothing interesting to do; just
Index: lib/AST/ASTDumper.cpp =================================================================== --- lib/AST/ASTDumper.cpp +++ lib/AST/ASTDumper.cpp @@ -63,6 +63,9 @@ template<typename Fn> void dumpChild(Fn doDumpChild) { TreeStructure.addChild(doDumpChild); } + template <typename Fn> void dumpChild(const char *label, Fn doDumpChild) { + TreeStructure.addChild(label, doDumpChild); + } public: ASTDumper(raw_ostream &OS, const CommandTraits *Traits, @@ -83,7 +86,7 @@ void setDeserialize(bool D) { Deserialize = D; } void dumpDecl(const Decl *D); - void dumpStmt(const Stmt *S); + void dumpStmt(const Stmt *S, const char *label = nullptr); // Utilities void dumpType(QualType T) { NodeDumper.dumpType(T); } @@ -1711,8 +1714,8 @@ // Stmt dumping methods. //===----------------------------------------------------------------------===// -void ASTDumper::dumpStmt(const Stmt *S) { - dumpChild([=] { +void ASTDumper::dumpStmt(const Stmt *S, const char *label) { + dumpChild(label, [=] { if (!S) { ColorScope Color(OS, ShowColors, NullColor); OS << "<<<NULL>>>"; @@ -1978,10 +1981,7 @@ NodeDumper.dumpBareDeclRef(Field); } if (auto *Filler = ILE->getArrayFiller()) { - dumpChild([=] { - OS << "array filler"; - dumpStmt(Filler); - }); + dumpStmt(Filler, "array filler"); } } Index: include/clang/AST/ASTDumperUtils.h =================================================================== --- include/clang/AST/ASTDumperUtils.h +++ include/clang/AST/ASTDumperUtils.h @@ -109,6 +109,16 @@ std::string Prefix; public: + /// Add a child of the current node with a label. + /// Calls doAddChild without arguments + template <typename Fn> void addChild(const char *label, Fn doAddChild) { + if (!label) + return addChild(doAddChild); + addChild([=] { + OS << label; + addChild(doAddChild); + }); + } /// Add a child of the current node. Calls doAddChild without arguments template <typename Fn> void addChild(Fn doAddChild) { // If we're at the top level, there's nothing interesting to do; just
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits