From: Steve Naroff Date: Sat, 1 Sep 2007 21:08:38 +0000 (+0000) Subject: Finish converting SwitchStmt AST to source ranges. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9dcbfa450d751bd68fc4af8b75da381d4f6984b9;p=clang Finish converting SwitchStmt AST to source ranges. Move DumpSourceRange() to DumpStmt(). Now -parse-ast-dump will display source range info for all stmts/exprs. One day we should implement the source range protocol for Decls. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41670 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/AST/StmtDumper.cpp b/AST/StmtDumper.cpp index 73aef84742..ea43ad72a1 100644 --- a/AST/StmtDumper.cpp +++ b/AST/StmtDumper.cpp @@ -78,7 +78,7 @@ namespace { 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 @@ -86,22 +86,18 @@ namespace { if (TypedefType *TDT = dyn_cast(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); @@ -158,7 +154,7 @@ void StmtDumper::DumpLocation(SourceLocation Loc) { } } -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; diff --git a/Sema/SemaStmt.cpp b/Sema/SemaStmt.cpp index 87d5e26298..d6c4c2d6d1 100644 --- a/Sema/SemaStmt.cpp +++ b/Sema/SemaStmt.cpp @@ -260,7 +260,7 @@ Sema::FinishSwitchStmt(SourceLocation SwitchLoc, StmtTy *Switch, ExprTy *Body) { 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(); diff --git a/include/clang/AST/Stmt.h b/include/clang/AST/Stmt.h index aae088a512..b0dca78648 100644 --- a/include/clang/AST/Stmt.h +++ b/include/clang/AST/Stmt.h @@ -375,6 +375,7 @@ class SwitchStmt : public Stmt { 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(cond); @@ -389,17 +390,19 @@ public: 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; }