Commit Graph

257 Commits

Author SHA1 Message Date
Donny/강동윤
97647861bf
fix(es/minifier): Track aliasing via assignments () 2022-09-23 14:22:41 +09:00
Donny/강동윤
93964a82ea
test(es/minifier): Remove analysis snapshot ()
**Description:**

This PR removes analysis snapshots as it disturbs code review process
2022-09-23 13:14:42 +09:00
Donny/강동윤
7bcaaef4f7
feat(es/minifier): Mangle labels ()
**Description:**

This PR adds code to mangle labels.
2022-09-22 23:24:05 +09:00
Donny/강동윤
e9c704182b
feat(es/minifier): Improve analysis of reassignments () 2022-09-22 10:22:18 +00:00
Donny/강동윤
f2224132c1
fix(es/minifier): Prepend vars when dropping vars in a for loop initializer ()
**Description:**

The minifier appends initializer of for statements instead of prepending it.

**Related issue:**

- https://github.com/vercel/next.js/discussions/30237#discussioncomment-3704795
2022-09-22 09:18:41 +00:00
Donny/강동윤
19ce2737b1
feat(es/minifier): Collapse let without init ()
**Description:**

This patch applies the variable collapsing logic for the variables declared with `var` to the variables declared with `let`. This requires some patch about the behavior of visitors about `BlockStmt`, so this patch includes relevant changes.

**Related issue:**

 - Closes https://github.com/swc-project/swc/issues/5696.
2022-09-21 15:04:29 +00:00
Donny/강동윤
e303f7e853
fix(es/minifier): Fix analysis of assignments ()
**Related issue:**

 - Closes https://github.com/swc-project/swc/issues/5910
2022-09-21 11:33:25 +00:00
Donny/강동윤
a9873e505d
perf(es/minifier): Optimize analyzer () 2022-09-20 08:21:39 +00:00
Donny/강동윤
1df72430a5
perf(es/minifier): Invoke DCE only before the first compression ()
**Description:**

Invoke DCE only before the first compression. I verified that this patch does not affect the compression rate of the real-world inputs greatly.
2022-09-20 15:41:26 +09:00
Donny/강동윤
aacf7aaf80
feat(es/minifier): Drop function identifier in a single pass ()
**Description:**

We only inline function declarations if `ref_count` is 1, so we don't need to preserve the name of the function.

**Related issue:**

 - Closes https://github.com/swc-project/swc/issues/5682.
2022-09-19 15:07:56 +00:00
Austaras
83c7887600
fix(es/minifier): Remove more pure calls () 2022-09-19 12:21:15 +00:00
Donny/강동윤
0bbcfe15ee
test(es/minifier): Add a test for a fixed issue () 2022-09-19 17:25:49 +09:00
Donny/강동윤
4e656af1ec
feat(es/minifier): Drop variable from the sequential inliner ()
**Description:**

We now drop variable declarations if we are going to eliminate the only usage.

**Related issue:**

 - Closes https://github.com/swc-project/swc/issues/5693.
2022-09-19 07:40:04 +00:00
IWANABETHATGUY
7d6d04b421
fix(es/codegen): Drop the last comma in an array literal ()
**Description:**

Drop the last comma in an array literal.

**Related issue:**

 - Closes https://github.com/swc-project/swc/issues/5692.
2022-09-16 15:48:28 +09:00
magic-akari
90d311c042
fix(es/minifier): Fix handling of .toFixed call without an argument () 2022-09-15 16:00:36 +09:00
Donny/강동윤
991a34e0c2
fix(es/minifier): Remove fake_block while calculating next scope ()
**Description:**

We now remove `fake_block` mark from `with_ctx`.

**Related issue:**
 - Closes https://github.com/swc-project/swc/issues/5865
2022-09-15 06:04:47 +00:00
Alexander Akait
7f62fa6227
perf(html): Reduce memory usage () 2022-09-15 04:17:05 +00:00
Austaras
63fb0c4ad3
feat(es/minifier): Move assign with seq init into seq () 2022-09-14 12:57:18 +00:00
Donny/강동윤
32f18068ad
fix(es/minifier): Preserve more side effects ()
**Description:**

We now preserve more side effects.

**Related issue:**

 - Closes https://github.com/swc-project/swc/issues/5680.
2022-09-14 06:51:56 +00:00
magic-akari
2b2464271a
fix(es/codegen): Remove redundant ; after export default decl () 2022-09-14 06:07:15 +00:00
Donny/강동윤
a5f7b6946f
fix(es/minifier): Don't replace parameters of IIFE if it's recursive ()
**Description:**

While investigating, I found that problem is not the analysis of recursive functions. Instead, it was a problem with the IIFE evaluator, which replaces parameters even if it's recursive.

**Related issue:**

 - Closes https://github.com/swc-project/swc/issues/5846
