Skip to content

Commit

Permalink
feat(codegen): minify whitespace for some expressions (#7671)
Browse files Browse the repository at this point in the history
part of #7638
  • Loading branch information
Boshen committed Dec 5, 2024
1 parent 6ae178e commit d0b78f7
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 26 deletions.
25 changes: 15 additions & 10 deletions crates/oxc_codegen/src/gen.rs
Original file line number Diff line number Diff line change
Expand Up @@ -477,7 +477,7 @@ impl Gen for ReturnStatement<'_> {
p.print_space_before_identifier();
p.print_str("return");
if let Some(arg) = &self.argument {
p.print_hard_space();
p.print_soft_space();
p.print_expression(arg);
}
p.print_semicolon_after_statement();
Expand Down Expand Up @@ -531,7 +531,8 @@ impl Gen for ThrowStatement<'_> {
fn gen(&self, p: &mut Codegen, _ctx: Context) {
p.add_source_mapping(self.span);
p.print_indent();
p.print_str("throw ");
p.print_str("throw");
p.print_soft_space();
p.print_expression(&self.argument);
p.print_semicolon_after_statement();
}
Expand Down Expand Up @@ -1316,8 +1317,8 @@ impl Gen for StringLiteral<'_> {

impl Gen for ThisExpression {
fn gen(&self, p: &mut Codegen, _ctx: Context) {
p.add_source_mapping(self.span);
p.print_space_before_identifier();
p.add_source_mapping(self.span);
p.print_str("this");
}
}
Expand Down Expand Up @@ -1628,14 +1629,11 @@ impl GenExpr for ArrowFunctionExpression<'_> {
p.wrap(precedence >= Precedence::Assign, |p| {
p.print_annotation_comments(self.span.start);
if self.r#async {
p.print_space_before_identifier();
p.add_source_mapping(self.span);
p.print_str("async");
p.print_soft_space();
}

if self.r#async {
p.print_hard_space();
}

if let Some(type_parameters) = &self.type_parameters {
type_parameters.print(p, ctx);
}
Expand Down Expand Up @@ -1666,8 +1664,8 @@ impl GenExpr for ArrowFunctionExpression<'_> {
impl GenExpr for YieldExpression<'_> {
fn gen_expr(&self, p: &mut Codegen, precedence: Precedence, _ctx: Context) {
p.wrap(precedence >= Precedence::Assign, |p| {
p.add_source_mapping(self.span);
p.print_space_before_identifier();
p.add_source_mapping(self.span);
p.print_str("yield");
if self.delegate {
p.print_ascii_byte(b'*');
Expand Down Expand Up @@ -1992,6 +1990,7 @@ impl GenExpr for ImportExpression<'_> {
|| self.arguments.first().is_some_and(|argument| p.has_comment(argument.span().start));

p.wrap(wrap, |p| {
p.print_space_before_identifier();
p.add_source_mapping(self.span);
p.print_str("import(");
if has_comment {
Expand Down Expand Up @@ -2059,6 +2058,7 @@ impl Gen for TaggedTemplateExpression<'_> {

impl Gen for Super {
fn gen(&self, p: &mut Codegen, _ctx: Context) {
p.print_space_before_identifier();
p.add_source_mapping(self.span);
p.print_str("super");
}
Expand All @@ -2067,8 +2067,10 @@ impl Gen for Super {
impl GenExpr for AwaitExpression<'_> {
fn gen_expr(&self, p: &mut Codegen, precedence: Precedence, ctx: Context) {
p.wrap(precedence >= self.precedence(), |p| {
p.print_space_before_identifier();
p.add_source_mapping(self.span);
p.print_str("await ");
p.print_str("await");
p.print_soft_space();
self.argument.print_expr(p, Precedence::Exponentiation, ctx);
});
}
Expand Down Expand Up @@ -2181,6 +2183,7 @@ impl GenExpr for TSTypeAssertion<'_> {

impl Gen for MetaProperty<'_> {
fn gen(&self, p: &mut Codegen, ctx: Context) {
p.print_space_before_identifier();
p.add_source_mapping(self.span);
self.meta.print(p, ctx);
p.print_ascii_byte(b'.');
Expand All @@ -2198,6 +2201,8 @@ impl Gen for Class<'_> {
decorator.print(p, ctx);
p.print_hard_space();
}
p.print_space_before_identifier();
p.add_source_mapping(self.span);
if self.declare {
p.print_str("declare ");
}
Expand Down
4 changes: 4 additions & 0 deletions crates/oxc_codegen/tests/integration/tester.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,7 @@ pub fn test_minify(source_text: &str, expected: &str) {
.code;
assert_eq!(result, expected, "\nfor minify source: {source_text}");
}

pub fn test_minify_same(source_text: &str) {
test_minify(source_text, source_text);
}
17 changes: 13 additions & 4 deletions crates/oxc_codegen/tests/integration/unit.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::tester::{test, test_minify, test_without_source};
use crate::tester::{test, test_minify, test_minify_same, test_without_source};

#[test]
fn module_decl() {
Expand All @@ -15,6 +15,15 @@ fn expr() {

test("1000000000000000128.0.toFixed(0)", "0xde0b6b3a7640080.toFixed(0);\n");
test_minify("1000000000000000128.0.toFixed(0)", "0xde0b6b3a7640080.toFixed(0);");

test_minify("throw 'foo'", "throw\"foo\";");
test_minify("return 'foo'", "return\"foo\";");
test_minify("return class {}", "return class{};");
test_minify("return async function foo() {}", "return async function foo(){};");
test_minify_same("return super();");
test_minify_same("return new.target;");
test_minify_same("throw await 1;");
test_minify_same("await import(\"\");");
}

#[test]
Expand Down Expand Up @@ -121,7 +130,7 @@ fn assignment() {
test_minify("({a,b} = (1, 2))", "({a,b}=(1,2));");
test_minify("a *= yield b", "a*=yield b;");
test_minify("a /= () => {}", "a/=()=>{};");
test_minify("a %= async () => {}", "a%=async ()=>{};");
test_minify("a %= async () => {}", "a%=async()=>{};");
test_minify("a -= (1, 2)", "a-=(1,2);");
test_minify("a >>= b >>= c", "a>>=b>>=c;");
}
Expand All @@ -132,11 +141,11 @@ fn r#yield() {
test_minify("function *foo() { yield * a ? b : c }", "function*foo(){yield*a?b:c}");
test_minify("function *foo() { yield * yield * a }", "function*foo(){yield*yield*a}");
test_minify("function *foo() { yield * () => {} }", "function*foo(){yield*()=>{}}");
test_minify("function *foo() { yield * async () => {} }", "function*foo(){yield*async ()=>{}}");
test_minify("function *foo() { yield * async () => {} }", "function*foo(){yield*async()=>{}}");
test_minify("function *foo() { yield a ? b : c }", "function*foo(){yield a?b:c}");
test_minify("function *foo() { yield yield a }", "function*foo(){yield yield a}");
test_minify("function *foo() { yield () => {} }", "function*foo(){yield ()=>{}}");
test_minify("function *foo() { yield async () => {} }", "function*foo(){yield async ()=>{}}");
test_minify("function *foo() { yield async () => {} }", "function*foo(){yield async()=>{}}");
test_minify(
"function *foo() { yield { a } = [ b ] = c ? b : d }",
"function*foo(){yield {a}=[b]=c?b:d}",
Expand Down
24 changes: 12 additions & 12 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.12 kB | 23.70 kB | 8.62 kB | 8.54 kB | react.development.js
72.14 kB | 24.09 kB | 23.70 kB | 8.62 kB | 8.54 kB | react.development.js

173.90 kB | 61.67 kB | 59.82 kB | 19.54 kB | 19.33 kB | moment.js
173.90 kB | 61.61 kB | 59.82 kB | 19.55 kB | 19.33 kB | moment.js

287.63 kB | 92.70 kB | 90.07 kB | 32.26 kB | 31.95 kB | jquery.js
287.63 kB | 92.61 kB | 90.07 kB | 32.27 kB | 31.95 kB | jquery.js

342.15 kB | 121.90 kB | 118.14 kB | 44.59 kB | 44.37 kB | vue.js
342.15 kB | 121.79 kB | 118.14 kB | 44.59 kB | 44.37 kB | vue.js

544.10 kB | 73.48 kB | 72.48 kB | 26.12 kB | 26.20 kB | lodash.js
544.10 kB | 73.37 kB | 72.48 kB | 26.13 kB | 26.20 kB | lodash.js

555.77 kB | 276.48 kB | 270.13 kB | 91.15 kB | 90.80 kB | d3.js
555.77 kB | 276.22 kB | 270.13 kB | 91.15 kB | 90.80 kB | d3.js

1.01 MB | 467.59 kB | 458.89 kB | 126.73 kB | 126.71 kB | bundle.min.js
1.01 MB | 467.14 kB | 458.89 kB | 126.74 kB | 126.71 kB | bundle.min.js

1.25 MB | 662.83 kB | 646.76 kB | 164.00 kB | 163.73 kB | three.js
1.25 MB | 662.69 kB | 646.76 kB | 164.02 kB | 163.73 kB | three.js

2.14 MB | 741.55 kB | 724.14 kB | 181.45 kB | 181.07 kB | victory.js
2.14 MB | 740.94 kB | 724.14 kB | 181.49 kB | 181.07 kB | victory.js

3.20 MB | 1.02 MB | 1.01 MB | 332.07 kB | 331.56 kB | echarts.js
3.20 MB | 1.02 MB | 1.01 MB | 332.09 kB | 331.56 kB | echarts.js

6.69 MB | 2.39 MB | 2.31 MB | 496.11 kB | 488.28 kB | antd.js
6.69 MB | 2.39 MB | 2.31 MB | 496.17 kB | 488.28 kB | antd.js

10.95 MB | 3.56 MB | 3.49 MB | 911.20 kB | 915.50 kB | typescript.js
10.95 MB | 3.56 MB | 3.49 MB | 911.37 kB | 915.50 kB | typescript.js

0 comments on commit d0b78f7

Please sign in to comment.