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/StmtDumper.cpp ------------------------------------ -*- C++ -*-===// 00002 // 00003 // This file is distributed under the MIT license. See LICENSE.txt for details. 00004 // 00005 // Copyright (C) 2009-2010, Stephen Wilson 00006 // 00007 //===----------------------------------------------------------------------===// 00008 00009 #include "StmtDumper.h" 00010 #include "comma/ast/Decl.h" 00011 #include "comma/ast/DSTDefinition.h" 00012 #include "comma/ast/Expr.h" 00013 #include "comma/ast/Stmt.h" 00014 00015 #include "llvm/Support/Format.h" 00016 00017 using namespace comma; 00018 00019 using llvm::dyn_cast; 00020 using llvm::cast; 00021 using llvm::isa; 00022 00023 00024 llvm::raw_ostream &StmtDumper::dump(Stmt *stmt, unsigned level) 00025 { 00026 unsigned savedLevel = indentLevel; 00027 indentLevel = level; 00028 visitStmt(stmt); 00029 indentLevel = savedLevel; 00030 return S; 00031 } 00032 00033 llvm::raw_ostream &StmtDumper::dumpAST(Ast *node) 00034 { 00035 return dumper->dump(node, indentLevel); 00036 } 00037 00038 void StmtDumper::visitStmtSequence(StmtSequence *node) 00039 { 00040 printHeader(node); 00041 indent(); 00042 for (StmtSequence::stmt_iter I = node->stmt_begin(); 00043 I != node->stmt_end(); ++I) { 00044 S << '\n'; 00045 printIndentation(); 00046 visitStmt(*I); 00047 } 00048 dedent(); 00049 S << '>'; 00050 } 00051 00052 void StmtDumper::visitBlockStmt(BlockStmt *node) 00053 { 00054 printHeader(node); 00055 00056 if (node->hasLabel()) 00057 S << llvm::format(" '%s'", node->getLabel()->getString()); 00058 00059 if (node->countDecls()) { 00060 indent(); 00061 S << '\n'; 00062 printIndentation(); 00063 S << ":Declare"; 00064 indent(); 00065 for (BlockStmt::DeclIter I = node->beginDecls(); 00066 I != node->endDecls(); ++I) { 00067 S << '\n'; 00068 printIndentation(); 00069 dumpAST(*I); 00070 } 00071 dedent(); 00072 dedent(); 00073 } 00074 00075 if (node->numStatements()) { 00076 indent(); 00077 S << '\n'; 00078 printIndentation(); 00079 S << ":Body"; 00080 indent(); 00081 for (StmtSequence::stmt_iter I = node->stmt_begin(); 00082 I != node->stmt_end(); ++I) { 00083 S << '\n'; 00084 printIndentation(); 00085 visitStmt(*I); 00086 } 00087 dedent(); 00088 dedent(); 00089 } 00090 S << '>'; 00091 } 00092 00093 void StmtDumper::visitProcedureCallStmt(ProcedureCallStmt *node) 00094 { 00095 printHeader(node) 00096 << llvm::format(" '%s'>", node->getConnective()->getString()); 00097 } 00098 00099 void StmtDumper::visitReturnStmt(ReturnStmt *node) 00100 { 00101 printHeader(node); 00102 if (node->hasReturnExpr()) { 00103 S << '\n'; 00104 indent(); 00105 printIndentation(); 00106 dumpAST(node->getReturnExpr()); 00107 dedent(); 00108 } 00109 S << '>'; 00110 } 00111 00112 void StmtDumper::visitAssignmentStmt(AssignmentStmt *node) 00113 { 00114 printHeader(node) << '\n'; 00115 indent(); 00116 printIndentation(); 00117 dumpAST(node->getTarget()) << '\n'; 00118 printIndentation(); 00119 dumpAST(node->getAssignedExpr()); 00120 dedent(); 00121 S << '>'; 00122 } 00123 00124 void StmtDumper::visitIfStmt(IfStmt *node) 00125 { 00126 printHeader(node) << '\n'; 00127 indent(); 00128 printIndentation(); 00129 dumpAST(node->getCondition()) << '\n'; 00130 printIndentation(); 00131 visitStmtSequence(node->getConsequent()); 00132 00133 for (IfStmt::iterator I = node->beginElsif(); 00134 I != node->endElsif(); ++I) { 00135 // For each elsif, print a condition and consequent group. 00136 S << '\n'; 00137 printIndentation() << "<elsif\n"; 00138 indent(); 00139 printIndentation(); 00140 dumpAST(I->getCondition()) << '\n'; 00141 printIndentation(); 00142 visitStmtSequence(I->getConsequent()); 00143 dedent(); 00144 S << '>'; 00145 } 00146 00147 if (node->hasAlternate()) { 00148 S << '\n'; 00149 printIndentation() << "<else\n"; 00150 indent(); 00151 printIndentation(); 00152 visitStmtSequence(node->getAlternate()); 00153 dedent(); 00154 S << '>'; 00155 } 00156 00157 dedent(); 00158 S << '>'; 00159 } 00160 00161 void StmtDumper::visitWhileStmt(WhileStmt *node) 00162 { 00163 printHeader(node) << '\n'; 00164 indent(); 00165 printIndentation(); 00166 dumpAST(node->getCondition()) << '\n'; 00167 printIndentation(); 00168 visitStmtSequence(node->getBody()); 00169 dedent(); 00170 S << '>'; 00171 } 00172 00173 void StmtDumper::visitLoopStmt(LoopStmt *node) 00174 { 00175 printHeader(node) << '\n'; 00176 indent(); 00177 printIndentation(); 00178 visitStmtSequence(node->getBody()); 00179 dedent(); 00180 S << '>'; 00181 } 00182 00183 void StmtDumper::visitForStmt(ForStmt *node) 00184 { 00185 printHeader(node) << ' '; 00186 dumpAST(node->getLoopDecl()) << '\n'; 00187 indent(); 00188 printIndentation(); 00189 dumpAST(node->getControl()) << '\n'; 00190 printIndentation(); 00191 visitStmtSequence(node->getBody()); 00192 dedent(); 00193 S << '>'; 00194 } 00195 00196 void StmtDumper::visitPragmaStmt(PragmaStmt *node) 00197 { 00198 printHeader(node) << '>'; 00199 } 00200 00201 void StmtDumper::visitNullStmt(NullStmt *node) 00202 { 00203 printHeader(node) << '>'; 00204 } 00205