fprintf(F, " ");
}
- void DumpType(QualType T) const {
+ void DumpType(QualType T) {
fprintf(F, "'%s'", T.getAsString().c_str());
// If the type is directly a typedef, strip off typedefness to give at
if (TypedefType *TDT = dyn_cast<TypedefType>(T))
fprintf(F, ":'%s'", TDT->LookThroughTypedefs().getAsString().c_str());
}
-
- void DumpStmt(const Stmt *Node) const {
+ void DumpStmt(const Stmt *Node) {
Indent();
fprintf(F, "(%s %p", Node->getStmtClassName(), (void*)Node);
+ DumpSourceRange(Node);
}
-
- void DumpExpr(Expr *Node) {
+ void DumpExpr(const Expr *Node) {
DumpStmt(Node);
fprintf(F, " ");
DumpType(Node->getType());
- DumpSourceRange(Node);
}
-
- void DumpSourceRange(Expr *Node);
+ void DumpSourceRange(const Stmt *Node);
void DumpLocation(SourceLocation Loc);
-
// Stmts.
void VisitStmt(Stmt *Node);
}
}
-void StmtDumper::DumpSourceRange(Expr *Node) {
+void StmtDumper::DumpSourceRange(const Stmt *Node) {
// Can't translate locations if a SourceManager isn't available.
if (SM == 0) return;
SwitchStmt *SS = SwitchStack.back();
assert(SS == (SwitchStmt*)Switch && "switch stack missing push/pop!");
- SS->setBody(BodyStmt);
+ SS->setBody(BodyStmt, SwitchLoc);
SwitchStack.pop_back();
Expr *CondExpr = SS->getCond();
Stmt* SubExprs[END_EXPR];
// This points to a linked list of case and default statements.
SwitchCase *FirstCase;
+ SourceLocation SwitchLoc;
public:
SwitchStmt(Expr *cond) : Stmt(SwitchStmtClass), FirstCase(0) {
SubExprs[COND] = reinterpret_cast<Stmt*>(cond);
Stmt *getBody() { return SubExprs[BODY]; }
SwitchCase *getSwitchCaseList() { return FirstCase; }
- void setBody(Stmt *S) { SubExprs[BODY] = S; }
-
+ void setBody(Stmt *S, SourceLocation SL) {
+ SubExprs[BODY] = S;
+ SwitchLoc = SL;
+ }
void addSwitchCase(SwitchCase *SC) {
if (FirstCase)
SC->setNextSwitchCase(FirstCase);
FirstCase = SC;
}
-
- virtual SourceRange getSourceRange() const { return SourceRange(); }
-
+ virtual SourceRange getSourceRange() const {
+ return SourceRange(SwitchLoc, SubExprs[BODY]->getLocEnd());
+ }
static bool classof(const Stmt *T) {
return T->getStmtClass() == SwitchStmtClass;
}