mirror of
https://github.com/danbulant/oxc
synced 2026-05-24 12:21:58 +00:00
It seems like we need to rebuild the scopes and symbols while traversing. We can't utilize the scopes and symbols built by semantic because they are immutable.
156 lines
3.8 KiB
Rust
156 lines
3.8 KiB
Rust
use std::path::{Path, PathBuf};
|
|
|
|
use oxc_allocator::Allocator;
|
|
use oxc_parser::Parser;
|
|
use oxc_span::SourceType;
|
|
use oxc_transformer::{TransformOptions, Transformer};
|
|
|
|
use crate::{
|
|
babel::BabelCase,
|
|
misc::MiscCase,
|
|
suite::{Case, TestResult},
|
|
test262::{Test262Case, TestFlag},
|
|
typescript::TypeScriptCase,
|
|
};
|
|
|
|
/// Runs the transformer and make sure it doesn't crash.
|
|
/// TODO: add codegen to turn on idempotency test.
|
|
fn get_result(source_text: &str, source_type: SourceType, source_path: &Path) -> TestResult {
|
|
let allocator = Allocator::default();
|
|
let ret = Parser::new(&allocator, source_text, source_type).parse();
|
|
let mut program = ret.program;
|
|
let options = TransformOptions::default();
|
|
let _ =
|
|
Transformer::new(&allocator, source_path, source_type, source_text, &ret.trivias, options)
|
|
.build(&mut program);
|
|
TestResult::Passed
|
|
}
|
|
|
|
pub struct TransformerTest262Case {
|
|
base: Test262Case,
|
|
}
|
|
|
|
impl Case for TransformerTest262Case {
|
|
fn new(path: PathBuf, code: String) -> Self {
|
|
Self { base: Test262Case::new(path, code) }
|
|
}
|
|
|
|
fn code(&self) -> &str {
|
|
self.base.code()
|
|
}
|
|
|
|
fn path(&self) -> &Path {
|
|
self.base.path()
|
|
}
|
|
|
|
fn test_result(&self) -> &TestResult {
|
|
self.base.test_result()
|
|
}
|
|
|
|
fn skip_test_case(&self) -> bool {
|
|
self.base.should_fail()
|
|
}
|
|
|
|
fn run(&mut self) {
|
|
let source_text = self.base.code();
|
|
let is_module = self.base.meta().flags.contains(&TestFlag::Module);
|
|
let source_type = SourceType::default().with_module(is_module);
|
|
let result = get_result(source_text, source_type, self.path());
|
|
self.base.set_result(result);
|
|
}
|
|
}
|
|
|
|
pub struct TransformerBabelCase {
|
|
base: BabelCase,
|
|
}
|
|
|
|
impl Case for TransformerBabelCase {
|
|
fn new(path: PathBuf, code: String) -> Self {
|
|
Self { base: BabelCase::new(path, code) }
|
|
}
|
|
|
|
fn code(&self) -> &str {
|
|
self.base.code()
|
|
}
|
|
|
|
fn path(&self) -> &Path {
|
|
self.base.path()
|
|
}
|
|
|
|
fn test_result(&self) -> &TestResult {
|
|
self.base.test_result()
|
|
}
|
|
|
|
fn skip_test_case(&self) -> bool {
|
|
self.base.skip_test_case() || self.base.should_fail()
|
|
}
|
|
|
|
fn run(&mut self) {
|
|
let source_text = self.base.code();
|
|
let source_type = self.base.source_type();
|
|
let result = get_result(source_text, source_type, self.path());
|
|
self.base.set_result(result);
|
|
}
|
|
}
|
|
|
|
pub struct TransformerTypeScriptCase {
|
|
base: TypeScriptCase,
|
|
}
|
|
|
|
impl Case for TransformerTypeScriptCase {
|
|
fn new(path: PathBuf, code: String) -> Self {
|
|
Self { base: TypeScriptCase::new(path, code) }
|
|
}
|
|
|
|
fn code(&self) -> &str {
|
|
self.base.code()
|
|
}
|
|
|
|
fn path(&self) -> &Path {
|
|
self.base.path()
|
|
}
|
|
|
|
fn test_result(&self) -> &TestResult {
|
|
self.base.test_result()
|
|
}
|
|
|
|
fn skip_test_case(&self) -> bool {
|
|
self.base.skip_test_case() || self.base.should_fail()
|
|
}
|
|
|
|
fn run(&mut self) {
|
|
let result = get_result(self.base.code(), self.base.source_type(), self.path());
|
|
self.base.set_result(result);
|
|
}
|
|
}
|
|
|
|
pub struct TransformerMiscCase {
|
|
base: MiscCase,
|
|
}
|
|
|
|
impl Case for TransformerMiscCase {
|
|
fn new(path: PathBuf, code: String) -> Self {
|
|
Self { base: MiscCase::new(path, code) }
|
|
}
|
|
|
|
fn code(&self) -> &str {
|
|
self.base.code()
|
|
}
|
|
|
|
fn path(&self) -> &Path {
|
|
self.base.path()
|
|
}
|
|
|
|
fn test_result(&self) -> &TestResult {
|
|
self.base.test_result()
|
|
}
|
|
|
|
fn skip_test_case(&self) -> bool {
|
|
self.base.skip_test_case() || self.base.should_fail()
|
|
}
|
|
|
|
fn run(&mut self) {
|
|
let result = get_result(self.base.code(), self.base.source_type(), self.path());
|
|
self.base.set_result(result);
|
|
}
|
|
}
|