feat(transformer): add es target to engineTargets (#7193)

This commit is contained in:
Boshen 2024-11-08 03:25:21 +00:00
parent c82b273154
commit 3a20b906f4
7 changed files with 123 additions and 75 deletions

View file

@ -37,6 +37,8 @@ pub enum Engine {
OperaMobile,
// TODO:
Android,
// Special Value for ESXXXX target.
Es,
}
impl FromStr for Engine {
@ -105,6 +107,9 @@ impl EngineTargets {
pub fn should_enable(&self, engine_targets: &EngineTargets) -> bool {
for (engine, version) in &engine_targets.0 {
if let Some(v) = self.0.get(engine) {
if *engine == Engine::Es && v <= version {
return true;
}
if v < version {
return true;
}

View file

@ -14,7 +14,7 @@ use crate::{
EngineTargets,
};
use super::{babel::BabelEnvOptions, ESFeature, ESTarget};
use super::{babel::BabelEnvOptions, ESFeature};
#[derive(Debug, Default, Clone, Deserialize)]
#[serde(try_from = "BabelEnvOptions")]
@ -100,67 +100,21 @@ impl EnvOptions {
///
/// [browserslist]: <https://github.com/browserslist/browserslist>
pub fn from_browserslist_query(query: &str) -> Result<Self, Error> {
Self::try_from(BabelEnvOptions {
targets: EngineTargets::try_from_query(query)?,
..BabelEnvOptions::default()
})
.map_err(|err| Error::msg(err))
EngineTargets::try_from_query(query).map(Self::from)
}
}
impl From<ESTarget> for EnvOptions {
fn from(target: ESTarget) -> Self {
Self {
regexp: RegExpOptions {
sticky_flag: target < ESTarget::ES2015,
unicode_flag: target < ESTarget::ES2015,
unicode_property_escapes: target < ESTarget::ES2018,
dot_all_flag: target < ESTarget::ES2015,
named_capture_groups: target < ESTarget::ES2018,
look_behind_assertions: target < ESTarget::ES2018,
match_indices: target < ESTarget::ES2022,
set_notation: target < ESTarget::ES2024,
},
es2015: ES2015Options {
arrow_function: (target < ESTarget::ES2015).then(ArrowFunctionsOptions::default),
},
es2016: ES2016Options { exponentiation_operator: target < ESTarget::ES2016 },
es2017: ES2017Options { async_to_generator: target < ESTarget::ES2017 },
es2018: ES2018Options {
object_rest_spread: (target < ESTarget::ES2018)
.then(ObjectRestSpreadOptions::default),
async_generator_functions: target < ESTarget::ES2018,
},
es2019: ES2019Options { optional_catch_binding: target < ESTarget::ES2019 },
es2020: ES2020Options {
nullish_coalescing_operator: target < ESTarget::ES2020,
big_int: target < ESTarget::ES2020,
},
es2021: ES2021Options { logical_assignment_operators: target < ESTarget::ES2021 },
es2022: ES2022Options {
class_static_block: target < ESTarget::ES2022,
class_properties: (target < ESTarget::ES2022).then(ClassPropertiesOptions::default),
},
}
impl From<BabelEnvOptions> for EnvOptions {
fn from(o: BabelEnvOptions) -> Self {
Self::from(o.targets)
}
}
impl TryFrom<BabelEnvOptions> for EnvOptions {
type Error = String;
fn try_from(o: BabelEnvOptions) -> Result<Self, Self::Error> {
Self::try_from(o.targets)
}
}
impl TryFrom<EngineTargets> for EnvOptions {
type Error = String;
impl From<EngineTargets> for EnvOptions {
#[allow(clippy::enum_glob_use)]
/// If there are any errors in the `options.targets``, they will be returned as a list of errors.
fn try_from(o: EngineTargets) -> Result<Self, Self::Error> {
fn from(o: EngineTargets) -> Self {
use ESFeature::*;
Ok(Self {
Self {
regexp: RegExpOptions {
sticky_flag: o.has_feature(ES2015StickyRegex),
unicode_flag: o.has_feature(ES2015UnicodeRegex),
@ -196,6 +150,6 @@ impl TryFrom<EngineTargets> for EnvOptions {
class_static_block: o.has_feature(ES2022ClassStaticBlock),
class_properties: o.has_feature(ES2022ClassProperties).then(Default::default),
},
})
}
}
}

View file

@ -1,5 +1,5 @@
// Auto generated by `tasks/compat_data/src/lib.rs`.
#![allow(clippy::enum_glob_use)]
#![allow(clippy::enum_glob_use, clippy::match_same_arms)]
use super::{Engine, EngineTargets};
use browserslist::Version;
use rustc_hash::FxHashMap;
@ -77,6 +77,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(10u32, 50u32, 0u32)),
(Ios, Version(6u32, 0u32, 0u32)),
(Edge, Version(12u32, 0u32, 0u32)),
(Es, Version(5u32, 0, 0)),
])),
),
(
@ -96,6 +97,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(12u32, 0u32, 0u32)),
(Ios, Version(6u32, 0u32, 0u32)),
(Edge, Version(12u32, 0u32, 0u32)),
(Es, Version(5u32, 0, 0)),
])),
),
(
@ -115,6 +117,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(12u32, 0u32, 0u32)),
(Ios, Version(6u32, 0u32, 0u32)),
(Edge, Version(12u32, 0u32, 0u32)),
(Es, Version(5u32, 0, 0)),
])),
),
(
@ -131,6 +134,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(36u32, 0u32, 0u32)),
(Ios, Version(16u32, 3u32, 0u32)),
(Edge, Version(18u32, 0u32, 0u32)),
(Es, Version(2015u32, 0, 0)),
])),
),
(
@ -147,6 +151,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(37u32, 0u32, 0u32)),
(Ios, Version(10u32, 0u32, 0u32)),
(Edge, Version(13u32, 0u32, 0u32)),
(Es, Version(2015u32, 0, 0)),
])),
),
(
@ -163,6 +168,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(33u32, 0u32, 0u32)),
(Ios, Version(10u32, 0u32, 0u32)),
(Edge, Version(14u32, 0u32, 0u32)),
(Es, Version(2015u32, 0, 0)),
])),
),
(
@ -180,6 +186,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(25u32, 0u32, 0u32)),
(Ios, Version(9u32, 0u32, 0u32)),
(Edge, Version(12u32, 0u32, 0u32)),
(Es, Version(2015u32, 0, 0)),
])),
),
(
@ -196,6 +203,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(37u32, 0u32, 0u32)),
(Ios, Version(11u32, 0u32, 0u32)),
(Edge, Version(14u32, 0u32, 0u32)),
(Es, Version(2015u32, 0, 0)),
])),
),
(
@ -212,6 +220,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(38u32, 0u32, 0u32)),
(Ios, Version(10u32, 0u32, 0u32)),
(Edge, Version(15u32, 0u32, 0u32)),
(Es, Version(2015u32, 0, 0)),
])),
),
(
@ -228,6 +237,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(33u32, 0u32, 0u32)),
(Ios, Version(10u32, 0u32, 0u32)),
(Edge, Version(13u32, 0u32, 0u32)),
(Es, Version(2015u32, 0, 0)),
])),
),
(
@ -244,6 +254,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(37u32, 0u32, 0u32)),
(Ios, Version(12u32, 0u32, 0u32)),
(Edge, Version(13u32, 0u32, 0u32)),
(Es, Version(2015u32, 0, 0)),
])),
),
(
@ -261,6 +272,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(31u32, 0u32, 0u32)),
(Ios, Version(9u32, 0u32, 0u32)),
(Edge, Version(12u32, 0u32, 0u32)),
(Es, Version(2015u32, 0, 0)),
])),
),
(
@ -278,6 +290,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(36u32, 0u32, 0u32)),
(Ios, Version(10u32, 0u32, 0u32)),
(Edge, Version(13u32, 0u32, 0u32)),
(Es, Version(2015u32, 0, 0)),
])),
),
(
@ -294,6 +307,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(38u32, 0u32, 0u32)),
(Ios, Version(10u32, 0u32, 0u32)),
(Edge, Version(15u32, 0u32, 0u32)),
(Es, Version(2015u32, 0, 0)),
])),
),
(
@ -310,6 +324,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(31u32, 0u32, 0u32)),
(Ios, Version(8u32, 0u32, 0u32)),
(Edge, Version(12u32, 0u32, 0u32)),
(Es, Version(2015u32, 0, 0)),
])),
),
(
@ -326,6 +341,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(29u32, 0u32, 0u32)),
(Ios, Version(9u32, 0u32, 0u32)),
(Edge, Version(12u32, 0u32, 0u32)),
(Es, Version(2015u32, 0, 0)),
])),
),
(
@ -343,6 +359,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(30u32, 0u32, 0u32)),
(Ios, Version(9u32, 0u32, 0u32)),
(Edge, Version(12u32, 0u32, 0u32)),
(Es, Version(2015u32, 0, 0)),
])),
),
(
@ -359,6 +376,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(33u32, 0u32, 0u32)),
(Ios, Version(10u32, 0u32, 0u32)),
(Edge, Version(13u32, 0u32, 0u32)),
(Es, Version(2015u32, 0, 0)),
])),
),
(
@ -375,6 +393,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(33u32, 0u32, 0u32)),
(Ios, Version(10u32, 0u32, 0u32)),
(Edge, Version(13u32, 0u32, 0u32)),
(Es, Version(2015u32, 0, 0)),
])),
),
(
@ -392,6 +411,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(28u32, 0u32, 0u32)),
(Ios, Version(10u32, 0u32, 0u32)),
(Edge, Version(12u32, 0u32, 0u32)),
(Es, Version(2015u32, 0, 0)),
])),
),
(
@ -409,6 +429,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(34u32, 0u32, 0u32)),
(Ios, Version(10u32, 0u32, 0u32)),
(Edge, Version(13u32, 0u32, 0u32)),
(Es, Version(2015u32, 0, 0)),
])),
),
(
@ -425,6 +446,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(38u32, 0u32, 0u32)),
(Ios, Version(10u32, 0u32, 0u32)),
(Edge, Version(79u32, 0u32, 0u32)),
(Es, Version(2015u32, 0, 0)),
])),
),
(
@ -442,6 +464,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(31u32, 0u32, 0u32)),
(Ios, Version(9u32, 0u32, 0u32)),
(Edge, Version(12u32, 0u32, 0u32)),
(Es, Version(2015u32, 0, 0)),
])),
),
(
@ -458,6 +481,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(28u32, 0u32, 0u32)),
(Ios, Version(13u32, 0u32, 0u32)),
(Edge, Version(13u32, 0u32, 0u32)),
(Es, Version(2015u32, 0, 0)),
])),
),
(
@ -475,6 +499,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(39u32, 0u32, 0u32)),
(Ios, Version(10u32, 3u32, 0u32)),
(Edge, Version(14u32, 0u32, 0u32)),
(Es, Version(2016u32, 0, 0)),
])),
),
(
@ -491,6 +516,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(42u32, 0u32, 0u32)),
(Ios, Version(11u32, 0u32, 0u32)),
(Edge, Version(15u32, 0u32, 0u32)),
(Es, Version(2017u32, 0, 0)),
])),
),
(
@ -507,6 +533,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(51u32, 0u32, 0u32)),
(Ios, Version(11u32, 3u32, 0u32)),
(Edge, Version(79u32, 0u32, 0u32)),
(Es, Version(2018u32, 0, 0)),
])),
),
(
@ -523,6 +550,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(51u32, 0u32, 0u32)),
(Ios, Version(11u32, 3u32, 0u32)),
(Edge, Version(79u32, 0u32, 0u32)),
(Es, Version(2018u32, 0, 0)),
])),
),
(
@ -540,6 +568,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(49u32, 0u32, 0u32)),
(Ios, Version(11u32, 3u32, 0u32)),
(Edge, Version(79u32, 0u32, 0u32)),
(Es, Version(2018u32, 0, 0)),
])),
),
(
@ -556,6 +585,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(49u32, 0u32, 0u32)),
(Ios, Version(16u32, 4u32, 0u32)),
(Edge, Version(79u32, 0u32, 0u32)),
(Es, Version(2018u32, 0, 0)),
])),
),
(
@ -572,6 +602,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(47u32, 0u32, 0u32)),
(Ios, Version(11u32, 3u32, 0u32)),
(Edge, Version(79u32, 0u32, 0u32)),
(Es, Version(2018u32, 0, 0)),
])),
),
(
@ -588,6 +619,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(50u32, 0u32, 0u32)),
(Ios, Version(12u32, 0u32, 0u32)),
(Edge, Version(79u32, 0u32, 0u32)),
(Es, Version(2018u32, 0, 0)),
])),
),
(
@ -604,6 +636,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(53u32, 0u32, 0u32)),
(Ios, Version(11u32, 3u32, 0u32)),
(Edge, Version(79u32, 0u32, 0u32)),
(Es, Version(2018u32, 0, 0)),
])),
),
(
@ -621,6 +654,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(53u32, 0u32, 0u32)),
(Ios, Version(12u32, 0u32, 0u32)),
(Edge, Version(79u32, 0u32, 0u32)),
(Es, Version(2019u32, 0, 0)),
])),
),
(
@ -637,6 +671,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(77u32, 0u32, 0u32)),
(Ios, Version(13u32, 4u32, 0u32)),
(Edge, Version(91u32, 0u32, 0u32)),
(Es, Version(2019u32, 0, 0)),
])),
),
(
@ -653,6 +688,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(67u32, 0u32, 0u32)),
(Ios, Version(13u32, 4u32, 0u32)),
(Edge, Version(80u32, 0u32, 0u32)),
(Es, Version(2020u32, 0, 0)),
])),
),
(
@ -669,6 +705,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(71u32, 0u32, 0u32)),
(Ios, Version(14u32, 0u32, 0u32)),
(Edge, Version(85u32, 0u32, 0u32)),
(Es, Version(2020u32, 0, 0)),
])),
),
(
@ -686,6 +723,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(54u32, 0u32, 0u32)),
(Ios, Version(14u32, 0u32, 0u32)),
(Edge, Version(79u32, 0u32, 0u32)),
(Es, Version(2020u32, 0, 0)),
])),
),
(
@ -703,6 +741,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(62u32, 0u32, 0u32)),
(Ios, Version(13u32, 0u32, 0u32)),
(Edge, Version(79u32, 0u32, 0u32)),
(Es, Version(2021u32, 0, 0)),
])),
),
(
@ -719,6 +758,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(70u32, 0u32, 0u32)),
(Ios, Version(15u32, 0u32, 0u32)),
(Edge, Version(84u32, 0u32, 0u32)),
(Es, Version(2022u32, 0, 0)),
])),
),
(
@ -735,6 +775,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(84u32, 0u32, 0u32)),
(Ios, Version(16u32, 0u32, 0u32)),
(Edge, Version(98u32, 0u32, 0u32)),
(Es, Version(2022u32, 0, 0)),
])),
),
(
@ -751,6 +792,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(77u32, 0u32, 0u32)),
(Ios, Version(15u32, 0u32, 0u32)),
(Edge, Version(91u32, 0u32, 0u32)),
(Es, Version(2022u32, 0, 0)),
])),
),
(
@ -767,6 +809,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(80u32, 0u32, 0u32)),
(Ios, Version(16u32, 4u32, 0u32)),
(Edge, Version(94u32, 0u32, 0u32)),
(Es, Version(2022u32, 0, 0)),
])),
),
(
@ -783,6 +826,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(76u32, 0u32, 0u32)),
(Ios, Version(15u32, 0u32, 0u32)),
(Edge, Version(90u32, 0u32, 0u32)),
(Es, Version(2022u32, 0, 0)),
])),
),
(
@ -798,6 +842,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(98u32, 0u32, 0u32)),
(Ios, Version(17u32, 0u32, 0u32)),
(Edge, Version(112u32, 0u32, 0u32)),
(Es, Version(2024u32, 0, 0)),
])),
),
(
@ -809,6 +854,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(111u32, 0u32, 0u32)),
(Node, Version(23u32, 0u32, 0u32)),
(Firefox, Version(132u32, 0u32, 0u32)),
(Es, Version(2025u32, 0, 0)),
])),
),
(
@ -822,6 +868,7 @@ pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
(Opera, Version(112u32, 0u32, 0u32)),
(Ios, Version(17u32, 4u32, 0u32)),
(Edge, Version(126u32, 0u32, 0u32)),
(Es, Version(2025u32, 0, 0)),
])),
),
])

