Skip to content

Commit ade6b2e

Browse files
committed
Move input tracking out of AssetReader to SingleStepReader.
`BuildStepImpl` always uses a `SingleStepReader`.
1 parent c663785 commit ade6b2e

19 files changed

+183
-104
lines changed

_test_common/lib/in_memory_reader_writer.dart

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,36 +24,35 @@ class InMemoryRunnerAssetReaderWriter extends InMemoryAssetReaderWriter
2424
factory InMemoryRunnerAssetReaderWriter({String? rootPackage}) {
2525
final filesystem = InMemoryFilesystem();
2626
return InMemoryRunnerAssetReaderWriter.using(
27+
assetsRead: {},
2728
rootPackage: rootPackage ?? 'unset',
2829
assetFinder: InMemoryAssetFinder(filesystem, rootPackage),
2930
assetPathProvider: const InMemoryAssetPathProvider(),
3031
filesystem: filesystem,
3132
cache: const PassthroughFilesystemCache(),
32-
inputTracker: InputTracker(),
3333
);
3434
}
3535

3636
InMemoryRunnerAssetReaderWriter.using({
37+
required super.assetsRead,
3738
required super.rootPackage,
3839
required super.assetFinder,
3940
required super.assetPathProvider,
4041
required super.filesystem,
4142
required super.cache,
42-
required super.inputTracker,
4343
}) : super.using();
4444

4545
@override
4646
InMemoryRunnerAssetReaderWriter copyWith({
4747
AssetPathProvider? assetPathProvider,
4848
FilesystemCache? cache,
49-
InputTracker? inputTracker,
5049
}) => InMemoryRunnerAssetReaderWriter.using(
50+
assetsRead: assetsRead,
5151
rootPackage: rootPackage,
5252
assetFinder: assetFinder,
5353
assetPathProvider: assetPathProvider ?? this.assetPathProvider,
5454
filesystem: filesystem,
5555
cache: cache ?? this.cache,
56-
inputTracker: inputTracker ?? this.inputTracker,
5756
);
5857

5958
@override

build/lib/src/builder/build_step.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import 'dart:async';
55
import 'dart:convert';
66

77
import 'package:analyzer/dart/element/element.dart';
8-
import 'package:meta/meta.dart';
98
import 'package:package_config/package_config_types.dart';
109

