]> granicus.if.org Git - clang/commitdiff
Bunch of class declarations for objective-c's @try-catch statement.
authorFariborz Jahanian <fjahanian@apple.com>
Thu, 1 Nov 2007 21:12:44 +0000 (21:12 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Thu, 1 Nov 2007 21:12:44 +0000 (21:12 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43623 91177308-0d34-0410-b5e6-96231b3b80d8

AST/Stmt.cpp
AST/StmtPrinter.cpp
Parse/ParseObjc.cpp
include/clang/AST/Stmt.h
include/clang/AST/StmtNodes.def
include/clang/Parse/Parser.h

index e8ecd0c987617cf1be755472298fd6305cfc300b..1738f9573be4de76e43003fce06310b302b06a3b 100644 (file)
@@ -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; }
+
index ac6da0638d9bd5456c46d7e1b7318d9b50f57166..0953891fdbdbf44f0522ded2ed58575484ddf0aa 100644 (file)
@@ -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.
 //===----------------------------------------------------------------------===//
index 69124f2939d24572acc5694634915c65e8278825..765422a985baa85e7d3011d9a12183c15faa9c26 100644 (file)
@@ -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 '}'
index fa0dc9d2346cd74013887794577c0c67ee79e8a1..580b3d6dbdf6bdccce6813d90e313f46e52a58ab 100644 (file)
@@ -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
 
index 469f0a8c2c29188259eab3a961f760f6f70741f0..b94e6c3db23401c8c5e62f7cd6ea4b293476fdd5 100644 (file)
@@ -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.
index 1345fe99dd5eacf8bda3aa7a48bd7b06a224d1bd..aeffdc69a41448553635d6c66cec3b1234ac56aa 100644 (file)
@@ -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();
 
   //===--------------------------------------------------------------------===//