forked from OSchip/llvm-project
start converting dumper to be a simple visitor
llvm-svn: 39109
This commit is contained in:
parent
9ea960a220
commit
a3bcb7a104
|
@ -0,0 +1,194 @@
|
||||||
|
//===--- StmtPrinter.cpp - Printing implementation for Stmt ASTs ----------===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file was developed by Chris Lattner and is distributed under
|
||||||
|
// the University of Illinois Open Source License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// This file implements the Stmt::dump/Stmt::print methods.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#include "clang/AST/StmtVisitor.h"
|
||||||
|
#include "clang/AST/Expr.h"
|
||||||
|
#include "llvm/Support/Compiler.h"
|
||||||
|
#include <iostream>
|
||||||
|
using namespace llvm;
|
||||||
|
using namespace clang;
|
||||||
|
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
// StmtPrinter Visitor
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
class VISIBILITY_HIDDEN StmtPrinter : public StmtVisitor {
|
||||||
|
std::ostream &OS;
|
||||||
|
unsigned IndentLevel;
|
||||||
|
public:
|
||||||
|
StmtPrinter(std::ostream &os) : OS(os), IndentLevel(0) {}
|
||||||
|
|
||||||
|
void visit(Stmt *S) {
|
||||||
|
if (S)
|
||||||
|
S->visit(*this);
|
||||||
|
else
|
||||||
|
VisitNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ostream &Indent() const {
|
||||||
|
for (unsigned i = 0, e = IndentLevel; i != e; ++i)
|
||||||
|
OS << " ";
|
||||||
|
return OS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VisitNull();
|
||||||
|
void VisitCompoundStmt(CompoundStmt *Node);
|
||||||
|
void VisitIfStmt(IfStmt *Node);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
void StmtPrinter::VisitNull() {
|
||||||
|
Indent() << "<nullptr>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME: split out ExprPrinter from StmtPrinter.
|
||||||
|
|
||||||
|
|
||||||
|
void StmtPrinter::VisitCompoundStmt(CompoundStmt *Node) {
|
||||||
|
Indent() << "{\n";
|
||||||
|
++IndentLevel;
|
||||||
|
|
||||||
|
for (CompoundStmt::body_iterator I = Node->body_begin(), E = Node->body_end();
|
||||||
|
I != E; ++I) {
|
||||||
|
visit(*I);
|
||||||
|
}
|
||||||
|
|
||||||
|
--IndentLevel;
|
||||||
|
Indent() << "}\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void StmtPrinter::VisitIfStmt(IfStmt *If) {
|
||||||
|
Indent() << "if ";
|
||||||
|
visit(If->getCond());
|
||||||
|
|
||||||
|
OS << " then\n";
|
||||||
|
++IndentLevel;
|
||||||
|
visit(If->getThen());
|
||||||
|
--IndentLevel;
|
||||||
|
Indent() << "else\n";
|
||||||
|
++IndentLevel;
|
||||||
|
visit(If->getElse());
|
||||||
|
--IndentLevel;
|
||||||
|
Indent() << "endif\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
|
||||||
|
void ReturnStmt::dump_impl() const {
|
||||||
|
std::cerr << "return ";
|
||||||
|
if (RetExpr)
|
||||||
|
RetExpr->dump();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeclRefExpr::dump_impl() const {
|
||||||
|
std::cerr << "x";
|
||||||
|
}
|
||||||
|
|
||||||
|
void IntegerConstant::dump_impl() const {
|
||||||
|
std::cerr << "1";
|
||||||
|
}
|
||||||
|
|
||||||
|
void FloatingConstant::dump_impl() const {
|
||||||
|
std::cerr << "1.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
void StringExpr::dump_impl() const {
|
||||||
|
if (isWide) std::cerr << 'L';
|
||||||
|
std::cerr << '"' << StrData << '"';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void ParenExpr::dump_impl() const {
|
||||||
|
std::cerr << "'('";
|
||||||
|
Val->dump();
|
||||||
|
std::cerr << "')'";
|
||||||
|
}
|
||||||
|
|
||||||
|
void UnaryOperator::dump_impl() const {
|
||||||
|
std::cerr << getOpcodeStr(Opc);
|
||||||
|
Input->dump();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SizeOfAlignOfTypeExpr::dump_impl() const {
|
||||||
|
std::cerr << (isSizeof ? "sizeof(" : "alignof(");
|
||||||
|
// FIXME: print type.
|
||||||
|
std::cerr << "ty)";
|
||||||
|
}
|
||||||
|
|
||||||
|
void ArraySubscriptExpr::dump_impl() const {
|
||||||
|
Base->dump();
|
||||||
|
std::cerr << "[";
|
||||||
|
Idx->dump();
|
||||||
|
std::cerr << "]";
|
||||||
|
}
|
||||||
|
|
||||||
|
void CallExpr::dump_impl() const {
|
||||||
|
Fn->dump();
|
||||||
|
std::cerr << "(";
|
||||||
|
for (unsigned i = 0, e = getNumArgs(); i != e; ++i) {
|
||||||
|
if (i) std::cerr << ", ";
|
||||||
|
getArg(i)->dump();
|
||||||
|
}
|
||||||
|
std::cerr << ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MemberExpr::dump_impl() const {
|
||||||
|
Base->dump();
|
||||||
|
std::cerr << (isArrow ? "->" : ".");
|
||||||
|
|
||||||
|
if (MemberDecl)
|
||||||
|
/*TODO: Print MemberDecl*/;
|
||||||
|
std::cerr << "member";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CastExpr::dump_impl() const {
|
||||||
|
std::cerr << "'('";
|
||||||
|
// TODO PRINT TYPE
|
||||||
|
std::cerr << "<type>";
|
||||||
|
std::cerr << "')'";
|
||||||
|
Op->dump();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void BinaryOperator::dump_impl() const {
|
||||||
|
LHS->dump();
|
||||||
|
std::cerr << " " << getOpcodeStr(Opc) << " ";
|
||||||
|
RHS->dump();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConditionalOperator::dump_impl() const {
|
||||||
|
Cond->dump();
|
||||||
|
std::cerr << " ? ";
|
||||||
|
LHS->dump();
|
||||||
|
std::cerr << " : ";
|
||||||
|
RHS->dump();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
// Stmt method implementations
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
void Stmt::dump() const {
|
||||||
|
print(std::cerr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Stmt::print(std::ostream &OS) const {
|
||||||
|
StmtPrinter P(OS);
|
||||||
|
const_cast<Stmt*>(this)->visit(P);
|
||||||
|
}
|
Loading…
Reference in New Issue