Skip to content

[native_assets_cli] Namespace asset types #2142

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 28, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 40 additions & 17 deletions pkgs/code_assets/doc/schema/shared/shared_definitions.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,32 +40,55 @@
{
"const": "native_code"
},
{
"const": "code_assets/code"
},
{
"type": "string"
}
]
}
},
"if": {
"properties": {
"type": {
"const": "native_code"
}
}
},
"then": {
"properties": {
"encoding": {
"$ref": "#/definitions/NativeCodeAssetEncoding"
"allOf": [
{
"if": {
"properties": {
"type": {
"const": "native_code"
}
}
},
"then": {
"properties": {
"encoding": {
"$ref": "#/definitions/NativeCodeAssetEncoding"
}
},
"allOf": [
{
"$comment": "Also include the fields parent object for backwards compatibility.",
"$ref": "#/definitions/NativeCodeAssetEncoding"
}
]
}
},
"allOf": [
{
"$comment": "Also include the fields parent object for backwards compatibility.",
"$ref": "#/definitions/NativeCodeAssetEncoding"
{
"if": {
"properties": {
"type": {
"const": "code_assets/code"
}
}
},
"then": {
"properties": {
"encoding": {
"$ref": "#/definitions/NativeCodeAssetEncoding"
}
}
}
]
}
}
]
},
"CCompilerConfig": {
"type": "object",
Expand Down
12 changes: 12 additions & 0 deletions pkgs/code_assets/test/data/link_input_macos.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,18 @@
},
"os": "macos",
"type": "native_code"
},
{
"encoding": {
"architecture": "arm64",
"file": "/private/var/folders/2y/mngq9h194yzglt4kzttzfq6800klzg/T/iv6i0d/native_add/.dart_tool/native_assets_builder/native_add/c6b312c90c95d2d98ffb6760a738fb36/out/libnative_add.a",
"id": "package:native_add/src/native_add_bindings_generated.dart",
"link_mode": {
"type": "static"
},
"os": "macos"
},
"type": "code_assets/code"
}
],
"config": {
Expand Down
4 changes: 3 additions & 1 deletion pkgs/code_assets/test/schema/schema_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -113,9 +113,11 @@ FieldsFunction _codeFields(AllTestData allTestData) {
expectRequiredFieldMissing,
),
if (hook == Hook.link) ...[
for (final (field, expect) in codeAssetFields)
for (final (field, expect) in codeAssetFields) ...[
for (final encoding in _encoding)
(['assets', 0, ...encoding, ...field], expect),
(['assets', 1, 'encoding', ...field], expect),
],
],
],
if (inputOrOutput == InputOrOutput.output) ...[
Expand Down
55 changes: 39 additions & 16 deletions pkgs/data_assets/doc/schema/shared/shared_definitions.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,31 +11,54 @@
{
"const": "data"
},
{
"const": "data_assets/data"
},
{
"type": "string"
}
]
}
},
"if": {
"properties": {
"type": {
"const": "data"
}
}
},
"then": {
"properties": {
"encoding": {
"$ref": "#/definitions/DataAssetEncoding"
"allOf": [
{
"if": {
"properties": {
"type": {
"const": "data"
}
}
},
"then": {
"properties": {
"encoding": {
"$ref": "#/definitions/DataAssetEncoding"
}
},
"allOf": [
{
"$ref": "#/definitions/DataAssetEncoding"
}
]
}
},
"allOf": [
{
"$ref": "#/definitions/DataAssetEncoding"
{
"if": {
"properties": {
"type": {
"const": "data_assets/data"
}
}
},
"then": {
"properties": {
"encoding": {
"$ref": "#/definitions/DataAssetEncoding"
}
}
}
]
}
}
]
},
"DataAssetEncoding": {
"type": "object",
Expand Down
5 changes: 1 addition & 4 deletions pkgs/data_assets/test/data/link_input.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,7 @@
"name": "assets/data_1.json",
"package": "simple_link"
},
"file": "/private/var/folders/2y/mngq9h194yzglt4kzttzfq6800klzg/T/0s5bKi/simple_link/assets/data_1.json",
"name": "assets/data_1.json",
"package": "simple_link",
"type": "data"
"type": "data_assets/data"
}
],
"config": {
Expand Down
4 changes: 3 additions & 1 deletion pkgs/data_assets/test/schema/schema_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,11 @@ List<(List<Object>, void Function(ValidationResults result))> _dataFields({
}) => <(List<Object>, void Function(ValidationResults result))>[
if (inputOrOutput == InputOrOutput.input) ...[
if (hook == Hook.link) ...[
for (final field in _dataAssetFields)
for (final field in _dataAssetFields) ...[
for (final encoding in _encoding)
(['assets', 0, ...encoding, field], expectRequiredFieldMissing),
(['assets', 1, 'encoding', field], expectRequiredFieldMissing),
],
],
],
if (inputOrOutput == InputOrOutput.output) ...[
Expand Down
4 changes: 3 additions & 1 deletion pkgs/hooks/tool/generate_syntax.dart
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,16 @@ void main(List<String> args) {
final analyzedSchema =
SchemaAnalyzer(
schema,
capitalizationOverrides: {
nameOverrides: {
'ios': 'iOS',
'Ios': 'IOS',
'macos': 'macOS',
'Macos': 'MacOS',
'prefer-dynamic': 'preferDynamicOld',
'prefer-static': 'preferStaticOld',
'assetsForLinking': 'assetsForLinkingOld',
'CodeAssetsCodeAsset': 'NativeCodeAssetNew',
'DataAssetsDataAsset': 'DataAssetNew',
},
publicSetters: [
'BuildOutput',
Expand Down
18 changes: 11 additions & 7 deletions pkgs/json_syntax_generator/lib/src/parser/schema_analyzer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,19 @@ import '../model/schema_info.dart';
/// * Naming according to "effective Dart". This class expects a JSON schema
/// with snake-cased keys and produces [SchemaInfo] with camel-cased Dart
/// names and types.
/// * Renaming with [capitalizationOverrides].
/// * Renaming with [nameOverrides].
/// * Whether setters are public or not with [publicSetters].
/// * Output sorting alphabetically or with [classSorting].
class SchemaAnalyzer {
final JsonSchema schema;

/// Overriding configuration for capitalization of camel cased strings.
final Map<String, String> capitalizationOverrides;
/// Overriding for names.
///
/// Useful for
/// * capitalization overrides (`macos` -> `macOS`),
/// * naming conflicts (to prevent `myName` and `my_name` clasing), and
/// * renames as preferred.
final Map<String, String> nameOverrides;

/// Optional custom ordering for the output classes.
///
Expand Down Expand Up @@ -63,7 +68,7 @@ class SchemaAnalyzer {

SchemaAnalyzer(
this.schema, {
this.capitalizationOverrides = const {},
this.nameOverrides = const {},
this.classSorting,
this.publicSetters = const [],
this.visbleUnionTagValues = const [],
Expand Down Expand Up @@ -413,10 +418,9 @@ class SchemaAnalyzer {
return '';
}

final parts = string.split('_');
final parts = string.replaceAll('/', '_').split('_');

String remapCapitalization(String input) =>
capitalizationOverrides[input] ?? input;
String remapCapitalization(String input) => nameOverrides[input] ?? input;

var result = StringBuffer();
result += remapCapitalization(parts[0]);
Expand Down
20 changes: 14 additions & 6 deletions pkgs/native_assets_cli/lib/src/code_assets/code_asset.dart
Original file line number Diff line number Diff line change
Expand Up @@ -163,19 +163,27 @@ final class CodeAsset {
linkMode: linkMode.toSyntax(),
os: _os?.toSyntax(),
);
return EncodedAsset(CodeAssetType.type, encoding.json);
return EncodedAsset(CodeAssetType.typeForAsset, encoding.json);
}
}

extension CodeAssetType on CodeAsset {
// TODO(https://github.com/dart-lang/native/issues/2132): Change to be
// namespaced by package name. (We'll temporarily need to support both the
// old a new type.)
static const String type = syntax.NativeCodeAsset.typeValue;
/// Recognize both new and old type.
///
/// And add both types to builtAssetTypes.
static const typesForBuildAssetTypes = [
syntax.NativeCodeAssetNew.typeValue,
syntax.NativeCodeAsset.typeValue,
];

/// Write the old type to prevent old hooks and SDKs from failing.
// TODO(https://github.com/dart-lang/native/issues/2132): Change this to the
// new value after it has rolled.
static const String typeForAsset = syntax.NativeCodeAsset.typeValue;
}

extension EncodedCodeAsset on EncodedAsset {
bool get isCodeAsset => type == CodeAssetType.type;
bool get isCodeAsset => CodeAssetType.typesForBuildAssetTypes.contains(type);
CodeAsset get asCodeAsset => CodeAsset.fromEncoded(this);
}

Expand Down
5 changes: 4 additions & 1 deletion pkgs/native_assets_cli/lib/src/code_assets/config.dart
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,10 @@ extension CodeAssetHookConfig on HookConfig {
/// Code asset specific configuration.
CodeConfig get code => CodeConfig._fromJson(json, path);

bool get buildCodeAssets => buildAssetTypes.contains(CodeAssetType.type);
bool get buildCodeAssets =>
buildAssetTypes
.where((e) => CodeAssetType.typesForBuildAssetTypes.contains(e))
.isNotEmpty;
}

/// Extension to the [LinkInput] providing access to configuration specific to
Expand Down
4 changes: 1 addition & 3 deletions pkgs/native_assets_cli/lib/src/code_assets/extension.dart
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,6 @@ final class CodeAssetExtension implements ProtocolExtension {
this.macOS,
});

static const List<String> _buildAssetTypes = [CodeAssetType.type];

@override
void setupBuildInput(BuildInputBuilder input) {
_setupConfig(input);
Expand All @@ -47,7 +45,7 @@ final class CodeAssetExtension implements ProtocolExtension {
}

void _setupConfig(HookInputBuilder input) {
input.config.addBuildAssetTypes(_buildAssetTypes);
input.config.addBuildAssetTypes(CodeAssetType.typesForBuildAssetTypes);
// ignore: deprecated_member_use_from_same_package
input.config.setupCode(
targetArchitecture: targetArchitecture,
Expand Down
56 changes: 56 additions & 0 deletions pkgs/native_assets_cli/lib/src/code_assets/syntax.g.dart
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,9 @@ class Asset {
List<Object> path = const [],
}) {
final result = Asset._fromJson(json, path: path);
if (result.isNativeCodeAssetNew) {
return result.asNativeCodeAssetNew;
}
if (result.isNativeCodeAsset) {
return result.asNativeCodeAsset;
}
Expand Down Expand Up @@ -1075,6 +1078,59 @@ class NativeCodeAssetEncoding {
String toString() => 'NativeCodeAssetEncoding($json)';
}

class NativeCodeAssetNew extends Asset {
static const typeValue = 'code_assets/code';

NativeCodeAssetNew.fromJson(super.json, {super.path}) : super._fromJson();

NativeCodeAssetNew({required NativeCodeAssetEncoding? encoding})
: super(type: 'code_assets/code') {
_encoding = encoding;
json.sortOnKey();
}

/// Setup all fields for [NativeCodeAssetNew] that are not in
/// [Asset].
void setup({required NativeCodeAssetEncoding? encoding}) {
_encoding = encoding;
json.sortOnKey();
}

NativeCodeAssetEncoding? get encoding {
final jsonValue = _reader.optionalMap('encoding');
if (jsonValue == null) return null;
return NativeCodeAssetEncoding.fromJson(
jsonValue,
path: [...path, 'encoding'],
);
}

set _encoding(NativeCodeAssetEncoding? value) {
json.setOrRemove('encoding', value?.json);
}

List<String> _validateEncoding() {
final mapErrors = _reader.validate<Map<String, Object?>?>('encoding');
if (mapErrors.isNotEmpty) {
return mapErrors;
}
return encoding?.validate() ?? [];
}

@override
List<String> validate() => [...super.validate(), ..._validateEncoding()];

@override
String toString() => 'NativeCodeAssetNew($json)';
}

extension NativeCodeAssetNewExtension on Asset {
bool get isNativeCodeAssetNew => type == 'code_assets/code';

NativeCodeAssetNew get asNativeCodeAssetNew =>
NativeCodeAssetNew.fromJson(json, path: path);
}

class OS {
final String name;

Expand Down
Loading