X Tutup
Skip to content

Commit 1f2302e

Browse files
author
Tim Blasi
committed
fix(dart/transform): Fix transformer output declaration
Ensure that the transformers are properly declaring all consumed outputs. In particular, when a transformer overwrites an output, make sure the transformer calls `consumePrimary` followed by `addOutput` for that file. Prevent `DirectiveLinker` from consuming `.ng_deps.json` files. When we do this, barback incorrectly calculates the available assets for that phase, resulting in broken builds.
1 parent a88e6f3 commit 1f2302e

File tree

6 files changed

+58
-38
lines changed

6 files changed

+58
-38
lines changed

modules_dart/transform/lib/src/transform/bind_generator/transformer.dart

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,19 @@ class BindGenerator extends Transformer implements DeclaringTransformer {
2626

2727
@override
2828
declareOutputs(DeclaringTransform transform) {
29+
transform.consumePrimary();
2930
transform.declareOutput(transform.primaryId);
3031
}
3132

3233
@override
3334
Future apply(Transform transform) async {
3435
await log.initZoned(transform, () async {
35-
var id = transform.primaryInput.id;
36+
var primaryId = transform.primaryInput.id;
3637
var reader = new AssetReader.fromTransform(transform);
37-
var transformedCode = await createNgSettersAndGetters(reader, id);
38+
var transformedCode = await createNgSettersAndGetters(reader, primaryId);
39+
transform.consumePrimary();
3840
transform.addOutput(new Asset.fromString(
39-
id, formatter.format(transformedCode, uri: id.path)));
41+
primaryId, formatter.format(transformedCode, uri: primaryId.path)));
4042
});
4143
}
4244
}

modules_dart/transform/lib/src/transform/deferred_rewriter/transformer.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class DeferredRewriter extends Transformer implements DeclaringTransformer {
2424

2525
@override
2626
declareOutputs(DeclaringTransform transform) {
27+
transform.consumePrimary();
2728
transform.declareOutput(transform.primaryId);
2829
}
2930

@@ -33,9 +34,11 @@ class DeferredRewriter extends Transformer implements DeclaringTransformer {
3334
var asset = transform.primaryInput;
3435
var reader = new AssetReader.fromTransform(transform);
3536
var transformedCode = await rewriteDeferredLibraries(reader, asset.id);
37+
transform.consumePrimary();
3638
if (transformedCode != null) {
37-
transform.addOutput(
38-
new Asset.fromString(transform.primaryInput.id, transformedCode));
39+
transform.addOutput(new Asset.fromString(asset.id, transformedCode));
40+
} else {
41+
transform.addOutput(asset);
3942
}
4043
});
4144
}

modules_dart/transform/lib/src/transform/directive_linker/transformer.dart

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,29 +22,37 @@ class DirectiveLinker extends Transformer implements DeclaringTransformer {
2222

2323
@override
2424
declareOutputs(DeclaringTransform transform) {
25-
transform.declareOutput(transform.primaryId);
25+
// TODO(kegluenq): We should consume this, but doing so causes barback to
26+
// incorrectly determine what assets are available in this phase.
27+
// transform.consumePrimary();
28+
transform.declareOutput(_depsAssetId(transform.primaryId));
2629
}
2730

2831
@override
2932
Future apply(Transform transform) async {
3033
await log.initZoned(transform, () async {
3134
var reader = new AssetReader.fromTransform(transform);
3235
var assetId = transform.primaryInput.id;
33-
var assetPath = assetId.path;
3436
var ngDepsModel = await linkNgDeps(reader, assetId);
37+
// See above
38+
// transform.consumePrimary();
39+
var outputAssetId = _depsAssetId(assetId);
3540
if (ngDepsModel != null) {
3641
var buf = new StringBuffer();
3742
var writer = new NgDepsWriter(buf);
3843
writer.writeNgDepsModel(ngDepsModel);
39-
var formattedCode = formatter.format('$buf', uri: assetPath);
40-
var ngDepsAssetId =
41-
new AssetId(assetId.package, toDepsExtension(assetPath));
42-
transform.addOutput(new Asset.fromString(ngDepsAssetId, formattedCode));
44+
var formattedCode = formatter.format('$buf', uri: assetId.path);
45+
transform.addOutput(new Asset.fromString(outputAssetId, formattedCode));
46+
} else {
47+
transform.addOutput(new Asset.fromString(outputAssetId, ''));
4348
}
4449
});
4550
}
4651
}
4752

