From 0f373e7419cf1a0fa894d26b19add2ce4cc37dcb Mon Sep 17 00:00:00 2001 From: Boshen Date: Fri, 22 Nov 2024 21:05:39 +0800 Subject: [PATCH 1/2] update to es transform --- Cargo.toml | 2 +- benches/transformer.rs | 2 +- src/lib.rs | 86 +++++++++++++++++++++++------------------- 3 files changed, 49 insertions(+), 41 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 390a480..498d33c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,7 +27,7 @@ swc = "6.0.0" swc_common = "4.0.1" swc_ecma_ast = "4.0.1" swc_ecma_parser = { version = "5.0.0", features = ["typescript"] } -swc_ecma_transforms = "6.0.0" +swc_ecma_transforms = { version = "6.0.0", features = ["compat"] } swc_ecma_transforms_react = "5.0.0" swc_ecma_transforms_typescript = "5.0.0" swc_ecma_visit = "4.0.1" diff --git a/benches/transformer.rs b/benches/transformer.rs index 1f14cc4..b81308b 100644 --- a/benches/transformer.rs +++ b/benches/transformer.rs @@ -49,7 +49,7 @@ impl TheBencher for OxcBencher { struct SwcBencher; impl TheBencher for SwcBencher { - type RunOutput = (swc_ecma_ast::Program, String); + type RunOutput = String; const ID: &'static str = "swc"; diff --git a/src/lib.rs b/src/lib.rs index 02f1775..1dce225 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,7 +7,7 @@ pub mod oxc { parser::Parser, semantic::SemanticBuilder, span::SourceType, - transformer::{JsxOptions, TransformOptions, Transformer, TypeScriptOptions}, + transformer::{TransformOptions, Transformer}, }; pub fn transform(path: &Path, source_text: &str) -> (Allocator, String) { @@ -16,11 +16,7 @@ pub mod oxc { let printed = { let ret = Parser::new(&allocator, source_text, source_type).parse(); let mut program = ret.program; - let transform_options = TransformOptions { - typescript: TypeScriptOptions::default(), - jsx: JsxOptions::default(), - ..TransformOptions::default() - }; + let transform_options = TransformOptions::from_target("es2015").unwrap(); let (symbols, scopes) = SemanticBuilder::new() .build(&program) .semantic @@ -38,16 +34,18 @@ pub mod oxc { pub mod swc { use std::{path::Path, sync::Arc}; - use swc::{Compiler, PrintArgs, SwcComments}; + use swc::{try_with_handler, Compiler, PrintArgs, SwcComments}; use swc_common::{source_map::SourceMap, sync::Lrc, Mark, GLOBALS}; - use swc_ecma_ast::Program; use swc_ecma_parser::{EsSyntax, Parser, StringInput, Syntax, TsSyntax}; - use swc_ecma_transforms::resolver; + use swc_ecma_transforms::{ + compat::{es2016, es2017, es2018, es2019, es2020, es2021, es2022}, + resolver, + }; use swc_ecma_transforms_react::{react, Options, Runtime}; use swc_ecma_transforms_typescript::strip; use swc_ecma_visit::VisitMutWith; - pub fn transform(path: &Path, source_text: &str) -> (Program, String) { + pub fn transform(path: &Path, source_text: &str) -> String { let cm = Lrc::new(SourceMap::new(swc_common::FilePathMapping::empty())); let compiler = Compiler::new(Arc::clone(&cm)); let comments = SwcComments::default(); @@ -61,40 +59,50 @@ pub mod swc { }; GLOBALS.set(&Default::default(), || { - let input = StringInput::new(source_text, Default::default(), Default::default()); - let mut program = Parser::new(syntax, input, Some(&comments)) - .parse_program() - .unwrap(); - - let top_level_mark = Mark::new(); - let unresolved_mark = Mark::new(); + try_with_handler(cm.clone(), Default::default(), |_handler| { + let input = StringInput::new(source_text, Default::default(), Default::default()); + let mut program = Parser::new(syntax, input, Some(&comments)) + .parse_program() + .unwrap(); - program.visit_mut_with(&mut resolver( - unresolved_mark, - top_level_mark, - syntax.typescript(), - )); + let top_level_mark = Mark::new(); + let unresolved_mark = Mark::new(); - let mut ast_pass = ( - strip(unresolved_mark, top_level_mark), - react( - Arc::clone(&cm), - Some(comments), - Options { - runtime: Some(Runtime::Automatic), - ..Options::default() - }, - top_level_mark, + program.visit_mut_with(&mut resolver( unresolved_mark, - ), - ); - let program = program.apply(&mut ast_pass); + top_level_mark, + syntax.typescript(), + )); + + let mut ast_pass = ( + strip(unresolved_mark, top_level_mark), + react( + Arc::clone(&cm), + Some(comments), + Options { + runtime: Some(Runtime::Automatic), + ..Options::default() + }, + top_level_mark, + unresolved_mark, + ), + es2022(Default::default(), unresolved_mark), + es2021(), + es2020(Default::default(), unresolved_mark), + es2019(), + es2018(Default::default()), + es2017(Default::default(), unresolved_mark), + es2016(), + ); + let program = program.apply(&mut ast_pass); - let printed = compiler - .print(&program, PrintArgs::default()) - .expect("print failed"); + let printed = compiler + .print(&program, PrintArgs::default()) + .expect("print failed"); - (program, printed.code) + Ok(printed.code) + }) + .unwrap() }) } } From 774b13ccee8fd94160df84ea28f4556542d192ac Mon Sep 17 00:00:00 2001 From: Boshen Date: Tue, 26 Nov 2024 00:27:00 +0800 Subject: [PATCH 2/2] w --- src/lib.rs | 82 +++++++++++++++++++++++++++++------------------------- 1 file changed, 44 insertions(+), 38 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 1dce225..43d87f2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -35,10 +35,11 @@ pub mod swc { use std::{path::Path, sync::Arc}; use swc::{try_with_handler, Compiler, PrintArgs, SwcComments}; - use swc_common::{source_map::SourceMap, sync::Lrc, Mark, GLOBALS}; + use swc_common::{errors::HANDLER, source_map::SourceMap, sync::Lrc, Mark, GLOBALS}; use swc_ecma_parser::{EsSyntax, Parser, StringInput, Syntax, TsSyntax}; use swc_ecma_transforms::{ compat::{es2016, es2017, es2018, es2019, es2020, es2021, es2022}, + helpers::{Helpers, HELPERS}, resolver, }; use swc_ecma_transforms_react::{react, Options, Runtime}; @@ -59,48 +60,53 @@ pub mod swc { }; GLOBALS.set(&Default::default(), || { - try_with_handler(cm.clone(), Default::default(), |_handler| { - let input = StringInput::new(source_text, Default::default(), Default::default()); - let mut program = Parser::new(syntax, input, Some(&comments)) - .parse_program() - .unwrap(); + try_with_handler(cm.clone(), Default::default(), |handler| { + HELPERS.set(&Helpers::new(true), || { + HANDLER.set(handler, || { + let input = + StringInput::new(source_text, Default::default(), Default::default()); + let mut program = Parser::new(syntax, input, Some(&comments)) + .parse_program() + .unwrap(); - let top_level_mark = Mark::new(); - let unresolved_mark = Mark::new(); + let top_level_mark = Mark::new(); + let unresolved_mark = Mark::new(); - program.visit_mut_with(&mut resolver( - unresolved_mark, - top_level_mark, - syntax.typescript(), - )); + program.visit_mut_with(&mut resolver( + unresolved_mark, + top_level_mark, + syntax.typescript(), + )); - let mut ast_pass = ( - strip(unresolved_mark, top_level_mark), - react( - Arc::clone(&cm), - Some(comments), - Options { - runtime: Some(Runtime::Automatic), - ..Options::default() - }, - top_level_mark, - unresolved_mark, - ), - es2022(Default::default(), unresolved_mark), - es2021(), - es2020(Default::default(), unresolved_mark), - es2019(), - es2018(Default::default()), - es2017(Default::default(), unresolved_mark), - es2016(), - ); - let program = program.apply(&mut ast_pass); + let mut ast_pass = ( + strip(unresolved_mark, top_level_mark), + react( + Arc::clone(&cm), + Some(comments), + Options { + runtime: Some(Runtime::Automatic), + ..Options::default() + }, + top_level_mark, + unresolved_mark, + ), + es2022(Default::default(), unresolved_mark), + es2021(), + es2020(Default::default(), unresolved_mark), + es2019(), + es2018(Default::default()), + es2017(Default::default(), unresolved_mark), + es2016(), + ); + let program = program.apply(&mut ast_pass); - let printed = compiler - .print(&program, PrintArgs::default()) - .expect("print failed"); + let printed = compiler + .print(&program, PrintArgs::default()) + .expect("print failed"); - Ok(printed.code) + Ok(printed.code) + }) + }) }) .unwrap() })