diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2007-11-01 21:12:44 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2007-11-01 21:12:44 +0000 |
commit | b210bd0404f84b99259c9987d347a44d3c202238 (patch) | |
tree | bc50b0a7a1b9aef32a527e5f1c5bca7ab0381131 | |
parent | 88a981b47c7face1b1fdaa9074256245107b9ca9 (diff) |
Bunch of class declarations for objective-c's @try-catch statement.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43623 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | AST/Stmt.cpp | 12 | ||||
-rw-r--r-- | AST/StmtPrinter.cpp | 12 | ||||
-rw-r--r-- | Parse/ParseObjc.cpp | 10 | ||||
-rw-r--r-- | include/clang/AST/Stmt.h | 90 | ||||
-rw-r--r-- | include/clang/AST/StmtNodes.def | 8 | ||||
-rw-r--r-- | include/clang/Parse/Parser.h | 2 |
6 files changed, 126 insertions, 8 deletions
diff --git a/AST/Stmt.cpp b/AST/Stmt.cpp index e8ecd0c987..1738f9573b 100644 --- a/AST/Stmt.cpp +++ b/AST/Stmt.cpp @@ -193,3 +193,15 @@ Stmt::child_iterator ReturnStmt::child_end() { Stmt::child_iterator AsmStmt::child_begin() { return child_iterator(); } Stmt::child_iterator AsmStmt::child_end() { return child_iterator(); } +// ObjcAtCatchStmt +Stmt::child_iterator ObjcAtCatchStmt::child_begin() { return &AtCatchStmt; } +Stmt::child_iterator ObjcAtCatchStmt::child_end() { return &AtCatchStmt+1; } + +// ObjcAtFinallyStmt +Stmt::child_iterator ObjcAtFinallyStmt::child_begin() { return &AtFinallyStmt; } +Stmt::child_iterator ObjcAtFinallyStmt::child_end() { return &AtFinallyStmt+1; } + +// ObjcAtTryStmt +Stmt::child_iterator ObjcAtTryStmt::child_begin() { return &SubStmts[0]; } +Stmt::child_iterator ObjcAtTryStmt::child_end() { return &SubStmts[0]+1; } + diff --git a/AST/StmtPrinter.cpp b/AST/StmtPrinter.cpp index ac6da0638d..0953891fdb 100644 --- a/AST/StmtPrinter.cpp +++ b/AST/StmtPrinter.cpp @@ -321,6 +321,18 @@ void StmtPrinter::VisitAsmStmt(AsmStmt *Node) { Indent() << "asm (/*todo*/);\n"; } +void StmtPrinter::VisitObjcAtTryStmt(ObjcAtTryStmt *Node) { + Indent() << "@try { /* todo */ }\n"; +} + +void StmtPrinter::VisitObjcAtFinallyStmt(ObjcAtFinallyStmt *Node) { + Indent() << "@finally { /* todo */ } \n"; +} + +void StmtPrinter::VisitObjcAtCatchStmt (ObjcAtCatchStmt *Node) { + Indent() << "@catch (...) { /* todo */ } \n"; +} + //===----------------------------------------------------------------------===// // Expr printing methods. //===----------------------------------------------------------------------===// diff --git a/Parse/ParseObjc.cpp b/Parse/ParseObjc.cpp index 69124f2939..765422a985 100644 --- a/Parse/ParseObjc.cpp +++ b/Parse/ParseObjc.cpp @@ -1046,12 +1046,12 @@ Parser::DeclTy *Parser::ParseObjCThrowStmt(SourceLocation atLoc) { /// parameter-declaration /// '...' [OBJC2] /// -Parser::DeclTy *Parser::ParseObjCTryStmt(SourceLocation atLoc) { +Parser::StmtResult Parser::ParseObjCTryStmt(SourceLocation atLoc) { bool catch_or_finally_seen = false; ConsumeToken(); // consume try if (Tok.isNot(tok::l_brace)) { Diag (Tok, diag::err_expected_lbrace); - return 0; + return true; } StmtResult TryBody = ParseCompoundStatementBody(); while (Tok.is(tok::at)) { @@ -1071,11 +1071,11 @@ Parser::DeclTy *Parser::ParseObjCTryStmt(SourceLocation atLoc) { else ConsumeToken(); // consume '...' ConsumeParen(); - StmtResult CatchMody = ParseCompoundStatementBody(); + StmtResult CatchBody = ParseCompoundStatementBody(); } else { Diag(catchLoc, diag::err_expected_lparen_after, "@catch clause"); - return 0; + return true; } catch_or_finally_seen = true; } @@ -1088,7 +1088,7 @@ Parser::DeclTy *Parser::ParseObjCTryStmt(SourceLocation atLoc) { } if (!catch_or_finally_seen) Diag(atLoc, diag::err_missing_catch_finally); - return 0; + return true; } /// objc-method-def: objc-method-proto ';'[opt] '{' body '}' diff --git a/include/clang/AST/Stmt.h b/include/clang/AST/Stmt.h index fa0dc9d234..580b3d6dbd 100644 --- a/include/clang/AST/Stmt.h +++ b/include/clang/AST/Stmt.h @@ -657,7 +657,95 @@ public: virtual child_iterator child_begin(); virtual child_iterator child_end(); }; - + +/// ObjcAtCatchStmt - This represents objective-c's @catch statement. +class ObjcAtCatchStmt : public Stmt { +private: + // Points to next @catch statement, or null + ObjcAtCatchStmt *NextAtCatchStmt; + ScopedDecl *AtCatchDeclarator; + Stmt *AtCatchStmt; + + SourceLocation AtCatchLoc, RParenLoc; +public: + ObjcAtCatchStmt(SourceLocation atCatchLoc, SourceLocation rparenloc, + ScopedDecl *atCatchDeclarator, Stmt *atCatchStmt) + : Stmt(ObjcAtCatchStmtClass), NextAtCatchStmt(0), + AtCatchDeclarator(atCatchDeclarator), AtCatchStmt(atCatchStmt), + AtCatchLoc(atCatchLoc), RParenLoc(rparenloc) {} + + virtual SourceRange getSourceRange() const { + return SourceRange(AtCatchLoc, AtCatchStmt->getLocEnd()); + } + + static bool classof(const Stmt *T) { + return T->getStmtClass() == ObjcAtCatchStmtClass; + } + static bool classof(const ObjcAtCatchStmt *) { return true; } + + virtual child_iterator child_begin(); + virtual child_iterator child_end(); + +}; + +/// ObjcAtFinallyStmt - This represent objective-c's @finally Statement +class ObjcAtFinallyStmt : public Stmt { + private: + Stmt *AtFinallyStmt; + SourceLocation AtFinallyLoc; + + public: + ObjcAtFinallyStmt(SourceLocation atFinallyLoc, Stmt *atFinallyStmt) + : Stmt(ObjcAtFinallyStmtClass), + AtFinallyStmt(atFinallyStmt), AtFinallyLoc(atFinallyLoc) {} + + virtual SourceRange getSourceRange() const { + return SourceRange(AtFinallyLoc, AtFinallyStmt->getLocEnd()); + } + + static bool classof(const Stmt *T) { + return T->getStmtClass() == ObjcAtFinallyStmtClass; + } + static bool classof(const ObjcAtFinallyStmt *) { return true; } + + virtual child_iterator child_begin(); + virtual child_iterator child_end(); + +}; + +/// ObjcAtTryStmt - This represent objective-c's over-all +/// @try ... @catch ... @finally statement. +class ObjcAtTryStmt : public Stmt { +private: + enum { TRY, CATCH, FINALLY, END_TRY }; + Stmt* SubStmts[END_TRY]; + + SourceLocation AtTryLoc; + +public: + ObjcAtTryStmt(SourceLocation atTryLoc, Stmt *atTryStmt, + ObjcAtCatchStmt *atCatchStmt, + ObjcAtFinallyStmt *atFinallyStmt) + : Stmt(ObjcAtTryStmtClass), AtTryLoc(atTryLoc) { + SubStmts[TRY] = atTryStmt; + SubStmts[CATCH] = atCatchStmt; + SubStmts[FINALLY] = atFinallyStmt; + SubStmts[END_TRY] = NULL; + } + + virtual SourceRange getSourceRange() const { + return SourceRange(AtTryLoc, SubStmts[TRY]->getLocEnd()); + } + + static bool classof(const Stmt *T) { + return T->getStmtClass() == ObjcAtTryStmtClass; + } + static bool classof(const ObjcAtTryStmt *) { return true; } + + virtual child_iterator child_begin(); + virtual child_iterator child_end(); + +}; } // end namespace clang diff --git a/include/clang/AST/StmtNodes.def b/include/clang/AST/StmtNodes.def index 469f0a8c2c..b94e6c3db2 100644 --- a/include/clang/AST/StmtNodes.def +++ b/include/clang/AST/StmtNodes.def @@ -43,7 +43,13 @@ STMT(17, SwitchCase , Stmt) // GNU Stmt Extensions STMT(18, AsmStmt , Stmt) -LAST_STMT(17) + +// Obj-C statements +STMT(19, ObjcAtTryStmt , Stmt) +STMT(20, ObjcAtCatchStmt , Stmt) +STMT(21, ObjcAtFinallyStmt , Stmt) + +LAST_STMT(21) FIRST_EXPR(31) // Expressions. diff --git a/include/clang/Parse/Parser.h b/include/clang/Parse/Parser.h index 1345fe99dd..aeffdc69a4 100644 --- a/include/clang/Parse/Parser.h +++ b/include/clang/Parse/Parser.h @@ -275,7 +275,6 @@ private: DeclTy *ParseObjCAtAliasDeclaration(SourceLocation atLoc); DeclTy *ParseObjCPropertySynthesize(SourceLocation atLoc); DeclTy *ParseObjCPropertyDynamic(SourceLocation atLoc); - DeclTy *ParseObjCTryStmt(SourceLocation atLoc); DeclTy *ParseObjCThrowStmt(SourceLocation atLoc); IdentifierInfo *ParseObjCSelector(SourceLocation &MethodLocation); @@ -389,6 +388,7 @@ private: StmtResult ParseBreakStatement(); StmtResult ParseReturnStatement(); StmtResult ParseAsmStatement(); + StmtResult ParseObjCTryStmt(SourceLocation atLoc); void ParseAsmOperandsOpt(); //===--------------------------------------------------------------------===// |