blob: f92ca4e4f752f5cf3321ede3bee9ff67b5539bd2 [file] [log] [blame]
// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'code_asset.dart';
import 'config.dart';
import 'syntax.g.dart';
/// The preferred link mode for [CodeAsset]s in [CodeConfig.linkModePreference].
final class LinkModePreference {
/// The name for this link mode.
final String name;
const LinkModePreference._(this.name);
/// Creates a [LinkModePreference] from a string.
///
/// The [name] must be one of [LinkModePreference.values].
factory LinkModePreference.fromString(String name) =>
LinkModePreferenceSyntaxExtension.fromSyntax(
LinkModePreferenceSyntax.fromJson(name),
);
/// Provide native assets as dynamic libraries.
///
/// Fails if not all native assets can only be provided as static library.
/// Required to run Dart in JIT mode.
static const dynamic = LinkModePreference._('dynamic');
/// Provide native assets as static libraries.
///
/// Fails if not all native assets can only be provided as dynamic library.
/// Required for potential link-time tree-shaking of native code.
/// Therefore, preferred to in Dart AOT mode.
static const static = LinkModePreference._('static');
/// Provide native assets as dynamic libraries, if possible.
///
/// Otherwise, build native assets as static libraries
static const preferDynamic = LinkModePreference._('prefer_dynamic');
/// Provide native assets as static libraries, if possible.
///
/// Otherwise, build native assets as dynamic libraries. Preferred for AOT
/// compilation, if there are any native assets which can only be provided as
/// dynamic libraries.
static const preferStatic = LinkModePreference._('prefer_static');
/// All possible values for [LinkModePreference].
static const values = [dynamic, static, preferDynamic, preferStatic];
@override
String toString() => name;
}
/// Extension methods for [LinkModePreference] to convert to and from the
/// syntax model.
extension LinkModePreferenceSyntaxExtension on LinkModePreference {
static const _toSyntax = {
LinkModePreference.dynamic: LinkModePreferenceSyntax.dynamic,
LinkModePreference.preferDynamic: LinkModePreferenceSyntax.preferDynamic,
LinkModePreference.preferStatic: LinkModePreferenceSyntax.preferStatic,
LinkModePreference.static: LinkModePreferenceSyntax.static,
};
static const _fromSyntax = {
LinkModePreferenceSyntax.dynamic: LinkModePreference.dynamic,
LinkModePreferenceSyntax.preferDynamic: LinkModePreference.preferDynamic,
LinkModePreferenceSyntax.preferStatic: LinkModePreference.preferStatic,
LinkModePreferenceSyntax.static: LinkModePreference.static,
};
/// Converts this [LinkModePreference] to its corresponding
/// [LinkModePreferenceSyntax].
LinkModePreferenceSyntax toSyntax() => _toSyntax[this]!;
/// Converts a [LinkModePreferenceSyntax] to its corresponding
/// [LinkModePreference].
static LinkModePreference fromSyntax(LinkModePreferenceSyntax syntax) =>
_fromSyntax[syntax]!;
}