Chromium Code Reviews| Index: sdk/lib/_internal/pub/lib/src/barback/foreign_transformer.dart |
| diff --git a/sdk/lib/_internal/pub/lib/src/barback/foreign_transformer.dart b/sdk/lib/_internal/pub/lib/src/barback/foreign_transformer.dart |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..1cc5a1e9cc59f2921c351df70015c08aaa293f13 |
| --- /dev/null |
| +++ b/sdk/lib/_internal/pub/lib/src/barback/foreign_transformer.dart |
| @@ -0,0 +1,101 @@ |
| +// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| +// for details. All rights reserved. Use of this source code is governed by a |
| +// BSD-style license that can be found in the LICENSE file. |
| + |
| +library pub.foreign_transformer; |
| + |
| +import 'dart:async'; |
| +import 'dart:isolate'; |
| + |
| +import 'package:barback/barback.dart'; |
| +// TODO(nweiz): don't import from "src" once issue 14966 is fixed. |
| +import 'package:barback/src/internal_asset.dart'; |
| + |
| +import '../../../asset/dart/serialize.dart'; |
| +import '../barback.dart'; |
| +import 'excluding_transformer.dart'; |
| + |
| +/// A wrapper for a transformer that's in a different isolate. |
| +class _ForeignTransformer extends Transformer { |
| + /// The port with which we communicate with the child isolate. |
| + /// |
| + /// This port and all messages sent across it are specific to this |
| + /// transformer. |
| + final SendPort _port; |
| + |
| + /// The result of calling [toString] on the transformer in the isolate. |
| + final String _toString; |
| + |
| + _ForeignTransformer(Map map) |
| + : _port = map['port'], |
| + _toString = map['toString']; |
| + |
| + Future<bool> isPrimary(AssetId id) { |
| + return call(_port, { |
| + 'type': 'isPrimary', |
| + 'id': serializeId(id) |
| + }); |
| + } |
| + |
| + Future apply(Transform transform) { |
| + return call(_port, { |
| + 'type': 'apply', |
| + 'transform': serializeTransform(transform) |
| + }); |
| + } |
| + |
| + String toString() => _toString; |
| +} |
| + |
| +class _ForeignDeclaringTransformer extends _ForeignTransformer |
| + implements DeclaringTransformer { |
| + _ForeignDeclaringTransformer(Map map) |
| + : super(map); |
| + |
| + Future declareOutputs(DeclaringTransform transform) { |
| + return call(_port, { |
| + 'type': 'declareOutputs', |
| + 'transform': serializeDeclaringTransform(transform) |
| + }); |
| + } |
| +} |
| + |
| +class _ForeignLazyTransformer extends _ForeignDeclaringTransformer |
| + implements LazyTransformer { |
| + _ForeignLazyTransformer(Map map) |
| + : super(map); |
| +} |
| + |
| +/// A wrapper for a transformer group that's in a different isolate. |
| +class _ForeignGroup implements TransformerGroup { |
| + final Iterable<Iterable> phases; |
| + |
| + /// The result of calling [toString] on the transformer group in the isolate. |
| + final String _toString; |
| + |
| + _ForeignGroup(TransformerId id, Map map) |
| + : phases = map['phases'].map((phase) { |
| + return phase.map((transformer) => deserializeTransformerOrGroup( |
| + transformer, id)).toList(); |
| + }).toList(), |
| + _toString = map['toString']; |
| + |
| + String toString() => _toString; |
| +} |
| + |
| +/// Converts a serializable map into a [Transformer] or a [TransformerGroup]. |
| +deserializeTransformerOrGroup(Map map, TransformerId id) { |
| + if (map['type'] == 'TransformerGroup') return new _ForeignGroup(id, map); |
|
Bob Nystrom
2014/04/16 16:21:00
How about:
switch (map['type']) { ... }
nweiz
2014/04/16 20:28:21
Done.
|
| + |
| + var transformer; |
| + if (map['type'] == 'Transformer') { |
| + transformer = new _ForeignTransformer(map); |
| + } else if (map['type'] == 'DeclaringTransformer') { |
| + transformer = new _ForeignDeclaringTransformer(map); |
| + } else { |
| + assert(map['type'] == 'LazyTransformer'); |
| + transformer = new _ForeignLazyTransformer(map); |
| + } |
| + |
| + return ExcludingTransformer.wrap(transformer, id.includes, id.excludes); |
| +} |