From 30c67f43dfffc146d67563912dab1e2e586057a8 Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Tue, 10 Nov 2009 15:15:51 +0100
Subject: [PATCH] Cleanup Catch clause

---
 src/shared/cplusplus/AST.cpp            | 8 +++-----
 src/shared/cplusplus/AST.h              | 3 +--
 src/shared/cplusplus/ASTVisit.cpp       | 3 +--
 src/shared/cplusplus/ASTfwd.h           | 1 +
 src/shared/cplusplus/CheckStatement.cpp | 4 ++--
 src/shared/cplusplus/Parser.cpp         | 6 +++---
 src/shared/cplusplus/Parser.h           | 2 +-
 7 files changed, 12 insertions(+), 15 deletions(-)

diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index 4286cc8dff9..03531c481a5 100644
--- a/src/shared/cplusplus/AST.cpp
+++ b/src/shared/cplusplus/AST.cpp
@@ -1616,12 +1616,10 @@ unsigned TryBlockStatementAST::firstToken() const
 
 unsigned TryBlockStatementAST::lastToken() const
 {
-    for (CatchClauseAST *it = catch_clause_seq; it; it = it->next) {
-        if (! it->next)
-            return it->lastToken();
-    }
+    if (catch_clause_list)
+        return catch_clause_list->lastToken();
 
-    if (statement)
+    else if (statement)
         return statement->lastToken();
 
     return try_token + 1;
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index 97a56da8efe..190b5cb5600 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -1899,7 +1899,7 @@ class CPLUSPLUS_EXPORT TryBlockStatementAST: public StatementAST
 public:
     unsigned try_token;
     StatementAST *statement;
-    CatchClauseAST *catch_clause_seq;
+    CatchClauseListAST *catch_clause_list;
 
 public:
     virtual TryBlockStatementAST *asTryBlockStatement() { return this; }
@@ -1919,7 +1919,6 @@ public:
     ExceptionDeclarationAST *exception_declaration;
     unsigned rparen_token;
     StatementAST *statement;
-    CatchClauseAST *next;
 
 public: // annotations
     Block *symbol;
diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp
index 63ef418ec9e..7469388d4cf 100644
--- a/src/shared/cplusplus/ASTVisit.cpp
+++ b/src/shared/cplusplus/ASTVisit.cpp
@@ -804,8 +804,7 @@ void TryBlockStatementAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
         accept(statement, visitor);
-        for (CatchClauseAST *it = catch_clause_seq; it; it = it->next)
-            accept(it, visitor);
+        accept(catch_clause_list, visitor);
     }
     visitor->endVisit(this);
 }
diff --git a/src/shared/cplusplus/ASTfwd.h b/src/shared/cplusplus/ASTfwd.h
index ac70f735db5..4c04800c181 100644
--- a/src/shared/cplusplus/ASTfwd.h
+++ b/src/shared/cplusplus/ASTfwd.h
@@ -203,6 +203,7 @@ typedef List<PostfixAST *> PostfixListAST;
 typedef List<PostfixDeclaratorAST *> PostfixDeclaratorListAST;
 typedef List<AttributeAST *> AttributeListAST;
 typedef List<NestedNameSpecifierAST *> NestedNameSpecifierListAST;
+typedef List<CatchClauseAST *> CatchClauseListAST;
 
 typedef List<NameAST *> ObjCIdentifierListAST;
 typedef List<ObjCMessageArgumentAST *> ObjCMessageArgumentListAST;
diff --git a/src/shared/cplusplus/CheckStatement.cpp b/src/shared/cplusplus/CheckStatement.cpp
index f2edeae338a..f63aa9270b3 100644
--- a/src/shared/cplusplus/CheckStatement.cpp
+++ b/src/shared/cplusplus/CheckStatement.cpp
@@ -273,8 +273,8 @@ bool CheckStatement::visit(SwitchStatementAST *ast)
 bool CheckStatement::visit(TryBlockStatementAST *ast)
 {
     semantic()->check(ast->statement, _scope);
-    for (CatchClauseAST *c = ast->catch_clause_seq; c; c = c->next) {
-        semantic()->check(c, _scope);
+    for (CatchClauseListAST *it = ast->catch_clause_list; it; it = it->next) {
+        semantic()->check(it->value, _scope);
     }
     return false;
 }
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index 904a5c76f04..394074e594a 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -2949,7 +2949,7 @@ bool Parser::parseTryBlockStatement(StatementAST *&node)
         TryBlockStatementAST *ast = new (_pool) TryBlockStatementAST;
         ast->try_token = consumeToken();
         parseCompoundStatement(ast->statement);
-        CatchClauseAST **catch_clause_ptr = &ast->catch_clause_seq;
+        CatchClauseListAST **catch_clause_ptr = &ast->catch_clause_list;
         while (parseCatchClause(*catch_clause_ptr))
             catch_clause_ptr = &(*catch_clause_ptr)->next;
         node = ast;
@@ -2958,7 +2958,7 @@ bool Parser::parseTryBlockStatement(StatementAST *&node)
     return false;
 }
 
-bool Parser::parseCatchClause(CatchClauseAST *&node)
+bool Parser::parseCatchClause(CatchClauseListAST *&node)
 {
     DEBUG_THIS_RULE();
     if (LA() == T_CATCH) {
@@ -2968,7 +2968,7 @@ bool Parser::parseCatchClause(CatchClauseAST *&node)
         parseExceptionDeclaration(ast->exception_declaration);
         match(T_RPAREN, &ast->rparen_token);
         parseCompoundStatement(ast->statement);
-        node = ast;
+        node = new (_pool) CatchClauseListAST(ast);
         return true;
     }
     return false;
diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h
index 2ab563f09a3..15f768b3cf2 100644
--- a/src/shared/cplusplus/Parser.h
+++ b/src/shared/cplusplus/Parser.h
@@ -181,7 +181,7 @@ public:
     bool parseTemplateParameterList(DeclarationListAST *&node);
     bool parseThrowExpression(ExpressionAST *&node);
     bool parseTryBlockStatement(StatementAST *&node);
-    bool parseCatchClause(CatchClauseAST *&node);
+    bool parseCatchClause(CatchClauseListAST *&node);
     bool parseTypeId(ExpressionAST *&node);
     bool parseTypeIdList(ExpressionListAST *&node);
     bool parseTypenameTypeParameter(DeclarationAST *&node);
-- 
GitLab