53+
AssetId _depsAssetId(AssetId primaryId) =>
54+
new AssetId(primaryId.package, toDepsExtension(primaryId.path));
55+
4856
/// Transformer responsible for removing unnecessary `.ng_deps.json` files
4957
/// created by {@link DirectiveProcessor}.
5058
class EmptyNgDepsRemover extends Transformer implements DeclaringTransformer {
@@ -54,17 +62,22 @@ class EmptyNgDepsRemover extends Transformer implements DeclaringTransformer {
5462
bool isPrimary(AssetId id) => id.path.endsWith(DEPS_JSON_EXTENSION);
5563

5664
/// We occasionally consume the primary input, but that depends on the
57-
/// contents of the file, so we conservatively do not declare any outputs nor
58-
/// consumption to ensure that we declare a superset of our actual outputs.
65+
/// contents of the file, so we conservatively declare that we both consume
66+
/// and output the asset. This prevents barback from making any assumptions
67+
/// about the existence of the assets until after the transformer has run.
5968
@override
60-
declareOutputs(DeclaringTransform transform) => null;
69+
declareOutputs(DeclaringTransform transform) {
70+
transform.consumePrimary();
71+
transform.declareOutput(transform.primaryId);
72+
}
6173

6274
@override
6375
Future apply(Transform transform) async {
6476
await log.initZoned(transform, () async {
6577
var reader = new AssetReader.fromTransform(transform);
66-
if (!(await isNecessary(reader, transform.primaryInput.id))) {
67-
transform.consumePrimary();
78+
transform.consumePrimary();
79+
if ((await isNecessary(reader, transform.primaryInput.id))) {
80+
transform.addOutput(transform.primaryInput);
6881
}
6982
});
7083
}

modules_dart/transform/lib/src/transform/directive_processor/transformer.dart

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -34,36 +34,33 @@ class DirectiveProcessor extends Transformer implements DeclaringTransformer {
3434
/// determine that one or the other will not be emitted.
3535
@override
3636
declareOutputs(DeclaringTransform transform) {
37-
transform.declareOutput(
38-
transform.primaryId.changeExtension(ALIAS_EXTENSION));
39-
transform.declareOutput(
40-
transform.primaryId.changeExtension(DEPS_EXTENSION));
37+
transform.declareOutput(_depsOutputId(transform.primaryId));
38+
transform.declareOutput(_metaOutputId(transform.primaryId));
4139
}
4240

4341
@override
4442
Future apply(Transform transform) async {
4543
await log.initZoned(transform, () async {
46-
var asset = transform.primaryInput;
44+
var assetId = transform.primaryInput.id;
4745
var reader = new AssetReader.fromTransform(transform);
4846
var ngMeta = new NgMeta.empty();
4947
var ngDepsModel = await createNgDeps(
50-
reader, asset.id, options.annotationMatcher, ngMeta,
48+
reader, assetId, options.annotationMatcher, ngMeta,
5149
inlineViews: options.inlineViews);
5250
if (ngDepsModel != null) {
53-
var ngDepsAssetId =
54-
transform.primaryInput.id.changeExtension(DEPS_JSON_EXTENSION);
55-
if (await transform.hasInput(ngDepsAssetId)) {
56-
log.logger.error('Clobbering ${ngDepsAssetId}. '
57-
'This probably will not end well');
58-
}
59-
transform.addOutput(new Asset.fromString(ngDepsAssetId, ngDepsModel.writeToJson()));
51+
transform.addOutput(new Asset.fromString(
52+
_depsOutputId(assetId), ngDepsModel.writeToJson()));
6053
}
54+
var metaOutputId = _metaOutputId(assetId);
6155
if (!ngMeta.isEmpty) {
62-
var ngAliasesId =
63-
transform.primaryInput.id.changeExtension(ALIAS_EXTENSION);
64-
transform.addOutput(new Asset.fromString(ngAliasesId,
56+
transform.addOutput(new Asset.fromString(metaOutputId,
6557
new JsonEncoder.withIndent(" ").convert(ngMeta.toJson())));
6658
}
6759
});
6860
}
6961
}
62+
63+
AssetId _depsOutputId(AssetId primaryId) =>
64+
primaryId.changeExtension(DEPS_JSON_EXTENSION);
65+
AssetId _metaOutputId(AssetId primaryId) =>
66+
primaryId.changeExtension(ALIAS_EXTENSION);

modules_dart/transform/lib/src/transform/reflection_remover/transformer.dart

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,14 @@ class ReflectionRemover extends Transformer implements DeclaringTransformer {
3030

3131
@override
3232
declareOutputs(DeclaringTransform transform) {
33+
transform.consumePrimary();
3334
transform.declareOutput(transform.primaryId);
3435
}
3536

3637
@override
3738
Future apply(Transform transform) async {
3839
await log.initZoned(transform, () async {
40+
var primaryId = transform.primaryInput.id;
3941
var mirrorMode = options.mirrorMode;
4042
var writeStaticInit = options.initReflector;
4143
if (options.modeName == TRANSFORM_DYNAMIC_MODE) {
@@ -47,10 +49,10 @@ class ReflectionRemover extends Transformer implements DeclaringTransformer {
4749
}
4850

4951
var transformedCode = await removeReflectionCapabilities(
50-
new AssetReader.fromTransform(transform), transform.primaryInput.id,
52+
new AssetReader.fromTransform(transform), primaryId,
5153
mirrorMode: mirrorMode, writeStaticInit: writeStaticInit);
52-
transform.addOutput(
53-
new Asset.fromString(transform.primaryInput.id, transformedCode));
54+
transform.consumePrimary();
55+
transform.addOutput(new Asset.fromString(primaryId, transformedCode));
5456
});
5557
}
5658
}

modules_dart/transform/lib/src/transform/template_compiler/transformer.dart

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,20 +28,23 @@ class TemplateCompiler extends Transformer implements DeclaringTransformer {
2828

2929
@override
3030
declareOutputs(DeclaringTransform transform) {
31+
transform.consumePrimary();
3132
transform.declareOutput(transform.primaryId);
3233
}
3334

3435
@override
3536
Future apply(Transform transform) async {
3637
await log.initZoned(transform, () async {
3738
Html5LibDomAdapter.makeCurrent();
38-
var id = transform.primaryInput.id;
39+
var primaryId = transform.primaryInput.id;
3940
var reader = new AssetReader.fromTransform(transform);
40-
var transformedCode = formatter.format(await processTemplates(reader, id,
41+
var transformedCode = formatter.format(await processTemplates(
42+
reader, primaryId,
4143
generateChangeDetectors: options.generateChangeDetectors,
4244
reflectPropertiesAsAttributes:
4345
options.reflectPropertiesAsAttributes));
44-
transform.addOutput(new Asset.fromString(id, transformedCode));
46+
transform.consumePrimary();
47+
transform.addOutput(new Asset.fromString(primaryId, transformedCode));
4548
});
4649
}
4750
}

0 commit comments

Comments
 (0)
X Tutup