Skip to content

Commit

Permalink
fix(es/minifier): Support minifying JSX (#9271)
Browse files Browse the repository at this point in the history
**Related issue:**

 - Closes #9204
  • Loading branch information
kdy1 committed Jul 18, 2024
1 parent fa0841c commit 9a6367b
Show file tree
Hide file tree
Showing 122 changed files with 613 additions and 319 deletions.
4 changes: 2 additions & 2 deletions crates/dbg-swc/src/util/minifier.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ use swc_common::{FileName, SourceMap};
use swc_ecma_ast::*;
use swc_ecma_minifier::option::{CompressOptions, MangleOptions, MinifyOptions};
use swc_ecma_transforms_base::fixer::fixer;
use swc_ecma_visit::{standard_only_visit_mut, VisitMut, VisitMutWith};
use swc_ecma_visit::{noop_visit_mut_type, VisitMut, VisitMutWith};

use super::{parse_js, print_js, wrap_task, ModuleRecord};

Expand Down Expand Up @@ -136,7 +136,7 @@ pub fn get_esbuild_output(file: &Path, mangle: bool) -> Result<String> {
struct Normalizer {}

impl VisitMut for Normalizer {
standard_only_visit_mut!();
noop_visit_mut_type!(fail);

fn visit_mut_prop(&mut self, p: &mut Prop) {
p.visit_mut_children_with(self);
Expand Down
4 changes: 2 additions & 2 deletions crates/swc/src/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ use swc_ecma_transforms::{
pass::Optional,
resolver, Assumptions,
};
use swc_ecma_visit::{as_folder, standard_only_visit_mut, VisitMut, VisitMutWith};
use swc_ecma_visit::{as_folder, noop_visit_mut_type, VisitMut, VisitMutWith};

use crate::config::{CompiledPaths, GlobalPassOption, JsMinifyOptions, ModuleConfig};

Expand Down Expand Up @@ -382,7 +382,7 @@ struct MinifierPass<'a> {
}

impl VisitMut for MinifierPass<'_> {
standard_only_visit_mut!();
noop_visit_mut_type!(fail);

fn visit_mut_module(&mut self, m: &mut Module) {
if let Some(options) = &self.options {
Expand Down
4 changes: 2 additions & 2 deletions crates/swc/src/dropped_comments_preserver.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use swc_common::{
BytePos, Span, DUMMY_SP,
};
use swc_ecma_ast::{Module, Script};
use swc_ecma_visit::{as_folder, standard_only_visit_mut, Fold, VisitMut, VisitMutWith};
use swc_ecma_visit::{as_folder, noop_visit_mut_type, Fold, VisitMut, VisitMutWith};

/// Preserves comments that would otherwise be dropped.
///
Expand Down Expand Up @@ -36,7 +36,7 @@ struct DroppedCommentsPreserver {
type CommentEntries = Vec<(BytePos, Vec<Comment>)>;

impl VisitMut for DroppedCommentsPreserver {
standard_only_visit_mut!();
noop_visit_mut_type!(fail);

fn visit_mut_module(&mut self, module: &mut Module) {
module.visit_mut_children_with(self);
Expand Down
64 changes: 64 additions & 0 deletions crates/swc/tests/fixture/issues-9xxx/9204/input/.swcrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
{
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": true
},
"target": "es2022",
"loose": false,
"minify": {
"compress": {
"arguments": true,
"arrows": true,
"booleans": true,
"booleans_as_integers": true,
"collapse_vars": true,
"comparisons": true,
"computed_props": true,
"conditionals": true,
"dead_code": false,
"directives": true,
"drop_console": true,
"drop_debugger": true,
"evaluate": true,
"expression": true,
"hoist_funs": true,
"hoist_props": true,
"hoist_vars": true,
"if_return": true,
"join_vars": false,
"keep_classnames": true,
"keep_fargs": true,
"keep_fnames": false,
"keep_infinity": true,
"loops": true,
"negate_iife": false,
"properties": true,
"reduce_funcs": true,
"reduce_vars": false,
"side_effects": true,
"switches": true,
"typeofs": true,
"unsafe": false,
"unsafe_arrows": false,
"unsafe_comps": false,
"unsafe_Function": false,
"unsafe_math": false,
"unsafe_symbols": false,
"unsafe_methods": false,
"unsafe_proto": false,
"unsafe_regexp": false,
"unsafe_undefined": false,
"unused": true,
"const_to_let": true,
"pristine_globals": true
},
"mangle": false
}
},
"module": {
"type": "es6"
},
"minify": false,
"isModule": true
}
8 changes: 8 additions & 0 deletions crates/swc/tests/fixture/issues-9xxx/9204/input/1.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
const Foo = createFoo();
export function App() {
return (
<view>
<Foo />
</view>
);
}
4 changes: 4 additions & 0 deletions crates/swc/tests/fixture/issues-9xxx/9204/output/1.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
let Foo = createFoo();
export function App() {
return React.createElement("view", null, React.createElement(Foo, null));
}
4 changes: 2 additions & 2 deletions crates/swc/tests/rust_api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@ use swc_common::{comments::SingleThreadedComments, FileName};
use swc_ecma_ast::*;
use swc_ecma_parser::{EsSyntax, Syntax, TsSyntax};
use swc_ecma_transforms::pass::noop;
use swc_ecma_visit::{as_folder, standard_only_visit_mut, VisitMut};
use swc_ecma_visit::{as_folder, noop_visit_mut_type, VisitMut};

struct PanicOnVisit;

impl VisitMut for PanicOnVisit {
standard_only_visit_mut!();
noop_visit_mut_type!(fail);

fn visit_mut_number(&mut self, n: &mut Number) {
panic!("Expected {:?}", n.value)
Expand Down
8 changes: 4 additions & 4 deletions crates/swc_bundler/src/bundler/chunk/cjs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use anyhow::Error;
use swc_common::{collections::AHashMap, Span, SyntaxContext, DUMMY_SP};
use swc_ecma_ast::*;
use swc_ecma_utils::{quote_ident, ExprFactory};
use swc_ecma_visit::{standard_only_visit_mut, VisitMut, VisitMutWith};
use swc_ecma_visit::{noop_visit_mut_type, VisitMut, VisitMutWith};

use crate::{
bundler::{chunk::merge::Ctx, load::TransformedModule},
Expand Down Expand Up @@ -189,7 +189,7 @@ where
L: Load,
R: Resolve,
{
standard_only_visit_mut!();
noop_visit_mut_type!(fail);

fn visit_mut_call_expr(&mut self, node: &mut CallExpr) {
node.visit_mut_children_with(self);
Expand Down Expand Up @@ -352,7 +352,7 @@ struct DefaultHandler {
}

impl VisitMut for DefaultHandler {
standard_only_visit_mut!();
noop_visit_mut_type!(fail);

fn visit_mut_expr(&mut self, e: &mut Expr) {
e.visit_mut_children_with(self);
Expand All @@ -375,7 +375,7 @@ struct Remapper {
}

impl VisitMut for Remapper {
standard_only_visit_mut!();
noop_visit_mut_type!(fail);

fn visit_mut_ident(&mut self, i: &mut Ident) {
if let Some(v) = self.vars.get(&i.to_id()).copied() {
Expand Down
4 changes: 2 additions & 2 deletions crates/swc_bundler/src/bundler/export.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use swc_atoms::JsWord;
use swc_common::{collections::ARandomState, FileName, SyntaxContext};
use swc_ecma_ast::*;
use swc_ecma_utils::find_pat_ids;
use swc_ecma_visit::{standard_only_visit_mut, VisitMut, VisitMutWith};
use swc_ecma_visit::{noop_visit_mut_type, VisitMut, VisitMutWith};

use super::{
load::{Source, Specifier},
Expand Down Expand Up @@ -115,7 +115,7 @@ where
L: Load,
R: Resolve,
{
standard_only_visit_mut!();
noop_visit_mut_type!(fail);

fn visit_mut_module_item(&mut self, item: &mut ModuleItem) {
match item {
Expand Down
4 changes: 2 additions & 2 deletions crates/swc_bundler/src/bundler/import/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use swc_common::{
};
use swc_ecma_ast::*;
use swc_ecma_utils::find_pat_ids;
use swc_ecma_visit::{standard_only_visit_mut, VisitMut, VisitMutWith};
use swc_ecma_visit::{noop_visit_mut_type, VisitMut, VisitMutWith};

use super::Bundler;
use crate::{load::Load, resolve::Resolve, util::ExportMetadata};
Expand Down Expand Up @@ -365,7 +365,7 @@ where
L: Load,
R: Resolve,
{
standard_only_visit_mut!();
noop_visit_mut_type!(fail);

fn visit_mut_export_named_specifier(&mut self, s: &mut ExportNamedSpecifier) {
let orig = match &s.orig {
Expand Down
4 changes: 2 additions & 2 deletions crates/swc_bundler/src/bundler/keywords.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use swc_common::{collections::AHashMap, util::take::Take};
use swc_ecma_ast::*;
use swc_ecma_utils::private_ident;
use swc_ecma_visit::{standard_only_visit_mut, VisitMut, VisitMutWith};
use swc_ecma_visit::{noop_visit_mut_type, VisitMut, VisitMutWith};

use crate::id::Id;

Expand Down Expand Up @@ -31,7 +31,7 @@ impl KeywordRenamer {
}

impl VisitMut for KeywordRenamer {
standard_only_visit_mut!();
noop_visit_mut_type!(fail);

fn visit_mut_binding_ident(&mut self, n: &mut BindingIdent) {
if let Some(new) = self.renamed(&n.id) {
Expand Down
4 changes: 2 additions & 2 deletions crates/swc_bundler/src/bundler/load.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ use swc_ecma_ast::{
};
use swc_ecma_transforms_base::resolver;
use swc_ecma_visit::{
noop_visit_type, standard_only_visit_mut, FoldWith, Visit, VisitMut, VisitMutWith, VisitWith,
noop_visit_mut_type, noop_visit_type, FoldWith, Visit, VisitMut, VisitMutWith, VisitWith,
};

use super::{export::Exports, helpers::Helpers, Bundler};
Expand Down Expand Up @@ -486,7 +486,7 @@ impl Visit for Es6ModuleDetector {
#[derive(Clone, Copy)]
struct ClearMark;
impl VisitMut for ClearMark {
standard_only_visit_mut!();
noop_visit_mut_type!(fail);

fn visit_mut_ident(&mut self, ident: &mut Ident) {
ident.ctxt = SyntaxContext::empty();
Expand Down
4 changes: 2 additions & 2 deletions crates/swc_bundler/src/inline.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use swc_common::{collections::AHashMap, SyntaxContext, DUMMY_SP};
use swc_ecma_ast::*;
use swc_ecma_visit::{
noop_visit_type, standard_only_visit_mut, visit_mut_obj_and_computed, Visit, VisitMut,
noop_visit_mut_type, noop_visit_type, visit_mut_obj_and_computed, Visit, VisitMut,
VisitMutWith, VisitWith,
};

Expand Down Expand Up @@ -84,7 +84,7 @@ impl Visit for Analyzer<'_> {
}

impl VisitMut for Inliner {
standard_only_visit_mut!();
noop_visit_mut_type!(fail);

visit_mut_obj_and_computed!();

Expand Down
4 changes: 2 additions & 2 deletions crates/swc_bundler/src/util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use std::hash::Hash;
use swc_common::{SyntaxContext, DUMMY_SP};
use swc_ecma_ast::*;
use swc_ecma_utils::ident::IdentLike;
use swc_ecma_visit::{standard_only_visit_mut, VisitMut};
use swc_ecma_visit::{noop_visit_mut_type, VisitMut};

#[cfg(feature = "concurrent")]
pub(crate) type Readonly<T> = std::sync::Arc<T>;
Expand Down Expand Up @@ -149,7 +149,7 @@ where
pub(crate) struct HygieneRemover;

impl VisitMut for HygieneRemover {
standard_only_visit_mut!();
noop_visit_mut_type!(fail);

fn visit_mut_syntax_context(&mut self, n: &mut SyntaxContext) {
*n = SyntaxContext::empty();
Expand Down
4 changes: 2 additions & 2 deletions crates/swc_ecma_compat_bugfixes/src/edge_default_param.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use swc_ecma_ast::*;
use swc_ecma_visit::{as_folder, standard_only_visit_mut, Fold, VisitMut, VisitMutWith};
use swc_ecma_visit::{as_folder, noop_visit_mut_type, Fold, VisitMut, VisitMutWith};
use swc_trace_macro::swc_trace;

/// Converts destructured parameters with default values to non-shorthand
Expand All @@ -16,7 +16,7 @@ struct EdgeDefaultParam {

#[swc_trace]
impl VisitMut for EdgeDefaultParam {
standard_only_visit_mut!();
noop_visit_mut_type!(fail);

fn visit_mut_arrow_expr(&mut self, n: &mut ArrowExpr) {
self.in_arrow = true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use swc_atoms::JsWord;
use swc_common::{collections::AHashSet, SyntaxContext};
use swc_ecma_ast::*;
use swc_ecma_transforms_base::hygiene::rename;
use swc_ecma_visit::{as_folder, standard_only_visit_mut, Fold, VisitMut, VisitMutWith};
use swc_ecma_visit::{as_folder, noop_visit_mut_type, Fold, VisitMut, VisitMutWith};
use swc_trace_macro::swc_trace;

pub fn safari_id_destructuring_collision_in_function_expression() -> impl Fold + VisitMut {
Expand All @@ -31,7 +31,7 @@ impl SafariIdDestructuringCollisionInFunctionExpression {

#[swc_trace]
impl VisitMut for SafariIdDestructuringCollisionInFunctionExpression {
standard_only_visit_mut!();
noop_visit_mut_type!(fail);

fn visit_mut_assign_pat_prop(&mut self, n: &mut AssignPatProp) {
self.visit_mut_pat_id(&Ident::from(&n.key));
Expand Down
4 changes: 2 additions & 2 deletions crates/swc_ecma_compat_common/src/regexp.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use swc_common::util::take::Take;
use swc_ecma_ast::{CallExpr, Expr, Lit, Regex};
use swc_ecma_utils::{quote_ident, ExprFactory};
use swc_ecma_visit::{as_folder, standard_only_visit_mut, Fold, VisitMut, VisitMutWith};
use swc_ecma_visit::{as_folder, noop_visit_mut_type, Fold, VisitMut, VisitMutWith};

pub fn regexp(config: Config) -> impl Fold + VisitMut {
as_folder(RegExp { config })
Expand Down Expand Up @@ -32,7 +32,7 @@ struct RegExp {
}

impl VisitMut for RegExp {
standard_only_visit_mut!();
noop_visit_mut_type!(fail);

fn visit_mut_expr(&mut self, expr: &mut Expr) {
expr.visit_mut_children_with(self);
Expand Down
6 changes: 2 additions & 4 deletions crates/swc_ecma_compat_es2015/src/arrow.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,7 @@ use swc_ecma_utils::{
function::{init_this, FnEnvHoister},
prepend_stmt,
};
use swc_ecma_visit::{
as_folder, standard_only_visit_mut, Fold, InjectVars, VisitMut, VisitMutWith,
};
use swc_ecma_visit::{as_folder, noop_visit_mut_type, Fold, InjectVars, VisitMut, VisitMutWith};
use swc_trace_macro::swc_trace;

/// Compile ES2015 arrow functions to ES5
Expand Down Expand Up @@ -74,7 +72,7 @@ struct Arrow {

#[swc_trace]
impl VisitMut for Arrow {
standard_only_visit_mut!();
noop_visit_mut_type!(fail);

fn visit_mut_class(&mut self, c: &mut Class) {
if c.super_class.is_some() {
Expand Down
4 changes: 2 additions & 2 deletions crates/swc_ecma_compat_es2015/src/block_scoped_fn.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use swc_common::{util::take::Take, DUMMY_SP};
use swc_ecma_ast::*;
use swc_ecma_utils::IdentUsageFinder;
use swc_ecma_visit::{as_folder, standard_only_visit_mut, Fold, VisitMut, VisitMutWith};
use swc_ecma_visit::{as_folder, noop_visit_mut_type, Fold, VisitMut, VisitMutWith};
use swc_trace_macro::swc_trace;

pub fn block_scoped_functions() -> impl Fold + VisitMut {
Expand All @@ -13,7 +13,7 @@ struct BlockScopedFns;

#[swc_trace]
impl VisitMut for BlockScopedFns {
standard_only_visit_mut!();
noop_visit_mut_type!(fail);

fn visit_mut_function(&mut self, n: &mut Function) {
let Some(body) = &mut n.body else { return };
Expand Down
Loading

0 comments on commit 9a6367b

Please sign in to comment.