2022-09-14 05:02:14 +00:00
Alexander Akait
ccd618ce54
perf(html/minifier): Improve performance () 2022-09-13 14:01:41 +09:00
Austaras
8567a38c4a
feat(es/minifier): Extend inlining of identifiers to multi-usage () 2022-09-13 03:52:47 +00:00
Donny/강동윤
7391cc99b1
perf(css/minifier): Use JsWord instead of &str () 2022-09-10 07:20:51 +00:00
Austaras
ee26337a25
feat(es/minifier): Inline lazily initialized variables ()
Safety:

For a function-local variable, an expression with side-effects would be a call, including an indirect one with a member expression.

 - If the call is function-local, it will be analyzed by the analyzer and inliner will not work.
 - If the call is not a function-local one, it cannot modify the local variable.
2022-09-08 08:07:43 +00:00
Donny/강동윤
24b60d2b64
feat(es/minifier): Change order of renaming to align with terser ()
**Description:**

 - Change the order of renaming to match one of `terser`.
2022-09-08 05:23:23 +00:00
Donny/강동윤
32a73fbf22
fix(es/minifier): Fix calculation of character frequency () 2022-09-07 04:46:21 +00:00
Austaras
90852f5aa6
fix(es/minifier): Fix analysis of assignments and classes () 2022-09-07 03:51:42 +00:00
Donny/강동윤
60ce462215
feat(es/minifier): Align name mangler with terser () 2022-09-06 21:37:58 +09:00
Austaras
948d708144
fix(es/minifier): Don't drop parameters in an exported function () 2022-09-06 10:39:23 +09:00
Donny/강동윤
6ba6da62d7
perf(es/minifier): Make dead branch remover parallel () 2022-09-04 07:33:26 +00:00
Austaras
5b2d024788
feat(es/minifier): Relax requirement for IIFE invokation () 2022-09-03 07:33:31 +00:00
Donny/강동윤
5e151c8a8e
feat(es/minifier): Support cycles in DCE () 2022-09-03 04:41:54 +00:00
Donny/강동윤
8827c38faf
feat(es/minifier): Make DCE single-pass () 2022-09-01 16:30:21 +00:00
Austaras
4ef99f346b
feat(es/minifier): Relax function inline requirement () 2022-09-01 19:36:16 +09:00
Donny/강동윤
5e2b6d5551
feat(es/minifier): Remove useless ES version check () 2022-08-31 11:11:54 +00:00
Donny/강동윤
217f519940
feat(es/minifier): Ignore closure in initializer from sequential inliner () 2022-08-31 10:33:22 +00:00
Donny/강동윤
d43334eb92
feat(es/minifier): Remove redundant check () 2022-08-30 12:22:18 +09:00
Donny/강동윤
100f359e5d
fix(es/minifier): Fix optimization of template literals with escape () 2022-08-28 03:15:12 +00:00
Donny/강동윤
a06e6e9ce5
fix(es/minifier): Fix alias analyzer () 2022-08-26 10:06:25 +00:00
Donny/강동윤
d44bbffa02
fix(es/minifier): Revert alias analyzer work () 2022-08-26 08:45:49 +00:00
Donny/강동윤
00e635b9ea
fix(es/minifier): Improve alias analyzer () 2022-08-26 07:56:40 +00:00
Donny/강동윤
d81fe67e4b
feat(es/minifier): Improve gzipped size () 2022-08-26 05:23:01 +00:00
Donny/강동윤
7f5095dd5e
test(es/minifier): Add tests for size () 2022-08-19 06:03:42 +00:00
Austaras
69f8945911
feat(es/minifier): Remove more functions and classes () 2022-08-19 04:28:06 +00:00
Donny/강동윤
7487e3341d
feat(es/minifier): Optimize more string property names () 2022-08-18 11:58:05 +09:00
Austaras
d2f3e29bb0
feat(es/minifier): Ignore recursive usage for function calls and pure calls () 2022-08-17 23:24:10 +00:00
Austaras
5aa96e00d8
fix(es/minifier): Remove recklessly inline () 2022-08-17 13:06:01 +00:00
Donny/강동윤
40bb695f64
fix(es/minifier): Fix context of call/new expressions () 2022-08-14 18:56:35 +09:00
Austaras
ca21fd0c4d
fix(es/minifier): Inline vars declared in conditional paths () 2022-08-05 13:25:28 +00:00
Donny/강동윤
3943eb24d1
feat(es/minifier): Consider char frequencies () 2022-08-03 10:20:17 +00:00
Austaras
77497e4fbe
fix(es/fixer): Don't insert extra paren when left of BinExpr is UpdateExpr () 2022-08-03 08:41:40 +00:00
Austaras
b221f90117
fix(es/minifier): Optimize inlining function calls with a literal in arguments () 2022-08-02 11:37:40 +00:00
Austaras
8611161c02
fix(es/minifier): Ignore member expression without side-effects in assign position () 2022-07-31 16:40:58 +09:00
Austaras
11f495ad37
fix(es/minifier): Check if an inlined value is mutated () 2022-07-29 04:49:09 +00:00
Donny/강동윤
64a99461ec
fix(es/minifier): Change default es version to es5 () 2022-07-29 02:40:14 +00:00
Austaras
ee84842d22
fix(es/minifier): Preserve order of side-effects in sequences pass () 2022-07-24 13:55:37 +00:00
Austaras
6573324d9c
feat(es/minifier): Calculate correct size () 2022-07-20 08:25:26 +00:00
Austaras
2e9c9bea1a
fix(es/minifier): Fix size calculation of numbers () 2022-07-17 18:07:35 +09:00
Donny/강동윤
16ece4dce0
fix(es/minifier): Don't merge exported declarations () 2022-07-13 06:07:31 +00:00
Donny/강동윤
0e4a03ccc6
fix(es/minifier): Don't inline a callable expression if it's used as a reference () 2022-07-06 03:53:11 +00:00
Donny/강동윤
b76b4999cc
fix(es/codegen): Fix codegen of some non-ascii characters () 2022-07-05 10:22:25 +00:00
Donny/강동윤
eedcb114a2
test(es/minifier): Add a test case for the minifier () 2022-06-20 14:38:23 +00:00
Donny/강동윤
36d960c7e9
perf(es/hygiene): Make hygiene faster () 2022-06-15 14:36:57 +00:00
Austaras
47bdc6a6b1
feat(es/minifier): Turn Array/Object calls into literals () 2022-06-12 02:36:49 +00:00
magic-akari
594089488b
feat(es/minifier): Drop new token if possible () 2022-06-11 05:27:13 +00:00
Donny/강동윤
be87494495
fix(es/minifier): Reserve more symbols on eval () 2022-06-10 08:49:56 +00:00
Austaras
83ae6a1f1f
feat(es/minifier): Remove extra parens in BinExpr () 2022-06-05 05:52:22 +00:00
Donny/강동윤
8365c3d0df
fix(es/minifier): Make if_return to not drop required returns () 2022-05-30 06:46:01 +00:00
Donny/강동윤
0567f67664
fix(es/minifier): Apply name mangler for more cases () 2022-05-29 11:15:16 +00:00
Donny/강동윤
7f69b9c80f
test(es/minifier): Add snapshots for the mangler ()
I found a way to make the name mangler parallel, but I want to ensure that we don't break anything.
2022-05-27 07:32:23 +00:00
brightwu
f28d9c143b
fix(es/resolver): Fix more edge cases related to catch and var () 2022-05-24 09:24:42 +00:00
Donny/강동윤
49b3c2715c
refactor(es/minifier): Make rust-analyzer fast, really () 2022-05-23 16:16:05 +09:00
Donny/강동윤
47e6cc5190
refactor(es/minifier): Make rust-analyzer faster ()
- We now use a separate crate for testing the minifier. This makes IDE much faster.
2022-05-23 15:53:01 +09:00
Donny/강동윤
dc67911f61
feat(es/minifier): Implement more skipping rules for sequences () 2022-05-20 16:01:27 +09:00
Donny/강동윤
1358f452e7
fix(es/minifier): Consider more side effects while inlining () 2022-05-20 04:57:38 +00:00
Kevin Barabash
72fbf692a4
fix(es/codegen): Don't add a newline after an arrow body () 2022-05-19 07:12:37 +00:00
Donny/강동윤
73dfa95e5a
fix(es/minifier): Fix analysis of assignment patterns () 2022-05-19 05:10:12 +00:00
Donny/강동윤
9a27b5f275
perf(es/minifier): Make minifier more parallel () 2022-05-18 13:51:25 +00:00
Donny/강동윤
183e884cbf
fix(es/minifier): Don't hoist functions with dead_code () 2022-05-18 07:25:25 +00:00
Donny/강동윤
c01476d9ae
feat(es/minifier): Enable conditionals by default () 2022-05-17 07:34:47 +00:00
Donny/강동윤
04d66dbc8b
feat(es/minifier): Enable computed_props by default () 2022-05-16 12:51:38 +00:00
Donny/강동윤
3bb4b74d94
fix(es/minifier): Consider fallthrough while merging swtich cases () 2022-05-16 12:27:24 +00:00
Donny/강동윤
36ff4f735f
test(es/minifier): Add size tests using dbg-swc () 2022-05-16 03:01:53 +00:00
Donny/강동윤
8a40b583a5
feat(es/minifier): Implement directives () 2022-05-15 10:02:55 +00:00
Donny/강동윤
56a227ad9d fix(es/minifier): Don't create direct eval ()
- `expr_simplifier`: Preserve `this`.
 - `ExprReplacer`: Inject `0` after inlining eval.
 - `MultiReplacer`: Inject `0` after inlining eval.
