| 
									
										
										
										
											2009-02-25 09:15:00 +01:00
										 |  |  | /**************************************************************************
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | ** | 
					
						
							|  |  |  | ** This file is part of Qt Creator | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2010-03-05 11:25:49 +01:00
										 |  |  | ** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2009-06-17 00:01:27 +10:00
										 |  |  | ** Contact: Nokia Corporation (qt-info@nokia.com) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2009-02-25 09:15:00 +01:00
										 |  |  | ** Commercial Usage | 
					
						
							| 
									
										
										
										
											2008-12-02 14:17:16 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2009-02-25 09:15:00 +01:00
										 |  |  | ** Licensees holding valid Qt Commercial licenses may use this file in | 
					
						
							|  |  |  | ** accordance with the Qt Commercial License Agreement provided with the | 
					
						
							|  |  |  | ** Software or, alternatively, in accordance with the terms contained in | 
					
						
							|  |  |  | ** a written agreement between you and Nokia. | 
					
						
							| 
									
										
										
										
											2008-12-02 14:17:16 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2009-02-25 09:15:00 +01:00
										 |  |  | ** GNU Lesser General Public License Usage | 
					
						
							| 
									
										
										
										
											2008-12-02 14:17:16 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2009-02-25 09:15:00 +01:00
										 |  |  | ** Alternatively, this file may be used under the terms of the GNU Lesser | 
					
						
							|  |  |  | ** General Public License version 2.1 as published by the Free Software | 
					
						
							|  |  |  | ** Foundation and appearing in the file LICENSE.LGPL included in the | 
					
						
							|  |  |  | ** packaging of this file.  Please review the following information to | 
					
						
							|  |  |  | ** ensure the GNU Lesser General Public License version 2.1 requirements | 
					
						
							|  |  |  | ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 | 
					
						
							| 
									
										
										
										
											2008-12-02 14:17:16 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2009-02-25 09:15:00 +01:00
										 |  |  | ** If you are unsure which license is appropriate for your use, please | 
					
						
							| 
									
										
										
										
											2009-08-14 09:30:56 +02:00
										 |  |  | ** contact the sales department at http://qt.nokia.com/contact.
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2009-02-25 09:15:00 +01:00
										 |  |  | **************************************************************************/ | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | // Copyright (c) 2008 Roberto Raggi <roberto.raggi@gmail.com>
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
					
						
							|  |  |  | // of this software and associated documentation files (the "Software"), to deal
 | 
					
						
							|  |  |  | // in the Software without restriction, including without limitation the rights
 | 
					
						
							|  |  |  | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
					
						
							|  |  |  | // copies of the Software, and to permit persons to whom the Software is
 | 
					
						
							|  |  |  | // furnished to do so, subject to the following conditions:
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // The above copyright notice and this permission notice shall be included in
 | 
					
						
							|  |  |  | // all copies or substantial portions of the Software.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
					
						
							|  |  |  | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
					
						
							|  |  |  | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
					
						
							|  |  |  | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
					
						
							|  |  |  | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
					
						
							|  |  |  | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
					
						
							|  |  |  | // THE SOFTWARE.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "CheckStatement.h"
 | 
					
						
							|  |  |  | #include "Semantic.h"
 | 
					
						
							|  |  |  | #include "AST.h"
 | 
					
						
							|  |  |  | #include "TranslationUnit.h"
 | 
					
						
							|  |  |  | #include "Scope.h"
 | 
					
						
							|  |  |  | #include "CoreTypes.h"
 | 
					
						
							|  |  |  | #include "Control.h"
 | 
					
						
							|  |  |  | #include "Symbols.h"
 | 
					
						
							| 
									
										
										
										
											2009-11-30 16:30:21 +01:00
										 |  |  | #include "Names.h"
 | 
					
						
							|  |  |  | #include "Literals.h"
 | 
					
						
							|  |  |  | #include <string>
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-20 11:21:25 +02:00
										 |  |  | using namespace CPlusPlus; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | CheckStatement::CheckStatement(Semantic *semantic) | 
					
						
							|  |  |  |     : SemanticCheck(semantic), | 
					
						
							|  |  |  |       _statement(0), | 
					
						
							|  |  |  |       _scope(0) | 
					
						
							|  |  |  | { } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | CheckStatement::~CheckStatement() | 
					
						
							|  |  |  | { } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-04 16:31:29 +01:00
										 |  |  | FullySpecifiedType CheckStatement::check(StatementAST *statement, Scope *scope) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-04 16:31:29 +01:00
										 |  |  |     FullySpecifiedType previousExprType = switchExprType(FullySpecifiedType()); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     Scope *previousScope = switchScope(scope); | 
					
						
							|  |  |  |     StatementAST *previousStatement = switchStatement(statement); | 
					
						
							|  |  |  |     accept(statement); | 
					
						
							|  |  |  |     (void) switchStatement(previousStatement); | 
					
						
							|  |  |  |     (void) switchScope(previousScope); | 
					
						
							| 
									
										
										
										
											2010-02-04 16:31:29 +01:00
										 |  |  |     return switchExprType(previousExprType); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | FullySpecifiedType CheckStatement::switchExprType(const FullySpecifiedType &type) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const FullySpecifiedType &previousExprType = _exprType; | 
					
						
							|  |  |  |     _exprType = type; | 
					
						
							|  |  |  |     return previousExprType; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | StatementAST *CheckStatement::switchStatement(StatementAST *statement) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     StatementAST *previousStatement = _statement; | 
					
						
							|  |  |  |     _statement = statement; | 
					
						
							|  |  |  |     return previousStatement; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Scope *CheckStatement::switchScope(Scope *scope) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Scope *previousScope = _scope; | 
					
						
							|  |  |  |     _scope = scope; | 
					
						
							|  |  |  |     return previousScope; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool CheckStatement::visit(CaseStatementAST *ast) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-04 16:31:29 +01:00
										 |  |  |     (void) semantic()->check(ast->expression, _scope); | 
					
						
							|  |  |  |     _exprType = semantic()->check(ast->statement, _scope); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool CheckStatement::visit(CompoundStatementAST *ast) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Block *block = control()->newBlock(ast->lbrace_token); | 
					
						
							| 
									
										
										
										
											2009-03-31 13:56:28 +02:00
										 |  |  |     block->setStartOffset(tokenAt(ast->firstToken()).offset); | 
					
						
							|  |  |  |     block->setEndOffset(tokenAt(ast->lastToken()).offset); | 
					
						
							| 
									
										
										
										
											2009-02-09 14:58:13 +01:00
										 |  |  |     ast->symbol = block; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     _scope->enterSymbol(block); | 
					
						
							|  |  |  |     Scope *previousScope = switchScope(block->members()); | 
					
						
							| 
									
										
										
										
											2009-12-07 15:00:37 +01:00
										 |  |  |     StatementAST *previousStatement = 0; | 
					
						
							| 
									
										
										
										
											2009-11-10 16:47:16 +01:00
										 |  |  |     for (StatementListAST *it = ast->statement_list; it; it = it->next) { | 
					
						
							| 
									
										
										
										
											2009-12-07 15:00:37 +01:00
										 |  |  |         StatementAST *statement = it->value; | 
					
						
							| 
									
										
										
										
											2010-02-04 16:31:29 +01:00
										 |  |  |         _exprType = semantic()->check(statement, _scope); | 
					
						
							| 
									
										
										
										
											2009-12-07 15:00:37 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (statement && previousStatement) { | 
					
						
							|  |  |  |             ExpressionStatementAST *expressionStatement = statement->asExpressionStatement(); | 
					
						
							|  |  |  |             CompoundStatementAST *compoundStatement = previousStatement->asCompoundStatement(); | 
					
						
							|  |  |  |             if (expressionStatement && ! expressionStatement->expression && compoundStatement && compoundStatement->rbrace_token) | 
					
						
							|  |  |  |                 translationUnit()->warning(compoundStatement->rbrace_token, "unnecessary semicolon after block"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         previousStatement = statement; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     } | 
					
						
							|  |  |  |     (void) switchScope(previousScope); | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool CheckStatement::visit(DeclarationStatementAST *ast) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     semantic()->check(ast->declaration, _scope); | 
					
						
							| 
									
										
										
										
											2010-02-04 16:31:29 +01:00
										 |  |  |     _exprType = FullySpecifiedType(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool CheckStatement::visit(DoStatementAST *ast) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     semantic()->check(ast->statement, _scope); | 
					
						
							| 
									
										
										
										
											2010-02-04 16:31:29 +01:00
										 |  |  |     (void) semantic()->check(ast->expression, _scope); | 
					
						
							|  |  |  |     _exprType = FullySpecifiedType(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool CheckStatement::visit(ExpressionOrDeclarationStatementAST *ast) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | //    translationUnit()->warning(ast->firstToken(),
 | 
					
						
							|  |  |  | //                               "ambiguous expression or declaration statement");
 | 
					
						
							| 
									
										
										
										
											2010-02-04 16:31:29 +01:00
										 |  |  |     if (ast->declaration) { | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         semantic()->check(ast->declaration, _scope); | 
					
						
							| 
									
										
										
										
											2010-02-04 16:31:29 +01:00
										 |  |  |         _exprType = FullySpecifiedType(); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         _exprType = semantic()->check(ast->expression, _scope); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool CheckStatement::visit(ExpressionStatementAST *ast) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-04 16:31:29 +01:00
										 |  |  |     _exprType = semantic()->check(ast->expression, _scope); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-09 18:00:25 +01:00
										 |  |  | bool CheckStatement::forEachFastEnum(unsigned firstToken, | 
					
						
							|  |  |  |                                      unsigned lastToken, | 
					
						
							|  |  |  |                                      SpecifierListAST *type_specifier_list, | 
					
						
							|  |  |  |                                      DeclaratorAST *declarator, | 
					
						
							|  |  |  |                                      ExpressionAST *initializer, | 
					
						
							|  |  |  |                                      ExpressionAST *expression, | 
					
						
							|  |  |  |                                      StatementAST *statement, | 
					
						
							|  |  |  |                                      Block *&symbol) | 
					
						
							| 
									
										
										
										
											2009-07-03 09:11:52 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-01-09 18:00:25 +01:00
										 |  |  |     Block *block = control()->newBlock(firstToken); | 
					
						
							|  |  |  |     block->setStartOffset(tokenAt(firstToken).offset); | 
					
						
							|  |  |  |     block->setEndOffset(tokenAt(lastToken).offset); | 
					
						
							|  |  |  |     symbol = block; | 
					
						
							| 
									
										
										
										
											2009-07-03 09:11:52 +02:00
										 |  |  |     _scope->enterSymbol(block); | 
					
						
							|  |  |  |     Scope *previousScope = switchScope(block->members()); | 
					
						
							| 
									
										
										
										
											2010-01-09 18:00:25 +01:00
										 |  |  |     if (type_specifier_list && declarator) { | 
					
						
							|  |  |  |         FullySpecifiedType ty = semantic()->check(type_specifier_list, _scope); | 
					
						
							| 
									
										
										
										
											2009-12-01 12:46:15 +01:00
										 |  |  |         const Name *name = 0; | 
					
						
							| 
									
										
										
										
											2010-01-09 18:00:25 +01:00
										 |  |  |         ty = semantic()->check(declarator, ty, _scope, &name); | 
					
						
							|  |  |  |         unsigned location = declarator->firstToken(); | 
					
						
							|  |  |  |         if (CoreDeclaratorAST *core_declarator = declarator->core_declarator) | 
					
						
							| 
									
										
										
										
											2009-07-03 09:11:52 +02:00
										 |  |  |             location = core_declarator->firstToken(); | 
					
						
							|  |  |  |         Declaration *decl = control()->newDeclaration(location, name); | 
					
						
							|  |  |  |         decl->setType(ty); | 
					
						
							|  |  |  |         _scope->enterSymbol(decl); | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2010-02-04 16:31:29 +01:00
										 |  |  |         (void) semantic()->check(initializer, _scope); | 
					
						
							| 
									
										
										
										
											2009-07-03 09:11:52 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-04 16:31:29 +01:00
										 |  |  |     (void) semantic()->check(expression, _scope); | 
					
						
							| 
									
										
										
										
											2010-01-09 18:00:25 +01:00
										 |  |  |     semantic()->check(statement, _scope); | 
					
						
							| 
									
										
										
										
											2009-07-03 09:11:52 +02:00
										 |  |  |     (void) switchScope(previousScope); | 
					
						
							| 
									
										
										
										
											2010-02-04 16:31:29 +01:00
										 |  |  |     _exprType = FullySpecifiedType(); | 
					
						
							| 
									
										
										
										
											2009-07-03 09:11:52 +02:00
										 |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-09 18:00:25 +01:00
										 |  |  | bool CheckStatement::visit(ForeachStatementAST *ast) | 
					
						
							| 
									
										
										
										
											2009-08-05 18:30:18 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-01-09 18:00:25 +01:00
										 |  |  |     return forEachFastEnum(ast->firstToken(), | 
					
						
							|  |  |  |                            ast->lastToken(), | 
					
						
							|  |  |  |                            ast->type_specifier_list, | 
					
						
							|  |  |  |                            ast->declarator, | 
					
						
							|  |  |  |                            ast->initializer, | 
					
						
							|  |  |  |                            ast->expression, | 
					
						
							|  |  |  |                            ast->statement, | 
					
						
							|  |  |  |                            ast->symbol); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-08-05 18:30:18 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-09 18:00:25 +01:00
										 |  |  | bool CheckStatement::visit(ObjCFastEnumerationAST *ast) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return forEachFastEnum(ast->firstToken(), | 
					
						
							|  |  |  |                            ast->lastToken(), | 
					
						
							|  |  |  |                            ast->type_specifier_list, | 
					
						
							|  |  |  |                            ast->declarator, | 
					
						
							|  |  |  |                            ast->initializer, | 
					
						
							|  |  |  |                            ast->fast_enumeratable_expression, | 
					
						
							|  |  |  |                            ast->statement, | 
					
						
							|  |  |  |                            ast->symbol); | 
					
						
							| 
									
										
										
										
											2009-08-05 18:30:18 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | bool CheckStatement::visit(ForStatementAST *ast) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Block *block = control()->newBlock(ast->for_token); | 
					
						
							| 
									
										
										
										
											2009-06-25 11:02:02 +02:00
										 |  |  |     block->setStartOffset(tokenAt(ast->firstToken()).offset); | 
					
						
							|  |  |  |     block->setEndOffset(tokenAt(ast->lastToken()).offset); | 
					
						
							| 
									
										
										
										
											2009-02-09 14:58:13 +01:00
										 |  |  |     ast->symbol = block; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     _scope->enterSymbol(block); | 
					
						
							|  |  |  |     Scope *previousScope = switchScope(block->members()); | 
					
						
							|  |  |  |     semantic()->check(ast->initializer, _scope); | 
					
						
							|  |  |  |     FullySpecifiedType condTy = semantic()->check(ast->condition, _scope); | 
					
						
							|  |  |  |     FullySpecifiedType exprTy = semantic()->check(ast->expression, _scope); | 
					
						
							|  |  |  |     semantic()->check(ast->statement, _scope); | 
					
						
							|  |  |  |     (void) switchScope(previousScope); | 
					
						
							| 
									
										
										
										
											2010-02-04 16:31:29 +01:00
										 |  |  |     _exprType = FullySpecifiedType(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool CheckStatement::visit(IfStatementAST *ast) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Block *block = control()->newBlock(ast->if_token); | 
					
						
							| 
									
										
										
										
											2009-06-25 11:02:02 +02:00
										 |  |  |     block->setStartOffset(tokenAt(ast->firstToken()).offset); | 
					
						
							|  |  |  |     block->setEndOffset(tokenAt(ast->lastToken()).offset); | 
					
						
							| 
									
										
										
										
											2009-02-09 14:58:13 +01:00
										 |  |  |     ast->symbol = block; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     _scope->enterSymbol(block); | 
					
						
							|  |  |  |     Scope *previousScope = switchScope(block->members()); | 
					
						
							|  |  |  |     FullySpecifiedType exprTy = semantic()->check(ast->condition, _scope); | 
					
						
							|  |  |  |     semantic()->check(ast->statement, _scope); | 
					
						
							|  |  |  |     semantic()->check(ast->else_statement, _scope); | 
					
						
							|  |  |  |     (void) switchScope(previousScope); | 
					
						
							| 
									
										
										
										
											2010-02-04 16:31:29 +01:00
										 |  |  |     _exprType = FullySpecifiedType(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool CheckStatement::visit(LabeledStatementAST *ast) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     semantic()->check(ast->statement, _scope); | 
					
						
							| 
									
										
										
										
											2010-02-04 16:31:29 +01:00
										 |  |  |     _exprType = FullySpecifiedType(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool CheckStatement::visit(BreakStatementAST *) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-04 16:31:29 +01:00
										 |  |  |     _exprType = FullySpecifiedType(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool CheckStatement::visit(ContinueStatementAST *) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-04 16:31:29 +01:00
										 |  |  |     _exprType = FullySpecifiedType(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool CheckStatement::visit(GotoStatementAST *) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-04 16:31:29 +01:00
										 |  |  |     _exprType = FullySpecifiedType(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool CheckStatement::visit(ReturnStatementAST *ast) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-04 16:31:29 +01:00
										 |  |  |     _exprType = semantic()->check(ast->expression, _scope); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool CheckStatement::visit(SwitchStatementAST *ast) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Block *block = control()->newBlock(ast->switch_token); | 
					
						
							| 
									
										
										
										
											2009-06-25 11:02:02 +02:00
										 |  |  |     block->setStartOffset(tokenAt(ast->firstToken()).offset); | 
					
						
							|  |  |  |     block->setEndOffset(tokenAt(ast->lastToken()).offset); | 
					
						
							| 
									
										
										
										
											2009-02-09 14:58:13 +01:00
										 |  |  |     ast->symbol = block; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     _scope->enterSymbol(block); | 
					
						
							|  |  |  |     Scope *previousScope = switchScope(block->members()); | 
					
						
							|  |  |  |     FullySpecifiedType condTy = semantic()->check(ast->condition, _scope); | 
					
						
							|  |  |  |     semantic()->check(ast->statement, _scope); | 
					
						
							|  |  |  |     (void) switchScope(previousScope); | 
					
						
							| 
									
										
										
										
											2010-02-04 16:31:29 +01:00
										 |  |  |     _exprType = FullySpecifiedType(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool CheckStatement::visit(TryBlockStatementAST *ast) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     semantic()->check(ast->statement, _scope); | 
					
						
							| 
									
										
										
										
											2009-11-10 15:15:51 +01:00
										 |  |  |     for (CatchClauseListAST *it = ast->catch_clause_list; it; it = it->next) { | 
					
						
							|  |  |  |         semantic()->check(it->value, _scope); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-02-04 16:31:29 +01:00
										 |  |  |     _exprType = FullySpecifiedType(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool CheckStatement::visit(CatchClauseAST *ast) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Block *block = control()->newBlock(ast->catch_token); | 
					
						
							| 
									
										
										
										
											2009-06-25 11:02:02 +02:00
										 |  |  |     block->setStartOffset(tokenAt(ast->firstToken()).offset); | 
					
						
							|  |  |  |     block->setEndOffset(tokenAt(ast->lastToken()).offset); | 
					
						
							| 
									
										
										
										
											2009-02-09 14:58:13 +01:00
										 |  |  |     ast->symbol = block; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     _scope->enterSymbol(block); | 
					
						
							|  |  |  |     Scope *previousScope = switchScope(block->members()); | 
					
						
							|  |  |  |     semantic()->check(ast->exception_declaration, _scope); | 
					
						
							|  |  |  |     semantic()->check(ast->statement, _scope); | 
					
						
							|  |  |  |     (void) switchScope(previousScope); | 
					
						
							| 
									
										
										
										
											2010-02-04 16:31:29 +01:00
										 |  |  |     _exprType = FullySpecifiedType(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool CheckStatement::visit(WhileStatementAST *ast) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Block *block = control()->newBlock(ast->while_token); | 
					
						
							| 
									
										
										
										
											2009-06-25 11:02:02 +02:00
										 |  |  |     block->setStartOffset(tokenAt(ast->firstToken()).offset); | 
					
						
							|  |  |  |     block->setEndOffset(tokenAt(ast->lastToken()).offset); | 
					
						
							| 
									
										
										
										
											2009-02-09 14:58:13 +01:00
										 |  |  |     ast->symbol = block; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     _scope->enterSymbol(block); | 
					
						
							|  |  |  |     Scope *previousScope = switchScope(block->members()); | 
					
						
							|  |  |  |     FullySpecifiedType condTy = semantic()->check(ast->condition, _scope); | 
					
						
							|  |  |  |     semantic()->check(ast->statement, _scope); | 
					
						
							|  |  |  |     (void) switchScope(previousScope); | 
					
						
							| 
									
										
										
										
											2010-02-04 16:31:29 +01:00
										 |  |  |     _exprType = FullySpecifiedType(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-30 16:30:21 +01:00
										 |  |  | bool CheckStatement::visit(QtMemberDeclarationAST *ast) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-12-01 12:46:15 +01:00
										 |  |  |     const Name *name = 0; | 
					
						
							| 
									
										
										
										
											2009-11-30 16:30:21 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (tokenKind(ast->q_token) == T_Q_D) | 
					
						
							|  |  |  |         name = control()->nameId(control()->findOrInsertIdentifier("d")); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         name = control()->nameId(control()->findOrInsertIdentifier("q")); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     FullySpecifiedType declTy = semantic()->check(ast->type_id, _scope); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (tokenKind(ast->q_token) == T_Q_D) { | 
					
						
							|  |  |  |         if (NamedType *namedTy = declTy->asNamedType()) { | 
					
						
							| 
									
										
										
										
											2009-12-01 12:46:15 +01:00
										 |  |  |             if (const NameId *nameId = namedTy->name()->asNameId()) { | 
					
						
							| 
									
										
										
										
											2009-11-30 16:30:21 +01:00
										 |  |  |                 std::string privateClass; | 
					
						
							|  |  |  |                 privateClass += nameId->identifier()->chars(); | 
					
						
							|  |  |  |                 privateClass += "Private"; | 
					
						
							| 
									
										
										
										
											2010-01-29 22:49:55 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-01 12:46:15 +01:00
										 |  |  |                 const Name *privName = control()->nameId(control()->findOrInsertIdentifier(privateClass.c_str(), | 
					
						
							|  |  |  |                                                                                            privateClass.size())); | 
					
						
							| 
									
										
										
										
											2009-11-30 16:30:21 +01:00
										 |  |  |                 declTy.setType(control()->namedType(privName)); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Declaration *symbol = control()->newDeclaration(/*generated*/ 0, name); | 
					
						
							|  |  |  |     symbol->setType(control()->pointerType(declTy)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     _scope->enterSymbol(symbol); | 
					
						
							| 
									
										
										
										
											2010-02-04 16:31:29 +01:00
										 |  |  |     _exprType = FullySpecifiedType(); | 
					
						
							| 
									
										
										
										
											2009-11-30 16:30:21 +01:00
										 |  |  |     return false; | 
					
						
							|  |  |  | } |