Skip to content

Commit d231a3d

Browse files
authored
Split out AssetTracker, create AssetGraphLoader and BuildPhases. (#3928)
* Move `AssetTracker` to its own file. * Add `AssetGraphLoader` and `BuildPhases`.
1 parent d27ff83 commit d231a3d

24 files changed

+623
-462
lines changed

build_runner/lib/src/daemon/change_providers.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import 'package:build_daemon/change_provider.dart';
88
// ignore: implementation_imports
99
import 'package:build_runner_core/src/asset_graph/graph.dart';
1010
// ignore: implementation_imports
11-
import 'package:build_runner_core/src/generate/build_definition.dart';
11+
import 'package:build_runner_core/src/generate/asset_tracker.dart';
1212
import 'package:watcher/watcher.dart' show WatchEvent;
1313

1414
/// Continually updates the [changes] stream as watch events are seen on the

build_runner/lib/src/daemon/daemon_builder.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import 'package:build_runner_core/build_runner_core.dart'
1717
import 'package:build_runner_core/build_runner_core.dart'
1818
hide BuildResult, BuildStatus;
1919
// ignore: implementation_imports
20-
import 'package:build_runner_core/src/generate/build_definition.dart';
20+
import 'package:build_runner_core/src/generate/asset_tracker.dart';
2121
// ignore: implementation_imports
2222
import 'package:build_runner_core/src/generate/build_series.dart';
2323
import 'package:stream_transform/stream_transform.dart';

build_runner/test/generate/watch_test.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import 'package:build_runner/src/generate/watch_impl.dart' as watch_impl;
1414
import 'package:build_runner_core/build_runner_core.dart';
1515
import 'package:build_runner_core/src/asset_graph/graph.dart';
1616
import 'package:build_runner_core/src/asset_graph/node.dart';
17+
import 'package:build_runner_core/src/generate/build_phases.dart';
1718
import 'package:build_test/src/in_memory_reader_writer.dart';
1819
import 'package:logging/logging.dart';
1920
import 'package:path/path.dart' as path;
@@ -354,7 +355,7 @@ void main() {
354355
);
355356

356357
var expectedGraph = await AssetGraph.build(
357-
[],
358+
BuildPhases([]),
358359
<AssetId>{},
359360
{packageConfigId},
360361
buildPackageGraph({rootPackage('a'): []}),

build_runner/test/server/asset_handler_test.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import 'package:build_runner/src/server/server.dart';
1010
import 'package:build_runner_core/build_runner_core.dart';
1111
import 'package:build_runner_core/src/asset_graph/graph.dart';
1212
import 'package:build_runner_core/src/asset_graph/node.dart';
13+
import 'package:build_runner_core/src/generate/build_phases.dart';
1314
import 'package:build_runner_core/src/generate/options.dart';
1415
import 'package:build_runner_core/src/package_graph/target_graph.dart';
1516
import 'package:shelf/shelf.dart';
@@ -23,7 +24,7 @@ void main() {
2324

2425
setUp(() async {
2526
graph = await AssetGraph.build(
26-
[],
27+
BuildPhases([]),
2728
<AssetId>{},
2829
<AssetId>{},
2930
buildPackageGraph({rootPackage('a'): []}),
@@ -38,7 +39,7 @@ void main() {
3839
packageGraph,
3940
defaultRootPackageSources: defaultRootPackageSources,
4041
),
41-
[],
42+
BuildPhases([]),
4243
'a',
4344
);
4445
handler = AssetHandler(reader, 'a');

build_runner/test/server/serve_handler_test.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import 'package:build_runner/src/server/server.dart';
1515
import 'package:build_runner_core/build_runner_core.dart';
1616
import 'package:build_runner_core/src/asset_graph/graph.dart';
1717
import 'package:build_runner_core/src/asset_graph/node.dart';
18+
import 'package:build_runner_core/src/generate/build_phases.dart';
1819
import 'package:build_runner_core/src/generate/options.dart';
1920
import 'package:build_runner_core/src/generate/performance_tracker.dart';
2021
import 'package:build_runner_core/src/package_graph/target_graph.dart';
@@ -107,7 +108,7 @@ void main() {
107108
final packageGraph = buildPackageGraph({rootPackage('a'): []});
108109
readerWriter = TestReaderWriter(rootPackage: packageGraph.root.name);
109110
assetGraph = await AssetGraph.build(
110-
[],
111+
BuildPhases([]),
111112
<AssetId>{},
112113
<AssetId>{},
113114
packageGraph,
@@ -122,7 +123,7 @@ void main() {
122123
packageGraph,
123124
defaultRootPackageSources: defaultRootPackageSources,
124125
),
125-
[],
126+
BuildPhases([]),
126127
'a',
127128
),
128129
),

build_runner_core/lib/src/asset/finalized_reader.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import '../../build_runner_core.dart';
1515
import '../asset_graph/graph.dart';
1616
import '../asset_graph/node.dart';
1717
import '../asset_graph/optional_output_tracker.dart';
18-
import '../generate/phase.dart';
18+
import '../generate/build_phases.dart';
1919
import '../package_graph/target_graph.dart';
2020

2121
/// A view of the build output.
@@ -30,7 +30,7 @@ class FinalizedReader {
3030
final TargetGraph _targetGraph;
3131
OptionalOutputTracker? _optionalOutputTracker;
3232
final String _rootPackage;
33-
final List<BuildPhase> _buildPhases;
33+
final BuildPhases _buildPhases;
3434

3535
void reset(Set<String> buildDirs, Set<BuildFilter> buildFilters) {
3636
_optionalOutputTracker = OptionalOutputTracker(

build_runner_core/lib/src/asset_graph/graph.dart

Lines changed: 42 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,15 @@ import 'package:build/build.dart';
1111
import 'package:build/experiments.dart' as experiments_zone;
1212
// ignore: implementation_imports
1313
import 'package:build/src/internal.dart';
14-
import 'package:convert/convert.dart';
14+
import 'package:built_collection/built_collection.dart';
1515
import 'package:crypto/crypto.dart';
1616
import 'package:glob/glob.dart';
1717
import 'package:package_config/package_config.dart';
1818
import 'package:watcher/watcher.dart';
1919

20+
import '../../build_runner_core.dart';
21+
import '../generate/build_phases.dart';
2022
import '../generate/phase.dart';
21-
import '../package_graph/package_graph.dart';
2223
import '../util/constants.dart';
2324
import 'exceptions.dart';
2425
import 'node.dart';
@@ -41,9 +42,9 @@ class AssetGraph implements GeneratedAssetHider {
4142

4243
/// The Dart language experiments that were enabled when this graph was
4344
/// originally created from the [build] constructor.
44-
final List<String> enabledExperiments;
45+
final BuiltList<String> enabledExperiments;
4546

46-
final Map<String, LanguageVersion?> packageLanguageVersions;
47+
final BuiltMap<String, LanguageVersion?> packageLanguageVersions;
4748

4849
AssetGraph._(
4950
this.buildPhasesDigest,
@@ -57,21 +58,17 @@ class AssetGraph implements GeneratedAssetHider {
5758
_AssetGraphDeserializer(serializedGraph).deserialize();
5859

5960
static Future<AssetGraph> build(
60-
List<BuildPhase> buildPhases,
61+
BuildPhases buildPhases,
6162
Set<AssetId> sources,
6263
Set<AssetId> internalSources,
6364
PackageGraph packageGraph,
6465
AssetReader digestReader,
6566
) async {
66-
var packageLanguageVersions = {
67-
for (var pkg in packageGraph.allPackages.values)
68-
pkg.name: pkg.languageVersion,
69-
};
7067
var graph = AssetGraph._(
71-
computeBuildPhasesDigest(buildPhases),
68+
buildPhases.digest,
7269
Platform.version,
73-
packageLanguageVersions,
74-
experiments_zone.enabledExperiments,
70+
packageGraph.languageVersions,
71+
experiments_zone.enabledExperiments.build(),
7572
);
7673
var placeholders = graph._addPlaceHolderNodes(packageGraph);
7774
graph._addSources(sources);
@@ -191,7 +188,7 @@ class AssetGraph implements GeneratedAssetHider {
191188
}
192189

193190
/// Adds [AssetNode.builderOptions] for all [buildPhases] to this graph.
194-
void _addBuilderOptionsNodes(List<BuildPhase> buildPhases) {
191+
void _addBuilderOptionsNodes(BuildPhases buildPhases) {
195192
for (var phaseNum = 0; phaseNum < buildPhases.length; phaseNum++) {
196193
var phase = buildPhases[phaseNum];
197194
if (phase is InBuildPhase) {
@@ -335,7 +332,7 @@ class AssetGraph implements GeneratedAssetHider {
335332
///
336333
/// Returns the list of [AssetId]s that were invalidated.
337334
Future<Set<AssetId>> updateAndInvalidate(
338-
List<BuildPhase> buildPhases,
335+
BuildPhases buildPhases,
339336
Map<AssetId, ChangeType> updates,
340337
String rootPackage,
341338
Future Function(AssetId id) delete,
@@ -531,7 +528,7 @@ class AssetGraph implements GeneratedAssetHider {
531528
/// If [placeholders] is supplied they will be added to [newSources] to create
532529
/// the full input set.
533530
Set<AssetId> _addOutputsForSources(
534-
List<BuildPhase> buildPhases,
531+
BuildPhases buildPhases,
535532
Set<AssetId> newSources,
536533
String rootPackage, {
537534
Set<AssetId>? placeholders,
@@ -570,7 +567,7 @@ class AssetGraph implements GeneratedAssetHider {
570567
InBuildPhase phase,
571568
int phaseNum,
572569
Set<AssetId> allInputs,
573-
List<BuildPhase> buildPhases,
570+
BuildPhases buildPhases,
574571
String rootPackage,
575572
) {
576573
var phaseOutputs = <AssetId>{};
@@ -640,7 +637,7 @@ class AssetGraph implements GeneratedAssetHider {
640637
Iterable<AssetId> outputs,
641638
int phaseNumber,
642639
AssetNode builderOptionsNode,
643-
List<BuildPhase> buildPhases,
640+
BuildPhases buildPhases,
644641
String rootPackage, {
645642
required AssetId primaryInput,
646643
required bool isHidden,
@@ -733,17 +730,35 @@ class AssetGraph implements GeneratedAssetHider {
733730
}
734731
return id;
735732
}
736-
}
737733

738-
/// Computes a [Digest] for [buildPhases] which can be used to compare one set
739-
/// of [BuildPhase]s against another.
740-
Digest computeBuildPhasesDigest(Iterable<BuildPhase> buildPhases) {
741-
var digestSink = AccumulatorSink<Digest>();
742-
md5.startChunkedConversion(digestSink)
743-
..add(buildPhases.map((phase) => phase.identity).toList())
744-
..close();
745-
assert(digestSink.events.length == 1);
746-
return digestSink.events.first;
734+
/// Deletes outputs that were written to the source tree.
735+
///
736+
/// Returns the assets that were deleted.
737+
Future<Iterable<AssetId>> deleteOutputs(
738+
PackageGraph packageGraph,
739+
RunnerAssetWriter writer,
740+
) async {
741+
var deletedSources = <AssetId>[];
742+
// Delete all the non-hidden outputs.
743+
for (final id in outputs) {
744+
var node = get(id)!;
745+
final nodeConfiguration = node.generatedNodeConfiguration!;
746+
final nodeState = node.generatedNodeState!;
747+
if (nodeState.wasOutput && !nodeConfiguration.isHidden) {
748+
var idToDelete = id;
749+
// If the package no longer exists, then the user must have
750+
// renamed the root package.
751+
//
752+
// In that case we change `idToDelete` to be in the root package.
753+
if (packageGraph[id.package] == null) {
754+
idToDelete = AssetId(packageGraph.root.name, id.path);
755+
}
756+
deletedSources.add(idToDelete);
757+
await writer.delete(idToDelete);
758+
}
759+
}
760+
return deletedSources;
761+
}
747762
}
748763

749764
Digest computeBuilderOptionsDigest(BuilderOptions options) =>

0 commit comments

Comments
 (0)