| 
									
										
										
										
											2011-05-06 15:05:37 +02:00
										 |  |  | /**************************************************************************
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** This file is part of Qt Creator | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2012-01-26 18:33:46 +01:00
										 |  |  | ** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). | 
					
						
							| 
									
										
										
										
											2011-05-06 15:05:37 +02:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2012-07-19 12:26:56 +02:00
										 |  |  | ** Contact: http://www.qt-project.org/
 | 
					
						
							| 
									
										
										
										
											2011-05-06 15:05:37 +02:00
										 |  |  | ** | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** GNU Lesser General Public License Usage | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** 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.
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** In addition, as a special exception, Nokia gives you certain additional | 
					
						
							|  |  |  | ** rights. These rights are described in the Nokia Qt LGPL Exception | 
					
						
							|  |  |  | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** Other Usage | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** Alternatively, this file may be used in accordance with the terms and | 
					
						
							|  |  |  | ** conditions contained in a signed written agreement between you and Nokia. | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | **************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-04 11:52:31 +02:00
										 |  |  | #include "qmljsscopeastpath.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "parser/qmljsast_p.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | using namespace QmlJS; | 
					
						
							|  |  |  | using namespace AST; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ScopeAstPath::ScopeAstPath(Document::Ptr doc) | 
					
						
							|  |  |  |     : _doc(doc) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QList<Node *> ScopeAstPath::operator()(quint32 offset) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     _result.clear(); | 
					
						
							|  |  |  |     _offset = offset; | 
					
						
							|  |  |  |     if (_doc) | 
					
						
							| 
									
										
										
										
											2011-08-09 10:40:39 +02:00
										 |  |  |         accept(_doc->ast()); | 
					
						
							| 
									
										
										
										
											2011-05-04 11:52:31 +02:00
										 |  |  |     return _result; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ScopeAstPath::accept(Node *node) | 
					
						
							| 
									
										
										
										
											2011-08-09 10:40:39 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     Node::accept(node, this); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-05-04 11:52:31 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | bool ScopeAstPath::preVisit(Node *node) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (Statement *stmt = node->statementCast()) { | 
					
						
							|  |  |  |         return containsOffset(stmt->firstSourceLocation(), stmt->lastSourceLocation()); | 
					
						
							|  |  |  |     } else if (ExpressionNode *exp = node->expressionCast()) { | 
					
						
							|  |  |  |         return containsOffset(exp->firstSourceLocation(), exp->lastSourceLocation()); | 
					
						
							|  |  |  |     } else if (UiObjectMember *ui = node->uiObjectMemberCast()) { | 
					
						
							|  |  |  |         return containsOffset(ui->firstSourceLocation(), ui->lastSourceLocation()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-06 14:13:50 +02:00
										 |  |  | bool ScopeAstPath::visit(UiPublicMember *node) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (node && node->statement && node->statement->kind == node->Kind_Block | 
					
						
							|  |  |  |             && containsOffset(node->statement->firstSourceLocation(), | 
					
						
							|  |  |  |                               node->statement->lastSourceLocation())) { | 
					
						
							|  |  |  |         _result.append(node); | 
					
						
							| 
									
										
										
										
											2011-08-09 10:40:39 +02:00
										 |  |  |         accept(node->statement); | 
					
						
							| 
									
										
										
										
											2011-06-06 14:13:50 +02:00
										 |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool ScopeAstPath::visit(UiScriptBinding *node) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (node && node->statement && node->statement->kind == node->Kind_Block | 
					
						
							|  |  |  |             && containsOffset(node->statement->firstSourceLocation(), | 
					
						
							|  |  |  |                               node->statement->lastSourceLocation())) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         _result.append(node); | 
					
						
							| 
									
										
										
										
											2011-08-09 10:40:39 +02:00
										 |  |  |         accept(node->statement); | 
					
						
							| 
									
										
										
										
											2011-06-06 14:13:50 +02:00
										 |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-04 11:52:31 +02:00
										 |  |  | bool ScopeAstPath::visit(UiObjectDefinition *node) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     _result.append(node); | 
					
						
							| 
									
										
										
										
											2011-08-09 10:40:39 +02:00
										 |  |  |     accept(node->initializer); | 
					
						
							| 
									
										
										
										
											2011-05-04 11:52:31 +02:00
										 |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool ScopeAstPath::visit(UiObjectBinding *node) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     _result.append(node); | 
					
						
							| 
									
										
										
										
											2011-08-09 10:40:39 +02:00
										 |  |  |     accept(node->initializer); | 
					
						
							| 
									
										
										
										
											2011-05-04 11:52:31 +02:00
										 |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool ScopeAstPath::visit(FunctionDeclaration *node) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return visit(static_cast<FunctionExpression *>(node)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool ScopeAstPath::visit(FunctionExpression *node) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-08-09 10:40:39 +02:00
										 |  |  |     accept(node->formals); | 
					
						
							| 
									
										
										
										
											2011-05-04 11:52:31 +02:00
										 |  |  |     _result.append(node); | 
					
						
							| 
									
										
										
										
											2011-08-09 10:40:39 +02:00
										 |  |  |     accept(node->body); | 
					
						
							| 
									
										
										
										
											2011-05-04 11:52:31 +02:00
										 |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool ScopeAstPath::containsOffset(SourceLocation start, SourceLocation end) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return _offset >= start.begin() && _offset <= end.end(); | 
					
						
							|  |  |  | } |