2022-05-12 15:14:18 +09:00
Donny/강동윤
6a97c7bef8
fix(es/utils): Fix wrong apis ()
# API Changes

## `swc_ecma_utils`

### Renames

 - `find_ids` => `find_pat_ids`
 - `prepend` => `prepend_stmt`
 - `as_bool` => `cast_to_bool`
 - `as_number` => `as_pure_number`
 - `as_string` => `cast_to_string`
 - (`as_pure_bool`, `cast_to_number` is not renamed)
 - `UsageFinder` => `IdentUsageFinder`.
 - `IdentFinder` => `IdentRefFinder`.

## Changes

 - Re-export of `HANDLER` from `swc_common::errors` is removed. Use `swc_common::error::HANDLER` instead.
 - Re-export of `Id` from `swc_ecma_ast` is removed. Use `swc_ecma_ast::Id` instead.
 - `ExprCtx` is used for apis related to `Expr`.
 - `preserve_effects` is now a method of `ExprCtx`. It was a top-level function.
 - `extract_side_effects_to` is now a method of `ExprCtx`. It was a top-level function.
 - `IdentUsageFinder` (previously `UsageFinder`) now takes `Id` instead of `Ident`.
 - `IdentRefFinder` (previously `IdentFinder`) now takes `Id` instead of `Ident`.
 - `ExprExt::is_ident_ref_to` is removed.
 - `Expr::is_global_ref_to` is added.
 - `:🆔:id` is removed. Use `Ident::to_id()` instead.
