Chromium Code Reviews| 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 code_transformer.src.resolver_impl; | 5 library code_transformer.src.resolver_impl; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'package:analyzer/src/generated/ast.dart'; | 8 import 'package:analyzer/src/generated/ast.dart'; |
| 9 import 'package:analyzer/src/generated/element.dart'; | 9 import 'package:analyzer/src/generated/element.dart'; |
| 10 import 'package:analyzer/src/generated/engine.dart'; | 10 import 'package:analyzer/src/generated/engine.dart'; |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 39 | 39 |
| 40 final AnalysisContext _context = | 40 final AnalysisContext _context = |
| 41 AnalysisEngine.instance.createAnalysisContext(); | 41 AnalysisEngine.instance.createAnalysisContext(); |
| 42 | 42 |
| 43 /// Transform for which this is currently updating, or null when not updating. | 43 /// Transform for which this is currently updating, or null when not updating. |
| 44 Transform _currentTransform; | 44 Transform _currentTransform; |
| 45 | 45 |
| 46 /// The currently resolved library, or null if unresolved. | 46 /// The currently resolved library, or null if unresolved. |
| 47 LibraryElement _entryLibrary; | 47 LibraryElement _entryLibrary; |
| 48 | 48 |
| 49 /// Future indicating when this resolver is done in the current phase. | |
| 50 Future _lastPhaseComplete = new Future.value(); | |
| 51 | |
| 52 /// Completer for wrapping up the current phase. | |
| 53 Completer _currentPhaseComplete; | |
| 54 | |
| 49 /// Handler for all Dart SDK (dart:) sources. | 55 /// Handler for all Dart SDK (dart:) sources. |
| 50 DirectoryBasedDartSdk _dartSdk; | 56 DirectoryBasedDartSdk _dartSdk; |
| 51 | 57 |
| 52 /// Creates a resolver that will resolve the Dart code starting at | 58 /// Creates a resolver that will resolve the Dart code starting at |
| 53 /// [entryPoint]. | 59 /// [entryPoint]. |
| 54 /// | 60 /// |
| 55 /// [sdkDir] is the root directory of the Dart SDK, for resolving dart: | 61 /// [sdkDir] is the root directory of the Dart SDK, for resolving dart: |
| 56 /// imports. | 62 /// imports. |
| 57 ResolverImpl(this.entryPoint, String sdkDir, {AnalysisOptions options}) { | 63 ResolverImpl(this.entryPoint, String sdkDir, {AnalysisOptions options}) { |
| 58 if (options == null) { | 64 if (options == null) { |
| 59 options = new AnalysisOptionsImpl() | 65 options = new AnalysisOptionsImpl() |
| 60 ..cacheSize = 256 // # of sources to cache ASTs for. | 66 ..cacheSize = 256 // # of sources to cache ASTs for. |
| 61 ..preserveComments = false | 67 ..preserveComments = false |
| 62 ..analyzeFunctionBodies = true; | 68 ..analyzeFunctionBodies = true; |
| 63 } | 69 } |
| 64 _context.analysisOptions = options; | 70 _context.analysisOptions = options; |
| 65 | 71 |
| 66 _dartSdk = new _DirectoryBasedDartSdkProxy(new JavaFile(sdkDir)); | 72 _dartSdk = new _DirectoryBasedDartSdkProxy(new JavaFile(sdkDir)); |
| 67 _dartSdk.context.analysisOptions = options; | 73 _dartSdk.context.analysisOptions = options; |
| 68 | 74 |
| 69 _context.sourceFactory = new SourceFactory.con2([ | 75 _context.sourceFactory = new SourceFactory.con2([ |
| 70 new DartUriResolverProxy(_dartSdk), | 76 new DartUriResolverProxy(_dartSdk), |
| 71 new _AssetUriResolver(this)]); | 77 new _AssetUriResolver(this)]); |
| 72 } | 78 } |
| 73 | 79 |
| 74 LibraryElement get entryLibrary => _entryLibrary; | 80 LibraryElement get entryLibrary => _entryLibrary; |
| 75 | 81 |
| 82 Future<Resolver> resolve(Transform transform) { | |
| 83 // Can only have one resolve in progress at a time, so chain the current | |
| 84 // resolution to be after the last one. | |
| 85 var phaseComplete = new Completer(); | |
| 86 var future = _lastPhaseComplete.then((_) { | |
| 87 _currentPhaseComplete = phaseComplete; | |
| 76 | 88 |
| 77 /// Update the status of all the sources referenced by the entryPoint and | 89 return _performResolve(transform); |
| 78 /// update the resolved library. | 90 }).then((_) { |
| 79 /// | 91 return this; |
| 80 /// This will be invoked automatically by [ResolverTransformer]. Only one | 92 }); |
|
Siggi Cherem (dart-lang)
2014/02/27 18:20:41
style nit: use (_) => this, maybe fold into the pr
blois
2014/02/27 23:47:17
Done.
| |
| 81 /// transformer may update this at a time. | 93 // Advance the lastPhaseComplete to be done when this phase is all done. |
| 82 Future updateSources(Transform transform) { | 94 _lastPhaseComplete = phaseComplete.future; |
| 95 return future; | |
| 96 } | |
| 97 | |
| 98 void release() { | |
| 99 if (_currentPhaseComplete == null) { | |
| 100 throw new StateError('Releasing without current lock.'); | |
| 101 } | |
| 102 _currentPhaseComplete.complete(null); | |
| 103 _currentPhaseComplete = null; | |
| 104 | |
| 105 // Clear out the entry lib since it should not be referenced after release. | |
| 106 _entryLibrary = null; | |
| 107 } | |
| 108 | |
| 109 Future _performResolve(Transform transform) { | |
| 83 if (_currentTransform != null) { | 110 if (_currentTransform != null) { |
| 84 throw new StateError('Cannot be accessed by concurrent transforms'); | 111 throw new StateError('Cannot be accessed by concurrent transforms'); |
| 85 } | 112 } |
| 86 _currentTransform = transform; | 113 _currentTransform = transform; |
| 87 // Clear this out and update once all asset changes have been processed. | |
| 88 _entryLibrary = null; | |
| 89 | 114 |
| 90 // Basic approach is to start at the first file, update it's contents | 115 // Basic approach is to start at the first file, update it's contents |
| 91 // and see if it changed, then walk all files accessed by it. | 116 // and see if it changed, then walk all files accessed by it. |
| 92 var visited = new Set<AssetId>(); | 117 var visited = new Set<AssetId>(); |
| 93 var visiting = new FutureGroup(); | 118 var visiting = new FutureGroup(); |
| 94 | 119 |
| 95 void processAsset(AssetId assetId) { | 120 void processAsset(AssetId assetId) { |
| 96 visited.add(assetId); | 121 visited.add(assetId); |
| 97 | 122 |
| 98 visiting.add(transform.readInputAsString(assetId).then((contents) { | 123 visiting.add(transform.readInputAsString(assetId).then((contents) { |
| (...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 538 | 563 |
| 539 /** | 564 /** |
| 540 * A Future that complets with a List of the values from all the added | 565 * A Future that complets with a List of the values from all the added |
| 541 * tasks, when they have all completed. | 566 * tasks, when they have all completed. |
| 542 * | 567 * |
| 543 * If any task fails, this Future will receive the error. Only the first | 568 * If any task fails, this Future will receive the error. Only the first |
| 544 * error will be sent to the Future. | 569 * error will be sent to the Future. |
| 545 */ | 570 */ |
| 546 Future<List<E>> get future => _completer.future; | 571 Future<List<E>> get future => _completer.future; |
| 547 } | 572 } |
| OLD | NEW |