View file

@ -1,5 +1,6 @@
use std::{fmt, str::FromStr};
use browserslist::Version;
use cow_utils::CowUtils;
#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Ord, PartialOrd)]
@ -15,6 +16,7 @@ pub enum ESTarget {
ES2022,
ES2023,
ES2024,
ES2025,
#[default]
ESNext,
}
@ -35,6 +37,7 @@ impl FromStr for ESTarget {
"es2022" => Ok(Self::ES2022),
"es2023" => Ok(Self::ES2023),
"es2024" => Ok(Self::ES2024),
"es2025" => Ok(Self::ES2025),
"esnext" => Ok(Self::ESNext),
_ => Err(format!("Invalid target \"{s}\".")),
}
@ -55,8 +58,29 @@ impl fmt::Display for ESTarget {
Self::ES2022 => "es2022",
Self::ES2023 => "es2023",
Self::ES2024 => "es2024",
Self::ES2025 => "es2025",
Self::ESNext => "esnext",
};
write!(f, "{s}",)
}
}
impl ESTarget {
pub fn version(&self) -> Version {
match self {
Self::ES5 => Version(5, 0, 0),
Self::ES2015 => Version(2015, 0, 0),
Self::ES2016 => Version(2016, 0, 0),
Self::ES2017 => Version(2017, 0, 0),
Self::ES2018 => Version(2018, 0, 0),
Self::ES2019 => Version(2019, 0, 0),
Self::ES2020 => Version(2020, 0, 0),
Self::ES2021 => Version(2021, 0, 0),
Self::ES2022 => Version(2022, 0, 0),
Self::ES2023 => Version(2023, 0, 0),
Self::ES2024 => Version(2024, 0, 0),
Self::ES2025 => Version(2025, 0, 0),
Self::ESNext => Version(9999, 0, 0),
}
}
}

