This machine mirrors various open-source projects.
20 Gbit/s uplink.
If there are any issues or you want another project mirrored, please contact
mirror-service -=AT=- netcologne DOT de !
00001 //===-- ast/AstDumper.cpp ------------------------------------- -*- C++ -*-===// 00002 // 00003 // This file is distributed under the MIT license. See LICENSE.txt for details. 00004 // 00005 // Copyright (C) 2009, Stephen Wilson 00006 // 00007 //===----------------------------------------------------------------------===// 00008 00009 #include "AstDumper.h" 00010 #include "ExprDumper.h" 00011 #include "DeclDumper.h" 00012 #include "StmtDumper.h" 00013 #include "TypeDumper.h" 00014 #include "comma/ast/Decl.h" 00015 #include "comma/ast/Expr.h" 00016 #include "comma/ast/RangeAttrib.h" 00017 #include "comma/ast/Stmt.h" 00018 #include "comma/ast/Type.h" 00019 00020 #include "llvm/Support/Format.h" 00021 00022 using namespace comma; 00023 00024 using llvm::dyn_cast; 00025 using llvm::cast; 00026 using llvm::isa; 00027 00028 //===----------------------------------------------------------------------===// 00029 // AstDumperBase methods. 00030 00031 llvm::raw_ostream &AstDumperBase::printHeader(Ast *node) 00032 { 00033 const char *kindString = node->getKindString(); 00034 S << llvm::format("<%s ", kindString); 00035 S.write_hex(uintptr_t(node)); 00036 return S; 00037 } 00038 00039 llvm::raw_ostream &AstDumperBase::printIndentation() 00040 { 00041 for (unsigned i = 0; i < indentLevel; ++i) 00042 S << ' '; 00043 return S; 00044 } 00045 00046 llvm::raw_ostream &AstDumperBase::dumpParamMode(PM::ParameterMode mode) 00047 { 00048 switch (mode) { 00049 case PM::MODE_DEFAULT: 00050 S << "D"; 00051 break; 00052 case PM::MODE_IN: 00053 S << "I"; 00054 break; 00055 case PM::MODE_OUT: 00056 S << "O"; 00057 break; 00058 case PM::MODE_IN_OUT: 00059 S << "IO"; 00060 break; 00061 } 00062 return S; 00063 } 00064 00065 //===----------------------------------------------------------------------===// 00066 // AstDumper methods. 00067 00068 AstDumper::AstDumper(llvm::raw_ostream &stream) 00069 : AstDumperBase(stream) 00070 { 00071 EDumper = new ExprDumper(stream, this); 00072 DDumper = new DeclDumper(stream, this); 00073 SDumper = new StmtDumper(stream, this); 00074 TDumper = new TypeDumper(stream, this); 00075 } 00076 00077 AstDumper::~AstDumper() 00078 { 00079 delete EDumper; 00080 delete DDumper; 00081 delete SDumper; 00082 delete TDumper; 00083 } 00084 00085 llvm::raw_ostream &AstDumper::dumpDecl(Decl *node) 00086 { 00087 return DDumper->dump(node, indentLevel); 00088 } 00089 00090 llvm::raw_ostream &AstDumper::dumpExpr(Expr *node) 00091 { 00092 return EDumper->dump(node, indentLevel); 00093 } 00094 00095 llvm::raw_ostream &AstDumper::dumpStmt(Stmt *node) 00096 { 00097 return SDumper->dump(node, indentLevel); 00098 } 00099 00100 llvm::raw_ostream &AstDumper::dumpType(Type *node) 00101 { 00102 return TDumper->dump(node, indentLevel); 00103 } 00104 00105 llvm::raw_ostream &AstDumper::dumpRangeAttrib(RangeAttrib *node) 00106 { 00107 printHeader(node) << ' '; 00108 return dump(node->getPrefix(), indentLevel) << '>'; 00109 } 00110 00111 llvm::raw_ostream &AstDumper::dump(Ast *node, unsigned level) 00112 { 00113 unsigned savedLevel = indentLevel; 00114 indentLevel = level; 00115 if (Decl *decl = dyn_cast<Decl>(node)) 00116 dumpDecl(decl); 00117 else if (Stmt *stmt = dyn_cast<Stmt>(node)) 00118 dumpStmt(stmt); 00119 else if (Expr *expr = dyn_cast<Expr>(node)) 00120 dumpExpr(expr); 00121 else if (Type *type = dyn_cast<Type>(node)) 00122 dumpType(type); 00123 else { 00124 switch (node->getKind()) { 00125 00126 default: 00127 assert(false && "Cannot dump this kind of node yet!"); 00128 break; 00129 00130 case Ast::AST_ArrayRangeAttrib: 00131 case Ast::AST_ScalarRangeAttrib: 00132 dumpRangeAttrib(cast<RangeAttrib>(node)); 00133 break; 00134 }; 00135 } 00136 indentLevel = savedLevel; 00137 return S; 00138 } 00139