Index: pkg/barback/lib/src/graph/transformer_classifier.dart |
diff --git a/pkg/barback/lib/src/graph/transformer_classifier.dart b/pkg/barback/lib/src/graph/transformer_classifier.dart |
index 6ba2480085771a1114162738f38154d62d055ba2..9a59f57c30c185abcb9b66f69d75b7df7d64da98 100644 |
--- a/pkg/barback/lib/src/graph/transformer_classifier.dart |
+++ b/pkg/barback/lib/src/graph/transformer_classifier.dart |
@@ -10,7 +10,8 @@ import '../asset/asset_forwarder.dart'; |
import '../asset/asset_node.dart'; |
import '../errors.dart'; |
import '../log.dart'; |
-import '../transformer/transformer.dart'; |
+import '../transformer/aggregate_transformer.dart'; |
+import '../transformer/wrapping_aggregate_transformer.dart'; |
import '../utils.dart'; |
import 'node_status.dart'; |
import 'node_streams.dart'; |
@@ -18,17 +19,17 @@ import 'phase.dart'; |
import 'transform_node.dart'; |
/// A class for classifying the primary inputs for a transformer according to |
-/// its `classifyPrimary` method. |
+/// its [AggregateTransformer.classifyPrimary] method. |
/// |
-/// This is used for non-aggregate transformers; they're modeled as aggregate |
-/// transformers that return the primary path if `isPrimary` is true and `null` |
-/// if `isPrimary` is `null`. |
+/// This is also used for non-aggregate transformers; they're modeled as |
+/// aggregate transformers that return the primary path if `isPrimary` is true |
+/// and `null` if `isPrimary` is `null`. |
class TransformerClassifier { |
/// The containing [Phase]. |
final Phase _phase; |
- /// The [Transformer] to use to classify the inputs. |
- final Transformer transformer; |
+ /// The [AggregateTransformer] used to classify the inputs. |
+ final AggregateTransformer transformer; |
/// A string describing the location of [this] in the transformer graph. |
final String _location; |
@@ -45,24 +46,26 @@ class TransformerClassifier { |
Stream<AssetNode> get onAsset => _streams.onAsset; |
Stream<LogEntry> get onLog => _streams.onLog; |
- /// The number of currently-active calls to [transformer.isPrimary]. |
+ /// The number of currently-active calls to [transformer.classifyPrimary]. |
/// |
/// This is used to determine whether [this] is dirty. |
- var _activeIsPrimaries = 0; |
+ var _activeClassifications = 0; |
/// How far along [this] is in processing its assets. |
NodeStatus get status { |
- if (_activeIsPrimaries > 0) return NodeStatus.RUNNING; |
+ if (_activeClassifications > 0) return NodeStatus.RUNNING; |
return NodeStatus.dirtiest( |
_transforms.values.map((transform) => transform.status)); |
} |
- TransformerClassifier(this._phase, this.transformer, this._location); |
+ TransformerClassifier(this._phase, transformer, this._location) |
+ : transformer = transformer is AggregateTransformer ? |
+ transformer : new WrappingAggregateTransformer(transformer); |
/// Adds a new asset as an input for this transformer. |
void addInput(AssetNode input) { |
- _activeIsPrimaries++; |
- syncFuture(() => transformer.isPrimary(input.id)).catchError( |
+ _activeClassifications++; |
+ syncFuture(() => transformer.classifyPrimary(input.id)).catchError( |
(error, stackTrace) { |
if (input.state.isRemoved) return false; |
@@ -77,18 +80,19 @@ class TransformerClassifier { |
_phase.cascade.reportError(error); |
return false; |
- }).then((isPrimary) { |
+ }).then((key) { |
if (input.state.isRemoved) return; |
- if (!isPrimary) { |
+ if (key == null) { |
var forwarder = new AssetForwarder(input); |
_passThroughForwarders.add(forwarder); |
forwarder.node.whenRemoved( |
() => _passThroughForwarders.remove(forwarder)); |
_streams.onAssetController.add(forwarder.node); |
+ } else if (_transforms.containsKey(key)) { |
+ _transforms[key].addPrimary(input); |
} else { |
- var transform = new TransformNode( |
- _phase, transformer, input, _location); |
- _transforms[input.id.path] = transform; |
+ var transform = new TransformNode(_phase, transformer, key, _location); |
+ _transforms[key] = transform; |
transform.onStatusChange.listen( |
(_) => _streams.changeStatus(status), |
@@ -96,9 +100,10 @@ class TransformerClassifier { |
_streams.onAssetPool.add(transform.onAsset); |
_streams.onLogPool.add(transform.onLog); |
+ transform.addPrimary(input); |
} |
}).whenComplete(() { |
- _activeIsPrimaries--; |
+ _activeClassifications--; |
if (!_streams.isClosed) _streams.changeStatus(status); |
}); |
} |