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 import 'dart:async'; | 5 import 'dart:async'; |
6 | 6 |
7 import 'package:barback/barback.dart'; | 7 import 'package:barback/barback.dart'; |
8 | 8 |
9 import '../log.dart' as log; | 9 import '../log.dart' as log; |
10 import '../package_graph.dart'; | 10 import '../package_graph.dart'; |
(...skipping 14 matching lines...) Expand all Loading... |
25 /// automatically be added to the end of the root package's cascade. | 25 /// automatically be added to the end of the root package's cascade. |
26 /// | 26 /// |
27 /// If [entrypoints] is passed, only transformers necessary to run those | 27 /// If [entrypoints] is passed, only transformers necessary to run those |
28 /// entrypoints will be loaded. | 28 /// entrypoints will be loaded. |
29 Future loadAllTransformers(AssetEnvironment environment, | 29 Future loadAllTransformers(AssetEnvironment environment, |
30 BarbackServer transformerServer, {Iterable<AssetId> entrypoints}) async { | 30 BarbackServer transformerServer, {Iterable<AssetId> entrypoints}) async { |
31 var dependencyComputer = new DependencyComputer(environment.graph); | 31 var dependencyComputer = new DependencyComputer(environment.graph); |
32 | 32 |
33 // If we only need to load transformers for a specific set of entrypoints, | 33 // If we only need to load transformers for a specific set of entrypoints, |
34 // remove any other transformers from [transformersNeededByTransformers]. | 34 // remove any other transformers from [transformersNeededByTransformers]. |
35 var necessaryTransformers; | 35 Set<TransformerId> necessaryTransformers; |
36 if (entrypoints != null) { | 36 if (entrypoints != null) { |
37 if (entrypoints.isEmpty) return; | 37 if (entrypoints.isEmpty) return; |
38 | 38 |
39 necessaryTransformers = unionAll(entrypoints.map( | 39 necessaryTransformers = unionAll(entrypoints.map( |
40 dependencyComputer.transformersNeededByLibrary)); | 40 dependencyComputer.transformersNeededByLibrary)); |
41 | 41 |
42 if (necessaryTransformers.isEmpty) { | 42 if (necessaryTransformers.isEmpty) { |
43 log.fine("No transformers are needed for ${toSentence(entrypoints)}."); | 43 log.fine("No transformers are needed for ${toSentence(entrypoints)}."); |
44 return; | 44 return; |
45 } | 45 } |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 /// Given [transformerDependencies], a directed acyclic graph, returns a list of | 119 /// Given [transformerDependencies], a directed acyclic graph, returns a list of |
120 /// "stages" (sets of transformers). | 120 /// "stages" (sets of transformers). |
121 /// | 121 /// |
122 /// Each stage must be fully loaded and passed to barback before the next stage | 122 /// Each stage must be fully loaded and passed to barback before the next stage |
123 /// can be safely loaded. However, transformers within a stage can be safely | 123 /// can be safely loaded. However, transformers within a stage can be safely |
124 /// loaded in parallel. | 124 /// loaded in parallel. |
125 List<Set<TransformerId>> _stageTransformers( | 125 List<Set<TransformerId>> _stageTransformers( |
126 Map<TransformerId, Set<TransformerId>> transformerDependencies) { | 126 Map<TransformerId, Set<TransformerId>> transformerDependencies) { |
127 // A map from transformer ids to the indices of the stages that those | 127 // A map from transformer ids to the indices of the stages that those |
128 // transformer ids should end up in. Populated by [stageNumberFor]. | 128 // transformer ids should end up in. Populated by [stageNumberFor]. |
129 var stageNumbers = {}; | 129 var stageNumbers = <TransformerId, int>{}; |
130 var stages = []; | 130 var stages = <Set<TransformerId>>[]; |
131 | 131 |
132 stageNumberFor(id) { | 132 stageNumberFor(TransformerId id) { |
133 // Built-in transformers don't have to be loaded in stages, since they're | 133 // Built-in transformers don't have to be loaded in stages, since they're |
134 // run from pub's source. Return -1 so that the "next stage" is 0. | 134 // run from pub's source. Return -1 so that the "next stage" is 0. |
135 if (id.isBuiltInTransformer) return -1; | 135 if (id.isBuiltInTransformer) return -1; |
136 | 136 |
137 if (stageNumbers.containsKey(id)) return stageNumbers[id]; | 137 if (stageNumbers.containsKey(id)) return stageNumbers[id]; |
138 var dependencies = transformerDependencies[id]; | 138 var dependencies = transformerDependencies[id]; |
139 stageNumbers[id] = dependencies.isEmpty ? | 139 stageNumbers[id] = dependencies.isEmpty ? |
140 0 : maxAll(dependencies.map(stageNumberFor)) + 1; | 140 0 : maxAll(dependencies.map(stageNumberFor)) + 1; |
141 return stageNumbers[id]; | 141 return stageNumbers[id]; |
142 } | 142 } |
143 | 143 |
144 for (var id in transformerDependencies.keys) { | 144 for (var id in transformerDependencies.keys) { |
145 var stageNumber = stageNumberFor(id); | 145 var stageNumber = stageNumberFor(id); |
146 if (stages.length <= stageNumber) stages.length = stageNumber + 1; | 146 if (stages.length <= stageNumber) stages.length = stageNumber + 1; |
147 if (stages[stageNumber] == null) stages[stageNumber] = new Set(); | 147 if (stages[stageNumber] == null) stages[stageNumber] = new Set(); |
148 stages[stageNumber].add(id); | 148 stages[stageNumber].add(id); |
149 } | 149 } |
150 | 150 |
151 return stages; | 151 return stages; |
152 } | 152 } |
153 | 153 |
154 /// Returns a map from transformer ids to all packages in [graph] that use each | 154 /// Returns a map from transformer ids to all packages in [graph] that use each |
155 /// transformer. | 155 /// transformer. |
156 Map<TransformerId, Set<String>> _packagesThatUseTransformers( | 156 Map<TransformerId, Set<String>> _packagesThatUseTransformers( |
157 PackageGraph graph) { | 157 PackageGraph graph) { |
158 var results = {}; | 158 var results = <TransformerId, Set<String>>{}; |
159 for (var package in graph.packages.values) { | 159 for (var package in graph.packages.values) { |
160 for (var phase in package.pubspec.transformers) { | 160 for (var phase in package.pubspec.transformers) { |
161 for (var config in phase) { | 161 for (var config in phase) { |
162 results.putIfAbsent(config.id, () => new Set()).add(package.name); | 162 results.putIfAbsent(config.id, () => new Set()).add(package.name); |
163 } | 163 } |
164 } | 164 } |
165 } | 165 } |
166 return results; | 166 return results; |
167 } | 167 } |
OLD | NEW |