OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 barback.graph.asset_cascade; | 5 library barback.graph.asset_cascade; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 | 8 |
| 9 import 'package:async/async.dart'; |
| 10 |
9 import '../asset/asset.dart'; | 11 import '../asset/asset.dart'; |
10 import '../asset/asset_id.dart'; | 12 import '../asset/asset_id.dart'; |
11 import '../asset/asset_node.dart'; | 13 import '../asset/asset_node.dart'; |
12 import '../asset/asset_set.dart'; | 14 import '../asset/asset_set.dart'; |
13 import '../errors.dart'; | 15 import '../errors.dart'; |
14 import '../log.dart'; | 16 import '../log.dart'; |
15 import '../transformer/transformer.dart'; | 17 import '../transformer/transformer.dart'; |
16 import '../utils.dart'; | |
17 import '../utils/cancelable_future.dart'; | 18 import '../utils/cancelable_future.dart'; |
18 import 'node_status.dart'; | 19 import 'node_status.dart'; |
19 import 'node_streams.dart'; | 20 import 'node_streams.dart'; |
20 import 'package_graph.dart'; | 21 import 'package_graph.dart'; |
21 import 'phase.dart'; | 22 import 'phase.dart'; |
22 | 23 |
23 /// The asset cascade for an individual package. | 24 /// The asset cascade for an individual package. |
24 /// | 25 /// |
25 /// This keeps track of which [Transformer]s are applied to which assets, and | 26 /// This keeps track of which [Transformer]s are applied to which assets, and |
26 /// re-runs those transformers when their dependencies change. The transformed | 27 /// re-runs those transformers when their dependencies change. The transformed |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 | 107 |
107 var oldLastPhase = _phases.last; | 108 var oldLastPhase = _phases.last; |
108 // TODO(rnystrom): Waiting for the entire build to complete is unnecessary | 109 // TODO(rnystrom): Waiting for the entire build to complete is unnecessary |
109 // in some cases. Should optimize: | 110 // in some cases. Should optimize: |
110 // * [id] may be generated before the compilation is finished. We should | 111 // * [id] may be generated before the compilation is finished. We should |
111 // be able to quickly check whether there are any more in-place | 112 // be able to quickly check whether there are any more in-place |
112 // transformations that can be run on it. If not, we can return it early. | 113 // transformations that can be run on it. If not, we can return it early. |
113 // * If [id] has never been generated and all active transformers provide | 114 // * If [id] has never been generated and all active transformers provide |
114 // metadata about the file names of assets it can emit, we can prove that | 115 // metadata about the file names of assets it can emit, we can prove that |
115 // none of them can emit [id] and fail early. | 116 // none of them can emit [id] and fail early. |
116 return oldLastPhase.getOutput(id).then((node) { | 117 return DelegatingFuture.typed(oldLastPhase.getOutput(id).then((node) { |
117 // The last phase may have changed if [updateSources] was called after | 118 // The last phase may have changed if [updateSources] was called after |
118 // requesting the output. In that case, we want the output from the new | 119 // requesting the output. In that case, we want the output from the new |
119 // last phase. | 120 // last phase. |
120 if (_phases.last == oldLastPhase) return node; | 121 if (_phases.last == oldLastPhase) return node; |
121 return getAssetNode(id); | 122 return getAssetNode(id); |
122 }); | 123 })); |
123 } | 124 } |
124 | 125 |
125 /// Adds [sources] to the graph's known set of source assets. | 126 /// Adds [sources] to the graph's known set of source assets. |
126 /// | 127 /// |
127 /// Begins applying any transforms that can consume any of the sources. If a | 128 /// Begins applying any transforms that can consume any of the sources. If a |
128 /// given source is already known, it is considered modified and all | 129 /// given source is already known, it is considered modified and all |
129 /// transforms that use it will be re-applied. | 130 /// transforms that use it will be re-applied. |
130 void updateSources(Iterable<AssetId> sources) { | 131 void updateSources(Iterable<AssetId> sources) { |
131 for (var id in sources) { | 132 for (var id in sources) { |
132 var controller = _sourceControllerMap[id]; | 133 var controller = _sourceControllerMap[id]; |
133 if (controller != null) { | 134 if (controller != null) { |
134 controller.setDirty(); | 135 controller.setDirty(); |
135 } else { | 136 } else { |
136 _sourceControllerMap[id] = new AssetNodeController(id); | 137 _sourceControllerMap[id] = new AssetNodeController(id); |
137 _phases.first.addInput(_sourceControllerMap[id].node); | 138 _phases.first.addInput(_sourceControllerMap[id].node); |
138 } | 139 } |
139 | 140 |
140 // If this source was already loading, cancel the old load, since it may | 141 // If this source was already loading, cancel the old load, since it may |
141 // return out-of-date contents for the asset. | 142 // return out-of-date contents for the asset. |
142 if (_loadingSources.containsKey(id)) _loadingSources[id].cancel(); | 143 if (_loadingSources.containsKey(id)) _loadingSources[id].cancel(); |
143 | 144 |
144 _loadingSources[id] = new CancelableFuture<Asset>( | 145 _loadingSources[id] = new CancelableFuture<Asset>( |
145 syncFuture(() => graph.provider.getAsset(id))); | 146 new Future.sync(() => graph.provider.getAsset(id))); |
146 _loadingSources[id].whenComplete(() { | 147 _loadingSources[id].whenComplete(() { |
147 _loadingSources.remove(id); | 148 _loadingSources.remove(id); |
148 }).then((asset) { | 149 }).then((asset) { |
149 var controller = _sourceControllerMap[id].setAvailable(asset); | 150 _sourceControllerMap[id].setAvailable(asset); |
150 }).catchError((error, stack) { | 151 }).catchError((error, stack) { |
151 reportError(new AssetLoadException(id, error, stack)); | 152 reportError(new AssetLoadException(id, error, stack)); |
152 | 153 |
153 // TODO(nweiz): propagate error information through asset nodes. | 154 // TODO(nweiz): propagate error information through asset nodes. |
154 _sourceControllerMap.remove(id).setRemoved(); | 155 _sourceControllerMap.remove(id).setRemoved(); |
155 }); | 156 }); |
156 } | 157 } |
157 } | 158 } |
158 | 159 |
159 /// Removes [removed] from the graph's known set of source assets. | 160 /// Removes [removed] from the graph's known set of source assets. |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
219 _streams.onLogPool.add(phase.onLog); | 220 _streams.onLogPool.add(phase.onLog); |
220 if (_phaseStatusSubscription != null) _phaseStatusSubscription.cancel(); | 221 if (_phaseStatusSubscription != null) _phaseStatusSubscription.cancel(); |
221 _phaseStatusSubscription = | 222 _phaseStatusSubscription = |
222 phase.onStatusChange.listen(_streams.changeStatus); | 223 phase.onStatusChange.listen(_streams.changeStatus); |
223 | 224 |
224 _phases.add(phase); | 225 _phases.add(phase); |
225 } | 226 } |
226 | 227 |
227 String toString() => "cascade for $package"; | 228 String toString() => "cascade for $package"; |
228 } | 229 } |
OLD | NEW |