oxc/tasks/coverage/src/transformer.rs
Boshen a63a45d5b2
refactor(transformer): remove the requirement of Semantic (#3140)
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.
2024-04-30 12:48:21 +08:00

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);
}
}