mirror of
https://github.com/danbulant/oxc
synced 2026-05-19 12:19:15 +00:00
feat(coverage/transformer): handle @jsx option (#3553)
if has`@jsx: react`, configure transformer options to match `@jsx: react` behavior
This commit is contained in:
parent
3ba2a932d6
commit
646b9937ee
5 changed files with 42 additions and 20 deletions
|
|
@ -37,7 +37,7 @@ pub use crate::{
|
|||
es2015::{ArrowFunctionsOptions, ES2015Options},
|
||||
options::BabelOptions,
|
||||
options::TransformOptions,
|
||||
react::ReactOptions,
|
||||
react::{ReactJsxRuntime, ReactOptions},
|
||||
typescript::TypeScriptOptions,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,11 @@ use oxc_traverse::TraverseCtx;
|
|||
|
||||
use crate::context::Ctx;
|
||||
|
||||
pub use self::{display_name::ReactDisplayName, jsx::ReactJsx, options::ReactOptions};
|
||||
pub use self::{
|
||||
display_name::ReactDisplayName,
|
||||
jsx::ReactJsx,
|
||||
options::{ReactJsxRuntime, ReactOptions},
|
||||
};
|
||||
|
||||
/// [Preset React](https://babel.dev/docs/babel-preset-react)
|
||||
///
|
||||
|
|
|
|||
|
|
@ -5,8 +5,8 @@ use oxc_codegen::{Codegen, CodegenOptions};
|
|||
use oxc_parser::Parser;
|
||||
use oxc_span::SourceType;
|
||||
use oxc_transformer::{
|
||||
ArrowFunctionsOptions, ES2015Options, ReactOptions, TransformOptions, Transformer,
|
||||
TypeScriptOptions,
|
||||
ArrowFunctionsOptions, ES2015Options, ReactJsxRuntime, ReactOptions, TransformOptions,
|
||||
Transformer, TypeScriptOptions,
|
||||
};
|
||||
|
||||
use crate::{
|
||||
|
|
@ -17,11 +17,8 @@ use crate::{
|
|||
typescript::TypeScriptCase,
|
||||
};
|
||||
|
||||
/// Runs the transformer and make sure it doesn't crash.
|
||||
fn get_result(source_text: &str, source_type: SourceType, source_path: &Path) -> TestResult {
|
||||
let allocator = Allocator::default();
|
||||
let filename = source_path.file_name().unwrap().to_string_lossy();
|
||||
let options = TransformOptions {
|
||||
fn get_default_transformer_options() -> TransformOptions {
|
||||
TransformOptions {
|
||||
typescript: TypeScriptOptions::default(),
|
||||
es2015: ES2015Options { arrow_function: Some(ArrowFunctionsOptions::default()) },
|
||||
react: ReactOptions {
|
||||
|
|
@ -31,7 +28,19 @@ fn get_result(source_text: &str, source_type: SourceType, source_path: &Path) ->
|
|||
..Default::default()
|
||||
},
|
||||
..Default::default()
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/// Runs the transformer and make sure it doesn't crash.
|
||||
fn get_result(
|
||||
source_text: &str,
|
||||
source_type: SourceType,
|
||||
source_path: &Path,
|
||||
options: Option<TransformOptions>,
|
||||
) -> TestResult {
|
||||
let allocator = Allocator::default();
|
||||
let filename = source_path.file_name().unwrap().to_string_lossy();
|
||||
let options = options.unwrap_or_else(get_default_transformer_options);
|
||||
let parse_result1 = Parser::new(&allocator, source_text, source_type).parse();
|
||||
let mut program = parse_result1.program;
|
||||
let _ = Transformer::new(
|
||||
|
|
@ -105,7 +114,7 @@ impl Case for TransformerTest262Case {
|
|||
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());
|
||||
let result = get_result(source_text, source_type, self.path(), None);
|
||||
self.base.set_result(result);
|
||||
}
|
||||
}
|
||||
|
|
@ -138,7 +147,7 @@ impl Case for TransformerBabelCase {
|
|||
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());
|
||||
let result = get_result(source_text, source_type, self.path(), None);
|
||||
self.base.set_result(result);
|
||||
}
|
||||
}
|
||||
|
|
@ -169,7 +178,14 @@ impl Case for TransformerTypeScriptCase {
|
|||
}
|
||||
|
||||
fn run(&mut self) {
|
||||
let result = get_result(self.base.code(), self.base.source_type(), self.path());
|
||||
let mut options = get_default_transformer_options();
|
||||
let mut source_type = self.base.source_type();
|
||||
// handle @jsx: react, `react` of behavior is match babel following options
|
||||
if self.base.meta().options.jsx.last().is_some_and(|jsx| jsx == "react") {
|
||||
source_type = source_type.with_module(true);
|
||||
options.react.runtime = ReactJsxRuntime::Classic;
|
||||
}
|
||||
let result = get_result(self.base.code(), source_type, self.path(), Some(options));
|
||||
self.base.set_result(result);
|
||||
}
|
||||
}
|
||||
|
|
@ -200,7 +216,7 @@ impl Case for TransformerMiscCase {
|
|||
}
|
||||
|
||||
fn run(&mut self) {
|
||||
let result = get_result(self.base.code(), self.base.source_type(), self.path());
|
||||
let result = get_result(self.base.code(), self.base.source_type(), self.path(), None);
|
||||
self.base.set_result(result);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -81,6 +81,10 @@ impl TypeScriptCase {
|
|||
pub fn set_result(&mut self, result: TestResult) {
|
||||
self.result = result;
|
||||
}
|
||||
|
||||
pub fn meta(&self) -> &TypeScriptTestMeta {
|
||||
&self.meta
|
||||
}
|
||||
}
|
||||
|
||||
impl Case for TypeScriptCase {
|
||||
|
|
@ -133,8 +137,8 @@ impl Case for TypeScriptCase {
|
|||
}
|
||||
}
|
||||
|
||||
struct TypeScriptTestMeta {
|
||||
pub tests: Vec<TestUnitData>,
|
||||
pub struct TypeScriptTestMeta {
|
||||
pub(self) tests: Vec<TestUnitData>,
|
||||
pub options: CompilerOptions,
|
||||
error_files: Vec<String>,
|
||||
}
|
||||
|
|
@ -224,7 +228,7 @@ struct TestUnitData {
|
|||
|
||||
#[derive(Debug)]
|
||||
#[allow(unused)]
|
||||
struct CompilerOptions {
|
||||
pub struct CompilerOptions {
|
||||
pub modules: Vec<String>,
|
||||
pub targets: Vec<String>,
|
||||
pub strict: bool,
|
||||
|
|
|
|||
|
|
@ -2,7 +2,5 @@ commit: 64d2eeea
|
|||
|
||||
transformer_typescript Summary:
|
||||
AST Parsed : 5243/5243 (100.00%)
|
||||
Positive Passed: 5240/5243 (99.94%)
|
||||
Positive Passed: 5242/5243 (99.98%)
|
||||
Mismatch: "compiler/elidedEmbeddedStatementsReplacedWithSemicolon.ts"
|
||||
Mismatch: "compiler/jsxComplexSignatureHasApplicabilityError.tsx"
|
||||
Mismatch: "compiler/tsxReactPropsInferenceSucceedsOnIntersections.tsx"
|
||||
|
|
|
|||
Loading…
Reference in a new issue