From 694ab242aa98f60d04d4dedb8d97482ae54578c7 Mon Sep 17 00:00:00 2001 From: Daco Harkes Date: Tue, 25 Mar 2025 08:52:30 +0100 Subject: [PATCH] [native_assets_cli] Prevent `EncodedAsset` and `Metadata` hashcode changing --- pkgs/native_assets_cli/lib/src/config.dart | 2 +- .../lib/src/encoded_asset.dart | 24 +++++++++++++------ pkgs/native_assets_cli/lib/src/metadata.dart | 14 ++++++----- .../test/build_input_test.dart | 4 ++-- .../test/model/metadata_test.dart | 2 +- 5 files changed, 29 insertions(+), 17 deletions(-) diff --git a/pkgs/native_assets_cli/lib/src/config.dart b/pkgs/native_assets_cli/lib/src/config.dart index 15f11a9af5..497692e1fb 100644 --- a/pkgs/native_assets_cli/lib/src/config.dart +++ b/pkgs/native_assets_cli/lib/src/config.dart @@ -151,7 +151,7 @@ String _jsonChecksum(Map json) { final class BuildInput extends HookInput { Map get metadata => { for (final entry in (_syntaxBuildInput.dependencyMetadata ?? {}).entries) - entry.key: Metadata.fromJson(entry.value), + entry.key: Metadata(entry.value), }; @override diff --git a/pkgs/native_assets_cli/lib/src/encoded_asset.dart b/pkgs/native_assets_cli/lib/src/encoded_asset.dart index 39cf5d1650..1b555998ad 100644 --- a/pkgs/native_assets_cli/lib/src/encoded_asset.dart +++ b/pkgs/native_assets_cli/lib/src/encoded_asset.dart @@ -13,14 +13,21 @@ final class EncodedAsset { final String type; /// The json encoding of the asset. - final Map encoding; + final UnmodifiableMapView encoding; /// The path of this object in a larger JSON. /// /// If provided, used for more precise error messages. final List? jsonPath; - EncodedAsset(this.type, this.encoding, {this.jsonPath}); + EncodedAsset._(this.type, this.encoding, {this.jsonPath}); + + EncodedAsset(this.type, Map encoding, {this.jsonPath}) + : encoding = UnmodifiableMapView( + // It would be better if `encoding` would be deep copied. + // https://github.com/dart-lang/native/issues/2045 + Map.of(encoding), + ); /// Decode an [EncodedAsset] from json. factory EncodedAsset.fromJson( @@ -28,10 +35,14 @@ final class EncodedAsset { List? path, ]) { final syntax_ = syntax.Asset.fromJson(json); - return EncodedAsset(syntax_.type, { - for (final key in json.keys) - if (key != _typeKey) key: json[key], - }, jsonPath: path); + return EncodedAsset._( + syntax_.type, + UnmodifiableMapView({ + for (final key in json.keys) + if (key != _typeKey) key: json[key], + }), + jsonPath: path, + ); } /// Encode this [EncodedAsset] tojson. @@ -42,7 +53,6 @@ final class EncodedAsset { @override String toString() => 'EncodedAsset($type, $encoding)'; - // TODO(https://github.com/dart-lang/native/issues/2045): Fix this. @override int get hashCode => Object.hash(type, const DeepCollectionEquality().hash); diff --git a/pkgs/native_assets_cli/lib/src/metadata.dart b/pkgs/native_assets_cli/lib/src/metadata.dart index c3bd3c56a3..19255ead3f 100644 --- a/pkgs/native_assets_cli/lib/src/metadata.dart +++ b/pkgs/native_assets_cli/lib/src/metadata.dart @@ -5,12 +5,14 @@ import 'package:collection/collection.dart'; class Metadata { - final Map metadata; - - const Metadata(this.metadata); - - factory Metadata.fromJson(Map? jsonMap) => - Metadata(jsonMap ?? {}); + final UnmodifiableMapView metadata; + + Metadata(Map metadata) + : metadata = UnmodifiableMapView( + // It would be better if `jsonMap` would be deep copied. + // https://github.com/dart-lang/native/issues/2045 + Map.of(metadata), + ); Map toJson() => metadata; diff --git a/pkgs/native_assets_cli/test/build_input_test.dart b/pkgs/native_assets_cli/test/build_input_test.dart index e2a3c90475..9017b6c3f7 100644 --- a/pkgs/native_assets_cli/test/build_input_test.dart +++ b/pkgs/native_assets_cli/test/build_input_test.dart @@ -30,11 +30,11 @@ void main() async { packageName = 'my_package'; packageRootUri = tempUri.resolve('$packageName/'); metadata = { - 'bar': const Metadata({ + 'bar': Metadata({ 'key': 'value', 'foo': ['asdf', 'fdsa'], }), - 'foo': const Metadata({'key': 321}), + 'foo': Metadata({'key': 321}), }; inputJson = { diff --git a/pkgs/native_assets_cli/test/model/metadata_test.dart b/pkgs/native_assets_cli/test/model/metadata_test.dart index 110efe758a..199dcdbf10 100644 --- a/pkgs/native_assets_cli/test/model/metadata_test.dart +++ b/pkgs/native_assets_cli/test/model/metadata_test.dart @@ -6,7 +6,7 @@ import 'package:native_assets_cli/native_assets_cli.dart'; import 'package:test/test.dart'; void main() { - const metadata = Metadata({ + final metadata = Metadata({ 'key': 'value', 'my_list': [1, 2, 3], 'my_map': {3: 4, 'foo': 'bar'},