From 40382efb9c7a0774d2764238fc1802e562e9cbaf Mon Sep 17 00:00:00 2001
From: Daco Harkes <dc.harkes@gmail.com>
Date: Wed, 17 Jan 2024 16:08:48 +0100
Subject: [PATCH] [native_assets_builder] Add `AssetRelativePath` back in
 (#941)

---
 pkgs/native_assets_builder/CHANGELOG.md          |  4 ++++
 .../lib/src/model/asset.dart                     | 13 ++++++++++++-
 pkgs/native_assets_builder/pubspec.yaml          |  2 +-
 .../test/model/asset_test.dart                   | 16 +++++++++++++++-
 4 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/pkgs/native_assets_builder/CHANGELOG.md b/pkgs/native_assets_builder/CHANGELOG.md
index 2477fd0d4d..da64bdf9f5 100644
--- a/pkgs/native_assets_builder/CHANGELOG.md
+++ b/pkgs/native_assets_builder/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.3.2
+
+- Reintroduce `AssetRelativePath`, it's used in `dart build`.
+
 ## 0.3.1
 
 - Add support for `runPackageName` to avoid native assets for packages that
diff --git a/pkgs/native_assets_builder/lib/src/model/asset.dart b/pkgs/native_assets_builder/lib/src/model/asset.dart
index 3ef919a443..f98cf7de2b 100644
--- a/pkgs/native_assets_builder/lib/src/model/asset.dart
+++ b/pkgs/native_assets_builder/lib/src/model/asset.dart
@@ -6,7 +6,16 @@ import 'package:native_assets_cli/native_assets_cli_internal.dart';
 
 import '../utils/yaml.dart';
 
-extension on AssetPath {}
+/// Asset at absolute path [uri].
+class AssetRelativePath implements AssetPath {
+  final Uri uri;
+
+  AssetRelativePath(this.uri);
+
+  // Never used in native_assets_cli, but the interface must be implemented.
+  @override
+  Map<String, Object> toYaml() => throw UnimplementedError();
+}
 
 extension AssetIterable on Iterable<Asset> {
   Iterable<Asset> whereLinkMode(LinkMode linkMode) =>
@@ -43,6 +52,8 @@ List<String> _toDartConst(AssetPath path) {
   switch (path) {
     case AssetAbsolutePath _:
       return ['absolute', path.uri.toFilePath()];
+    case AssetRelativePath _:
+      return ['relative', path.uri.toFilePath()];
     case AssetSystemPath _:
       return ['system', path.uri.toFilePath()];
     case AssetInProcess _:
diff --git a/pkgs/native_assets_builder/pubspec.yaml b/pkgs/native_assets_builder/pubspec.yaml
index e785f976d1..feadc61ed0 100644
--- a/pkgs/native_assets_builder/pubspec.yaml
+++ b/pkgs/native_assets_builder/pubspec.yaml
@@ -1,7 +1,7 @@
 name: native_assets_builder
 description: >-
   This package is the backend that invokes top-level `build.dart` scripts.
-version: 0.3.1
+version: 0.3.2
 repository: https://github.com/dart-lang/native/tree/main/pkgs/native_assets_builder
 
 environment:
diff --git a/pkgs/native_assets_builder/test/model/asset_test.dart b/pkgs/native_assets_builder/test/model/asset_test.dart
index 62916cca27..0272a790ac 100644
--- a/pkgs/native_assets_builder/test/model/asset_test.dart
+++ b/pkgs/native_assets_builder/test/model/asset_test.dart
@@ -11,6 +11,7 @@ import 'package:test/test.dart';
 
 void main() {
   final fooUri = Uri.file('path/to/libfoo.so');
+  final foo2Uri = Uri.file('path/to/libfoo2.so');
   final foo3Uri = Uri(path: 'libfoo3.so');
   final barUri = Uri(path: 'path/to/libbar.a');
   final blaUri = Uri(path: 'path/with spaces/bla.dll');
@@ -21,6 +22,12 @@ void main() {
       target: Target.androidX64,
       linkMode: LinkMode.dynamic,
     ),
+    Asset(
+      id: 'foo2',
+      path: AssetRelativePath(foo2Uri),
+      target: Target.androidX64,
+      linkMode: LinkMode.dynamic,
+    ),
     Asset(
       id: 'foo3',
       path: AssetSystemPath(foo3Uri),
@@ -62,6 +69,9 @@ native-assets:
     foo:
       - absolute
       - ${fooUri.toFilePath()}
+    foo2:
+      - relative
+      - ${foo2Uri.toFilePath()}
     foo3:
       - system
       - ${foo3Uri.toFilePath()}
@@ -85,6 +95,10 @@ native-assets:
 
   test('List<Asset> whereLinkMode', () async {
     final assets2 = assets.whereLinkMode(LinkMode.dynamic);
-    expect(assets2.length, 5);
+    expect(assets2.length, 6);
+  });
+
+  test('satisfy coverage', () async {
+    expect(() => assets[1].toYaml(), throwsUnimplementedError);
   });
 }