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 pub.barback.dependency_computer; | 5 library pub.barback.dependency_computer; |
6 | 6 |
7 import 'package:barback/barback.dart'; | 7 import 'package:barback/barback.dart'; |
8 import 'package:path/path.dart' as p; | 8 import 'package:path/path.dart' as p; |
9 | 9 |
10 import '../dart.dart'; | 10 import '../dart.dart'; |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 | 165 |
166 traversePackage(packageName) { | 166 traversePackage(packageName) { |
167 if (seen.contains(packageName)) return; | 167 if (seen.contains(packageName)) return; |
168 seen.add(packageName); | 168 seen.add(packageName); |
169 | 169 |
170 var package = _graph.packages[packageName]; | 170 var package = _graph.packages[packageName]; |
171 for (var phase in package.pubspec.transformers) { | 171 for (var phase in package.pubspec.transformers) { |
172 for (var config in phase) { | 172 for (var config in phase) { |
173 var id = config.id; | 173 var id = config.id; |
174 if (id.isBuiltInTransformer) continue; | 174 if (id.isBuiltInTransformer) continue; |
| 175 if (packageName != _graph.entrypoint.root.name && |
| 176 !config.canTransformPublicFiles) { |
| 177 continue; |
| 178 } |
| 179 |
175 if (_loadingPackageComputers.contains(id.package)) { | 180 if (_loadingPackageComputers.contains(id.package)) { |
176 throw new CycleException("$packageName is transformed by $id"); | 181 throw new CycleException("$packageName is transformed by $id"); |
177 } | 182 } |
| 183 |
178 results.add(id); | 184 results.add(id); |
179 } | 185 } |
180 } | 186 } |
181 | 187 |
182 var dependencies = packageName == _graph.entrypoint.root.name ? | 188 var dependencies = packageName == _graph.entrypoint.root.name ? |
183 package.immediateDependencies : package.dependencies; | 189 package.immediateDependencies : package.dependencies; |
184 for (var dep in dependencies) { | 190 for (var dep in dependencies) { |
185 try { | 191 try { |
186 traversePackage(dep.name); | 192 traversePackage(dep.name); |
187 } on CycleException catch (error) { | 193 } on CycleException catch (error) { |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
257 var isRootPackage = | 263 var isRootPackage = |
258 packageName == _dependencyComputer._graph.entrypoint.root.name; | 264 packageName == _dependencyComputer._graph.entrypoint.root.name; |
259 | 265 |
260 // If [_package] uses its own transformers, there will be fewer transformers | 266 // If [_package] uses its own transformers, there will be fewer transformers |
261 // running on [_package] while its own transformers are loading than there | 267 // running on [_package] while its own transformers are loading than there |
262 // will be once all its transformers are finished loading. To handle this, | 268 // will be once all its transformers are finished loading. To handle this, |
263 // we run [_transformersNeededByTransformer] to pre-populate | 269 // we run [_transformersNeededByTransformer] to pre-populate |
264 // [_transformersNeededByLibraries] while [_applicableTransformers] is | 270 // [_transformersNeededByLibraries] while [_applicableTransformers] is |
265 // smaller. | 271 // smaller. |
266 for (var phase in _package.pubspec.transformers) { | 272 for (var phase in _package.pubspec.transformers) { |
267 for (var config in phase) { | 273 _applicableTransformers.addAll(phase.where((config) { |
268 // Ignore non-root transformers on non-public files. | 274 // Ignore non-root transformers on non-public files. |
269 if (!isRootPackage && !config.canTransformPublicFiles) continue; | 275 if (!isRootPackage && !config.canTransformPublicFiles) return false; |
270 | 276 |
271 var id = config.id; | 277 var id = config.id; |
272 try { | 278 try { |
273 if (id.package != _package.name) { | 279 if (id.package != _package.name) { |
274 // Probe [id]'s transformer dependencies to ensure that it doesn't | 280 // Probe [id]'s transformer dependencies to ensure that it doesn't |
275 // depend on this package. If it does, a CycleError will be thrown. | 281 // depend on this package. If it does, a CycleError will be thrown. |
276 _dependencyComputer._transformersNeededByTransformer(id); | 282 _dependencyComputer._transformersNeededByTransformer(id); |
277 } else { | 283 } else { |
278 // Store the transformers needed specifically with the current set | 284 // Store the transformers needed specifically with the current set |
279 // of [_applicableTransformers]. When reporting this transformer's | 285 // of [_applicableTransformers]. When reporting this transformer's |
280 // dependencies, [computeTransformersNeededByTransformers] will use | 286 // dependencies, [computeTransformersNeededByTransformers] will use |
281 // this stored set of dependencies rather than the potentially wider | 287 // this stored set of dependencies rather than the potentially wider |
282 // set that would be recomputed if [transformersNeededByLibrary] | 288 // set that would be recomputed if [transformersNeededByLibrary] |
283 // were called anew. | 289 // were called anew. |
284 _transformersNeededByTransformers[id] = | 290 _transformersNeededByTransformers[id] = |
285 transformersNeededByLibrary(_package.transformerPath(id)); | 291 transformersNeededByLibrary(_package.transformerPath(id)); |
286 } | 292 } |
287 } on CycleException catch (error) { | 293 } on CycleException catch (error) { |
288 throw error.prependStep("$packageName is transformed by $id"); | 294 throw error.prependStep("$packageName is transformed by $id"); |
289 } | 295 } |
290 } | 296 |
| 297 return true; |
| 298 })); |
291 | 299 |
292 // Clear the cached imports and exports because the new transformers may | 300 // Clear the cached imports and exports because the new transformers may |
293 // start transforming a library whose directives were previously | 301 // start transforming a library whose directives were previously |
294 // statically analyzable. | 302 // statically analyzable. |
295 _transitiveExternalDirectives.clear(); | 303 _transitiveExternalDirectives.clear(); |
296 _applicableTransformers.addAll(phase); | |
297 } | 304 } |
298 } | 305 } |
299 | 306 |
300 /// Returns the set of all transformers that need to be loaded before [id] is | 307 /// Returns the set of all transformers that need to be loaded before [id] is |
301 /// loaded. | 308 /// loaded. |
302 /// | 309 /// |
303 /// [id] must refer to a transformer in [_package]. | 310 /// [id] must refer to a transformer in [_package]. |
304 Set<TransformerId> _transformersNeededByTransformer(TransformerId id) { | 311 Set<TransformerId> _transformersNeededByTransformer(TransformerId id) { |
305 assert(id.package == _package.name); | 312 assert(id.package == _package.name); |
306 if (_transformersNeededByTransformers.containsKey(id)) { | 313 if (_transformersNeededByTransformers.containsKey(id)) { |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
437 return null; | 444 return null; |
438 } | 445 } |
439 | 446 |
440 _directives[libraryUri] = | 447 _directives[libraryUri] = |
441 parseImportsAndExports(readTextFile(library), name: library) | 448 parseImportsAndExports(readTextFile(library), name: library) |
442 .map((directive) => Uri.parse(directive.uri.stringValue)) | 449 .map((directive) => Uri.parse(directive.uri.stringValue)) |
443 .toSet(); | 450 .toSet(); |
444 return _directives[libraryUri]; | 451 return _directives[libraryUri]; |
445 } | 452 } |
446 } | 453 } |
OLD | NEW |