]> granicus.if.org Git - clang/commitdiff
AST for objective-c's @throw statement and its pretty-printing.
authorFariborz Jahanian <fjahanian@apple.com>
Wed, 7 Nov 2007 02:00:49 +0000 (02:00 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Wed, 7 Nov 2007 02:00:49 +0000 (02:00 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43802 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 8e1abda582357a307b2c768ed8ec5adac46fc78f..28681c6a0a7079089b4f820edc7ea64867ffe86b 100644 (file)
@@ -209,3 +209,11 @@ Stmt::child_iterator ObjcAtTryStmt::child_end()   {
   return &SubStmts[0]+END_TRY; 
 }
 
+// ObjcAtThrowStmt
+Stmt::child_iterator ObjcAtThrowStmt::child_begin() {
+  return &Throw;
+}
+
+Stmt::child_iterator ObjcAtThrowStmt::child_end() {
+  return &Throw+1;
+}
index d42a16640f28681d6305b3ec2e0d25ea1e5020a3..7fa553d810e21a3307f68302842a7dc393d72c46 100644 (file)
@@ -361,6 +361,15 @@ void StmtPrinter::VisitObjcAtCatchStmt (ObjcAtCatchStmt *Node) {
   Indent() << "@catch (...) { /* todo */ } \n";
 }
 
+void StmtPrinter::VisitObjcAtThrowStmt (ObjcAtThrowStmt *Node) {
+  Indent() << "@throw";
+  if (Node->getThrowExpr()) {
+    OS << " ";
+    PrintExpr(Node->getThrowExpr());
+  }
+  OS << ";\n";
+}
+
 //===----------------------------------------------------------------------===//
 //  Expr printing methods.
 //===----------------------------------------------------------------------===//
index 4290fc5044066637d1dfdf688603d19e45a2dea7..a149b8611f67fe65489f52afe133bf1afc566c97 100644 (file)
@@ -1052,16 +1052,18 @@ Parser::DeclTy *Parser::ParseObjCPropertyDynamic(SourceLocation atLoc) {
 ///  objc-throw-statement:
 ///    throw expression[opt];
 ///
-Parser::DeclTy *Parser::ParseObjCThrowStmt(SourceLocation atLoc) {
+Parser::StmtResult Parser::ParseObjCThrowStmt(SourceLocation atLoc) {
+  ExprResult Res;
   ConsumeToken(); // consume throw
   if (Tok.isNot(tok::semi)) {
-    ExprResult Res = ParseExpression();
+    Res = ParseExpression();
     if (Res.isInvalid) {
       SkipUntil(tok::semi);
-      return 0;
+      return true;
     }
   }
-  return 0;
+  ConsumeToken(); // consume ';'
+  return Actions.ActOnObjcAtThrowStmt(atLoc, Res.Val);
 }
 
 ///  objc-try-catch-statement:
index 01ac1e4a14b6403315841a1235de4d44adcf3d19..2781b1674555463fd34080c15f7c95e1d38ca06b 100644 (file)
@@ -350,6 +350,9 @@ public:
                                         StmtTy *Try, 
                                         StmtTy *Catch, StmtTy *Finally);
   
+  virtual StmtResult ActOnObjcAtThrowStmt(SourceLocation AtLoc, 
+                                          StmtTy *Throw);
+  
   //===--------------------------------------------------------------------===//
   // Expression Parsing Callbacks: SemaExpr.cpp.
 
index b495bb828d0fefb0458cc225c046270e9b34257a..65acf0bb14d10bf604fbb161f0cb8186257fff15 100644 (file)
@@ -675,6 +675,11 @@ Sema::ActOnObjcAtTryStmt(SourceLocation AtLoc,
   return TS;
 }
 
+Action::StmtResult
+Sema::ActOnObjcAtThrowStmt(SourceLocation AtLoc, StmtTy *Throw) {
+  ObjcAtThrowStmt *TS = new ObjcAtThrowStmt(AtLoc, static_cast<Stmt*>(Throw));
+  return TS;
+}
 
 
 
index 67cf0c0891602f33ff4de7dad3afb506b60d6910..d1a7415e59cae424947cb443e7974036255255f2 100644 (file)
@@ -800,6 +800,33 @@ public:
     
 };
 
+/// ObjcAtThrowStmt - This represents objective-c's @throw statement.
+class ObjcAtThrowStmt : public Stmt {
+private:
+  Stmt *Throw;
+  SourceLocation AtThrowLoc;
+
+public:
+  ObjcAtThrowStmt(SourceLocation atThrowLoc, Stmt *throwExpr)
+  : Stmt(ObjcAtThrowStmtClass), Throw(throwExpr) {
+    AtThrowLoc = atThrowLoc;
+  }
+  
+  Expr *const getThrowExpr() const { return reinterpret_cast<Expr*>(Throw); }
+  
+  virtual SourceRange getSourceRange() const { 
+    return SourceRange(AtThrowLoc, Throw->getLocEnd()); 
+  }
+  
+  static bool classof(const Stmt *T) {
+    return T->getStmtClass() == ObjcAtThrowStmtClass;
+  }
+  static bool classof(const ObjcAtThrowStmt *) { return true; }
+  
+  virtual child_iterator child_begin();
+  virtual child_iterator child_end();
+};
+
 }  // end namespace clang
 
 #endif
index b94e6c3db23401c8c5e62f7cd6ea4b293476fdd5..db87975823aeda43fc12dbec3d594bb628ee4cc3 100644 (file)
@@ -48,8 +48,9 @@ STMT(18, AsmStmt         , Stmt)
 STMT(19, ObjcAtTryStmt        , Stmt)
 STMT(20, ObjcAtCatchStmt      , Stmt)
 STMT(21, ObjcAtFinallyStmt    , Stmt)
+STMT(22, ObjcAtThrowStmt      , Stmt)
 
-LAST_STMT(21)
+LAST_STMT(22)
 
 FIRST_EXPR(31)
 // Expressions.
index 41c60f4e5df11566a724cd9584c1e3cd1a6cfd7c..acdd27e1b7c0509c78253e43229d057d1d205b90 100644 (file)
@@ -305,6 +305,12 @@ public:
                                         StmtTy *Catch, StmtTy *Finally) {
     return 0;
   }
+  
+  virtual StmtResult ActOnObjcAtThrowStmt(SourceLocation AtLoc, 
+                                          StmtTy *Throw) {
+    return 0;
+  }
+  
   //===--------------------------------------------------------------------===//
   // Expression Parsing Callbacks.
   //===--------------------------------------------------------------------===//
index 1bdf2e743ec6d9f8d9d36cc579215f272fc80eb3..b7476a77b60c143b61c62102d523f3cae1c7220b 100644 (file)
@@ -275,7 +275,6 @@ private:
   DeclTy *ParseObjCAtAliasDeclaration(SourceLocation atLoc);
   DeclTy *ParseObjCPropertySynthesize(SourceLocation atLoc);
   DeclTy *ParseObjCPropertyDynamic(SourceLocation atLoc);
-  DeclTy *ParseObjCThrowStmt(SourceLocation atLoc);
   
   IdentifierInfo *ParseObjCSelector(SourceLocation &MethodLocation);
   // Definitions for Objective-c context sensitive keywords recognition.
@@ -389,6 +388,7 @@ private:
   StmtResult ParseReturnStatement();
   StmtResult ParseAsmStatement();
   StmtResult ParseObjCTryStmt(SourceLocation atLoc);
+  StmtResult ParseObjCThrowStmt(SourceLocation atLoc);
   void ParseAsmOperandsOpt();
 
   //===--------------------------------------------------------------------===//