00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "TypeDumper.h"
00010 #include "comma/ast/Decl.h"
00011 #include "comma/ast/Expr.h"
00012 #include "comma/ast/Type.h"
00013
00014 #include "llvm/Support/Format.h"
00015
00016 using namespace comma;
00017
00018 using llvm::dyn_cast;
00019 using llvm::cast;
00020 using llvm::isa;
00021
00022 llvm::raw_ostream &TypeDumper::printHeader(Type *node)
00023 {
00024 AstDumperBase::printHeader(node);
00025 if (DiscreteType *discrete = dyn_cast<DiscreteType>(node))
00026 S << " '" << discrete->getIdInfo()->getString() << '\'';
00027 return S;
00028 }
00029
00030 llvm::raw_ostream &TypeDumper::dump(Type *type, unsigned level)
00031 {
00032 unsigned savedLevel = indentLevel;
00033 indentLevel = level;
00034 visitType(type);
00035 indentLevel = savedLevel;
00036 return S;
00037 }
00038
00039 llvm::raw_ostream &TypeDumper::dumpAST(Ast *node)
00040 {
00041 return dumper->dump(node, indentLevel);
00042 }
00043
00044 llvm::raw_ostream &TypeDumper::dumpParameters(SubroutineType *node)
00045 {
00046 unsigned arity = node->getArity();
00047 unsigned argIndex = 0;
00048
00049 S << "(";
00050 while (argIndex < arity) {
00051 visitType(node->getArgType(argIndex));
00052 if (++argIndex < arity)
00053 S << "; ";
00054 }
00055 return S << ")";
00056 }
00057
00058 void TypeDumper::visitDomainType(DomainType *node)
00059 {
00060 printHeader(node) << ' ' << node->getDomainTypeDecl()->getString();
00061 if (DomainInstanceDecl *instance = node->getInstanceDecl()) {
00062 indent();
00063 for (unsigned i = 0; i < instance->getArity(); ++i) {
00064 S << '\n';
00065 printIndentation();
00066 visitType(instance->getActualParamType(i));
00067 }
00068 dedent();
00069 }
00070 S << '>';
00071 }
00072
00073 void TypeDumper::visitFunctionType(FunctionType *node)
00074 {
00075 printHeader(node) << ' ';
00076 dumpParameters(node) << '\n';
00077 indent();
00078 printIndentation();
00079 visitType(node->getReturnType());
00080 dedent();
00081 S << '>';
00082 }
00083
00084 void TypeDumper::visitProcedureType(ProcedureType *node)
00085 {
00086 printHeader(node) << ' ';
00087 dumpParameters(node) << '>';
00088 }
00089
00090 void TypeDumper::visitEnumerationType(EnumerationType *node)
00091 {
00092 printHeader(node) << '>';
00093 }
00094
00095 void TypeDumper::visitIntegerType(IntegerType *node)
00096 {
00097 printHeader(node);
00098 if (Range *range = node->getConstraint()) {
00099 S << ' ';
00100 dumpAST(range->getLowerBound());
00101 S << ' ';
00102 dumpAST(range->getUpperBound());
00103 }
00104 S << '>';
00105 }
00106
00107 void TypeDumper::visitIncompleteType(IncompleteType *node)
00108 {
00109 printHeader(node) << '>';
00110 }
00111
00112 void TypeDumper::visitArrayType(ArrayType *node)
00113 {
00114 printHeader(node) << '>';
00115 }
00116
00117 void TypeDumper::visitAccessType(AccessType *node)
00118 {
00119 printHeader(node) << ' ';
00120 visitType(node->getTargetType());
00121 S << '>';
00122 }
00123
00124 void TypeDumper::visitRecordType(RecordType *node)
00125 {
00126 printHeader(node);
00127 indent();
00128 for (unsigned i = 0; i < node->numComponents(); ++i) {
00129 S << '\n';
00130 printIndentation();
00131 visitType(node->getComponentType(i));
00132 }
00133 dedent();
00134 S << '>';
00135 }