@@ -14,7 +14,7 @@ import 'rewriter.dart';
1414/// Transformer responsible for rewriting deferred library loads to enable
1515/// initializing the reflector in a deferred way to keep the code with the
1616/// deferred library.
17- class DeferredRewriter extends Transformer implements LazyTransformer {
17+ class DeferredRewriter extends AggregateTransformer implements LazyTransformer {
1818 final TransformerOptions options;
1919
2020 DeferredRewriter (this .options);
@@ -25,23 +25,60 @@ class DeferredRewriter extends Transformer implements LazyTransformer {
2525 }
2626
2727 @override
28- bool isPrimary (AssetId id) =>
29- id.extension .endsWith ('dart' ) && _isNotGenerated (id);
28+ dynamic classifyPrimary (AssetId id) {
29+ // Map <name>.dart and <name>.dart.deferredCount => <name>.
30+ // Anything else to `null`.
31+ var extension = null ;
32+ if (id.path.endsWith (DEFERRED_EXTENSION )) {
33+ extension = DEFERRED_EXTENSION ;
34+ } else if (id.path.endsWith ('.dart' ) && ! isGenerated (id.path)) {
35+ extension = '.dart' ;
36+ } else {
37+ return null ;
38+ }
39+ return id.path.substring (0 , id.path.length - extension .length);
40+ }
3041
3142 @override
32- Future apply (Transform transform) async {
43+ Future apply (AggregateTransform transform) async {
3344 return zone.exec (() async {
34- var asset = transform.primaryInput;
35- var reader = new AssetReader .fromTransform (transform);
36- var transformedCode = await rewriteDeferredLibraries (reader, asset.id);
45+ final dartAsset = await _assetToProcess (transform);
46+ if (dartAsset == null ) return ;
47+
48+ var transformedCode = await rewriteDeferredLibraries (
49+ new AssetReader .fromTransform (transform), dartAsset.id);
3750 if (transformedCode != null ) {
38- transform.addOutput (new Asset .fromString (asset.id, transformedCode));
51+ transform
52+ .addOutput (new Asset .fromString (dartAsset.id, transformedCode));
3953 }
4054 }, log: transform.logger);
4155 }
42- }
4356
44- bool _isNotGenerated (AssetId id) => ! isGenerated (id.path);
57+ /// Returns the asset we need to process or `null` if none exists.
58+ ///
59+ /// Consumes the .dart.deferredCount asset if it is present.
60+ Future <Asset > _assetToProcess (AggregateTransform transform) async {
61+ // We only need to process .dart files that have an associated
62+ // .dart.deferredCount file with a value != "0".
63+ //
64+ // The .dart.deferredCount file is generated by a previous phase for files
65+ // which have deferred imports. An absent .dart.deferredCount asset is the
66+ // treated the same as a .dart.deferredCount asset with value "0".
67+ var dartAsset, deferredCountAsset;
68+ await for (Asset a in transform.primaryInputs) {
69+ if (a.id.path.endsWith (DEFERRED_EXTENSION )) {
70+ deferredCountAsset = a;
71+ } else if (a.id.path.endsWith ('.dart' )) {
72+ dartAsset = a;
73+ }
74+ }
75+ if (deferredCountAsset == null ) return null ;
76+ // No longer necessary.
77+ transform.consumePrimary (deferredCountAsset.id);
78+ if ((await deferredCountAsset.readAsString ()) == "0" ) return null ;
79+ return dartAsset;
80+ }
81+ }
4582
4683// Visible for testing
4784Future <String > rewriteDeferredLibraries (AssetReader reader, AssetId id) async {
0 commit comments