1110
import '../analyzer/resolver.dart';
@@ -19,7 +18,6 @@ import '../resource/resource.dart';
1918
/// This represents a single [inputId], logic around resolving as a library,
2019
/// and the ability to read and write assets as allowed by the underlying build
2120
/// system.
22-
@sealed
2321
abstract class BuildStep implements AssetReader, AssetWriter {
2422
/// The primary for this build step.
2523
AssetId get inputId;

build/lib/src/generate/run_builder.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
// BSD-style license that can be found in the LICENSE file.
44
import 'dart:isolate';
55

6+
// ignore: implementation_imports
7+
import 'package:build_runner_core/src/generate/build_step_impl.dart';
68
import 'package:logging/logging.dart';
79
import 'package:package_config/package_config.dart';
810

@@ -11,7 +13,6 @@ import '../asset/id.dart';
1113
import '../asset/reader.dart';
1214
import '../asset/writer.dart';
1315
import '../builder/build_step.dart';
14-
import '../builder/build_step_impl.dart';
1516
import '../builder/builder.dart';
1617
import '../builder/logging.dart';
1718
import '../resource/resource.dart';

build/lib/src/state/input_tracker.dart

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,58 @@
55
import 'dart:collection';
66

77
import '../asset/id.dart';
8+
import 'filesystem.dart';
89

9-
/// Records inputs for one generator run.
10+
/// Records inputs for each generator.
1011
class InputTracker {
11-
final assetsRead = HashSet<AssetId>();
12+
/// If set, when an `InputTracker` is instantiated it is stored in
13+
/// `inputTrackers`.
14+
static bool captureInputTrackersForTesting = false;
15+
16+
/// All `InputTracker`s created when `captureInputTrackersForTesting` is set,
17+
/// keyed by filesystem to split by test case.
18+
///
19+
/// TODO(davidmorgan): find a nicer way to do this.
20+
static Map<Filesystem, List<InputTracker>> inputTrackersForTesting =
21+
Map.identity();
22+
23+
final _inputs = HashMap<AssetId, HashSet<AssetId>>();
24+
25+
/// Creates an input tracker.
26+
///
27+
/// [filesystem] is used to distinguish input trackers for testing, because
28+
/// each test case creates a new in-memory filesystem. It's not used
29+
/// otherwise.
30+
InputTracker(Filesystem filesystem) {
31+
if (captureInputTrackersForTesting) {
32+
inputTrackersForTesting.putIfAbsent(filesystem, () => []).add(this);
33+
}
34+
}
35+
36+
HashSet<AssetId> _getInputs(AssetId primaryInput) =>
37+
_inputs.putIfAbsent(primaryInput, HashSet.new);
38+
39+
void add({required AssetId primaryInput, required AssetId input}) {
40+
_getInputs(primaryInput).add(input);
41+
}
42+
43+
void addAll({
44+
required AssetId primaryInput,
45+
required Iterable<AssetId> inputs,
46+
}) {
47+
_getInputs(primaryInput).addAll(inputs);
48+
}
49+
50+
Set<AssetId> inputsOf({required AssetId primaryInput}) =>
51+
_getInputs(primaryInput);
52+
53+
Set<AssetId> allInputs() => _inputs.values.expand((s) => s).toSet();
54+
55+
void clear({required AssetId primaryInput}) {
56+
print('clear $this');
57+
_getInputs(primaryInput).clear();
58+
}
59+
60+
@override
61+
String toString() => _inputs.toString();
1262
}

build/lib/src/state/reader_state.dart

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import 'asset_finder.dart';
77
import 'asset_path_provider.dart';
88
import 'filesystem.dart';
99
import 'filesystem_cache.dart';
10-
import 'input_tracker.dart';
1110

1211
/// Provides access to the state backing an [AssetReader].
1312
extension AssetReaderStateExtension on AssetReader {
@@ -38,26 +37,11 @@ extension AssetReaderStateExtension on AssetReader {
3837
return (this as AssetReaderState).assetFinder;
3938
}
4039

41-
InputTracker? get inputTracker =>
42-
this is AssetReaderState ? (this as AssetReaderState).inputTracker : null;
43-
4440
AssetPathProvider get assetPathProvider {
4541
_requireIsAssetReaderState();
4642
return (this as AssetReaderState).assetPathProvider;
4743
}
4844

49-
/// Gets [inputTracker] or throws a descriptive error if it is `null`.
50-
InputTracker get requireInputTracker {
51-
final result = inputTracker;
52-
if (result == null) {
53-
_requireIsAssetReaderState();
54-
throw StateError(
55-
'`AssetReader` is missing required `inputTracker`: $this',
56-
);
57-
}
58-
return result;
59-
}
60-
6145
/// Throws if `this` is not an [AssetReaderState].
6246
void _requireIsAssetReaderState() {
6347
if (this is! AssetReaderState) {
@@ -91,10 +75,6 @@ abstract interface class AssetReaderState {
9175
/// globbing in arbitrary packages, is hidden from generators.
9276
AssetFinder get assetFinder;
9377

94-
/// The [InputTracker] that this reader records reads to; or `null` if it does
95-
/// not have one.
96-
InputTracker? get inputTracker;
97-
9878
/// The [AssetPathProvider] associated with this reader.
9979
AssetPathProvider get assetPathProvider;
10080
}

build/pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ environment:
1010
dependencies:
1111
analyzer: '>=6.9.0 <8.0.0'
1212
async: ^2.5.0
13+
build_runner_core: ^8.0.1-wip
1314
convert: ^3.0.0
1415
crypto: ^3.0.0
1516
glob: ^2.0.0

build/test/builder/build_step_impl_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import 'dart:convert';
99

1010
import 'package:build/build.dart';
1111
import 'package:build/src/builder/build_step.dart';
12-
import 'package:build/src/builder/build_step_impl.dart';
1312
import 'package:build_resolvers/build_resolvers.dart';
13+
import 'package:build_runner_core/src/generate/build_step_impl.dart';
1414
import 'package:build_test/build_test.dart';
1515
import 'package:package_config/package_config.dart';
1616
import 'package:test/test.dart';

build_resolvers/lib/src/analysis_driver_model.dart

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import 'package:analyzer/dart/ast/ast.dart';
1111
import 'package:analyzer/src/clients/build_resolvers/build_resolvers.dart';
1212
import 'package:build/build.dart';
1313
// ignore: implementation_imports
14-
import 'package:build/src/internal.dart';
14+
import 'package:build_runner_core/src/generate/build_step_impl.dart';
1515

1616
import 'analysis_driver_filesystem.dart';
1717

@@ -97,7 +97,7 @@ class AnalysisDriverModel {
9797
await withDriverResource((driver) async {
9898
return _performResolve(
9999
driver,
100-
buildStep,
100+
buildStep as BuildStepImpl,
101101
entryPoints,
102102
withDriverResource,
103103
transitive: transitive,
@@ -107,7 +107,7 @@ class AnalysisDriverModel {
107107

108108
Future<void> _performResolve(
109109
AnalysisDriverForPackageBuild driver,
110-
BuildStep buildStep,
110+
BuildStepImpl buildStep,
111111
List<AssetId> entryPoints,
112112
Future<void> Function(
113113
FutureOr<void> Function(AnalysisDriverForPackageBuild),
@@ -127,7 +127,10 @@ class AnalysisDriverModel {
127127
}
128128

129129
// Notify [buildStep] of its inputs.
130-
buildStep.requireInputTracker.assetsRead.addAll(inputIds);
130+
buildStep.inputTracker.addAll(
131+
primaryInput: buildStep.inputId,
132+
inputs: inputIds,
133+
);
131134

132135
// Sync changes onto the "URI resolver", the in-memory filesystem.
133136
for (final id in idsToSyncOntoFilesystem) {

build_resolvers/pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ dependencies:
1111
analyzer: '>=6.9.0 <8.0.0'
1212
async: ^2.5.0
1313
build: ^2.4.3-wip
14+
build_runner_core: ^8.0.1-wip
1415
collection: ^1.17.0
1516
convert: ^3.1.1
1617
crypto: ^3.0.0

build_resolvers/test/resolver_test.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ void runTests(ResolversFactory resolversFactory) {
144144
await resolver.libraryFor(entryPoint);
145145
},
146146
assetReaderChecks: (reader) {
147-
expect(reader.testing.assetsRead, {
147+
expect(reader.testing.inputsTracked, {
148148
AssetId('a', 'web/main.dart'),
149149
AssetId('a', 'web/main.dart.transitive_digest'),
150150
AssetId('a', 'web/a.dart'),
@@ -194,7 +194,7 @@ void runTests(ResolversFactory resolversFactory) {
194194
await resolver.libraryFor(entryPoint);
195195
},
196196
assetReaderChecks: (reader) {
197-
expect(reader.testing.assetsRead, {
197+
expect(reader.testing.inputsTracked, {
198198
AssetId('a', 'web/main.dart'),
199199
AssetId('a', 'web/main.dart.transitive_digest'),
200200
AssetId('a', 'web/a.dart'),
@@ -212,7 +212,7 @@ void runTests(ResolversFactory resolversFactory) {
212212
await resolver.libraryFor(entryPoint);
213213
},
214214
assetReaderChecks: (reader) {
215-
expect(reader.testing.assetsRead, {
215+
expect(reader.testing.inputsTracked, {
216216
AssetId('a', 'web/main.dart'),
217217
AssetId('a', 'web/main.dart.transitive_digest'),
218218
AssetId('a', 'web/a.dart'),

0 commit comments

Comments
 (0)