View file

@ -92,7 +92,9 @@ impl TransformOptions {
impl From<ESTarget> for TransformOptions {
fn from(target: ESTarget) -> Self {
Self { env: EnvOptions::from(target), ..Self::default() }
let mut engine_targets = EngineTargets::default();
engine_targets.insert(Engine::Es, target.version());
Self { env: EnvOptions::from(engine_targets), ..Self::default() }
}
}

View file

@ -5,14 +5,13 @@ use oxc_transformer::{ESTarget, EnvOptions, TransformOptions};
#[test]
fn targets() {
let cases = [
// ("() => {}"),
// ("a ** b"),
// ("async function foo() {}"),
// ("({ ...x })"),
// ("try {} catch {}"),
// ("a ?? b"),
// ("a ||= b"),
// ("class foo { static {} }"),
("() => {}"),
("a ** b"),
("async function foo() {}"),
("({ ...x })"),
("try {} catch {}"),
("a ?? b"),
("a ||= b"),
"1n ** 2n",
];

View file

@ -1,4 +1,4 @@
use std::fs;
use std::{fs, str::FromStr};
use oxc_tasks_common::project_root;
use oxc_transformer::EngineTargets;
@ -27,24 +27,31 @@ pub fn generate() {
let content = fs::read_to_string(path).unwrap();
let items = serde_json::from_str::<Vec<Item>>(&content).unwrap();
let es_features = items.iter().map(Item::es_name);
let es_features = items.iter().map(Item::es_name).collect::<Vec<_>>();
// let es_targets = items.iter().map(|item| quote::format_ident!("{}", item.es));
let features = items.iter().map(|item| {
let key = item.es_name();
let targets = item.targets.iter().map(|(engine, version)| {
let engine = quote::format_ident!("{engine:?}");
let (a, b, c) = (version.0, version.1, version.2);
quote! {
(#engine, Version(#a, #b, #c))
}
});
let es_version = u32::from_str(item.es.trim_start_matches("ES")).unwrap();
let targets = item
.targets
.iter()
.map(|(engine, version)| {
let engine = quote::format_ident!("{engine:?}");
let (a, b, c) = (version.0, version.1, version.2);
quote! {
(#engine, Version(#a, #b, #c))
}
})
.chain([quote! { (Es, Version(#es_version, 0, 0)) }]);
quote! {
(#key, EngineTargets::new(FxHashMap::from_iter([#(#targets),*])))
}
});
let code = quote! {
#![allow(clippy::enum_glob_use)]
#![allow(clippy::enum_glob_use, clippy::match_same_arms)]
use browserslist::Version;
use rustc_hash::FxHashMap;
@ -57,6 +64,16 @@ pub fn generate() {
#(#es_features,)*
}
// use ESTarget::*;
// impl ESFeature {
// pub fn es_target(&self) -> ESTarget {
// match self {
// #(#es_features => #es_targets,)*
// }
// }
// }
pub fn features() -> &'static FxHashMap<ESFeature, EngineTargets> {
use ESFeature::*;
use Engine::*;