@@ -17,84 +17,72 @@ import '../builder/build_step_impl.dart';
1717import '../builder/builder.dart' ;
1818import '../util/barback.dart' ;
1919
20- /// A [Transformer] which runs multiple [Builder] s .
20+ /// A [Transformer] which runs a single [Builder] with a new [BuildStep] .
2121///
2222/// By default all [BuilderTransformer] s are [DeclaringTransformer] s. If you
2323/// wish to run as a [LazyTransformer] , extend this class and mix in
2424/// LazyTransformer.
2525class BuilderTransformer implements Transformer , DeclaringTransformer {
26- /// The builders that will run during this Transformer step.
27- ///
28- /// **Note**: All [builders] are ran in the same phase, and there are no
29- /// ordering guarantees. Thus, none of the [builders] can use the outputs of
30- /// other [builders] . In order to do this you must create a [TransformerGroup]
31- /// with multiple [BuilderTransformer] s.
32- final List <Builder > builders;
33-
26+ final Builder _builder;
3427 final Resolvers _resolvers;
3528
36- BuilderTransformer (this .builders , {Resolvers resolvers: const Resolvers ()})
29+ BuilderTransformer (this ._builder , {Resolvers resolvers: const Resolvers ()})
3730 : this ._resolvers = resolvers;
3831
3932 @override
4033 String get allowedExtensions => null ;
4134
4235 @override
4336 bool isPrimary (barback.AssetId id) =>
44- _expectedOutputs (id, builders ).isNotEmpty;
37+ _builder. declareOutputs ( toBuildAssetId (id) ).isNotEmpty;
4538
4639 @override
4740 Future apply (Transform transform) async {
4841 var input = await toBuildAsset (transform.primaryInput);
4942 var reader = new _TransformAssetReader (transform);
5043 var writer = new _TransformAssetWriter (transform);
5144
52- // Tracks all the expected outputs for each builder to make sure they don't
53- // overlap.
54- var allExpected = new Set <build.AssetId >();
55-
56- // Run all builders at the same time.
57- await Future .wait (builders.map ((builder) async {
58- var expected = _expectedOutputs (transform.primaryInput.id, [builder]);
59- if (expected.isEmpty) return ;
60-
61- // Check that no expected outputs already exist.
62- var preExistingFiles = [];
63- for (var output in expected) {
64- if (! allExpected.add (output) ||
65- await transform.hasInput (toBarbackAssetId (output))) {
66- preExistingFiles.add (toBarbackAssetId (output));
67- }
68- }
69- if (preExistingFiles.isNotEmpty) {
70- transform.logger.error (
71- 'Builder `$builder ` declared outputs `$preExistingFiles ` but those '
72- 'files already exist. That build step has been skipped.' ,
73- asset: transform.primaryInput.id);
74- return ;
45+ var expected =
46+ _builder.declareOutputs (toBuildAssetId (transform.primaryInput.id));
47+ if (expected.isEmpty) return ;
48+
49+ // Check for overlapping outputs.
50+ var uniqueExpected = new Set <build.AssetId >();
51+ var preExistingFiles = [];
52+ for (var output in expected) {
53+ if (! uniqueExpected.add (output) ||
54+ await transform.hasInput (toBarbackAssetId (output))) {
55+ preExistingFiles.add (toBarbackAssetId (output));
7556 }
57+ }
58+ if (preExistingFiles.isNotEmpty) {
59+ transform.logger.error (
60+ 'Builder `$_builder ` declared outputs `$preExistingFiles ` but those '
61+ 'files already exist. This build step has been skipped.' ,
62+ asset: transform.primaryInput.id);
63+ return ;
64+ }
7665
77- // Run the build step.
78- var buildStep = new BuildStepImpl (
79- input, expected, reader, writer, input.id.package, _resolvers);
80- Logger .root.level = Level .ALL ;
81- var logSubscription = buildStep.logger.onRecord.listen ((LogRecord log) {
82- if (log.loggerName != buildStep.logger.fullName) return ;
83-
84- if (log.level <= Level .CONFIG ) {
85- transform.logger.fine (_logRecordToMessage (log));
86- } else if (log.level <= Level .INFO ) {
87- transform.logger.info (_logRecordToMessage (log));
88- } else if (log.level <= Level .WARNING ) {
89- transform.logger.warning (_logRecordToMessage (log));
90- } else {
91- transform.logger.error (_logRecordToMessage (log));
92- }
93- });
94- await builder.build (buildStep);
95- await buildStep.complete ();
96- await logSubscription.cancel ();
97- }));
66+ // Run the build step.
67+ var buildStep = new BuildStepImpl (
68+ input, expected, reader, writer, input.id.package, _resolvers);
69+ Logger .root.level = Level .ALL ;
70+ var logSubscription = buildStep.logger.onRecord.listen ((LogRecord log) {
71+ if (log.loggerName != buildStep.logger.fullName) return ;
72+
73+ if (log.level <= Level .CONFIG ) {
74+ transform.logger.fine (_logRecordToMessage (log));
75+ } else if (log.level <= Level .INFO ) {
76+ transform.logger.info (_logRecordToMessage (log));
77+ } else if (log.level <= Level .WARNING ) {
78+ transform.logger.warning (_logRecordToMessage (log));
79+ } else {
80+ transform.logger.error (_logRecordToMessage (log));
81+ }
82+ });
83+ await _builder.build (buildStep);
84+ await buildStep.complete ();
85+ await logSubscription.cancel ();
9886 }
9987
10088 String _logRecordToMessage (LogRecord log) {
@@ -111,13 +99,12 @@ class BuilderTransformer implements Transformer, DeclaringTransformer {
11199
112100 @override
113101 void declareOutputs (DeclaringTransform transform) {
114- for (var outputId in _expectedOutputs (transform.primaryId, builders)) {
115- transform.declareOutput (toBarbackAssetId (outputId));
116- }
102+ var outputs = _builder.declareOutputs (toBuildAssetId (transform.primaryId));
103+ outputs.map (toBarbackAssetId).forEach (transform.declareOutput);
117104 }
118105
119106 @override
120- String toString () => 'BuilderTransformer: [$ builders ] ' ;
107+ String toString () => 'BuilderTransformer: $ _builder ' ;
121108}
122109
123110/// Very simple [AssetReader] which uses a [Transform] .
@@ -159,11 +146,3 @@ class _TransformAssetWriter implements AssetWriter {
159146 Future delete (build.AssetId id) =>
160147 throw new UnsupportedError ('_TransformAssetWriter can\' t delete files.' );
161148}
162-
163- /// All the expected outputs for [id] given [builders] .
164- Iterable <build.AssetId > _expectedOutputs (
165- barback.AssetId id, Iterable <Builder > builders) sync * {
166- for (var builder in builders) {
167- yield * builder.declareOutputs (toBuildAssetId (id));
168- }
169- }
0 commit comments