2022-05-11 04:36:22 +00:00
Donny/강동윤
2ab7594b4a
fix(es/minifier): Fix switches () 2022-05-09 21:36:09 +00:00
Donny/강동윤
3521ce09e7
fix(es/minifier): Consider more aliases in sequences pass () 2022-05-09 16:36:40 +00:00
Donny/강동윤
56c3010f6b
fix(es/resolver): Fix more try catch issues () 2022-05-09 17:50:30 +09:00
Donny/강동윤
9e79f9ced6
fix(es/resolver): Fix handling of a complex try catch () 2022-05-08 10:12:50 +00:00
Austaras
b3b6fd448c
feat(es/minifier): Remove duplicate control flow in nested blocks () 2022-05-08 13:07:58 +09:00
Donny/강동윤
f9b6016d4b
fix(es/minifier): Distinguish raw and cooked while joining template literals () 2022-05-07 10:10:50 +00:00
Donny/강동윤
c5b4ef4377
feat(es/minifier): Drop vars using sequential inliner () 2022-05-07 08:19:56 +00:00
Austaras
5d3a01ad35
fix(es/minifier): Skip getter/setter when collapsing vars () 2022-05-07 16:23:13 +09:00
Donny/강동윤
a6d404a8c2
chore(repo): Configure prettier () 2022-05-04 14:25:28 +00:00
Donny/강동윤
918c9c8a21
feat(es/minifier): Drop pure new calls () 2022-04-29 07:22:13 +00:00
Donny/강동윤
7a584d755a
feat(es/minifier): Consider cost of functions for inlining () 2022-04-29 05:58:59 +00:00
Donny/강동윤
233c4d5b86
fix(es/minifier): Fix skipping logic of sequential inliner () 2022-04-28 11:41:41 +00:00
Donny/강동윤
effc85df57
fix(es/minifier): Disable some passes for hoist_props () 2022-04-28 08:32:03 +00:00
Donny/강동윤
53610fdafc
feat(es/resolver): Use different syntax context for unresolved refs ()
- We don't need a list of bindings to check if an identifier is unresolved.
 - Checking if an identifier is unresolved is now one CPU instruction.
   - Previously it was one hashmap operation.
 - This PR also improves performance, by removing the hashmaps mentioned above.
2022-04-26 07:38:50 +00:00
Donny/강동윤
9733917cc7
fix(es/minifier): Fix analysis of update expressions () 2022-04-25 12:07:27 +00:00
Austaras
83244add33
fix(es/minifier): Remove the last break in the last BlockStmt () 2022-04-24 03:26:49 +00:00
Donny/강동윤
375cc5975a
fix(es/minifier): Disable conditionals by default () 2022-04-22 10:44:53 +09:00
Austaras
8cf3ddda6c
feat(es/minifier): Improve handling of switches () 2022-04-21 10:00:25 +00:00
Donny/강동윤
922299a490
fix(es/minifier): Don't drop labels if required () 2022-04-20 13:34:21 +00:00
Donny/강동윤
4a8b1dad1d
test(es/minifier): Organize tests () 2022-04-20 15:52:03 +09:00