Skip to content

Commit 69ba471

Browse files
committed
[native_assets_builder] Refactor API to ProtocolExtensions
1 parent 2dba4f5 commit 69ba471

33 files changed

+283
-357
lines changed

pkgs/native_assets_builder/lib/native_assets_builder.dart

+1-9
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,7 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
export 'package:native_assets_builder/src/build_runner/build_runner.dart'
6-
show
7-
ApplicationAssetValidator,
8-
BuildInputCreator,
9-
BuildInputValidator,
10-
BuildValidator,
11-
LinkInputCreator,
12-
LinkInputValidator,
13-
LinkValidator,
14-
NativeAssetsBuildRunner;
6+
show BuildInputCreator, LinkInputCreator, NativeAssetsBuildRunner;
157
export 'package:native_assets_builder/src/model/build_result.dart'
168
show BuildResult;
179
export 'package:native_assets_builder/src/model/kernel_assets.dart';

pkgs/native_assets_builder/lib/src/build_runner/build_runner.dart

+42-51
Original file line numberDiff line numberDiff line change
@@ -33,29 +33,6 @@ typedef LinkInputCreator = LinkInputBuilder Function();
3333
typedef _HookValidator =
3434
Future<ValidationErrors> Function(HookInput input, HookOutput output);
3535

