aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AST/Stmt.cpp12
-rw-r--r--AST/StmtPrinter.cpp12
-rw-r--r--Parse/ParseObjc.cpp10
-rw-r--r--include/clang/AST/Stmt.h90
-rw-r--r--include/clang/AST/StmtNodes.def8
-rw-r--r--include/clang/Parse/Parser.h2
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();
//===--------------------------------------------------------------------===//