Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
2 changes: 1 addition & 1 deletion benches/transformer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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";

Expand Down
86 changes: 47 additions & 39 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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
Expand All @@ -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();
Expand All @@ -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()
})
}
}
Loading