OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 /// Encapsulates how to invoke the analyzer resolver and overrides how it | 5 /// Encapsulates how to invoke the analyzer resolver and overrides how it |
6 /// computes types on expressions to use our restricted set of types. | 6 /// computes types on expressions to use our restricted set of types. |
7 library dev_compiler.src.checker.resolver; | 7 library dev_compiler.src.checker.resolver; |
8 | 8 |
9 import 'package:analyzer/analyzer.dart'; | 9 import 'package:analyzer/analyzer.dart'; |
10 import 'package:analyzer/src/generated/ast.dart'; | 10 import 'package:analyzer/src/generated/ast.dart'; |
11 import 'package:analyzer/src/generated/element.dart'; | 11 import 'package:analyzer/src/generated/element.dart'; |
12 import 'package:analyzer/src/generated/resolver.dart'; | 12 import 'package:analyzer/src/generated/resolver.dart'; |
13 import 'package:analyzer/src/generated/source.dart' show Source; | 13 import 'package:analyzer/src/generated/source.dart' show Source; |
14 import 'package:analyzer/src/generated/source_io.dart'; | 14 import 'package:analyzer/src/generated/source_io.dart'; |
15 import 'package:analyzer/src/generated/static_type_analyzer.dart'; | 15 import 'package:analyzer/src/generated/static_type_analyzer.dart'; |
16 import 'package:analyzer/src/generated/utilities_collection.dart' | 16 import 'package:analyzer/src/generated/utilities_collection.dart' |
17 show DirectedGraph; | 17 show DirectedGraph; |
18 import 'package:logging/logging.dart' as logger; | 18 import 'package:logging/logging.dart' as logger; |
19 | 19 |
20 import 'package:dev_compiler/src/options.dart'; | |
21 import 'package:dev_compiler/src/utils.dart'; | 20 import 'package:dev_compiler/src/utils.dart'; |
| 21 import 'package:dev_compiler/strong_mode.dart' show StrongModeOptions; |
22 | 22 |
23 final _log = new logger.Logger('dev_compiler.src.resolver'); | 23 final _log = new logger.Logger('dev_compiler.src.resolver'); |
24 | 24 |
25 /// A [LibraryResolver] that performs inference on top-levels and fields based | 25 /// A [LibraryResolver] that performs inference on top-levels and fields based |
26 /// on the value of the initializer, and on fields and methods based on | 26 /// on the value of the initializer, and on fields and methods based on |
27 /// overridden members in super classes. | 27 /// overridden members in super classes. |
28 class LibraryResolverWithInference extends LibraryResolver { | 28 class LibraryResolverWithInference extends LibraryResolver { |
29 final ResolverOptions _options; | 29 final StrongModeOptions _options; |
30 | 30 |
31 LibraryResolverWithInference(context, this._options) : super(context); | 31 LibraryResolverWithInference(context, this._options) : super(context); |
32 | 32 |
33 @override | 33 @override |
34 void resolveReferencesAndTypes() { | 34 void resolveReferencesAndTypes() { |
35 _resolveVariableReferences(); | 35 _resolveVariableReferences(); |
36 | 36 |
37 // Run resolution in two stages, skipping method bodies first, so we can run | 37 // Run resolution in two stages, skipping method bodies first, so we can run |
38 // type-inference before we fully analyze methods. | 38 // type-inference before we fully analyze methods. |
39 var visitors = _createVisitors(); | 39 var visitors = _createVisitors(); |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 // here will be dynamic. | 206 // here will be dynamic. |
207 var enclosingElement = varElement.enclosingElement; | 207 var enclosingElement = varElement.enclosingElement; |
208 var type = searchTypeFor(enclosingElement.type, getter); | 208 var type = searchTypeFor(enclosingElement.type, getter); |
209 | 209 |
210 // Infer from the RHS when there are no overrides. | 210 // Infer from the RHS when there are no overrides. |
211 if (type == null) { | 211 if (type == null) { |
212 if (variable.initializer != null) pending.add(variable); | 212 if (variable.initializer != null) pending.add(variable); |
213 continue; | 213 continue; |
214 } | 214 } |
215 | 215 |
216 // When field is final and overriden getter is dynamic, we can infer from | 216 // When field is final and overridden getter is dynamic, we can infer from |
217 // the RHS without breaking subtyping rules (return type is covariant). | 217 // the RHS without breaking subtyping rules (return type is covariant). |
218 if (type.returnType.isDynamic) { | 218 if (type.returnType.isDynamic) { |
219 if (variables.isFinal && variable.initializer != null) { | 219 if (variables.isFinal && variable.initializer != null) { |
220 pending.add(variable); | 220 pending.add(variable); |
221 } | 221 } |
222 continue; | 222 continue; |
223 } | 223 } |
224 | 224 |
225 // Use type from the override. | 225 // Use type from the override. |
226 var newType = type.returnType; | 226 var newType = type.returnType; |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
349 /// Internal state, whether we are revisiting an initializer, so we minimize | 349 /// Internal state, whether we are revisiting an initializer, so we minimize |
350 /// the work being done elsewhere. | 350 /// the work being done elsewhere. |
351 bool _revisiting = false; | 351 bool _revisiting = false; |
352 | 352 |
353 /// Initializers that have been visited, reanalyzed, and for which no node was | 353 /// Initializers that have been visited, reanalyzed, and for which no node was |
354 /// internally skipped. These initializers are fully resolved and don't need | 354 /// internally skipped. These initializers are fully resolved and don't need |
355 /// to be re-resolved on a sunsequent pass. | 355 /// to be re-resolved on a sunsequent pass. |
356 final _visitedInitializers = new Set<VariableDeclaration>(); | 356 final _visitedInitializers = new Set<VariableDeclaration>(); |
357 | 357 |
358 RestrictedResolverVisitor(Library library, Source source, | 358 RestrictedResolverVisitor(Library library, Source source, |
359 TypeProvider typeProvider, ResolverOptions options) | 359 TypeProvider typeProvider, StrongModeOptions options) |
360 : _typeProvider = typeProvider, | 360 : _typeProvider = typeProvider, |
361 super.con1(library, source, typeProvider, | 361 super.con1(library, source, typeProvider, |
362 typeAnalyzerFactory: RestrictedStaticTypeAnalyzer.constructor); | 362 typeAnalyzerFactory: RestrictedStaticTypeAnalyzer.constructor); |
363 | 363 |
364 reanalyzeInitializer(VariableDeclaration variable) { | 364 reanalyzeInitializer(VariableDeclaration variable) { |
365 try { | 365 try { |
366 _revisiting = true; | 366 _revisiting = true; |
367 _nodeWasSkipped = false; | 367 _nodeWasSkipped = false; |
368 var node = variable.parent.parent; | 368 var node = variable.parent.parent; |
369 var oldState; | 369 var oldState; |
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
686 } | 686 } |
687 } | 687 } |
688 | 688 |
689 // Review note: no longer need to override visitFunctionExpression, this is | 689 // Review note: no longer need to override visitFunctionExpression, this is |
690 // handled by the analyzer internally. | 690 // handled by the analyzer internally. |
691 // TODO(vsm): in visitbinaryExpression: check computeStaticReturnType result? | 691 // TODO(vsm): in visitbinaryExpression: check computeStaticReturnType result? |
692 // TODO(vsm): in visitFunctionDeclaration: Should we ever use the expression | 692 // TODO(vsm): in visitFunctionDeclaration: Should we ever use the expression |
693 // type in a (...) => expr or just the written type? | 693 // type in a (...) => expr or just the written type? |
694 | 694 |
695 } | 695 } |
OLD | NEW |