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 25 matching lines...) Expand all Loading... |
36 | 36 |
37 /// A cache of the results of [transformersNeededByPackage]. | 37 /// A cache of the results of [transformersNeededByPackage]. |
38 final _transformersNeededByPackages = new Map<String, Set<TransformerId>>(); | 38 final _transformersNeededByPackages = new Map<String, Set<TransformerId>>(); |
39 | 39 |
40 /// The set of all packages that neither use transformers themselves nor | 40 /// The set of all packages that neither use transformers themselves nor |
41 /// import packages that use transformers. | 41 /// import packages that use transformers. |
42 /// | 42 /// |
43 /// This is precomputed before any package computers are loaded. | 43 /// This is precomputed before any package computers are loaded. |
44 final _untransformedPackages = new Set<String>(); | 44 final _untransformedPackages = new Set<String>(); |
45 | 45 |
| 46 /// Creates a dependency computer for [graph]. |
| 47 /// |
| 48 /// If [rootDevDependencies] is true, this includes the root package's dev |
| 49 /// dependencies in the computation. |
46 DependencyComputer(this._graph) { | 50 DependencyComputer(this._graph) { |
47 for (var package in ordered(_graph.packages.keys)) { | 51 for (var package in ordered(_graph.packages.keys)) { |
48 if (_graph.transitiveDependencies(package).every((dependency) => | 52 if (_graph.transitiveDependencies(package).every((dependency) => |
49 dependency.pubspec.transformers.isEmpty)) { | 53 dependency.pubspec.transformers.isEmpty)) { |
50 _untransformedPackages.add(package); | 54 _untransformedPackages.add(package); |
51 } | 55 } |
52 } | 56 } |
53 | 57 |
54 ordered(_graph.packages.keys).forEach(_loadPackageComputer); | 58 ordered(_graph.packages.keys).forEach(_loadPackageComputer); |
55 } | 59 } |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
178 } | 182 } |
179 | 183 |
180 if (_loadingPackageComputers.contains(id.package)) { | 184 if (_loadingPackageComputers.contains(id.package)) { |
181 throw new CycleException("$packageName is transformed by $id"); | 185 throw new CycleException("$packageName is transformed by $id"); |
182 } | 186 } |
183 | 187 |
184 results.add(id); | 188 results.add(id); |
185 } | 189 } |
186 } | 190 } |
187 | 191 |
188 var dependencies = packageName == _graph.entrypoint.root.name ? | 192 var dependencies = |
189 package.immediateDependencies : package.dependencies; | 193 !_graph.entrypoint.isGlobal && |
| 194 packageName == _graph.entrypoint.root.name |
| 195 ? package.immediateDependencies |
| 196 : package.dependencies; |
190 for (var dep in dependencies) { | 197 for (var dep in dependencies) { |
191 try { | 198 try { |
192 traversePackage(dep.name); | 199 traversePackage(dep.name); |
193 } on CycleException catch (error) { | 200 } on CycleException catch (error) { |
194 throw error.prependStep("$packageName depends on ${dep.name}"); | 201 throw error.prependStep("$packageName depends on ${dep.name}"); |
195 } | 202 } |
196 } | 203 } |
197 } | 204 } |
198 | 205 |
199 traversePackage(rootPackage); | 206 traversePackage(rootPackage); |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
328 /// [DependencyComputer._transformersNeededByPackage]). | 335 /// [DependencyComputer._transformersNeededByPackage]). |
329 Set<TransformerId> transformersNeededByLibrary(String library) { | 336 Set<TransformerId> transformersNeededByLibrary(String library) { |
330 library = p.normalize(library); | 337 library = p.normalize(library); |
331 if (_activeLibraries.contains(library)) return new Set(); | 338 if (_activeLibraries.contains(library)) return new Set(); |
332 _activeLibraries.add(library); | 339 _activeLibraries.add(library); |
333 | 340 |
334 try { | 341 try { |
335 var externalDirectives = _getTransitiveExternalDirectives(library); | 342 var externalDirectives = _getTransitiveExternalDirectives(library); |
336 if (externalDirectives == null) { | 343 if (externalDirectives == null) { |
337 var rootName = _dependencyComputer._graph.entrypoint.root.name; | 344 var rootName = _dependencyComputer._graph.entrypoint.root.name; |
338 var dependencies = _package.name == rootName ? | 345 var dependencies = |
339 _package.immediateDependencies : _package.dependencies; | 346 !_dependencyComputer._graph.entrypoint.isGlobal && |
| 347 _package.name == rootName |
| 348 ? _package.immediateDependencies |
| 349 : _package.dependencies; |
340 | 350 |
341 // If anything transitively imported/exported by [library] within this | 351 // If anything transitively imported/exported by [library] within this |
342 // package is modified by a transformer, we don't know what it will | 352 // package is modified by a transformer, we don't know what it will |
343 // load, so we take the conservative approach and say it depends on | 353 // load, so we take the conservative approach and say it depends on |
344 // everything. | 354 // everything. |
345 return _applicableTransformers.map((config) => config.id).toSet().union( | 355 return _applicableTransformers.map((config) => config.id).toSet().union( |
346 unionAll(dependencies.map((dep) { | 356 unionAll(dependencies.map((dep) { |
347 try { | 357 try { |
348 return _dependencyComputer._transformersNeededByPackage(dep.name); | 358 return _dependencyComputer._transformersNeededByPackage(dep.name); |
349 } on CycleException catch (error) { | 359 } on CycleException catch (error) { |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
444 return null; | 454 return null; |
445 } | 455 } |
446 | 456 |
447 _directives[libraryUri] = | 457 _directives[libraryUri] = |
448 parseImportsAndExports(readTextFile(library), name: library) | 458 parseImportsAndExports(readTextFile(library), name: library) |
449 .map((directive) => Uri.parse(directive.uri.stringValue)) | 459 .map((directive) => Uri.parse(directive.uri.stringValue)) |
450 .toSet(); | 460 .toSet(); |
451 return _directives[libraryUri]; | 461 return _directives[libraryUri]; |
452 } | 462 } |
453 } | 463 } |
OLD | NEW |