36-
// A callback that validates the invariants of the [BuildInput].
37-
typedef BuildInputValidator =
38-
Future<ValidationErrors> Function(BuildInput input);
39-
40-
// A callback that validates the invariants of the [LinkInput].
41-
typedef LinkInputValidator = Future<ValidationErrors> Function(LinkInput input);
42-
43-
// A callback that validates the output of a `hook/link.dart` invocation is
44-
// valid (it may valid asset-type specific information).
45-
typedef BuildValidator =
46-
Future<ValidationErrors> Function(BuildInput input, BuildOutput outup);
47-
48-
// A callback that validates the output of a `hook/link.dart` invocation is
49-
// valid (it may valid asset-type specific information).
50-
typedef LinkValidator =
51-
Future<ValidationErrors> Function(LinkInput input, LinkOutput output);
52-
53-
// A callback that validates assets emitted across all packages are valid / can
54-
// be used together (it may valid asset-type specific information - e.g. that
55-
// there are no classes in shared library filenames).
56-
typedef ApplicationAssetValidator =
57-
Future<ValidationErrors> Function(List<EncodedAsset> assets);
58-
5936
/// The programmatic API to be used by Dart launchers to invoke native builds.
6037
///
6138
/// These methods are invoked by launchers such as dartdev (for `dart run`)
@@ -98,18 +75,11 @@ class NativeAssetsBuildRunner {
9875
/// This method is invoked by launchers such as dartdev (for `dart run`) and
9976
/// flutter_tools (for `flutter run` and `flutter build`).
10077
///
101-
/// The given [applicationAssetValidator] is only used if the build is
102-
/// performed without linking (i.e. [linkingEnabled] is `false`).
103-
///
10478
/// The native assets build runner does not support reentrancy for identical
10579
/// [BuildInput] and [LinkInput]! For more info see:
10680
/// https://github.com/dart-lang/native/issues/1319
10781
Future<BuildResult?> build({
108-
required BuildInputCreator inputCreator,
109-
required BuildInputValidator inputValidator,
110-
required BuildValidator buildValidator,
111-
required ApplicationAssetValidator applicationAssetValidator,
112-
required List<String> buildAssetTypes,
82+
required List<ProtocolExtension> extensions,
11383
required bool linkingEnabled,
11484
}) async {
11585
final (buildPlan, packageGraph) = await _makePlan(
@@ -132,11 +102,15 @@ class NativeAssetsBuildRunner {
132102
targetMetadata: globalMetadata,
133103
)?.forEach((key, value) => metadata[key] = value);
134104

135-
final inputBuilder =
136-
inputCreator()
137-
..config.setupShared(buildAssetTypes: buildAssetTypes)
138-
..config.setupBuild(linkingEnabled: linkingEnabled)
139-
..setupBuildInput(metadata: metadata);
105+
final inputBuilder = BuildInputBuilder();
106+
inputBuilder.config.setupShared(
107+
buildAssetTypes: [for (final e in extensions) ...e.buildAssetTypes],
108+
);
109+
for (final e in extensions) {
110+
e.setupBuildInput(inputBuilder);
111+
}
112+
inputBuilder.config.setupBuild(linkingEnabled: linkingEnabled);
113+
inputBuilder.setupBuildInput(metadata: metadata);
140114

141115
final (buildDirUri, outDirUri, outDirSharedUri) = await _setupDirectories(
142116
Hook.build,
@@ -155,7 +129,7 @@ class NativeAssetsBuildRunner {
155129
final input = BuildInput(inputBuilder.json);
156130
final errors = [
157131
...await validateBuildInput(input),
158-
...await inputValidator(input),
132+
for (final e in extensions) ...await e.validateBuildInput(input),
159133
];
160134
if (errors.isNotEmpty) {
161135
return _printErrors(
@@ -167,8 +141,13 @@ class NativeAssetsBuildRunner {
167141
final result = await _runHookForPackageCached(
168142
Hook.build,
169143
input,
170-
(input, output) =>
171-
buildValidator(input as BuildInput, output as BuildOutput),
144+
(input, output) async => [
145+
for (final e in extensions)
146+
...await e.validateBuildOutput(
147+
input as BuildInput,
148+
output as BuildOutput,
149+
),
150+
],
172151
null,
173152
);
174153
if (result == null) return null;
@@ -182,7 +161,10 @@ class NativeAssetsBuildRunner {
182161
// in the link step if linking is enableD).
183162
if (linkingEnabled) return hookResult;
184163

185-
final errors = await applicationAssetValidator(hookResult.encodedAssets);
164+
final errors = [
165+
for (final e in extensions)
166+
...await e.validateApplicationAssets(hookResult.encodedAssets),
167+
];
186168
if (errors.isEmpty) return hookResult;
187169

188170
_printErrors('Application asset verification failed', errors);
@@ -196,12 +178,8 @@ class NativeAssetsBuildRunner {
196178
/// [BuildInput] and [LinkInput]! For more info see:
197179
/// https://github.com/dart-lang/native/issues/1319
198180
Future<LinkResult?> link({
199-
required LinkInputCreator inputCreator,
200-
required LinkInputValidator inputValidator,
201-
required LinkValidator linkValidator,
202-
required ApplicationAssetValidator applicationAssetValidator,
181+
required List<ProtocolExtension> extensions,
203182
Uri? resourceIdentifiers,
204-
required List<String> buildAssetTypes,
205183
required BuildResult buildResult,
206184
}) async {
207185
final (buildPlan, packageGraph) = await _makePlan(
@@ -212,8 +190,13 @@ class NativeAssetsBuildRunner {
212190

213191
var hookResult = HookResult(encodedAssets: buildResult.encodedAssets);
214192
for (final package in buildPlan) {
215-
final inputBuilder =
216-
inputCreator()..config.setupShared(buildAssetTypes: buildAssetTypes);
193+
final inputBuilder = LinkInputBuilder();
194+
inputBuilder.config.setupShared(
195+
buildAssetTypes: [for (final e in extensions) ...e.buildAssetTypes],
196+
);
197+
for (final e in extensions) {
198+
e.setupLinkInput(inputBuilder);
199+
}
217200

218201
final (buildDirUri, outDirUri, outDirSharedUri) = await _setupDirectories(
219202
Hook.link,
@@ -243,7 +226,7 @@ class NativeAssetsBuildRunner {
243226
final input = LinkInput(inputBuilder.json);
244227
final errors = [
245228
...await validateLinkInput(input),
246-
...await inputValidator(input),
229+
for (final e in extensions) ...await e.validateLinkInput(input),
247230
];
248231
if (errors.isNotEmpty) {
249232
print(input.assets.encodedAssets);
@@ -256,16 +239,24 @@ class NativeAssetsBuildRunner {
256239
final result = await _runHookForPackageCached(
257240
Hook.link,
258241
input,
259-
(input, output) =>
260-
linkValidator(input as LinkInput, output as LinkOutput),
242+
(input, output) async => [
243+
for (final e in extensions)
244+
...await e.validateLinkOutput(
245+
input as LinkInput,
246+
output as LinkOutput,
247+
),
248+
],
261249
resourceIdentifiers,
262250
);
263251
if (result == null) return null;
264252
final (hookOutput, hookDeps) = result;
265253
hookResult = hookResult.copyAdd(hookOutput, hookDeps);
266254
}
267255

268-
final errors = await applicationAssetValidator(hookResult.encodedAssets);
256+
final errors = [
257+
for (final e in extensions)
258+
...await e.validateApplicationAssets(hookResult.encodedAssets),
259+
];
269260
if (errors.isEmpty) return hookResult;
270261

271262
_printErrors('Application asset verification failed', errors);

pkgs/native_assets_builder/test/build_runner/build_dependencies_test.dart

-3
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,6 @@ void main() async {
3030
dartExecutable,
3131
capturedLogs: logMessages,
3232
buildAssetTypes: [CodeAsset.type],
33-
inputValidator: validateCodeAssetBuildInput,
34-
buildValidator: validateCodeAssetBuildOutput,
35-
applicationAssetValidator: validateCodeAssetInApplication,
3633
))!;
3734
expect(
3835
logMessages.join('\n'),

pkgs/native_assets_builder/test/build_runner/build_runner_asset_id_test.dart

-6
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,6 @@ void main() async {
2525
createCapturingLogger(logMessages, level: Level.SEVERE),
2626
dartExecutable,
2727
buildAssetTypes: [CodeAsset.type],
28-
inputValidator: validateCodeAssetBuildInput,
29-
buildValidator: validateCodeAssetBuildOutput,
30-
applicationAssetValidator: validateCodeAssetInApplication,
3128
);
3229
final fullLog = logMessages.join('\n');
3330
expect(result, isNull);
@@ -56,9 +53,6 @@ void main() async {
5653
logger,
5754
dartExecutable,
5855
buildAssetTypes: [CodeAsset.type],
59-
inputValidator: validateCodeAssetBuildInput,
60-
buildValidator: validateCodeAssetBuildOutput,
61-
applicationAssetValidator: validateCodeAssetInApplication,
6256
);
6357
expect(result, isNotNull);
6458
}

pkgs/native_assets_builder/test/build_runner/build_runner_build_output_format_test.dart

-3
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,6 @@ void main() async {
3131
createCapturingLogger(logMessages, level: Level.SEVERE),
3232
dartExecutable,
3333
buildAssetTypes: [],
34-
inputValidator: (input) async => [],
35-
buildValidator: (input, output) async => [],
36-
applicationAssetValidator: validateCodeAssetInApplication,
3734
);
3835
final fullLog = logMessages.join('\n');
3936
expect(result, isNull);

pkgs/native_assets_builder/test/build_runner/build_runner_caching_test.dart

-24
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,6 @@ void main() async {
3030
dartExecutable,
3131
capturedLogs: logMessages,
3232
buildAssetTypes: [CodeAsset.type],
33-
inputValidator: validateCodeAssetBuildInput,
34-
buildValidator: validateCodeAssetBuildOutput,
35-
applicationAssetValidator: validateCodeAssetInApplication,
3633
))!;
3734
expect(
3835
logMessages.join('\n'),
@@ -56,9 +53,6 @@ void main() async {
5653
dartExecutable,
5754
capturedLogs: logMessages,
5855
buildAssetTypes: [CodeAsset.type],
59-
inputValidator: validateCodeAssetBuildInput,
60-
buildValidator: validateCodeAssetBuildOutput,
61-
applicationAssetValidator: validateCodeAssetInApplication,
6256
))!;
6357
final hookUri = packageUri.resolve('hook/build.dart');
6458
expect(
@@ -104,9 +98,6 @@ void main() async {
10498
logger,
10599
dartExecutable,
106100
buildAssetTypes: [CodeAsset.type],
107-
inputValidator: validateCodeAssetBuildInput,
108-
buildValidator: validateCodeAssetBuildOutput,
109-
applicationAssetValidator: validateCodeAssetInApplication,
110101
))!;
111102
await expectSymbols(
112103
asset: CodeAsset.fromEncoded(result.encodedAssets.single),
@@ -127,9 +118,6 @@ void main() async {
127118
logger,
128119
dartExecutable,
129120
buildAssetTypes: [CodeAsset.type],
130-
inputValidator: validateCodeAssetBuildInput,
131-
buildValidator: validateCodeAssetBuildOutput,
132-
applicationAssetValidator: validateCodeAssetInApplication,
133121
))!;
134122

135123
final cUri = packageUri.resolve('src/').resolve('native_add.c');
@@ -166,9 +154,6 @@ void main() async {
166154
logger,
167155
dartExecutable,
168156
buildAssetTypes: [CodeAsset.type],
169-
inputValidator: validateCodeAssetBuildInput,
170-
buildValidator: validateCodeAssetBuildOutput,
171-
applicationAssetValidator: validateCodeAssetInApplication,
172157
))!;
173158
{
174159
final compiledHook =
@@ -199,9 +184,6 @@ void main() async {
199184
logger,
200185
dartExecutable,
201186
buildAssetTypes: [CodeAsset.type],
202-
inputValidator: validateCodeAssetBuildInput,
203-
buildValidator: validateCodeAssetBuildOutput,
204-
applicationAssetValidator: validateCodeAssetInApplication,
205187
))!;
206188

207189
final hookUri = packageUri.resolve('hook/build.dart');
@@ -237,9 +219,6 @@ void main() async {
237219
logger,
238220
dartExecutable,
239221
buildAssetTypes: [CodeAsset.type],
240-
inputValidator: validateCodeAssetBuildInput,
241-
buildValidator: validateCodeAssetBuildOutput,
242-
applicationAssetValidator: validateCodeAssetInApplication,
243222
hookEnvironment:
244223
modifiedEnvKey == 'PATH'
245224
? null
@@ -272,9 +251,6 @@ void main() async {
272251
logger,
273252
dartExecutable,
274253
buildAssetTypes: [CodeAsset.type],
275-
inputValidator: validateCodeAssetBuildInput,
276-
buildValidator: validateCodeAssetBuildOutput,
277-
applicationAssetValidator: validateCodeAssetInApplication,
278254
))!;
279255
expect(logMessages.join('\n'), contains('hook.dill'));
280256
expect(

pkgs/native_assets_builder/test/build_runner/build_runner_cycle_test.dart

-3
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,6 @@ void main() async {
2525
createCapturingLogger(logMessages, level: Level.SEVERE),
2626
dartExecutable,
2727
buildAssetTypes: [],
28-
inputValidator: (input) async => [],
29-
buildValidator: (input, output) async => [],
30-
applicationAssetValidator: (_) async => [],
3128
);
3229
final fullLog = logMessages.join('\n');
3330
expect(result, isNull);

pkgs/native_assets_builder/test/build_runner/build_runner_failure_test.dart

-12
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,6 @@ void main() async {
2727
logger,
2828
dartExecutable,
2929
buildAssetTypes: [CodeAsset.type],
30-
inputValidator: validateCodeAssetBuildInput,
31-
buildValidator: validateCodeAssetBuildOutput,
32-
applicationAssetValidator: validateCodeAssetInApplication,
3330
))!;
3431
expect(result.encodedAssets.length, 1);
3532
await expectSymbols(
@@ -54,9 +51,6 @@ void main() async {
5451
createCapturingLogger(logMessages, level: Level.SEVERE),
5552
dartExecutable,
5653
buildAssetTypes: [CodeAsset.type],
57-
inputValidator: validateCodeAssetBuildInput,
58-
buildValidator: validateCodeAssetBuildOutput,
59-
applicationAssetValidator: validateCodeAssetInApplication,
6054
);
6155
final fullLog = logMessages.join('\n');
6256
expect(result, isNull);
@@ -87,9 +81,6 @@ void main() async {
8781
logger,
8882
dartExecutable,
8983
buildAssetTypes: [CodeAsset.type],
90-
inputValidator: validateCodeAssetBuildInput,
91-
buildValidator: validateCodeAssetBuildOutput,
92-
applicationAssetValidator: validateCodeAssetInApplication,
9384
))!;
9485
expect(result.encodedAssets.length, 1);
9586
await expectSymbols(
@@ -121,9 +112,6 @@ void main() async {
121112
capturedLogs: logMessages,
122113
dartExecutable,
123114
buildAssetTypes: [CodeAsset.type],
124-
inputValidator: validateCodeAssetBuildInput,
125-
buildValidator: validateCodeAssetBuildOutput,
126-
applicationAssetValidator: validateCodeAssetInApplication,
127115
);
128116
Matcher stringContainsBuildHookCompilation(String packageName) =>
129117
stringContainsInOrder([

pkgs/native_assets_builder/test/build_runner/build_runner_non_root_package_test.dart

-6
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,6 @@ void main() async {
2929
capturedLogs: logMessages,
3030
runPackageName: 'some_dev_dep',
3131
buildAssetTypes: [CodeAsset.type],
32-
inputValidator: validateDataAssetBuildInput,
33-
buildValidator: validateCodeAssetBuildOutput,
34-
applicationAssetValidator: validateCodeAssetInApplication,
3532
))!;
3633
expect(result.encodedAssets, isEmpty);
3734
expect(result.dependencies, isEmpty);
@@ -47,9 +44,6 @@ void main() async {
4744
capturedLogs: logMessages,
4845
runPackageName: 'native_add',
4946
buildAssetTypes: [CodeAsset.type],
50-
inputValidator: validateDataAssetBuildInput,
51-
buildValidator: validateCodeAssetBuildOutput,
52-
applicationAssetValidator: validateCodeAssetInApplication,
5347
))!;
5448
expect(result.encodedAssets, isNotEmpty);
5549
expect(

0 commit comments

Comments
 (0)