| 
									
										
										
										
											2012-10-02 09:12:39 +02:00
										 |  |  | /****************************************************************************
 | 
					
						
							| 
									
										
										
										
											2011-05-06 15:05:37 +02:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2013-01-28 17:12:19 +01:00
										 |  |  | ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). | 
					
						
							| 
									
										
										
										
											2012-10-02 09:12:39 +02:00
										 |  |  | ** Contact: http://www.qt-project.org/legal
 | 
					
						
							| 
									
										
										
										
											2011-05-06 15:05:37 +02:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2012-10-02 09:12:39 +02:00
										 |  |  | ** This file is part of Qt Creator. | 
					
						
							| 
									
										
										
										
											2011-05-06 15:05:37 +02:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2012-10-02 09:12:39 +02:00
										 |  |  | ** Commercial License Usage | 
					
						
							|  |  |  | ** Licensees holding valid commercial Qt licenses may use this file in | 
					
						
							|  |  |  | ** accordance with the commercial license agreement provided with the | 
					
						
							|  |  |  | ** Software or, alternatively, in accordance with the terms contained in | 
					
						
							|  |  |  | ** a written agreement between you and Digia.  For licensing terms and | 
					
						
							|  |  |  | ** conditions see http://qt.digia.com/licensing.  For further information
 | 
					
						
							|  |  |  | ** use the contact form at http://qt.digia.com/contact-us.
 | 
					
						
							| 
									
										
										
										
											2011-05-06 15:05:37 +02:00
										 |  |  | ** | 
					
						
							|  |  |  | ** GNU Lesser General Public License Usage | 
					
						
							| 
									
										
										
										
											2012-10-02 09:12:39 +02: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.
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** In addition, as a special exception, Digia gives you certain additional | 
					
						
							|  |  |  | ** rights.  These rights are described in the Digia Qt LGPL Exception | 
					
						
							| 
									
										
										
										
											2011-05-06 15:05:37 +02:00
										 |  |  | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2012-10-02 09:12:39 +02:00
										 |  |  | ****************************************************************************/ | 
					
						
							| 
									
										
										
										
											2011-05-06 15:05:37 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
											
												Remove braces for single lines of conditions
#!/usr/bin/env ruby
Dir.glob('**/*.cpp') { |file|
  # skip ast (excluding paste, astpath, and canv'ast'imer)
  next if file =~ /ast[^eip]|keywords\.|qualifiers|preprocessor|names.cpp/i
  s = File.read(file)
  next if s.include?('qlalr')
  orig = s.dup
  s.gsub!(/\n *if [^\n]*{\n[^\n]*\n\s+}(\s+else if [^\n]* {\n[^\n]*\n\s+})*(\s+else {\n[^\n]*\n\s+})?\n/m) { |m|
    res = $&
    if res =~ /^\s*(\/\/|[A-Z_]{3,})/ # C++ comment or macro (Q_UNUSED, SDEBUG), do not touch braces
      res
    else
      res.gsub!('} else', 'else')
      res.gsub!(/\n +} *\n/m, "\n")
      res.gsub(/ *{$/, '')
    end
  }
  s.gsub!(/ *$/, '')
  File.open(file, 'wb').write(s) if s != orig
}
Change-Id: I3b30ee60df0986f66c02132c65fc38a3fbb6bbdc
Reviewed-by: hjk <qthjk@ovi.com>
											
										 
											2013-01-08 03:32:53 +02:00
										 |  |  |     if (Statement *stmt = node->statementCast()) | 
					
						
							| 
									
										
										
										
											2011-05-04 11:52:31 +02:00
										 |  |  |         return containsOffset(stmt->firstSourceLocation(), stmt->lastSourceLocation()); | 
					
						
							| 
									
										
										
											
												Remove braces for single lines of conditions
#!/usr/bin/env ruby
Dir.glob('**/*.cpp') { |file|
  # skip ast (excluding paste, astpath, and canv'ast'imer)
  next if file =~ /ast[^eip]|keywords\.|qualifiers|preprocessor|names.cpp/i
  s = File.read(file)
  next if s.include?('qlalr')
  orig = s.dup
  s.gsub!(/\n *if [^\n]*{\n[^\n]*\n\s+}(\s+else if [^\n]* {\n[^\n]*\n\s+})*(\s+else {\n[^\n]*\n\s+})?\n/m) { |m|
    res = $&
    if res =~ /^\s*(\/\/|[A-Z_]{3,})/ # C++ comment or macro (Q_UNUSED, SDEBUG), do not touch braces
      res
    else
      res.gsub!('} else', 'else')
      res.gsub!(/\n +} *\n/m, "\n")
      res.gsub(/ *{$/, '')
    end
  }
  s.gsub!(/ *$/, '')
  File.open(file, 'wb').write(s) if s != orig
}
Change-Id: I3b30ee60df0986f66c02132c65fc38a3fbb6bbdc
Reviewed-by: hjk <qthjk@ovi.com>
											
										 
											2013-01-08 03:32:53 +02:00
										 |  |  |     else if (ExpressionNode *exp = node->expressionCast()) | 
					
						
							| 
									
										
										
										
											2011-05-04 11:52:31 +02:00
										 |  |  |         return containsOffset(exp->firstSourceLocation(), exp->lastSourceLocation()); | 
					
						
							| 
									
										
										
											
												Remove braces for single lines of conditions
#!/usr/bin/env ruby
Dir.glob('**/*.cpp') { |file|
  # skip ast (excluding paste, astpath, and canv'ast'imer)
  next if file =~ /ast[^eip]|keywords\.|qualifiers|preprocessor|names.cpp/i
  s = File.read(file)
  next if s.include?('qlalr')
  orig = s.dup
  s.gsub!(/\n *if [^\n]*{\n[^\n]*\n\s+}(\s+else if [^\n]* {\n[^\n]*\n\s+})*(\s+else {\n[^\n]*\n\s+})?\n/m) { |m|
    res = $&
    if res =~ /^\s*(\/\/|[A-Z_]{3,})/ # C++ comment or macro (Q_UNUSED, SDEBUG), do not touch braces
      res
    else
      res.gsub!('} else', 'else')
      res.gsub!(/\n +} *\n/m, "\n")
      res.gsub(/ *{$/, '')
    end
  }
  s.gsub!(/ *$/, '')
  File.open(file, 'wb').write(s) if s != orig
}
Change-Id: I3b30ee60df0986f66c02132c65fc38a3fbb6bbdc
Reviewed-by: hjk <qthjk@ovi.com>
											
										 
											2013-01-08 03:32:53 +02:00
										 |  |  |     else if (UiObjectMember *ui = node->uiObjectMemberCast()) | 
					
						
							| 
									
										
										
										
											2011-05-04 11:52:31 +02:00
										 |  |  |         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(); | 
					
						
							|  |  |  | } |