Skip to content

Commit 0cd2e55

Browse files
authored
[native_assets_builder] Refactor API to ProtocolExtensions (#2089)
This PR introduces a concept of protocol extensions, which package together everything belonging to a protocol extension. Closes: #2088 As a bonus, this better abstraction reduces LOC. The `validation` methods are now all internal to the extensions. The `setup` methods stay exported because they are used extensively in hook-helper-packages (e.g. `native_toolchain_c`).
1 parent 2dba4f5 commit 0cd2e55

33 files changed

+293
-357
lines changed

pkgs/native_assets_builder/lib/native_assets_builder.dart

Lines changed: 1 addition & 9 deletions
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

Lines changed: 48 additions & 51 deletions
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,14 @@ 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
81+
///
82+
/// The base protocol can be extended with [extensions]. See
83+
/// [ProtocolExtension] for more documentation.
10784
Future<BuildResult?> build({
108-
required BuildInputCreator inputCreator,
109-
required BuildInputValidator inputValidator,
110-
required BuildValidator buildValidator,
111-
required ApplicationAssetValidator applicationAssetValidator,
112-
required List<String> buildAssetTypes,
85+
required List<ProtocolExtension> extensions,
11386
required bool linkingEnabled,
11487
}) async {
11588
final (buildPlan, packageGraph) = await _makePlan(
@@ -132,11 +105,15 @@ class NativeAssetsBuildRunner {
132105
targetMetadata: globalMetadata,
133106
)?.forEach((key, value) => metadata[key] = value);
134107

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

141118
final (buildDirUri, outDirUri, outDirSharedUri) = await _setupDirectories(
142119
Hook.build,
@@ -155,7 +132,7 @@ class NativeAssetsBuildRunner {
155132
final input = BuildInput(inputBuilder.json);
156133
final errors = [
157134
...await validateBuildInput(input),
158-
...await inputValidator(input),
135+
for (final e in extensions) ...await e.validateBuildInput(input),
159136
];
160137
if (errors.isNotEmpty) {
161138
return _printErrors(
@@ -167,8 +144,13 @@ class NativeAssetsBuildRunner {
167144
final result = await _runHookForPackageCached(
168145
Hook.build,
169146
input,
170-
(input, output) =>
171-
buildValidator(input as BuildInput, output as BuildOutput),
147+
(input, output) async => [
148+
for (final e in extensions)
149+
...await e.validateBuildOutput(
150+
input as BuildInput,
151+
output as BuildOutput,
152+
),
153+
],
172154
null,
173155
);
174156
if (result == null) return null;
@@ -182,7 +164,10 @@ class NativeAssetsBuildRunner {
182164
// in the link step if linking is enableD).
183165
if (linkingEnabled) return hookResult;
184166

185-
final errors = await applicationAssetValidator(hookResult.encodedAssets);
167+
final errors = [
168+
for (final e in extensions)
169+
...await e.validateApplicationAssets(hookResult.encodedAssets),
170+
];
186171
if (errors.isEmpty) return hookResult;
187172

188173
_printErrors('Application asset verification failed', errors);
@@ -195,13 +180,12 @@ class NativeAssetsBuildRunner {
195180
/// The native assets build runner does not support reentrancy for identical
196181
/// [BuildInput] and [LinkInput]! For more info see:
197182
/// https://github.com/dart-lang/native/issues/1319
183+
///
184+
/// The base protocol can be extended with [extensions]. See
185+
/// [ProtocolExtension] for more documentation.
198186
Future<LinkResult?> link({
199-
required LinkInputCreator inputCreator,
200-
required LinkInputValidator inputValidator,
201-
required LinkValidator linkValidator,
202-
required ApplicationAssetValidator applicationAssetValidator,
187+
required List<ProtocolExtension> extensions,
203188
Uri? resourceIdentifiers,
204-
required List<String> buildAssetTypes,
205189
required BuildResult buildResult,
206190
}) async {
207191
final (buildPlan, packageGraph) = await _makePlan(
@@ -212,8 +196,13 @@ class NativeAssetsBuildRunner {
212196

213197
var hookResult = HookResult(encodedAssets: buildResult.encodedAssets);
214198
for (final package in buildPlan) {
215-
final inputBuilder =
216-
inputCreator()..config.setupShared(buildAssetTypes: buildAssetTypes);
199+
final inputBuilder = LinkInputBuilder();
200+
inputBuilder.config.setupShared(
201+
buildAssetTypes: [for (final e in extensions) ...e.buildAssetTypes],
202+
);
203+
for (final e in extensions) {
204+
e.setupLinkInput(inputBuilder);
205+
}
217206

218207
final (buildDirUri, outDirUri, outDirSharedUri) = await _setupDirectories(
219208
Hook.link,
@@ -243,7 +232,7 @@ class NativeAssetsBuildRunner {
243232
final input = LinkInput(inputBuilder.json);
244233
final errors = [
245234
...await validateLinkInput(input),
246-
...await inputValidator(input),
235+
for (final e in extensions) ...await e.validateLinkInput(input),
247236
];
248237
if (errors.isNotEmpty) {
249238
print(input.assets.encodedAssets);
@@ -256,16 +245,24 @@ class NativeAssetsBuildRunner {
256245
final result = await _runHookForPackageCached(
257246
Hook.link,
258247
input,
259-
(input, output) =>
260-
linkValidator(input as LinkInput, output as LinkOutput),
248+
(input, output) async => [
249+
for (final e in extensions)
250+
...await e.validateLinkOutput(
251+
input as LinkInput,
252+
output as LinkOutput,
253+
),
254+
],
261255
resourceIdentifiers,
262256
);
263257
if (result == null) return null;
264258
final (hookOutput, hookDeps) = result;
265259
hookResult = hookResult.copyAdd(hookOutput, hookDeps);
266260
}
267261

268-
final errors = await applicationAssetValidator(hookResult.encodedAssets);
262+
final errors = [
263+
for (final e in extensions)
264+
...await e.validateApplicationAssets(hookResult.encodedAssets),
265+
];
269266
if (errors.isEmpty) return hookResult;
270267

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

pkgs/native_assets_builder/test/build_runner/build_dependencies_test.dart

Lines changed: 0 additions & 3 deletions
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

Lines changed: 0 additions & 6 deletions
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

Lines changed: 0 additions & 3 deletions
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

Lines changed: 0 additions & 24 deletions
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

Lines changed: 0 additions & 3 deletions
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

Lines changed: 0 additions & 12 deletions
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

Lines changed: 0 additions & 6 deletions
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)