| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library analyzer.src.generated.resolver; | 5 library analyzer.src.generated.resolver; |
| 6 | 6 |
| 7 import 'dart:collection'; | 7 import 'dart:collection'; |
| 8 | 8 |
| 9 import 'package:analyzer/dart/ast/ast.dart'; | 9 import 'package:analyzer/dart/ast/ast.dart'; |
| 10 import 'package:analyzer/dart/ast/token.dart'; | 10 import 'package:analyzer/dart/ast/token.dart'; |
| (...skipping 5184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5195 class PartialResolverVisitor extends ResolverVisitor { | 5195 class PartialResolverVisitor extends ResolverVisitor { |
| 5196 /** | 5196 /** |
| 5197 * The static variables and fields that have an initializer. These are the | 5197 * The static variables and fields that have an initializer. These are the |
| 5198 * variables that need to be re-resolved after static variables have their | 5198 * variables that need to be re-resolved after static variables have their |
| 5199 * types inferred. A subset of these variables are those whose types should | 5199 * types inferred. A subset of these variables are those whose types should |
| 5200 * be inferred. | 5200 * be inferred. |
| 5201 */ | 5201 */ |
| 5202 final List<VariableElement> staticVariables = <VariableElement>[]; | 5202 final List<VariableElement> staticVariables = <VariableElement>[]; |
| 5203 | 5203 |
| 5204 /** | 5204 /** |
| 5205 * The static and instance variables and fields that have an initializer. | |
| 5206 * These are the variables whose types might be propagated. | |
| 5207 */ | |
| 5208 final List<VariableElement> propagableVariables = <VariableElement>[]; | |
| 5209 | |
| 5210 /** | |
| 5211 * Initialize a newly created visitor to resolve the nodes in an AST node. | 5205 * Initialize a newly created visitor to resolve the nodes in an AST node. |
| 5212 * | 5206 * |
| 5213 * The [definingLibrary] is the element for the library containing the node | 5207 * The [definingLibrary] is the element for the library containing the node |
| 5214 * being visited. The [source] is the source representing the compilation unit | 5208 * being visited. The [source] is the source representing the compilation unit |
| 5215 * containing the node being visited. The [typeProvider] is the object used to | 5209 * containing the node being visited. The [typeProvider] is the object used to |
| 5216 * access the types from the core library. The [errorListener] is the error | 5210 * access the types from the core library. The [errorListener] is the error |
| 5217 * listener that will be informed of any errors that are found during | 5211 * listener that will be informed of any errors that are found during |
| 5218 * resolution. The [nameScope] is the scope used to resolve identifiers in the | 5212 * resolution. The [nameScope] is the scope used to resolve identifiers in the |
| 5219 * node that will first be visited. If `null` or unspecified, a new | 5213 * node that will first be visited. If `null` or unspecified, a new |
| 5220 * [LibraryScope] will be created based on [definingLibrary] and | 5214 * [LibraryScope] will be created based on [definingLibrary] and |
| (...skipping 20 matching lines...) Expand all Loading... |
| 5241 @override | 5235 @override |
| 5242 Object visitExpressionFunctionBody(ExpressionFunctionBody node) { | 5236 Object visitExpressionFunctionBody(ExpressionFunctionBody node) { |
| 5243 if (_shouldBeSkipped(node)) { | 5237 if (_shouldBeSkipped(node)) { |
| 5244 return null; | 5238 return null; |
| 5245 } | 5239 } |
| 5246 return super.visitExpressionFunctionBody(node); | 5240 return super.visitExpressionFunctionBody(node); |
| 5247 } | 5241 } |
| 5248 | 5242 |
| 5249 @override | 5243 @override |
| 5250 Object visitFieldDeclaration(FieldDeclaration node) { | 5244 Object visitFieldDeclaration(FieldDeclaration node) { |
| 5251 _addPropagableVariables(node.fields.variables); | |
| 5252 if (node.isStatic) { | 5245 if (node.isStatic) { |
| 5253 _addStaticVariables(node.fields.variables); | 5246 _addStaticVariables(node.fields.variables); |
| 5254 } | 5247 } |
| 5255 return super.visitFieldDeclaration(node); | 5248 return super.visitFieldDeclaration(node); |
| 5256 } | 5249 } |
| 5257 | 5250 |
| 5258 @override | 5251 @override |
| 5259 Object visitNode(AstNode node) { | 5252 Object visitNode(AstNode node) { |
| 5260 return super.visitNode(node); | 5253 return super.visitNode(node); |
| 5261 } | 5254 } |
| 5262 | 5255 |
| 5263 @override | 5256 @override |
| 5264 Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) { | 5257 Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) { |
| 5265 _addPropagableVariables(node.variables.variables); | |
| 5266 _addStaticVariables(node.variables.variables); | 5258 _addStaticVariables(node.variables.variables); |
| 5267 return super.visitTopLevelVariableDeclaration(node); | 5259 return super.visitTopLevelVariableDeclaration(node); |
| 5268 } | 5260 } |
| 5269 | 5261 |
| 5270 /** | 5262 /** |
| 5271 * Add all of the [variables] with initializers to [propagableVariables]. | |
| 5272 */ | |
| 5273 void _addPropagableVariables(List<VariableDeclaration> variables) { | |
| 5274 int length = variables.length; | |
| 5275 for (int i = 0; i < length; i++) { | |
| 5276 VariableDeclaration variable = variables[i]; | |
| 5277 if (variable.name.name.isNotEmpty && variable.initializer != null) { | |
| 5278 VariableElement element = variable.element; | |
| 5279 if (element.isConst || element.isFinal) { | |
| 5280 propagableVariables.add(element); | |
| 5281 } | |
| 5282 } | |
| 5283 } | |
| 5284 } | |
| 5285 | |
| 5286 /** | |
| 5287 * Add all of the [variables] with initializers to the list of variables whose | 5263 * Add all of the [variables] with initializers to the list of variables whose |
| 5288 * type can be inferred. Technically, we only infer the types of variables | 5264 * type can be inferred. Technically, we only infer the types of variables |
| 5289 * that do not have a static type, but all variables with initializers | 5265 * that do not have a static type, but all variables with initializers |
| 5290 * potentially need to be re-resolved after inference because they might | 5266 * potentially need to be re-resolved after inference because they might |
| 5291 * refer to a field whose type was inferred. | 5267 * refer to a field whose type was inferred. |
| 5292 */ | 5268 */ |
| 5293 void _addStaticVariables(List<VariableDeclaration> variables) { | 5269 void _addStaticVariables(List<VariableDeclaration> variables) { |
| 5294 int length = variables.length; | 5270 int length = variables.length; |
| 5295 for (int i = 0; i < length; i++) { | 5271 for (int i = 0; i < length; i++) { |
| 5296 VariableDeclaration variable = variables[i]; | 5272 VariableDeclaration variable = variables[i]; |
| (...skipping 5874 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11171 return null; | 11147 return null; |
| 11172 } | 11148 } |
| 11173 if (identical(node.staticElement, variable)) { | 11149 if (identical(node.staticElement, variable)) { |
| 11174 if (node.inSetterContext()) { | 11150 if (node.inSetterContext()) { |
| 11175 result = true; | 11151 result = true; |
| 11176 } | 11152 } |
| 11177 } | 11153 } |
| 11178 return null; | 11154 return null; |
| 11179 } | 11155 } |
| 11180 } | 11156 } |
| OLD | NEW |