| 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 |