Skip to content

Commit

Permalink
feat(minifier): fold single arg new array expressions
Browse files Browse the repository at this point in the history
  • Loading branch information
camchenry committed Oct 2, 2024
1 parent 42704fe commit 1131f92
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 21 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use oxc_allocator::Vec;
use oxc_ast::ast::*;
use oxc_allocator::{CloneIn, Vec};
use oxc_ast::{ast::*, NONE};
use oxc_semantic::IsGlobalReference;
use oxc_span::{GetSpan, SPAN};
use oxc_syntax::number::ToJsInt32;
Expand Down Expand Up @@ -321,13 +321,57 @@ impl<'a> PeepholeSubstituteAlternateSyntax {
*expr =
ctx.ast.expression_object(expr.span(), Vec::new_in(ctx.ast.allocator), None);
self.changed = true;
}
// `new Array` -> `[]`
else if new_expr.arguments.is_empty()
&& new_expr.callee.is_global_reference_name("Array", ctx.symbols())
{
*expr = ctx.ast.expression_array(expr.span(), Vec::new_in(ctx.ast.allocator), None);
self.changed = true;
} else if new_expr.callee.is_global_reference_name("Array", ctx.symbols()) {
// `new Array` -> `[]`
if new_expr.arguments.is_empty() {
*expr =
ctx.ast.expression_array(expr.span(), Vec::new_in(ctx.ast.allocator), None);
self.changed = true;
} else if new_expr.arguments.len() == 1 {
let Some(arg) = new_expr.arguments[0].as_expression() else { return };
// `new Array(0)` -> `[]`
if arg.is_number_0() {
*expr = ctx.ast.expression_array(
expr.span(),
Vec::new_in(ctx.ast.allocator),
None,
);
self.changed = true;
}
// `new Array(8)` -> `Array(8)`
else if arg.is_number_literal() {
let mut arguments = Vec::new_in(ctx.ast.allocator);
arguments
.push(ctx.ast.argument_expression((*arg).clone_in(ctx.ast.allocator)));
*expr = ctx.ast.expression_call(
new_expr.span,
new_expr.callee.clone_in(ctx.ast.allocator),
NONE,
arguments,
false,
)
}
// `new Array(literal)` -> `[literal]`
else if arg.is_literal() {
let mut elements = Vec::new_in(ctx.ast.allocator);
let element = ctx.ast.array_expression_element_expression(
(*arg).clone_in(ctx.ast.allocator),
);
elements.push(element);
*expr = ctx.ast.expression_array(expr.span(), elements, None);
self.changed = true;
}
// `new Array()` -> `Array()`
else {
*expr = ctx.ast.expression_call(
new_expr.span,
new_expr.callee.clone_in(ctx.ast.allocator),
NONE,
new_expr.arguments.clone_in(ctx.ast.allocator),
false,
)
}
}
}
}
}
Expand Down Expand Up @@ -434,15 +478,15 @@ mod test {
test_same("x = Array?.()");

// One argument
// test("x = new Array(0)", "x = []");
test("x = new Array(0)", "x = []");
test("x = new Array(\"a\")", "x = [\"a\"]");
test("x = new Array(7)", "x = Array(7)");
test("x = new Array(y)", "x = Array(y)");
test("x = new Array(foo())", "x = Array(foo())");
// test("x = Array(0)", "x = []");
// test("x = new Array(\"a\")", "x = [\"a\"]");
// test("x = Array(\"a\")", "x = [\"a\"]");
// test("x = new Array(7)", "x = Array(7)");
// test_same("x = Array(7)");
// test("x = new Array(y)", "x = Array(y)");
// test_same("x = Array(y)");
// test("x = new Array(foo())", "x = Array(foo())");
// test_same("x = Array(foo())");

// // 1+ arguments
Expand Down
14 changes: 7 additions & 7 deletions tasks/minsize/minsize.snap
Original file line number Diff line number Diff line change
@@ -1,26 +1,26 @@
Original | Minified | esbuild | Gzip | esbuild

72.14 kB | 24.47 kB | 23.70 kB | 8.65 kB | 8.54 kB | react.development.js
72.14 kB | 24.46 kB | 23.70 kB | 8.65 kB | 8.54 kB | react.development.js

173.90 kB | 61.69 kB | 59.82 kB | 19.54 kB | 19.33 kB | moment.js

287.63 kB | 92.83 kB | 90.07 kB | 32.29 kB | 31.95 kB | jquery.js

342.15 kB | 124.14 kB | 118.14 kB | 44.81 kB | 44.37 kB | vue.js
342.15 kB | 124.11 kB | 118.14 kB | 44.80 kB | 44.37 kB | vue.js

544.10 kB | 74.13 kB | 72.48 kB | 26.23 kB | 26.20 kB | lodash.js

555.77 kB | 278.68 kB | 270.13 kB | 91.39 kB | 90.80 kB | d3.js
555.77 kB | 278.24 kB | 270.13 kB | 91.36 kB | 90.80 kB | d3.js

1.01 MB | 470.11 kB | 458.89 kB | 126.97 kB | 126.71 kB | bundle.min.js

1.25 MB | 671.00 kB | 646.76 kB | 164.72 kB | 163.73 kB | three.js
1.25 MB | 670.97 kB | 646.76 kB | 164.72 kB | 163.73 kB | three.js

2.14 MB | 756.69 kB | 724.14 kB | 182.87 kB | 181.07 kB | victory.js
2.14 MB | 756.33 kB | 724.14 kB | 182.74 kB | 181.07 kB | victory.js

3.20 MB | 1.05 MB | 1.01 MB | 334.10 kB | 331.56 kB | echarts.js

4.12 MB | 1.68 MB | 2.31 MB | 484.25 kB | 488.28 kB | antd.js
4.12 MB | 1.68 MB | 2.31 MB | 484.21 kB | 488.28 kB | antd.js

10.95 MB | 3.59 MB | 3.49 MB | 913.96 kB | 915.50 kB | typescript.js
10.95 MB | 3.59 MB | 3.49 MB | 913.92 kB | 915.50 kB | typescript.js

0 comments on commit 1131f92

Please sign in to comment.