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