00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 #include "ExprDumper.h"
00010 #include "comma/ast/AggExpr.h"
00011 
00012 #include "llvm/Support/Format.h"
00013 
00014 using namespace comma;
00015 
00016 using llvm::dyn_cast;
00017 using llvm::cast;
00018 using llvm::isa;
00019 
00020 llvm::raw_ostream &ExprDumper::dump(Expr *expr, unsigned level)
00021 {
00022     unsigned savedLevel = indentLevel;
00023     indentLevel = level;
00024     visitExpr(expr);
00025     indentLevel = savedLevel;
00026     return S;
00027 }
00028 
00029 void ExprDumper::visitDeclRefExpr(DeclRefExpr *node)
00030 {
00031     printHeader(node) <<
00032         llvm::format(" '%s'>", node->getString());
00033 }
00034 
00035 void ExprDumper::visitFunctionCallExpr(FunctionCallExpr *node)
00036 {
00037     printHeader(node);
00038     FunctionDecl *decl = node->getConnective(0);
00039     S << llvm::format(" '%s'>", decl->getString());
00040 }
00041 
00042 void ExprDumper::visitIndexedArrayExpr(IndexedArrayExpr *node)
00043 {
00044     printHeader(node) << '>';
00045 }
00046 
00047 void ExprDumper::visitInjExpr(InjExpr *node)
00048 {
00049     printHeader(node) << '>';
00050 }
00051 
00052 void ExprDumper::visitPrjExpr(PrjExpr *node)
00053 {
00054     printHeader(node) << '>';
00055 }
00056 
00057 void ExprDumper::visitIntegerLiteral(IntegerLiteral *node)
00058 {
00059     printHeader(node) << " '";
00060     node->getValue().print(S, false);
00061     S << "'>";
00062 }
00063 
00064 void ExprDumper::visitStringLiteral(StringLiteral *node)
00065 {
00066     printHeader(node) << " \"" << node->getString() << "\">";
00067 }
00068 
00069 void ExprDumper::visitAggregateExpr(AggregateExpr *node)
00070 {
00071     printHeader(node);
00072     indent();
00073 
00074     typedef AggregateExpr::pos_iterator pos_iterator;
00075     for (pos_iterator I = node->pos_begin(), E = node->pos_end(); I != E; ++I) {
00076         S << '\n';
00077         dump(*I, indentLevel);
00078     }
00079     dedent();
00080     S << ">";
00081 }
00082 
00083 void ExprDumper::visitConversionExpr(ConversionExpr *node)
00084 {
00085     printHeader(node) << " ";
00086     visitExpr(node->getOperand());
00087     S << " ";
00088     dumpAST(node->getType()) << ">";
00089 }
00090 
00091 void ExprDumper::visitNullExpr(NullExpr *node)
00092 {
00093     printHeader(node) << '>';
00094 }
00095 
00096 void ExprDumper::visitQualifiedExpr(QualifiedExpr *node)
00097 {
00098     printHeader(node) << ' ';
00099     dumpAST(node->getPrefix()) << ' ';
00100     visitExpr(node->getOperand());
00101     S << '>';
00102 }
00103 
00104 void ExprDumper::visitDereferenceExpr(DereferenceExpr *node)
00105 {
00106     printHeader(node) << ' ';
00107     visitExpr(node->getPrefix());
00108     S << '>';
00109 }
00110 
00111 void ExprDumper::visitAllocatorExpr(AllocatorExpr *node)
00112 {
00113     printHeader(node) << ' ';
00114     if (node->isInitialized())
00115         visitExpr(node->getInitializer());
00116     else
00117         dumpAST(node->getAllocatedType());
00118     S << '>';
00119 }
00120 
00121 void ExprDumper::visitSelectedExpr(SelectedExpr *node)
00122 {
00123     printHeader(node) << '\n';
00124     indent();
00125     printIndentation();
00126     visitExpr(node->getPrefix());
00127     if (node->isAmbiguous())
00128         S << ' ' << node->getSelectorIdInfo();
00129     else {
00130         S << '\n';
00131         printIndentation();
00132         dumpAST(node->getSelectorDecl());
00133         dedent();
00134     }
00135     S << '>';
00136 }