refactor(transformer): clean up the transformer constructor code

This commit is contained in:
Boshen 2023-10-16 14:36:14 +08:00
parent 6f289b9e57
commit 1e1050f92f
No known key found for this signature in database
GPG key ID: 234DA6A7079C6801
2 changed files with 14 additions and 33 deletions

View file

@ -38,9 +38,11 @@ pub use crate::options::{
#[derive(Default)] #[derive(Default)]
pub struct Transformer<'a> { pub struct Transformer<'a> {
#[allow(unused)]
typescript: Option<TypeScript<'a>>, typescript: Option<TypeScript<'a>>,
regexp_flags: Option<RegexpFlags<'a>>, #[allow(unused)]
react_jsx: Option<ReactJsx<'a>>, react_jsx: Option<ReactJsx<'a>>,
regexp_flags: Option<RegexpFlags<'a>>,
// es2022 // es2022
es2022_class_static_block: Option<es2022::ClassStaticBlock<'a>>, es2022_class_static_block: Option<es2022::ClassStaticBlock<'a>>,
// es2021 // es2021
@ -54,6 +56,7 @@ pub struct Transformer<'a> {
} }
impl<'a> Transformer<'a> { impl<'a> Transformer<'a> {
#[rustfmt::skip]
pub fn new( pub fn new(
allocator: &'a Allocator, allocator: &'a Allocator,
source_type: SourceType, source_type: SourceType,
@ -61,35 +64,16 @@ impl<'a> Transformer<'a> {
options: TransformOptions, options: TransformOptions,
) -> Self { ) -> Self {
let ast = Rc::new(AstBuilder::new(allocator)); let ast = Rc::new(AstBuilder::new(allocator));
Self {
let mut t = Self::default(); typescript: source_type.is_typescript().then(|| TypeScript::new(Rc::clone(&ast))),
if source_type.is_typescript() { react_jsx: options.react.map(|options| ReactJsx::new(Rc::clone(&ast), options)),
t.typescript.replace(TypeScript::new(Rc::clone(&ast))); regexp_flags: RegexpFlags::new(Rc::clone(&ast), options.target),
es2022_class_static_block: (options.target < TransformTarget::ES2022).then(|| es2022::ClassStaticBlock::new(Rc::clone(&ast))),
es2021_logical_assignment_operators: (options.target < TransformTarget::ES2021).then(|| LogicalAssignmentOperators::new(Rc::clone(&ast))),
es2019_optional_catch_binding: (options.target < TransformTarget::ES2019).then(|| OptionalCatchBinding::new(Rc::clone(&ast))),
es2016_exponentiation_operator: (options.target < TransformTarget::ES2016).then(|| ExponentiationOperator::new(Rc::clone(&ast), Rc::clone(symbols))),
es2015_shorthand_properties: (options.target < TransformTarget::ES2015).then(|| ShorthandProperties::new(Rc::clone(&ast))),
} }
if let Some(react_options) = options.react {
t.react_jsx.replace(ReactJsx::new(Rc::clone(&ast), react_options));
}
t.regexp_flags = RegexpFlags::new_with_transform_target(Rc::clone(&ast), options.target);
if options.target < TransformTarget::ES2022 {
t.es2022_class_static_block.replace(es2022::ClassStaticBlock::new(Rc::clone(&ast)));
}
if options.target < TransformTarget::ES2021 {
t.es2021_logical_assignment_operators
.replace(LogicalAssignmentOperators::new(Rc::clone(&ast)));
}
if options.target < TransformTarget::ES2019 {
t.es2019_optional_catch_binding.replace(OptionalCatchBinding::new(Rc::clone(&ast)));
}
if options.target < TransformTarget::ES2016 {
t.es2016_exponentiation_operator
.replace(ExponentiationOperator::new(Rc::clone(&ast), Rc::clone(symbols)));
}
if options.target < TransformTarget::ES2015 {
t.es2015_shorthand_properties.replace(ShorthandProperties::new(Rc::clone(&ast)));
}
t
} }
pub fn build(mut self, program: &mut Program<'a>) { pub fn build(mut self, program: &mut Program<'a>) {

View file

@ -20,10 +20,7 @@ pub struct RegexpFlags<'a> {
} }
impl<'a> RegexpFlags<'a> { impl<'a> RegexpFlags<'a> {
pub fn new_with_transform_target( pub fn new(ast: Rc<AstBuilder<'a>>, transform_target: TransformTarget) -> Option<Self> {
ast: Rc<AstBuilder<'a>>,
transform_target: TransformTarget,
) -> Option<Self> {
let transform_flags = Self::from_transform_target(transform_target); let transform_flags = Self::from_transform_target(transform_target);
(!transform_flags.is_empty()).then(|| Self { ast, transform_flags }) (!transform_flags.is_empty()).then(|| Self { ast, transform_flags })
} }