refactor(transformer): rename ReactJsx to Jsx (#6883)

This plugin is no longer about React.

The next PR will move out the React refresh plugin, which can be turned
on in isolation.
This commit is contained in:
Boshen 2024-10-25 10:37:28 +00:00
parent 860cbca446
commit 1f29523fed
12 changed files with 60 additions and 59 deletions

View file

@ -105,18 +105,18 @@ use crate::TransformCtx;
use super::diagnostics; use super::diagnostics;
pub use super::{ pub use super::{
jsx_self::ReactJsxSelf, jsx_self::JsxSelf,
jsx_source::ReactJsxSource, jsx_source::JsxSource,
options::{JsxOptions, JsxRuntime}, options::{JsxOptions, JsxRuntime},
}; };
pub struct ReactJsx<'a, 'ctx> { pub struct JsxImpl<'a, 'ctx> {
options: JsxOptions, options: JsxOptions,
ctx: &'ctx TransformCtx<'a>, ctx: &'ctx TransformCtx<'a>,
pub(super) jsx_self: ReactJsxSelf<'a, 'ctx>, pub(super) jsx_self: JsxSelf<'a, 'ctx>,
pub(super) jsx_source: ReactJsxSource<'a, 'ctx>, pub(super) jsx_source: JsxSource<'a, 'ctx>,
// States // States
bindings: Bindings<'a, 'ctx>, bindings: Bindings<'a, 'ctx>,
@ -128,6 +128,7 @@ enum Bindings<'a, 'ctx> {
AutomaticScript(AutomaticScriptBindings<'a, 'ctx>), AutomaticScript(AutomaticScriptBindings<'a, 'ctx>),
AutomaticModule(AutomaticModuleBindings<'a, 'ctx>), AutomaticModule(AutomaticModuleBindings<'a, 'ctx>),
} }
impl<'a, 'ctx> Bindings<'a, 'ctx> { impl<'a, 'ctx> Bindings<'a, 'ctx> {
#[inline] #[inline]
fn is_classic(&self) -> bool { fn is_classic(&self) -> bool {
@ -367,7 +368,7 @@ impl<'a> Pragma<'a> {
} }
} }
impl<'a, 'ctx> ReactJsx<'a, 'ctx> { impl<'a, 'ctx> JsxImpl<'a, 'ctx> {
pub fn new(options: JsxOptions, ast: AstBuilder<'a>, ctx: &'ctx TransformCtx<'a>) -> Self { pub fn new(options: JsxOptions, ast: AstBuilder<'a>, ctx: &'ctx TransformCtx<'a>) -> Self {
let bindings = match options.runtime { let bindings = match options.runtime {
JsxRuntime::Classic => { JsxRuntime::Classic => {
@ -434,14 +435,14 @@ impl<'a, 'ctx> ReactJsx<'a, 'ctx> {
Self { Self {
options, options,
ctx, ctx,
jsx_self: ReactJsxSelf::new(ctx), jsx_self: JsxSelf::new(ctx),
jsx_source: ReactJsxSource::new(ctx), jsx_source: JsxSource::new(ctx),
bindings, bindings,
} }
} }
} }
impl<'a, 'ctx> Traverse<'a> for ReactJsx<'a, 'ctx> { impl<'a, 'ctx> Traverse<'a> for JsxImpl<'a, 'ctx> {
fn exit_program(&mut self, _program: &mut Program<'a>, ctx: &mut TraverseCtx<'a>) { fn exit_program(&mut self, _program: &mut Program<'a>, ctx: &mut TraverseCtx<'a>) {
self.insert_filename_var_statement(ctx); self.insert_filename_var_statement(ctx);
} }
@ -457,7 +458,7 @@ impl<'a, 'ctx> Traverse<'a> for ReactJsx<'a, 'ctx> {
} }
} }
impl<'a, 'ctx> ReactJsx<'a, 'ctx> { impl<'a, 'ctx> JsxImpl<'a, 'ctx> {
fn is_script(&self) -> bool { fn is_script(&self) -> bool {
self.ctx.source_type.is_script() self.ctx.source_type.is_script()
} }
@ -613,7 +614,7 @@ impl<'a, 'ctx> ReactJsx<'a, 'ctx> {
if let Some(span) = self_attr_span { if let Some(span) = self_attr_span {
self.jsx_self.report_error(span); self.jsx_self.report_error(span);
} else { } else {
properties.push(ReactJsxSelf::get_object_property_kind_for_jsx_plugin(ctx)); properties.push(JsxSelf::get_object_property_kind_for_jsx_plugin(ctx));
} }
} }

View file

@ -37,17 +37,17 @@ use crate::TransformCtx;
const SELF: &str = "__self"; const SELF: &str = "__self";
pub struct ReactJsxSelf<'a, 'ctx> { pub struct JsxSelf<'a, 'ctx> {
ctx: &'ctx TransformCtx<'a>, ctx: &'ctx TransformCtx<'a>,
} }
impl<'a, 'ctx> ReactJsxSelf<'a, 'ctx> { impl<'a, 'ctx> JsxSelf<'a, 'ctx> {
pub fn new(ctx: &'ctx TransformCtx<'a>) -> Self { pub fn new(ctx: &'ctx TransformCtx<'a>) -> Self {
Self { ctx } Self { ctx }
} }
} }
impl<'a, 'ctx> Traverse<'a> for ReactJsxSelf<'a, 'ctx> { impl<'a, 'ctx> Traverse<'a> for JsxSelf<'a, 'ctx> {
fn enter_jsx_opening_element( fn enter_jsx_opening_element(
&mut self, &mut self,
elem: &mut JSXOpeningElement<'a>, elem: &mut JSXOpeningElement<'a>,
@ -57,7 +57,7 @@ impl<'a, 'ctx> Traverse<'a> for ReactJsxSelf<'a, 'ctx> {
} }
} }
impl<'a, 'ctx> ReactJsxSelf<'a, 'ctx> { impl<'a, 'ctx> JsxSelf<'a, 'ctx> {
pub fn report_error(&self, span: Span) { pub fn report_error(&self, span: Span) {
let error = OxcDiagnostic::warn("Duplicate __self prop found.").with_label(span); let error = OxcDiagnostic::warn("Duplicate __self prop found.").with_label(span);
self.ctx.error(error); self.ctx.error(error);

View file

@ -48,19 +48,19 @@ use super::utils::get_line_column;
const SOURCE: &str = "__source"; const SOURCE: &str = "__source";
const FILE_NAME_VAR: &str = "jsxFileName"; const FILE_NAME_VAR: &str = "jsxFileName";
pub struct ReactJsxSource<'a, 'ctx> { pub struct JsxSource<'a, 'ctx> {
filename_var: Option<BoundIdentifier<'a>>, filename_var: Option<BoundIdentifier<'a>>,
source_rope: Option<Rope>, source_rope: Option<Rope>,
ctx: &'ctx TransformCtx<'a>, ctx: &'ctx TransformCtx<'a>,
} }
impl<'a, 'ctx> ReactJsxSource<'a, 'ctx> { impl<'a, 'ctx> JsxSource<'a, 'ctx> {
pub fn new(ctx: &'ctx TransformCtx<'a>) -> Self { pub fn new(ctx: &'ctx TransformCtx<'a>) -> Self {
Self { filename_var: None, source_rope: None, ctx } Self { filename_var: None, source_rope: None, ctx }
} }
} }
impl<'a, 'ctx> Traverse<'a> for ReactJsxSource<'a, 'ctx> { impl<'a, 'ctx> Traverse<'a> for JsxSource<'a, 'ctx> {
fn exit_program(&mut self, _program: &mut Program<'a>, ctx: &mut TraverseCtx<'a>) { fn exit_program(&mut self, _program: &mut Program<'a>, ctx: &mut TraverseCtx<'a>) {
if let Some(stmt) = self.get_filename_var_statement(ctx) { if let Some(stmt) = self.get_filename_var_statement(ctx) {
self.ctx.top_level_statements.insert_statement(stmt); self.ctx.top_level_statements.insert_statement(stmt);
@ -76,7 +76,7 @@ impl<'a, 'ctx> Traverse<'a> for ReactJsxSource<'a, 'ctx> {
} }
} }
impl<'a, 'ctx> ReactJsxSource<'a, 'ctx> { impl<'a, 'ctx> JsxSource<'a, 'ctx> {
pub fn get_line_column(&mut self, offset: u32) -> (usize, usize) { pub fn get_line_column(&mut self, offset: u32) -> (usize, usize) {
let source_rope = let source_rope =
self.source_rope.get_or_insert_with(|| Rope::from_str(self.ctx.source_text)); self.source_rope.get_or_insert_with(|| Rope::from_str(self.ctx.source_text));

View file

@ -7,7 +7,7 @@ use crate::TransformCtx;
mod comments; mod comments;
mod diagnostics; mod diagnostics;
mod display_name; mod display_name;
mod jsx; mod jsx_impl;
mod jsx_self; mod jsx_self;
mod jsx_source; mod jsx_source;
mod options; mod options;
@ -16,7 +16,7 @@ mod utils;
use refresh::ReactRefresh; use refresh::ReactRefresh;
pub use display_name::ReactDisplayName; pub use display_name::ReactDisplayName;
pub use jsx::ReactJsx; pub use jsx_impl::JsxImpl;
pub use options::{JsxOptions, JsxRuntime, ReactRefreshOptions}; pub use options::{JsxOptions, JsxRuntime, ReactRefreshOptions};
pub(crate) use comments::update_options_with_comments; pub(crate) use comments::update_options_with_comments;
@ -29,19 +29,19 @@ pub(crate) use comments::update_options_with_comments;
/// * [plugin-transform-react-jsx-self](https://babeljs.io/docs/babel-plugin-transform-react-jsx-self) /// * [plugin-transform-react-jsx-self](https://babeljs.io/docs/babel-plugin-transform-react-jsx-self)
/// * [plugin-transform-react-jsx-source](https://babel.dev/docs/babel-plugin-transform-react-jsx-source) /// * [plugin-transform-react-jsx-source](https://babel.dev/docs/babel-plugin-transform-react-jsx-source)
/// * [plugin-transform-react-display-name](https://babeljs.io/docs/babel-plugin-transform-react-display-name) /// * [plugin-transform-react-display-name](https://babeljs.io/docs/babel-plugin-transform-react-display-name)
pub struct React<'a, 'ctx> { pub struct Jsx<'a, 'ctx> {
jsx: ReactJsx<'a, 'ctx>, implementation: JsxImpl<'a, 'ctx>,
display_name: ReactDisplayName<'a, 'ctx>, display_name: ReactDisplayName<'a, 'ctx>,
refresh: ReactRefresh<'a, 'ctx>, refresh: ReactRefresh<'a, 'ctx>,
jsx_plugin: bool, enable_jsx_plugin: bool,
display_name_plugin: bool, display_name_plugin: bool,
jsx_self_plugin: bool, self_plugin: bool,
jsx_source_plugin: bool, source_plugin: bool,
refresh_plugin: bool, refresh_plugin: bool,
} }
// Constructors // Constructors
impl<'a, 'ctx> React<'a, 'ctx> { impl<'a, 'ctx> Jsx<'a, 'ctx> {
pub fn new(mut options: JsxOptions, ast: AstBuilder<'a>, ctx: &'ctx TransformCtx<'a>) -> Self { pub fn new(mut options: JsxOptions, ast: AstBuilder<'a>, ctx: &'ctx TransformCtx<'a>) -> Self {
if options.jsx_plugin || options.development { if options.jsx_plugin || options.development {
options.conform(); options.conform();
@ -51,21 +51,21 @@ impl<'a, 'ctx> React<'a, 'ctx> {
} = options; } = options;
let refresh = options.refresh.clone(); let refresh = options.refresh.clone();
Self { Self {
jsx: ReactJsx::new(options, ast, ctx), implementation: JsxImpl::new(options, ast, ctx),
display_name: ReactDisplayName::new(ctx), display_name: ReactDisplayName::new(ctx),
jsx_plugin, enable_jsx_plugin: jsx_plugin,
display_name_plugin, display_name_plugin,
jsx_self_plugin, self_plugin: jsx_self_plugin,
jsx_source_plugin, source_plugin: jsx_source_plugin,
refresh_plugin: refresh.is_some(), refresh_plugin: refresh.is_some(),
refresh: ReactRefresh::new(&refresh.unwrap_or_default(), ast, ctx), refresh: ReactRefresh::new(&refresh.unwrap_or_default(), ast, ctx),
} }
} }
} }
impl<'a, 'ctx> Traverse<'a> for React<'a, 'ctx> { impl<'a, 'ctx> Traverse<'a> for Jsx<'a, 'ctx> {
fn enter_program(&mut self, program: &mut Program<'a>, ctx: &mut TraverseCtx<'a>) { fn enter_program(&mut self, program: &mut Program<'a>, ctx: &mut TraverseCtx<'a>) {
if self.jsx_plugin { if self.enable_jsx_plugin {
program.source_type = program.source_type.with_standard(true); program.source_type = program.source_type.with_standard(true);
} }
if self.refresh_plugin { if self.refresh_plugin {
@ -77,10 +77,10 @@ impl<'a, 'ctx> Traverse<'a> for React<'a, 'ctx> {
if self.refresh_plugin { if self.refresh_plugin {
self.refresh.exit_program(program, ctx); self.refresh.exit_program(program, ctx);
} }
if self.jsx_plugin { if self.enable_jsx_plugin {
self.jsx.exit_program(program, ctx); self.implementation.exit_program(program, ctx);
} else if self.jsx_source_plugin { } else if self.source_plugin {
self.jsx.jsx_source.exit_program(program, ctx); self.implementation.jsx_source.exit_program(program, ctx);
} }
} }
@ -115,19 +115,19 @@ impl<'a, 'ctx> Traverse<'a> for React<'a, 'ctx> {
elem: &mut JSXOpeningElement<'a>, elem: &mut JSXOpeningElement<'a>,
ctx: &mut TraverseCtx<'a>, ctx: &mut TraverseCtx<'a>,
) { ) {
if !self.jsx_plugin { if !self.enable_jsx_plugin {
if self.jsx_self_plugin && self.jsx.jsx_self.can_add_self_attribute(ctx) { if self.self_plugin && self.implementation.jsx_self.can_add_self_attribute(ctx) {
self.jsx.jsx_self.enter_jsx_opening_element(elem, ctx); self.implementation.jsx_self.enter_jsx_opening_element(elem, ctx);
} }
if self.jsx_source_plugin { if self.source_plugin {
self.jsx.jsx_source.enter_jsx_opening_element(elem, ctx); self.implementation.jsx_source.enter_jsx_opening_element(elem, ctx);
} }
} }
} }
fn exit_expression(&mut self, expr: &mut Expression<'a>, ctx: &mut TraverseCtx<'a>) { fn exit_expression(&mut self, expr: &mut Expression<'a>, ctx: &mut TraverseCtx<'a>) {
if self.jsx_plugin { if self.enable_jsx_plugin {
self.jsx.exit_expression(expr, ctx); self.implementation.exit_expression(expr, ctx);
} }
if self.refresh_plugin { if self.refresh_plugin {
self.refresh.exit_expression(expr, ctx); self.refresh.exit_expression(expr, ctx);

View file

@ -29,7 +29,7 @@ mod es2019;
mod es2020; mod es2020;
mod es2021; mod es2021;
mod es2022; mod es2022;
mod react; mod jsx;
mod regexp; mod regexp;
mod typescript; mod typescript;
@ -45,7 +45,7 @@ use es2019::ES2019;
use es2020::ES2020; use es2020::ES2020;
use es2021::ES2021; use es2021::ES2021;
use es2022::ES2022; use es2022::ES2022;
use react::React; use jsx::Jsx;
use regexp::RegExp; use regexp::RegExp;
use typescript::TypeScript; use typescript::TypeScript;
@ -54,9 +54,9 @@ pub use crate::{
compiler_assumptions::CompilerAssumptions, compiler_assumptions::CompilerAssumptions,
env::{EnvOptions, Targets}, env::{EnvOptions, Targets},
es2015::{ArrowFunctionsOptions, ES2015Options}, es2015::{ArrowFunctionsOptions, ES2015Options},
jsx::{JsxOptions, JsxRuntime, ReactRefreshOptions},
options::{BabelOptions, TransformOptions}, options::{BabelOptions, TransformOptions},
plugins::*, plugins::*,
react::{JsxOptions, JsxRuntime, ReactRefreshOptions},
typescript::{RewriteExtensionsMode, TypeScriptOptions}, typescript::{RewriteExtensionsMode, TypeScriptOptions},
}; };
@ -89,11 +89,11 @@ impl<'a> Transformer<'a> {
self.ctx.source_type = program.source_type; self.ctx.source_type = program.source_type;
self.ctx.source_text = program.source_text; self.ctx.source_text = program.source_text;
react::update_options_with_comments(&program.comments, &mut self.options, &self.ctx); jsx::update_options_with_comments(&program.comments, &mut self.options, &self.ctx);
let mut transformer = TransformerImpl { let mut transformer = TransformerImpl {
x0_typescript: TypeScript::new(&self.options.typescript, &self.ctx), x0_typescript: TypeScript::new(&self.options.typescript, &self.ctx),
x1_react: React::new(self.options.react, ast_builder, &self.ctx), x1_jsx: Jsx::new(self.options.react, ast_builder, &self.ctx),
x2_es2022: ES2022::new(self.options.es2022), x2_es2022: ES2022::new(self.options.es2022),
x2_es2021: ES2021::new(self.options.es2021, &self.ctx), x2_es2021: ES2021::new(self.options.es2021, &self.ctx),
x2_es2020: ES2020::new(self.options.es2020, &self.ctx), x2_es2020: ES2020::new(self.options.es2020, &self.ctx),
@ -114,7 +114,7 @@ impl<'a> Transformer<'a> {
struct TransformerImpl<'a, 'ctx> { struct TransformerImpl<'a, 'ctx> {
// NOTE: all callbacks must run in order. // NOTE: all callbacks must run in order.
x0_typescript: TypeScript<'a, 'ctx>, x0_typescript: TypeScript<'a, 'ctx>,
x1_react: React<'a, 'ctx>, x1_jsx: Jsx<'a, 'ctx>,
x2_es2022: ES2022, x2_es2022: ES2022,
x2_es2021: ES2021<'a, 'ctx>, x2_es2021: ES2021<'a, 'ctx>,
x2_es2020: ES2020<'a, 'ctx>, x2_es2020: ES2020<'a, 'ctx>,
@ -130,11 +130,11 @@ struct TransformerImpl<'a, 'ctx> {
impl<'a, 'ctx> Traverse<'a> for TransformerImpl<'a, 'ctx> { impl<'a, 'ctx> Traverse<'a> for TransformerImpl<'a, 'ctx> {
fn enter_program(&mut self, program: &mut Program<'a>, ctx: &mut TraverseCtx<'a>) { fn enter_program(&mut self, program: &mut Program<'a>, ctx: &mut TraverseCtx<'a>) {
self.x0_typescript.enter_program(program, ctx); self.x0_typescript.enter_program(program, ctx);
self.x1_react.enter_program(program, ctx); self.x1_jsx.enter_program(program, ctx);
} }
fn exit_program(&mut self, program: &mut Program<'a>, ctx: &mut TraverseCtx<'a>) { fn exit_program(&mut self, program: &mut Program<'a>, ctx: &mut TraverseCtx<'a>) {
self.x1_react.exit_program(program, ctx); self.x1_jsx.exit_program(program, ctx);
self.x0_typescript.exit_program(program, ctx); self.x0_typescript.exit_program(program, ctx);
self.x3_es2015.exit_program(program, ctx); self.x3_es2015.exit_program(program, ctx);
self.common.exit_program(program, ctx); self.common.exit_program(program, ctx);
@ -164,7 +164,7 @@ impl<'a, 'ctx> Traverse<'a> for TransformerImpl<'a, 'ctx> {
fn enter_call_expression(&mut self, expr: &mut CallExpression<'a>, ctx: &mut TraverseCtx<'a>) { fn enter_call_expression(&mut self, expr: &mut CallExpression<'a>, ctx: &mut TraverseCtx<'a>) {
self.x0_typescript.enter_call_expression(expr, ctx); self.x0_typescript.enter_call_expression(expr, ctx);
self.x1_react.enter_call_expression(expr, ctx); self.x1_jsx.enter_call_expression(expr, ctx);
} }
fn enter_class(&mut self, class: &mut Class<'a>, ctx: &mut TraverseCtx<'a>) { fn enter_class(&mut self, class: &mut Class<'a>, ctx: &mut TraverseCtx<'a>) {
@ -204,7 +204,7 @@ impl<'a, 'ctx> Traverse<'a> for TransformerImpl<'a, 'ctx> {
} }
fn exit_expression(&mut self, expr: &mut Expression<'a>, ctx: &mut TraverseCtx<'a>) { fn exit_expression(&mut self, expr: &mut Expression<'a>, ctx: &mut TraverseCtx<'a>) {
self.x1_react.exit_expression(expr, ctx); self.x1_jsx.exit_expression(expr, ctx);
self.x2_es2017.exit_expression(expr, ctx); self.x2_es2017.exit_expression(expr, ctx);
self.x3_es2015.exit_expression(expr, ctx); self.x3_es2015.exit_expression(expr, ctx);
} }
@ -239,7 +239,7 @@ impl<'a, 'ctx> Traverse<'a> for TransformerImpl<'a, 'ctx> {
fn exit_function(&mut self, func: &mut Function<'a>, ctx: &mut TraverseCtx<'a>) { fn exit_function(&mut self, func: &mut Function<'a>, ctx: &mut TraverseCtx<'a>) {
self.x0_typescript.exit_function(func, ctx); self.x0_typescript.exit_function(func, ctx);
self.x1_react.exit_function(func, ctx); self.x1_jsx.exit_function(func, ctx);
self.x3_es2015.exit_function(func, ctx); self.x3_es2015.exit_function(func, ctx);
} }
@ -269,7 +269,7 @@ impl<'a, 'ctx> Traverse<'a> for TransformerImpl<'a, 'ctx> {
ctx: &mut TraverseCtx<'a>, ctx: &mut TraverseCtx<'a>,
) { ) {
self.x0_typescript.enter_jsx_opening_element(elem, ctx); self.x0_typescript.enter_jsx_opening_element(elem, ctx);
self.x1_react.enter_jsx_opening_element(elem, ctx); self.x1_jsx.enter_jsx_opening_element(elem, ctx);
} }
fn enter_method_definition( fn enter_method_definition(
@ -312,7 +312,7 @@ impl<'a, 'ctx> Traverse<'a> for TransformerImpl<'a, 'ctx> {
fn enter_statements(&mut self, stmts: &mut Vec<'a, Statement<'a>>, ctx: &mut TraverseCtx<'a>) { fn enter_statements(&mut self, stmts: &mut Vec<'a, Statement<'a>>, ctx: &mut TraverseCtx<'a>) {
self.common.enter_statements(stmts, ctx); self.common.enter_statements(stmts, ctx);
self.x0_typescript.enter_statements(stmts, ctx); self.x0_typescript.enter_statements(stmts, ctx);
self.x1_react.enter_statements(stmts, ctx); self.x1_jsx.enter_statements(stmts, ctx);
} }
fn exit_arrow_function_expression( fn exit_arrow_function_expression(
@ -341,7 +341,7 @@ impl<'a, 'ctx> Traverse<'a> for TransformerImpl<'a, 'ctx> {
fn exit_statements(&mut self, stmts: &mut Vec<'a, Statement<'a>>, ctx: &mut TraverseCtx<'a>) { fn exit_statements(&mut self, stmts: &mut Vec<'a, Statement<'a>>, ctx: &mut TraverseCtx<'a>) {
self.x0_typescript.exit_statements(stmts, ctx); self.x0_typescript.exit_statements(stmts, ctx);
self.x1_react.exit_statements(stmts, ctx); self.x1_jsx.exit_statements(stmts, ctx);
self.common.exit_statements(stmts, ctx); self.common.exit_statements(stmts, ctx);
} }

View file

@ -16,8 +16,8 @@ use crate::{
es2020::ES2020Options, es2020::ES2020Options,
es2021::ES2021Options, es2021::ES2021Options,
es2022::ES2022Options, es2022::ES2022Options,
jsx::JsxOptions,
options::babel::BabelOptions, options::babel::BabelOptions,
react::JsxOptions,
regexp::RegExpOptions, regexp::RegExpOptions,
typescript::TypeScriptOptions, typescript::TypeScriptOptions,
ReactRefreshOptions, ReactRefreshOptions,