Compare commits
153 Commits
v2.8.29
...
harmony-v2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3ee46e91e8 | ||
|
|
ee26e7f11b | ||
|
|
937f534392 | ||
|
|
1b2c02c944 | ||
|
|
0aa526e72c | ||
|
|
c2112d5886 | ||
|
|
5f6825f9ec | ||
|
|
7e80a979a7 | ||
|
|
b7bb706150 | ||
|
|
32c2cc33bb | ||
|
|
947b8750e8 | ||
|
|
88f6ff38d1 | ||
|
|
4198095a9c | ||
|
|
13ed445607 | ||
|
|
1db50c3b16 | ||
|
|
7f6b5d662b | ||
|
|
1c15d0db45 | ||
|
|
67461666dc | ||
|
|
45d81f881b | ||
|
|
8c7d23dfb1 | ||
|
|
7fa0dbdeb9 | ||
|
|
c644c1292d | ||
|
|
d224d71b8d | ||
|
|
27d3669800 | ||
|
|
110a1ac885 | ||
|
|
3f8fc3a316 | ||
|
|
88384cf351 | ||
|
|
72a9d799b6 | ||
|
|
766fafda8b | ||
|
|
842ac27efb | ||
|
|
0af42d1831 | ||
|
|
ff7f6139ba | ||
|
|
0db7caf13b | ||
|
|
d9bc6f303c | ||
|
|
6fd9b338dd | ||
|
|
d8d4e71b9e | ||
|
|
fb2f8d1a51 | ||
|
|
54a783ba84 | ||
|
|
63c432f4fa | ||
|
|
07785d0003 | ||
|
|
6eaeb19a4a | ||
|
|
2246c79318 | ||
|
|
dda58244b6 | ||
|
|
ca04508cd1 | ||
|
|
6b03b800b3 | ||
|
|
f9cab7ad61 | ||
|
|
0a3d780327 | ||
|
|
b0555a123a | ||
|
|
fa29344781 | ||
|
|
dcfc514c38 | ||
|
|
8ad8d7b717 | ||
|
|
0357e5923f | ||
|
|
f63803e3e3 | ||
|
|
63be1f3a4d | ||
|
|
e36e07fa77 | ||
|
|
d1b4f61f93 | ||
|
|
5b893c8ec3 | ||
|
|
8571a08a93 | ||
|
|
68cc14f846 | ||
|
|
f94497d1d6 | ||
|
|
eaf3911c31 | ||
|
|
91cdb93e57 | ||
|
|
634f231b78 | ||
|
|
6702cae918 | ||
|
|
6d2f77c180 | ||
|
|
accca2445f | ||
|
|
0bc4f6edb4 | ||
|
|
ce84a706a3 | ||
|
|
86b5248837 | ||
|
|
59e1601fb8 | ||
|
|
d35a9e7839 | ||
|
|
0465bd270d | ||
|
|
6780d0906c | ||
|
|
0b303379c0 | ||
|
|
d7ec2ecc12 | ||
|
|
2827fa8699 | ||
|
|
c80ec625ec | ||
|
|
5e78f20f1c | ||
|
|
1f75232062 | ||
|
|
028ff64e9a | ||
|
|
7a8cffd631 | ||
|
|
5b553aafe2 | ||
|
|
084437bc6d | ||
|
|
1cd9a2df9a | ||
|
|
7f3dbb6df7 | ||
|
|
e4d73d8b7c | ||
|
|
8220dbbea0 | ||
|
|
59e999597e | ||
|
|
cbcb3ac44e | ||
|
|
f07ab4666f | ||
|
|
a800356ad0 | ||
|
|
e076abdbf2 | ||
|
|
425613b0d2 | ||
|
|
69da8e53e0 | ||
|
|
bb6b3a773a | ||
|
|
364d20f8fb | ||
|
|
392ac4ff31 | ||
|
|
9ffed2bea6 | ||
|
|
5f7cb6939c | ||
|
|
64e7a00399 | ||
|
|
c99eaae360 | ||
|
|
34213ea2f8 | ||
|
|
da8c428a07 | ||
|
|
0d8dea9538 | ||
|
|
2babe737e0 | ||
|
|
2cce61c564 | ||
|
|
246ec416c0 | ||
|
|
6be9c752d5 | ||
|
|
76ed083e47 | ||
|
|
b31918bbf0 | ||
|
|
b14496c742 | ||
|
|
991fa99655 | ||
|
|
3d7f73114d | ||
|
|
dde9e293df | ||
|
|
34685a6f55 | ||
|
|
9812c826e0 | ||
|
|
2fac2bbfe4 | ||
|
|
242c61be94 | ||
|
|
e1cb1a0e3c | ||
|
|
af22b9c657 | ||
|
|
adee5023c0 | ||
|
|
7ee8f3512e | ||
|
|
dc5db9b6ca | ||
|
|
079aaa0d48 | ||
|
|
d4f17f29ae | ||
|
|
e99bc914ca | ||
|
|
025d34bfa2 | ||
|
|
c44c2d6c21 | ||
|
|
824ecfb8a2 | ||
|
|
ceebc466b9 | ||
|
|
35b31bdd4e | ||
|
|
c8b82583d2 | ||
|
|
9f9179ba1a | ||
|
|
872231a0ca | ||
|
|
36420183fd | ||
|
|
a8f8aa518b | ||
|
|
4c12cccff9 | ||
|
|
dcce4e5c66 | ||
|
|
56c0b834d6 | ||
|
|
6f864402d3 | ||
|
|
8909e9e1cb | ||
|
|
e80ed38772 | ||
|
|
9863f0efa3 | ||
|
|
e8664e63ef | ||
|
|
ddd30eeaaa | ||
|
|
a68953c491 | ||
|
|
fa5c4f2d03 | ||
|
|
9d7d365c2b | ||
|
|
ad344c5be3 | ||
|
|
96b89e34a3 | ||
|
|
4644becb9b | ||
|
|
f7460166dd | ||
|
|
32f76f7ff8 |
9
.github/ISSUE_TEMPLATE.md
vendored
9
.github/ISSUE_TEMPLATE.md
vendored
@@ -1,9 +0,0 @@
|
|||||||
- Bug report or feature request? <!-- Note: sub-optimal but correct code is not a bug -->
|
|
||||||
- `uglify-js` version (`uglifyjs -V`)
|
|
||||||
- JavaScript input - ideally as small as possible.
|
|
||||||
- The `uglifyjs` CLI command executed or `minify()` options used.
|
|
||||||
- An example of JavaScript output produced and/or the error or warning.
|
|
||||||
<!--
|
|
||||||
Note: the release version of uglify-js only supports ES5. Those wishing
|
|
||||||
to minify ES6 should use the experimental harmony branch.
|
|
||||||
-->
|
|
||||||
@@ -1,11 +1,10 @@
|
|||||||
language: node_js
|
language: node_js
|
||||||
|
before_install: "npm install -g npm"
|
||||||
node_js:
|
node_js:
|
||||||
- "0.10"
|
|
||||||
- "0.12"
|
- "0.12"
|
||||||
|
- "0.10"
|
||||||
- "4"
|
- "4"
|
||||||
- "6"
|
- "6"
|
||||||
env:
|
|
||||||
- UGLIFYJS_TEST_ALL=1
|
|
||||||
matrix:
|
matrix:
|
||||||
fast_finish: true
|
fast_finish: true
|
||||||
sudo: false
|
sudo: false
|
||||||
|
|||||||
125
README.md
125
README.md
@@ -10,12 +10,6 @@ There's also an
|
|||||||
[in-browser online demo](http://lisperator.net/uglifyjs/#demo) (for Firefox,
|
[in-browser online demo](http://lisperator.net/uglifyjs/#demo) (for Firefox,
|
||||||
Chrome and probably Safari).
|
Chrome and probably Safari).
|
||||||
|
|
||||||
#### Note:
|
|
||||||
- `uglify-js` only supports ECMAScript 5 (ES5).
|
|
||||||
- Support for `const` is [present but incomplete](#support-for-const), and may not be
|
|
||||||
transformed properly.
|
|
||||||
- Those wishing to minify ES2015+ (ES6+) should use the `npm` package [**uglify-es**](https://github.com/mishoo/UglifyJS2/tree/harmony).
|
|
||||||
|
|
||||||
Install
|
Install
|
||||||
-------
|
-------
|
||||||
|
|
||||||
@@ -30,6 +24,12 @@ From NPM for programmatic use:
|
|||||||
|
|
||||||
npm install uglify-js
|
npm install uglify-js
|
||||||
|
|
||||||
|
From Git:
|
||||||
|
|
||||||
|
git clone git://github.com/mishoo/UglifyJS2.git
|
||||||
|
cd UglifyJS2
|
||||||
|
npm link .
|
||||||
|
|
||||||
Usage
|
Usage
|
||||||
-----
|
-----
|
||||||
|
|
||||||
@@ -65,14 +65,12 @@ The available options are:
|
|||||||
--source-map-inline Write base64-encoded source map to the end of js output.
|
--source-map-inline Write base64-encoded source map to the end of js output.
|
||||||
--in-source-map Input source map, useful if you're compressing
|
--in-source-map Input source map, useful if you're compressing
|
||||||
JS that was generated from some other original
|
JS that was generated from some other original
|
||||||
code. Specify "inline" if the source map is included
|
code.
|
||||||
inline with the sources.
|
|
||||||
--screw-ie8 Use this flag if you don't wish to support
|
--screw-ie8 Use this flag if you don't wish to support
|
||||||
Internet Explorer 6/7/8.
|
Internet Explorer 6-8 quirks.
|
||||||
By default UglifyJS will not try to be IE-proof.
|
By default UglifyJS will not try to be IE-proof.
|
||||||
--support-ie8 Use this flag to support Internet Explorer 6/7/8.
|
--support-ie8 Use this flag to support Internet Explorer 6-8 quirks.
|
||||||
Equivalent to setting `screw_ie8: false` in `minify()`
|
Note: may break standards compliant `catch` identifiers.
|
||||||
for `compress`, `mangle` and `output` options.
|
|
||||||
--expr Parse a single expression, rather than a
|
--expr Parse a single expression, rather than a
|
||||||
program (for parsing JSON)
|
program (for parsing JSON)
|
||||||
-p, --prefix Skip prefix for original filenames that appear
|
-p, --prefix Skip prefix for original filenames that appear
|
||||||
@@ -86,9 +84,10 @@ The available options are:
|
|||||||
-b, --beautify Beautify output/specify output options.
|
-b, --beautify Beautify output/specify output options.
|
||||||
-m, --mangle Mangle names/pass mangler options.
|
-m, --mangle Mangle names/pass mangler options.
|
||||||
-r, --reserved Reserved names to exclude from mangling.
|
-r, --reserved Reserved names to exclude from mangling.
|
||||||
-c, --compress Enable compressor/pass compressor options, e.g.
|
-c, --compress Enable compressor/pass compressor options. Pass
|
||||||
`-c 'if_return=false,pure_funcs=["Math.pow","console.log"]'`
|
options like -c
|
||||||
Use `-c` with no argument to enable default compression
|
hoist_vars=false,if_return=false. Use -c with
|
||||||
|
no argument to use the default compression
|
||||||
options.
|
options.
|
||||||
-d, --define Global definitions
|
-d, --define Global definitions
|
||||||
-e, --enclose Embed everything in a big function, with a
|
-e, --enclose Embed everything in a big function, with a
|
||||||
@@ -149,10 +148,8 @@ The available options are:
|
|||||||
them explicitly on the command line.
|
them explicitly on the command line.
|
||||||
--mangle-regex Only mangle property names matching the regex
|
--mangle-regex Only mangle property names matching the regex
|
||||||
--name-cache File to hold mangled names mappings
|
--name-cache File to hold mangled names mappings
|
||||||
--pure-funcs Functions that can be safely removed if their
|
--pure-funcs List of functions that can be safely removed if
|
||||||
return value is not used, e.g.
|
their return value is not used [array]
|
||||||
`--pure-funcs Math.floor console.info`
|
|
||||||
(requires `--compress`)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Specify `--output` (`-o`) to declare the output file. Otherwise the output
|
Specify `--output` (`-o`) to declare the output file. Otherwise the output
|
||||||
@@ -198,10 +195,9 @@ compressed JS by mapping every token in the compiled JS to its original
|
|||||||
location.
|
location.
|
||||||
|
|
||||||
To use this feature you need to pass `--in-source-map
|
To use this feature you need to pass `--in-source-map
|
||||||
/path/to/input/source.map` or `--in-source-map inline` if the source map is
|
/path/to/input/source.map`. Normally the input source map should also point
|
||||||
included inline with the sources. Normally the input source map should also
|
to the file containing the generated JS, so if that's correct you can omit
|
||||||
point to the file containing the generated JS, so if that's correct you can
|
input files from the command line.
|
||||||
omit input files from the command line.
|
|
||||||
|
|
||||||
## Mangler options
|
## Mangler options
|
||||||
|
|
||||||
@@ -289,17 +285,6 @@ of mangled property names.
|
|||||||
Using the name cache is not necessary if you compress all your files in a
|
Using the name cache is not necessary if you compress all your files in a
|
||||||
single call to UglifyJS.
|
single call to UglifyJS.
|
||||||
|
|
||||||
#### Mangling unquoted names (`--mangle-props=unquoted` or `--mangle-props=2`)
|
|
||||||
|
|
||||||
Using quoted property name (`o["foo"]`) reserves the property name (`foo`)
|
|
||||||
so that it is not mangled throughout the entire script even when used in an
|
|
||||||
unquoted style (`o.foo`). Example:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ echo 'var o={"foo":1, bar:3}; o.foo += o.bar; console.log(o.foo);' | uglifyjs --mangle-props=2 -mc
|
|
||||||
var o={"foo":1,a:3};o.foo+=o.a,console.log(o.foo);
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Debugging property name mangling
|
#### Debugging property name mangling
|
||||||
|
|
||||||
You can also pass `--mangle-props-debug` in order to mangle property names
|
You can also pass `--mangle-props-debug` in order to mangle property names
|
||||||
@@ -347,15 +332,6 @@ to set `true`; it's effectively a shortcut for `foo=true`).
|
|||||||
comparison are switching. Compression only works if both `comparisons` and
|
comparison are switching. Compression only works if both `comparisons` and
|
||||||
`unsafe_comps` are both set to true.
|
`unsafe_comps` are both set to true.
|
||||||
|
|
||||||
- `unsafe_math` (default: false) -- optimize numerical expressions like
|
|
||||||
`2 * x * 3` into `6 * x`, which may give imprecise floating point results.
|
|
||||||
|
|
||||||
- `unsafe_proto` (default: false) -- optimize expressions like
|
|
||||||
`Array.prototype.slice.call(a)` into `[].slice.call(a)`
|
|
||||||
|
|
||||||
- `unsafe_regexp` (default: false) -- enable substitutions of variables with
|
|
||||||
`RegExp` values the same way as if they are constants.
|
|
||||||
|
|
||||||
- `conditionals` -- apply optimizations for `if`-s and conditional
|
- `conditionals` -- apply optimizations for `if`-s and conditional
|
||||||
expressions
|
expressions
|
||||||
|
|
||||||
@@ -371,15 +347,7 @@ to set `true`; it's effectively a shortcut for `foo=true`).
|
|||||||
- `loops` -- optimizations for `do`, `while` and `for` loops when we can
|
- `loops` -- optimizations for `do`, `while` and `for` loops when we can
|
||||||
statically determine the condition
|
statically determine the condition
|
||||||
|
|
||||||
- `unused` -- drop unreferenced functions and variables (simple direct variable
|
- `unused` -- drop unreferenced functions and variables
|
||||||
assignments do not count as references unless set to `"keep_assign"`)
|
|
||||||
|
|
||||||
- `toplevel` -- drop unreferenced functions (`"funcs"`) and/or variables (`"vars"`)
|
|
||||||
in the toplevel scope (`false` by default, `true` to drop both unreferenced
|
|
||||||
functions and variables)
|
|
||||||
|
|
||||||
- `top_retain` -- prevent specific toplevel functions and variables from `unused`
|
|
||||||
removal (can be array, comma-separated, RegExp or function. Implies `toplevel`)
|
|
||||||
|
|
||||||
- `hoist_funs` -- hoist function declarations
|
- `hoist_funs` -- hoist function declarations
|
||||||
|
|
||||||
@@ -393,11 +361,11 @@ to set `true`; it's effectively a shortcut for `foo=true`).
|
|||||||
- `cascade` -- small optimization for sequences, transform `x, x` into `x`
|
- `cascade` -- small optimization for sequences, transform `x, x` into `x`
|
||||||
and `x = something(), x` into `x = something()`
|
and `x = something(), x` into `x = something()`
|
||||||
|
|
||||||
- `collapse_vars` -- Collapse single-use `var` and `const` definitions
|
- `collapse_vars` -- default `false`. Collapse single-use `var` and `const`
|
||||||
when possible.
|
definitions when possible.
|
||||||
|
|
||||||
- `reduce_vars` -- Improve optimization on variables assigned with and
|
- `reduce_vars` -- default `false`. Improve optimization on variables assigned
|
||||||
used as constant values.
|
with and used as constant values.
|
||||||
|
|
||||||
- `warnings` -- display warnings when dropping unreachable code or unused
|
- `warnings` -- display warnings when dropping unreachable code or unused
|
||||||
declarations etc.
|
declarations etc.
|
||||||
@@ -409,8 +377,6 @@ to set `true`; it's effectively a shortcut for `foo=true`).
|
|||||||
- `pure_getters` -- the default is `false`. If you pass `true` for
|
- `pure_getters` -- the default is `false`. If you pass `true` for
|
||||||
this, UglifyJS will assume that object property access
|
this, UglifyJS will assume that object property access
|
||||||
(e.g. `foo.bar` or `foo["bar"]`) doesn't have any side effects.
|
(e.g. `foo.bar` or `foo["bar"]`) doesn't have any side effects.
|
||||||
Specify `"strict"` to treat `foo.bar` as side-effect-free only when
|
|
||||||
`foo` is certain to not throw, i.e. not `null` or `undefined`.
|
|
||||||
|
|
||||||
- `pure_funcs` -- default `null`. You can pass an array of names and
|
- `pure_funcs` -- default `null`. You can pass an array of names and
|
||||||
UglifyJS will assume that those functions do not produce side
|
UglifyJS will assume that those functions do not produce side
|
||||||
@@ -424,12 +390,7 @@ to set `true`; it's effectively a shortcut for `foo=true`).
|
|||||||
overhead (compression will be slower).
|
overhead (compression will be slower).
|
||||||
|
|
||||||
- `drop_console` -- default `false`. Pass `true` to discard calls to
|
- `drop_console` -- default `false`. Pass `true` to discard calls to
|
||||||
`console.*` functions. If you wish to drop a specific function call
|
`console.*` functions.
|
||||||
such as `console.info` and/or retain side effects from function arguments
|
|
||||||
after dropping the function call then use `pure_funcs` instead.
|
|
||||||
|
|
||||||
- `expression` -- default `false`. Pass `true` to preserve completion values
|
|
||||||
from terminal statements without `return`, e.g. in bookmarklets.
|
|
||||||
|
|
||||||
- `keep_fargs` -- default `true`. Prevents the
|
- `keep_fargs` -- default `true`. Prevents the
|
||||||
compressor from discarding unused function arguments. You need this
|
compressor from discarding unused function arguments. You need this
|
||||||
@@ -439,18 +400,9 @@ to set `true`; it's effectively a shortcut for `foo=true`).
|
|||||||
compressor from discarding function names. Useful for code relying on
|
compressor from discarding function names. Useful for code relying on
|
||||||
`Function.prototype.name`. See also: the `keep_fnames` [mangle option](#mangle).
|
`Function.prototype.name`. See also: the `keep_fnames` [mangle option](#mangle).
|
||||||
|
|
||||||
- `passes` -- default `1`. Number of times to run compress with a maximum of 3.
|
- `passes` -- default `1`. Number of times to run compress. Use an
|
||||||
In some cases more than one pass leads to further compressed code. Keep in
|
integer argument larger than 1 to further reduce code size in some cases.
|
||||||
mind more passes will take more time.
|
Note: raising the number of passes will increase uglify compress time.
|
||||||
|
|
||||||
- `keep_infinity` -- default `false`. Pass `true` to prevent `Infinity` from
|
|
||||||
being compressed into `1/0`, which may cause performance issues on Chrome.
|
|
||||||
|
|
||||||
- `side_effects` -- default `true`. Pass `false` to disable potentially dropping
|
|
||||||
functions marked as "pure". A function call is marked as "pure" if a comment
|
|
||||||
annotation `/*@__PURE__*/` or `/*#__PURE__*/` immediately precedes the call. For
|
|
||||||
example: `/*@__PURE__*/foo();`
|
|
||||||
|
|
||||||
|
|
||||||
### The `unsafe` option
|
### The `unsafe` option
|
||||||
|
|
||||||
@@ -480,8 +432,6 @@ if (DEBUG) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
You can specify nested constants in the form of `--define env.DEBUG=false`.
|
|
||||||
|
|
||||||
UglifyJS will warn about the condition being always false and about dropping
|
UglifyJS will warn about the condition being always false and about dropping
|
||||||
unreachable code; for now there is no option to turn off only this specific
|
unreachable code; for now there is no option to turn off only this specific
|
||||||
warning, you can pass `warnings=false` to turn off *all* warnings.
|
warning, you can pass `warnings=false` to turn off *all* warnings.
|
||||||
@@ -492,6 +442,8 @@ separate file and include it into the build. For example you can have a
|
|||||||
```javascript
|
```javascript
|
||||||
const DEBUG = false;
|
const DEBUG = false;
|
||||||
const PRODUCTION = true;
|
const PRODUCTION = true;
|
||||||
|
// Alternative for environments that don't support `const`
|
||||||
|
/** @const */ var STAGING = false;
|
||||||
// etc.
|
// etc.
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -502,8 +454,7 @@ and build your code like this:
|
|||||||
UglifyJS will notice the constants and, since they cannot be altered, it
|
UglifyJS will notice the constants and, since they cannot be altered, it
|
||||||
will evaluate references to them to the value itself and drop unreachable
|
will evaluate references to them to the value itself and drop unreachable
|
||||||
code as usual. The build will contain the `const` declarations if you use
|
code as usual. The build will contain the `const` declarations if you use
|
||||||
them. If you are targeting < ES6 environments which does not support `const`,
|
them. If you are targeting < ES6 environments, use `/** @const */ var`.
|
||||||
using `var` with `reduce_vars` (enabled by default) should suffice.
|
|
||||||
|
|
||||||
<a name="codegen-options"></a>
|
<a name="codegen-options"></a>
|
||||||
|
|
||||||
@@ -567,6 +518,9 @@ can pass additional arguments that control the code output:
|
|||||||
- `3` -- always use the original quotes
|
- `3` -- always use the original quotes
|
||||||
- `keep_quoted_props` (default `false`) -- when turned on, prevents stripping
|
- `keep_quoted_props` (default `false`) -- when turned on, prevents stripping
|
||||||
quotes from property names in object literals.
|
quotes from property names in object literals.
|
||||||
|
- `ecma` (default `5`) -- set output printing mode. This will only change the
|
||||||
|
output in direct control of the beautifier. Non-compatible features in the
|
||||||
|
abstract syntax tree will still be outputted as is.
|
||||||
|
|
||||||
### Keeping copyright notices or other comments
|
### Keeping copyright notices or other comments
|
||||||
|
|
||||||
@@ -638,7 +592,7 @@ function uglify(ast, options, mangle) {
|
|||||||
|
|
||||||
// Compression
|
// Compression
|
||||||
uAST.figure_out_scope();
|
uAST.figure_out_scope();
|
||||||
uAST = UglifyJS.Compressor(options).compress(uAST);
|
uAST = uAST.transform(UglifyJS.Compressor(options));
|
||||||
|
|
||||||
// Mangling (optional)
|
// Mangling (optional)
|
||||||
if (mangle) {
|
if (mangle) {
|
||||||
@@ -882,7 +836,7 @@ toplevel.figure_out_scope()
|
|||||||
Like this:
|
Like this:
|
||||||
```javascript
|
```javascript
|
||||||
var compressor = UglifyJS.Compressor(options);
|
var compressor = UglifyJS.Compressor(options);
|
||||||
var compressed_ast = compressor.compress(toplevel);
|
var compressed_ast = toplevel.transform(compressor);
|
||||||
```
|
```
|
||||||
|
|
||||||
The `options` can be missing. Available options are discussed above in
|
The `options` can be missing. Available options are discussed above in
|
||||||
@@ -986,10 +940,3 @@ The `source_map_options` (optional) can contain the following properties:
|
|||||||
[codegen]: http://lisperator.net/uglifyjs/codegen
|
[codegen]: http://lisperator.net/uglifyjs/codegen
|
||||||
[compressor]: http://lisperator.net/uglifyjs/compress
|
[compressor]: http://lisperator.net/uglifyjs/compress
|
||||||
[parser]: http://lisperator.net/uglifyjs/parser
|
[parser]: http://lisperator.net/uglifyjs/parser
|
||||||
|
|
||||||
#### Support for `const`
|
|
||||||
|
|
||||||
`const` in `uglify-js@2.x` has function scope and as such behaves much like
|
|
||||||
`var` - unlike `const` in ES2015 (ES6) which has block scope. It is recommended
|
|
||||||
to avoid using `const` for this reason as it will have undefined behavior when
|
|
||||||
run on an ES2015 compatible browser.
|
|
||||||
|
|||||||
118
bin/uglifyjs
118
bin/uglifyjs
@@ -8,6 +8,7 @@ var sys = require("util");
|
|||||||
var yargs = require("yargs");
|
var yargs = require("yargs");
|
||||||
var fs = require("fs");
|
var fs = require("fs");
|
||||||
var path = require("path");
|
var path = require("path");
|
||||||
|
var async = require("async");
|
||||||
var acorn;
|
var acorn;
|
||||||
var screw_ie8 = true;
|
var screw_ie8 = true;
|
||||||
var ARGS = yargs
|
var ARGS = yargs
|
||||||
@@ -25,8 +26,8 @@ mangling you need to use `-c` and `-m`.\
|
|||||||
.describe("source-map-inline", "Write base64-encoded source map to the end of js output. Disabled by default")
|
.describe("source-map-inline", "Write base64-encoded source map to the end of js output. Disabled by default")
|
||||||
.describe("source-map-include-sources", "Pass this flag if you want to include the content of source files in the source map as sourcesContent property.")
|
.describe("source-map-include-sources", "Pass this flag if you want to include the content of source files in the source map as sourcesContent property.")
|
||||||
.describe("in-source-map", "Input source map, useful if you're compressing JS that was generated from some other original code.")
|
.describe("in-source-map", "Input source map, useful if you're compressing JS that was generated from some other original code.")
|
||||||
.describe("screw-ie8", "Do not support Internet Explorer 6/7/8. This flag is enabled by default.")
|
.describe("screw-ie8", "Do not support Internet Explorer 6-8 quirks. This flag is enabled by default.")
|
||||||
.describe("support-ie8", "Support non-standard Internet Explorer 6/7/8 javascript.")
|
.describe("support-ie8", "Support non-standard Internet Explorer 6-8 javascript. Note: may break standards compliant `catch` identifiers.")
|
||||||
.describe("expr", "Parse a single expression, rather than a program (for parsing JSON)")
|
.describe("expr", "Parse a single expression, rather than a program (for parsing JSON)")
|
||||||
.describe("p", "Skip prefix for original filenames that appear in source maps. \
|
.describe("p", "Skip prefix for original filenames that appear in source maps. \
|
||||||
For example -p 3 will drop 3 directories from file names and ensure they are relative paths. \
|
For example -p 3 will drop 3 directories from file names and ensure they are relative paths. \
|
||||||
@@ -228,9 +229,8 @@ if (ARGS.mangle_props === true) {
|
|||||||
|
|
||||||
var OUTPUT_OPTIONS = {
|
var OUTPUT_OPTIONS = {
|
||||||
beautify : BEAUTIFY ? true : false,
|
beautify : BEAUTIFY ? true : false,
|
||||||
max_line_len : 32000,
|
|
||||||
preamble : ARGS.preamble || null,
|
preamble : ARGS.preamble || null,
|
||||||
quote_style : ARGS.quotes != null ? ARGS.quotes : 0,
|
quote_style : ARGS.quotes != null ? ARGS.quotes : 0
|
||||||
};
|
};
|
||||||
|
|
||||||
if (ARGS.mangle_props == 2) {
|
if (ARGS.mangle_props == 2) {
|
||||||
@@ -281,29 +281,21 @@ if (ARGS.self) {
|
|||||||
|
|
||||||
var ORIG_MAP = ARGS.in_source_map;
|
var ORIG_MAP = ARGS.in_source_map;
|
||||||
|
|
||||||
if (ORIG_MAP && ORIG_MAP != "inline") {
|
if (ORIG_MAP) {
|
||||||
ORIG_MAP = JSON.parse(fs.readFileSync(ORIG_MAP));
|
ORIG_MAP = JSON.parse(fs.readFileSync(ORIG_MAP));
|
||||||
if (files.length == 0) {
|
if (files.length == 0) {
|
||||||
print_error("INFO: Using file from the input source map: " + ORIG_MAP.file);
|
print_error("INFO: Using file from the input source map: " + ORIG_MAP.file);
|
||||||
files = [ ORIG_MAP.file ];
|
files = [ ORIG_MAP.file ];
|
||||||
}
|
}
|
||||||
|
if (ARGS.source_map_root == null) {
|
||||||
|
ARGS.source_map_root = ORIG_MAP.sourceRoot;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (files.length == 0) {
|
if (files.length == 0) {
|
||||||
files = [ "-" ];
|
files = [ "-" ];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ORIG_MAP == "inline") {
|
|
||||||
if (files.length > 1) {
|
|
||||||
print_error("ERROR: Inline source map only works with singular input");
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
if (ARGS.acorn || ARGS.spidermonkey) {
|
|
||||||
print_error("ERROR: Inline source map only works with built-in parser");
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (files.indexOf("-") >= 0 && ARGS.source_map) {
|
if (files.indexOf("-") >= 0 && ARGS.source_map) {
|
||||||
print_error("ERROR: Source map doesn't work with input from STDIN");
|
print_error("ERROR: Source map doesn't work with input from STDIN");
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
@@ -315,22 +307,37 @@ if (files.filter(function(el){ return el == "-" }).length > 1) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var STATS = {};
|
var STATS = {};
|
||||||
|
var OUTPUT_FILE = ARGS.o;
|
||||||
var TOPLEVEL = null;
|
var TOPLEVEL = null;
|
||||||
var P_RELATIVE = ARGS.p && ARGS.p == "relative";
|
var P_RELATIVE = ARGS.p && ARGS.p == "relative";
|
||||||
var SOURCES_CONTENT = {};
|
var SOURCES_CONTENT = {};
|
||||||
var index = 0;
|
|
||||||
|
|
||||||
!function cb() {
|
var SOURCE_MAP = (ARGS.source_map || ARGS.source_map_inline) ? UglifyJS.SourceMap({
|
||||||
if (index == files.length) return done();
|
file: P_RELATIVE ? path.relative(path.dirname(ARGS.source_map), OUTPUT_FILE) : OUTPUT_FILE,
|
||||||
var file = files[index++];
|
root: ARGS.source_map_root,
|
||||||
|
orig: ORIG_MAP,
|
||||||
|
}) : null;
|
||||||
|
|
||||||
|
OUTPUT_OPTIONS.source_map = SOURCE_MAP;
|
||||||
|
|
||||||
|
try {
|
||||||
|
var output = UglifyJS.OutputStream(OUTPUT_OPTIONS);
|
||||||
|
var compressor = COMPRESS && UglifyJS.Compressor(COMPRESS);
|
||||||
|
} catch(ex) {
|
||||||
|
if (ex instanceof UglifyJS.DefaultsError) {
|
||||||
|
print_error(ex.msg);
|
||||||
|
print_error("Supported options:");
|
||||||
|
print_error(sys.inspect(ex.defs));
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async.eachLimit(files, 1, function (file, cb) {
|
||||||
read_whole_file(file, function (err, code) {
|
read_whole_file(file, function (err, code) {
|
||||||
if (err) {
|
if (err) {
|
||||||
print_error("ERROR: can't read file: " + file);
|
print_error("ERROR: can't read file: " + file);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
if (ORIG_MAP == "inline") {
|
|
||||||
ORIG_MAP = read_source_map(code);
|
|
||||||
}
|
|
||||||
if (ARGS.p != null) {
|
if (ARGS.p != null) {
|
||||||
if (P_RELATIVE) {
|
if (P_RELATIVE) {
|
||||||
file = path.relative(path.dirname(ARGS.source_map), file).replace(/\\/g, '/');
|
file = path.relative(path.dirname(ARGS.source_map), file).replace(/\\/g, '/');
|
||||||
@@ -366,21 +373,7 @@ var index = 0;
|
|||||||
} catch(ex) {
|
} catch(ex) {
|
||||||
if (ex instanceof UglifyJS.JS_Parse_Error) {
|
if (ex instanceof UglifyJS.JS_Parse_Error) {
|
||||||
print_error("Parse error at " + file + ":" + ex.line + "," + ex.col);
|
print_error("Parse error at " + file + ":" + ex.line + "," + ex.col);
|
||||||
var col = ex.col;
|
print_error(ex.message);
|
||||||
var lines = code.split(/\r?\n/);
|
|
||||||
var line = lines[ex.line - 1];
|
|
||||||
if (!line && !col) {
|
|
||||||
line = lines[ex.line - 2];
|
|
||||||
col = line.length;
|
|
||||||
}
|
|
||||||
if (line) {
|
|
||||||
if (col > 40) {
|
|
||||||
line = line.slice(col - 40);
|
|
||||||
col = 40;
|
|
||||||
}
|
|
||||||
print_error(line.slice(0, 80));
|
|
||||||
print_error(line.slice(0, col).replace(/\S/g, " ") + "^");
|
|
||||||
}
|
|
||||||
print_error(ex.stack);
|
print_error(ex.stack);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
@@ -390,31 +383,7 @@ var index = 0;
|
|||||||
});
|
});
|
||||||
cb();
|
cb();
|
||||||
});
|
});
|
||||||
}();
|
}, function () {
|
||||||
|
|
||||||
function done() {
|
|
||||||
var OUTPUT_FILE = ARGS.o;
|
|
||||||
|
|
||||||
var SOURCE_MAP = (ARGS.source_map || ARGS.source_map_inline) ? UglifyJS.SourceMap({
|
|
||||||
file: P_RELATIVE ? path.relative(path.dirname(ARGS.source_map), OUTPUT_FILE) : OUTPUT_FILE,
|
|
||||||
root: ARGS.source_map_root || ORIG_MAP && ORIG_MAP.sourceRoot,
|
|
||||||
orig: ORIG_MAP,
|
|
||||||
}) : null;
|
|
||||||
|
|
||||||
OUTPUT_OPTIONS.source_map = SOURCE_MAP;
|
|
||||||
|
|
||||||
try {
|
|
||||||
var output = UglifyJS.OutputStream(OUTPUT_OPTIONS);
|
|
||||||
var compressor = COMPRESS && UglifyJS.Compressor(COMPRESS);
|
|
||||||
} catch(ex) {
|
|
||||||
if (ex instanceof UglifyJS.DefaultsError) {
|
|
||||||
print_error(ex.message);
|
|
||||||
print_error("Supported options:");
|
|
||||||
print_error(sys.inspect(ex.defs));
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ARGS.acorn || ARGS.spidermonkey) time_it("convert_ast", function(){
|
if (ARGS.acorn || ARGS.spidermonkey) time_it("convert_ast", function(){
|
||||||
TOPLEVEL = UglifyJS.AST_Node.from_mozilla_ast(TOPLEVEL);
|
TOPLEVEL = UglifyJS.AST_Node.from_mozilla_ast(TOPLEVEL);
|
||||||
});
|
});
|
||||||
@@ -459,11 +428,10 @@ function done() {
|
|||||||
|
|
||||||
var SCOPE_IS_NEEDED = COMPRESS || MANGLE || ARGS.lint
|
var SCOPE_IS_NEEDED = COMPRESS || MANGLE || ARGS.lint
|
||||||
var TL_CACHE = readNameCache("vars");
|
var TL_CACHE = readNameCache("vars");
|
||||||
if (MANGLE) MANGLE.cache = TL_CACHE;
|
|
||||||
|
|
||||||
if (SCOPE_IS_NEEDED) {
|
if (SCOPE_IS_NEEDED) {
|
||||||
time_it("scope", function(){
|
time_it("scope", function(){
|
||||||
TOPLEVEL.figure_out_scope(MANGLE || { screw_ie8: screw_ie8, cache: TL_CACHE });
|
TOPLEVEL.figure_out_scope({ screw_ie8: screw_ie8, cache: TL_CACHE });
|
||||||
if (ARGS.lint) {
|
if (ARGS.lint) {
|
||||||
TOPLEVEL.scope_warnings();
|
TOPLEVEL.scope_warnings();
|
||||||
}
|
}
|
||||||
@@ -478,7 +446,7 @@ function done() {
|
|||||||
|
|
||||||
if (SCOPE_IS_NEEDED) {
|
if (SCOPE_IS_NEEDED) {
|
||||||
time_it("scope", function(){
|
time_it("scope", function(){
|
||||||
TOPLEVEL.figure_out_scope(MANGLE || { screw_ie8: screw_ie8, cache: TL_CACHE });
|
TOPLEVEL.figure_out_scope({ screw_ie8: screw_ie8, cache: TL_CACHE });
|
||||||
if (MANGLE && !TL_CACHE) {
|
if (MANGLE && !TL_CACHE) {
|
||||||
TOPLEVEL.compute_char_frequency(MANGLE);
|
TOPLEVEL.compute_char_frequency(MANGLE);
|
||||||
}
|
}
|
||||||
@@ -486,6 +454,7 @@ function done() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (MANGLE) time_it("mangle", function(){
|
if (MANGLE) time_it("mangle", function(){
|
||||||
|
MANGLE.cache = TL_CACHE;
|
||||||
TOPLEVEL.mangle_names(MANGLE);
|
TOPLEVEL.mangle_names(MANGLE);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -541,7 +510,7 @@ function done() {
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
/* -----[ functions ]----- */
|
/* -----[ functions ]----- */
|
||||||
|
|
||||||
@@ -561,7 +530,7 @@ function getOptions(flag, constants) {
|
|||||||
|
|
||||||
var ast;
|
var ast;
|
||||||
try {
|
try {
|
||||||
ast = UglifyJS.parse(x, { cli: true, expression: true });
|
ast = UglifyJS.parse(x, { expression: true });
|
||||||
} catch(ex) {
|
} catch(ex) {
|
||||||
if (ex instanceof UglifyJS.JS_Parse_Error) {
|
if (ex instanceof UglifyJS.JS_Parse_Error) {
|
||||||
print_error("Error parsing arguments for flag `" + flag + "': " + x);
|
print_error("Error parsing arguments for flag `" + flag + "': " + x);
|
||||||
@@ -571,7 +540,7 @@ function getOptions(flag, constants) {
|
|||||||
ast.walk(new UglifyJS.TreeWalker(function(node){
|
ast.walk(new UglifyJS.TreeWalker(function(node){
|
||||||
if (node instanceof UglifyJS.AST_Seq) return; // descend
|
if (node instanceof UglifyJS.AST_Seq) return; // descend
|
||||||
if (node instanceof UglifyJS.AST_Assign) {
|
if (node instanceof UglifyJS.AST_Assign) {
|
||||||
var name = node.left.print_to_string().replace(/-/g, "_");
|
var name = node.left.print_to_string({ beautify: false }).replace(/-/g, "_");
|
||||||
var value = node.right;
|
var value = node.right;
|
||||||
if (constants)
|
if (constants)
|
||||||
value = new Function("return (" + value.print_to_string() + ")")();
|
value = new Function("return (" + value.print_to_string() + ")")();
|
||||||
@@ -579,7 +548,7 @@ function getOptions(flag, constants) {
|
|||||||
return true; // no descend
|
return true; // no descend
|
||||||
}
|
}
|
||||||
if (node instanceof UglifyJS.AST_Symbol || node instanceof UglifyJS.AST_Binary) {
|
if (node instanceof UglifyJS.AST_Symbol || node instanceof UglifyJS.AST_Binary) {
|
||||||
var name = node.print_to_string().replace(/-/g, "_");
|
var name = node.print_to_string({ beautify: false }).replace(/-/g, "_");
|
||||||
ret[name] = true;
|
ret[name] = true;
|
||||||
return true; // no descend
|
return true; // no descend
|
||||||
}
|
}
|
||||||
@@ -606,15 +575,6 @@ function read_whole_file(filename, cb) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function read_source_map(code) {
|
|
||||||
var match = /\n\/\/# sourceMappingURL=data:application\/json(;.*?)?;base64,(.*)/.exec(code);
|
|
||||||
if (!match) {
|
|
||||||
print_error("WARN: inline source map not found");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return JSON.parse(new Buffer(match[2], "base64"));
|
|
||||||
}
|
|
||||||
|
|
||||||
function time_it(name, cont) {
|
function time_it(name, cont) {
|
||||||
var t1 = new Date().getTime();
|
var t1 = new Date().getTime();
|
||||||
var ret = cont();
|
var ret = cont();
|
||||||
|
|||||||
462
lib/ast.js
462
lib/ast.js
@@ -81,9 +81,7 @@ function DEFNODE(type, props, methods, base) {
|
|||||||
ctor.DEFMETHOD = function(name, method) {
|
ctor.DEFMETHOD = function(name, method) {
|
||||||
this.prototype[name] = method;
|
this.prototype[name] = method;
|
||||||
};
|
};
|
||||||
if (typeof exports !== "undefined") {
|
|
||||||
exports["AST_" + type] = ctor;
|
exports["AST_" + type] = ctor;
|
||||||
}
|
|
||||||
return ctor;
|
return ctor;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -91,20 +89,9 @@ var AST_Token = DEFNODE("Token", "type value line col pos endline endcol endpos
|
|||||||
}, null);
|
}, null);
|
||||||
|
|
||||||
var AST_Node = DEFNODE("Node", "start end", {
|
var AST_Node = DEFNODE("Node", "start end", {
|
||||||
_clone: function(deep) {
|
clone: function() {
|
||||||
if (deep) {
|
|
||||||
var self = this.clone();
|
|
||||||
return self.transform(new TreeTransformer(function(node) {
|
|
||||||
if (node !== self) {
|
|
||||||
return node.clone(true);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
return new this.CTOR(this);
|
return new this.CTOR(this);
|
||||||
},
|
},
|
||||||
clone: function(deep) {
|
|
||||||
return this._clone(deep);
|
|
||||||
},
|
|
||||||
$documentation: "Base class of all AST nodes",
|
$documentation: "Base class of all AST nodes",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
start: "[AST_Token] The first token of this node",
|
start: "[AST_Token] The first token of this node",
|
||||||
@@ -156,13 +143,12 @@ var AST_SimpleStatement = DEFNODE("SimpleStatement", "body", {
|
|||||||
}, AST_Statement);
|
}, AST_Statement);
|
||||||
|
|
||||||
function walk_body(node, visitor) {
|
function walk_body(node, visitor) {
|
||||||
var body = node.body;
|
if (node.body instanceof AST_Node) {
|
||||||
if (body instanceof AST_Statement) {
|
node.body._walk(visitor);
|
||||||
body._walk(visitor);
|
|
||||||
}
|
|
||||||
else for (var i = 0, len = body.length; i < len; i++) {
|
|
||||||
body[i]._walk(visitor);
|
|
||||||
}
|
}
|
||||||
|
else node.body.forEach(function(stat){
|
||||||
|
stat._walk(visitor);
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
var AST_Block = DEFNODE("Block", "body", {
|
var AST_Block = DEFNODE("Block", "body", {
|
||||||
@@ -210,21 +196,6 @@ var AST_LabeledStatement = DEFNODE("LabeledStatement", "label", {
|
|||||||
this.label._walk(visitor);
|
this.label._walk(visitor);
|
||||||
this.body._walk(visitor);
|
this.body._walk(visitor);
|
||||||
});
|
});
|
||||||
},
|
|
||||||
clone: function(deep) {
|
|
||||||
var node = this._clone(deep);
|
|
||||||
if (deep) {
|
|
||||||
var label = node.label;
|
|
||||||
var def = this.label;
|
|
||||||
node.walk(new TreeWalker(function(node) {
|
|
||||||
if (node instanceof AST_LoopControl
|
|
||||||
&& node.label && node.label.thedef === def) {
|
|
||||||
node.label.thedef = label;
|
|
||||||
label.references.push(node);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
return node;
|
|
||||||
}
|
}
|
||||||
}, AST_StatementWithBody);
|
}, AST_StatementWithBody);
|
||||||
|
|
||||||
@@ -292,6 +263,10 @@ var AST_ForIn = DEFNODE("ForIn", "init name object", {
|
|||||||
}
|
}
|
||||||
}, AST_IterationStatement);
|
}, AST_IterationStatement);
|
||||||
|
|
||||||
|
var AST_ForOf = DEFNODE("ForOf", null, {
|
||||||
|
$documentation: "A `for ... of` statement",
|
||||||
|
}, AST_ForIn);
|
||||||
|
|
||||||
var AST_With = DEFNODE("With", "expression", {
|
var AST_With = DEFNODE("With", "expression", {
|
||||||
$documentation: "A `with` statement",
|
$documentation: "A `with` statement",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
@@ -319,6 +294,13 @@ var AST_Scope = DEFNODE("Scope", "directives variables functions uses_with uses_
|
|||||||
enclosed: "[SymbolDef*/S] a list of all symbol definitions that are accessed from this scope or any subscopes",
|
enclosed: "[SymbolDef*/S] a list of all symbol definitions that are accessed from this scope or any subscopes",
|
||||||
cname: "[integer/S] current index for mangling variables (used internally by the mangler)",
|
cname: "[integer/S] current index for mangling variables (used internally by the mangler)",
|
||||||
},
|
},
|
||||||
|
get_defun_scope: function () {
|
||||||
|
var self = this;
|
||||||
|
while (self.is_block_scope() && self.parent_scope) {
|
||||||
|
self = self.parent_scope;
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
}, AST_Block);
|
}, AST_Block);
|
||||||
|
|
||||||
var AST_Toplevel = DEFNODE("Toplevel", "globals", {
|
var AST_Toplevel = DEFNODE("Toplevel", "globals", {
|
||||||
@@ -388,20 +370,103 @@ var AST_Toplevel = DEFNODE("Toplevel", "globals", {
|
|||||||
}
|
}
|
||||||
}, AST_Scope);
|
}, AST_Scope);
|
||||||
|
|
||||||
var AST_Lambda = DEFNODE("Lambda", "name argnames uses_arguments", {
|
var AST_Expansion = DEFNODE("Expansion", "expression", {
|
||||||
|
$documentation: "An expandible argument, such as ...rest, a splat, such as [1,2,...all], or an expansion in a variable declaration, such as var [first, ...rest] = list",
|
||||||
|
$propdoc: {
|
||||||
|
expression: "AST_Symbol the thing to be expanded"
|
||||||
|
},
|
||||||
|
_walk: function(visitor) {
|
||||||
|
var self = this;
|
||||||
|
return visitor._visit(this, function(){
|
||||||
|
self.expression.walk(visitor);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var AST_ArrowParametersOrSeq = DEFNODE("ArrowParametersOrSeq", "expressions", {
|
||||||
|
$documentation: "A set of arrow function parameters or a sequence expression. This is used because when the parser sees a \"(\" it could be the start of a seq, or the start of a parameter list of an arrow function.",
|
||||||
|
$propdoc: {
|
||||||
|
expressions: "[AST_Expression|AST_Destructuring|AST_Expansion*] array of expressions or argument names or destructurings."
|
||||||
|
},
|
||||||
|
as_params: function (croak) {
|
||||||
|
// We don't want anything which doesn't belong in a destructuring
|
||||||
|
var root = this;
|
||||||
|
return this.expressions.map(function to_fun_args(ex, _, __, default_seen_above) {
|
||||||
|
if (ex instanceof AST_Object) {
|
||||||
|
return new AST_Destructuring({
|
||||||
|
start: ex.start,
|
||||||
|
end: ex.end,
|
||||||
|
is_array: false,
|
||||||
|
default: default_seen_above,
|
||||||
|
names: ex.properties.map(to_fun_args)
|
||||||
|
});
|
||||||
|
} else if (ex instanceof AST_ObjectKeyVal) {
|
||||||
|
if (ex.key instanceof AST_SymbolRef) {
|
||||||
|
ex.key = to_fun_args(ex.key, 0, [ex.key], ex.default);
|
||||||
|
}
|
||||||
|
ex.value = to_fun_args(ex.value, 0, [ex.key], ex.default);
|
||||||
|
return ex;
|
||||||
|
} else if (ex instanceof AST_Hole) {
|
||||||
|
return ex;
|
||||||
|
} else if (ex instanceof AST_Destructuring) {
|
||||||
|
if (ex.names.length == 0)
|
||||||
|
croak("Invalid destructuring function parameter", ex.start.line, ex.start.col);
|
||||||
|
ex.names = ex.names.map(to_fun_args);
|
||||||
|
return ex;
|
||||||
|
} else if (ex instanceof AST_SymbolRef) {
|
||||||
|
return new AST_SymbolFunarg({
|
||||||
|
name: ex.name,
|
||||||
|
default: default_seen_above,
|
||||||
|
start: ex.start,
|
||||||
|
end: ex.end
|
||||||
|
});
|
||||||
|
} else if (ex instanceof AST_Expansion) {
|
||||||
|
return ex;
|
||||||
|
} else if (ex instanceof AST_Array) {
|
||||||
|
return new AST_Destructuring({
|
||||||
|
start: ex.start,
|
||||||
|
end: ex.end,
|
||||||
|
is_array: true,
|
||||||
|
default: default_seen_above,
|
||||||
|
names: ex.elements.map(to_fun_args)
|
||||||
|
});
|
||||||
|
} else if (ex instanceof AST_Assign) {
|
||||||
|
return to_fun_args(ex.left, undefined, undefined, ex.right);
|
||||||
|
} else {
|
||||||
|
croak("Invalid function parameter", ex.start.line, ex.start.col);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
as_expr: function (croak) {
|
||||||
|
return AST_Seq.from_array(this.expressions);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var AST_Lambda = DEFNODE("Lambda", "name argnames uses_arguments is_generator", {
|
||||||
$documentation: "Base class for functions",
|
$documentation: "Base class for functions",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
|
is_generator: "[boolean] is generatorFn or not",
|
||||||
name: "[AST_SymbolDeclaration?] the name of this function",
|
name: "[AST_SymbolDeclaration?] the name of this function",
|
||||||
argnames: "[AST_SymbolFunarg*] array of function arguments",
|
argnames: "[AST_SymbolFunarg|AST_Destructuring|AST_Expansion*] array of function arguments, destructurings, or expanding arguments",
|
||||||
uses_arguments: "[boolean/S] tells whether this function accesses the arguments array"
|
uses_arguments: "[boolean/S] tells whether this function accesses the arguments array"
|
||||||
},
|
},
|
||||||
|
args_as_names: function () {
|
||||||
|
var out = [];
|
||||||
|
for (var i = 0; i < this.argnames.length; i++) {
|
||||||
|
if (this.argnames[i] instanceof AST_Destructuring) {
|
||||||
|
out = out.concat(this.argnames[i].all_symbols());
|
||||||
|
} else {
|
||||||
|
out.push(this.argnames[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function(){
|
||||||
if (this.name) this.name._walk(visitor);
|
if (this.name) this.name._walk(visitor);
|
||||||
var argnames = this.argnames;
|
this.argnames.forEach(function(arg){
|
||||||
for (var i = 0, len = argnames.length; i < len; i++) {
|
arg._walk(visitor);
|
||||||
argnames[i]._walk(visitor);
|
});
|
||||||
}
|
|
||||||
walk_body(this, visitor);
|
walk_body(this, visitor);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -415,10 +480,79 @@ var AST_Function = DEFNODE("Function", null, {
|
|||||||
$documentation: "A function expression"
|
$documentation: "A function expression"
|
||||||
}, AST_Lambda);
|
}, AST_Lambda);
|
||||||
|
|
||||||
|
var AST_Arrow = DEFNODE("Arrow", null, {
|
||||||
|
$documentation: "An ES6 Arrow function ((a) => b)"
|
||||||
|
}, AST_Lambda);
|
||||||
|
|
||||||
var AST_Defun = DEFNODE("Defun", null, {
|
var AST_Defun = DEFNODE("Defun", null, {
|
||||||
$documentation: "A function definition"
|
$documentation: "A function definition"
|
||||||
}, AST_Lambda);
|
}, AST_Lambda);
|
||||||
|
|
||||||
|
/* -----[ DESTRUCTURING ]----- */
|
||||||
|
var AST_Destructuring = DEFNODE("Destructuring", "names is_array default", {
|
||||||
|
$documentation: "A destructuring of several names. Used in destructuring assignment and with destructuring function argument names",
|
||||||
|
$propdoc: {
|
||||||
|
"names": "[AST_Destructuring|AST_Expansion|AST_Hole|AST_ObjectKeyVal|AST_Symbol] Array of properties or elements",
|
||||||
|
"is_array": "[Boolean] Whether the destructuring represents an object or array",
|
||||||
|
"default": "[AST_Node?] Default assign value"
|
||||||
|
},
|
||||||
|
_walk: function(visitor) {
|
||||||
|
return visitor._visit(this, function(){
|
||||||
|
this.names.forEach(function(name){
|
||||||
|
name._walk(visitor);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
all_symbols: function() {
|
||||||
|
var out = [];
|
||||||
|
this.walk(new TreeWalker(function (node) {
|
||||||
|
if (node instanceof AST_Symbol) {
|
||||||
|
out.push(node);
|
||||||
|
}
|
||||||
|
if (node instanceof AST_Expansion) {
|
||||||
|
out.push(node.expression);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var AST_PrefixedTemplateString = DEFNODE("PrefixedTemplateString", "template_string prefix", {
|
||||||
|
$documentation: "A templatestring with a prefix, such as String.raw`foobarbaz`",
|
||||||
|
$propdoc: {
|
||||||
|
template_string: "[AST_TemplateString] The template string",
|
||||||
|
prefix: "[AST_SymbolRef|AST_PropAccess] The prefix, which can be a symbol such as `foo` or a dotted expression such as `String.raw`."
|
||||||
|
},
|
||||||
|
_walk: function(visitor) {
|
||||||
|
this.prefix._walk(visitor);
|
||||||
|
this.template_string._walk(visitor);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
var AST_TemplateString = DEFNODE("TemplateString", "segments", {
|
||||||
|
$documentation: "A template string literal",
|
||||||
|
$propdoc: {
|
||||||
|
segments: "[AST_TemplateSegment|AST_Expression]* One or more segments, starting with AST_TemplateSegment. AST_Expression may follow AST_TemplateSegment, but each AST_Expression must be followed by AST_TemplateSegment."
|
||||||
|
},
|
||||||
|
_walk: function(visitor) {
|
||||||
|
return visitor._visit(this, function(){
|
||||||
|
this.segments.forEach(function(seg, i){
|
||||||
|
if (i % 2 !== 0) {
|
||||||
|
seg._walk(visitor);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var AST_TemplateSegment = DEFNODE("TemplateSegment", "value raw", {
|
||||||
|
$documentation: "A segment of a template string literal",
|
||||||
|
$propdoc: {
|
||||||
|
value: "Content of the segment",
|
||||||
|
raw: "Raw content of the segment"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
/* -----[ JUMPS ]----- */
|
/* -----[ JUMPS ]----- */
|
||||||
|
|
||||||
var AST_Jump = DEFNODE("Jump", null, {
|
var AST_Jump = DEFNODE("Jump", null, {
|
||||||
@@ -561,10 +695,9 @@ var AST_Definitions = DEFNODE("Definitions", "definitions", {
|
|||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function(){
|
||||||
var definitions = this.definitions;
|
this.definitions.forEach(function(def){
|
||||||
for (var i = 0, len = definitions.length; i < len; i++) {
|
def._walk(visitor);
|
||||||
definitions[i]._walk(visitor);
|
});
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, AST_Statement);
|
}, AST_Statement);
|
||||||
@@ -573,16 +706,78 @@ var AST_Var = DEFNODE("Var", null, {
|
|||||||
$documentation: "A `var` statement"
|
$documentation: "A `var` statement"
|
||||||
}, AST_Definitions);
|
}, AST_Definitions);
|
||||||
|
|
||||||
|
var AST_Let = DEFNODE("Let", null, {
|
||||||
|
$documentation: "A `let` statement"
|
||||||
|
}, AST_Definitions);
|
||||||
|
|
||||||
var AST_Const = DEFNODE("Const", null, {
|
var AST_Const = DEFNODE("Const", null, {
|
||||||
$documentation: "A `const` statement"
|
$documentation: "A `const` statement"
|
||||||
}, AST_Definitions);
|
}, AST_Definitions);
|
||||||
|
|
||||||
|
var AST_NameImport = DEFNODE("NameImport", "foreign_name name", {
|
||||||
|
$documentation: "The part of the import statement that imports names from a module.",
|
||||||
|
$propdoc: {
|
||||||
|
foreign_name: "[AST_SymbolImportForeign] The name being imported (as specified in the module)",
|
||||||
|
name: "[AST_SymbolImport] The name as it becomes available to this module."
|
||||||
|
},
|
||||||
|
_walk: function (visitor) {
|
||||||
|
return visitor._visit(this, function() {
|
||||||
|
this.foreign_name._walk(visitor);
|
||||||
|
this.name._walk(visitor);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
var AST_Import = DEFNODE("Import", "imported_name imported_names module_name", {
|
||||||
|
$documentation: "An `import` statement",
|
||||||
|
$propdoc: {
|
||||||
|
imported_name: "[AST_SymbolImport] The name of the variable holding the module's default export.",
|
||||||
|
imported_names: "[AST_NameImport*] The names of non-default imported variables",
|
||||||
|
module_name: "[AST_String] String literal describing where this module came from",
|
||||||
|
},
|
||||||
|
_walk: function(visitor) {
|
||||||
|
return visitor._visit(this, function() {
|
||||||
|
if (this.imported_name) {
|
||||||
|
this.imported_name._walk(visitor);
|
||||||
|
}
|
||||||
|
if (this.imported_names) {
|
||||||
|
this.imported_names.forEach(function (name_import) {
|
||||||
|
name_import._walk(visitor);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
this.module_name._walk(visitor);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var AST_Export = DEFNODE("Export", "exported_definition exported_value is_default", {
|
||||||
|
$documentation: "An `export` statement",
|
||||||
|
$propdoc: {
|
||||||
|
exported_definition: "[AST_Defun|AST_Definitions|AST_DefClass?] An exported definition",
|
||||||
|
exported_value: "[AST_Node?] An exported value",
|
||||||
|
is_default: "[Boolean] Whether this is the default exported value of this module"
|
||||||
|
},
|
||||||
|
_walk: function (visitor) {
|
||||||
|
visitor._visit(this, function () {
|
||||||
|
if (this.exported_definition) {
|
||||||
|
this.exported_definition._walk(visitor);
|
||||||
|
}
|
||||||
|
if (this.exported_value) {
|
||||||
|
this.exported_value._walk(visitor);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, AST_Statement);
|
||||||
|
|
||||||
var AST_VarDef = DEFNODE("VarDef", "name value", {
|
var AST_VarDef = DEFNODE("VarDef", "name value", {
|
||||||
$documentation: "A variable declaration; only appears in a AST_Definitions node",
|
$documentation: "A variable declaration; only appears in a AST_Definitions node",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
name: "[AST_SymbolVar|AST_SymbolConst] name of the variable",
|
name: "[AST_SymbolVar|AST_SymbolConst|AST_Destructuring] name of the variable",
|
||||||
value: "[AST_Node?] initializer, or null of there's no initializer"
|
value: "[AST_Node?] initializer, or null of there's no initializer"
|
||||||
},
|
},
|
||||||
|
is_destructuring: function() {
|
||||||
|
return this.name instanceof AST_Destructuring;
|
||||||
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function(){
|
||||||
this.name._walk(visitor);
|
this.name._walk(visitor);
|
||||||
@@ -602,10 +797,9 @@ var AST_Call = DEFNODE("Call", "expression args", {
|
|||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function(){
|
||||||
this.expression._walk(visitor);
|
this.expression._walk(visitor);
|
||||||
var args = this.args;
|
this.args.forEach(function(arg){
|
||||||
for (var i = 0, len = args.length; i < len; i++) {
|
arg._walk(visitor);
|
||||||
args[i]._walk(visitor);
|
});
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -772,10 +966,9 @@ var AST_Array = DEFNODE("Array", "elements", {
|
|||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function(){
|
||||||
var elements = this.elements;
|
this.elements.forEach(function(el){
|
||||||
for (var i = 0, len = elements.length; i < len; i++) {
|
el._walk(visitor);
|
||||||
elements[i]._walk(visitor);
|
});
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -787,10 +980,9 @@ var AST_Object = DEFNODE("Object", "properties", {
|
|||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function(){
|
||||||
var properties = this.properties;
|
this.properties.forEach(function(prop){
|
||||||
for (var i = 0, len = properties.length; i < len; i++) {
|
prop._walk(visitor);
|
||||||
properties[i]._walk(visitor);
|
});
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -798,38 +990,99 @@ var AST_Object = DEFNODE("Object", "properties", {
|
|||||||
var AST_ObjectProperty = DEFNODE("ObjectProperty", "key value", {
|
var AST_ObjectProperty = DEFNODE("ObjectProperty", "key value", {
|
||||||
$documentation: "Base class for literal object properties",
|
$documentation: "Base class for literal object properties",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
key: "[string] the property name converted to a string for ObjectKeyVal. For setters and getters this is an AST_SymbolAccessor.",
|
key: "[string|AST_Node] the property name converted to a string for ObjectKeyVal. For setters, getters and computed property this is an arbitrary AST_Node",
|
||||||
value: "[AST_Node] property value. For setters and getters this is an AST_Accessor."
|
value: "[AST_Node] property value. For setters and getters this is an AST_Function.",
|
||||||
|
default: "[AST_Expression] The default for this parameter, only used when nested inside a binding pattern"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function(){
|
||||||
|
if (this.key instanceof AST_Node)
|
||||||
|
this.key._walk(visitor);
|
||||||
this.value._walk(visitor);
|
this.value._walk(visitor);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var AST_ObjectKeyVal = DEFNODE("ObjectKeyVal", "quote", {
|
var AST_ObjectKeyVal = DEFNODE("ObjectKeyVal", "quote default", {
|
||||||
$documentation: "A key: value object property",
|
$documentation: "A key: value object property",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
quote: "[string] the original quote character"
|
quote: "[string] the original quote character",
|
||||||
|
default: "[AST_Expression] The default parameter value, only used when nested inside a binding pattern"
|
||||||
}
|
}
|
||||||
}, AST_ObjectProperty);
|
}, AST_ObjectProperty);
|
||||||
|
|
||||||
var AST_ObjectSetter = DEFNODE("ObjectSetter", null, {
|
var AST_ObjectSetter = DEFNODE("ObjectSetter", "quote static", {
|
||||||
|
$propdoc: {
|
||||||
|
quote: "[string|undefined] the original quote character, if any",
|
||||||
|
static: "[boolean] whether this is a static setter (classes only)"
|
||||||
|
},
|
||||||
$documentation: "An object setter property",
|
$documentation: "An object setter property",
|
||||||
}, AST_ObjectProperty);
|
}, AST_ObjectProperty);
|
||||||
|
|
||||||
var AST_ObjectGetter = DEFNODE("ObjectGetter", null, {
|
var AST_ObjectGetter = DEFNODE("ObjectGetter", "quote static", {
|
||||||
|
$propdoc: {
|
||||||
|
quote: "[string|undefined] the original quote character, if any",
|
||||||
|
static: "[boolean] whether this is a static getter (classes only)"
|
||||||
|
},
|
||||||
$documentation: "An object getter property",
|
$documentation: "An object getter property",
|
||||||
}, AST_ObjectProperty);
|
}, AST_ObjectProperty);
|
||||||
|
|
||||||
var AST_Symbol = DEFNODE("Symbol", "scope name thedef", {
|
var AST_ConciseMethod = DEFNODE("ConciseMethod", "quote static is_generator", {
|
||||||
|
$propdoc: {
|
||||||
|
quote: "[string|undefined] the original quote character, if any",
|
||||||
|
static: "[boolean] whether this method is static (classes only)",
|
||||||
|
is_generator: "[boolean] is generatorFn or not",
|
||||||
|
},
|
||||||
|
$documentation: "An ES6 concise method inside an object or class"
|
||||||
|
}, AST_ObjectProperty);
|
||||||
|
|
||||||
|
var AST_Class = DEFNODE("Class", "name extends properties", {
|
||||||
|
$propdoc: {
|
||||||
|
name: "[AST_SymbolClass|AST_SymbolDefClass?] optional class name.",
|
||||||
|
extends: "[AST_Node]? optional parent class",
|
||||||
|
properties: "[AST_ObjectProperty*] array of properties"
|
||||||
|
},
|
||||||
|
$documentation: "An ES6 class",
|
||||||
|
_walk: function(visitor) {
|
||||||
|
return visitor._visit(this, function(){
|
||||||
|
if (this.name) {
|
||||||
|
this.name._walk(visitor);
|
||||||
|
}
|
||||||
|
if (this.extends) {
|
||||||
|
this.extends._walk(visitor);
|
||||||
|
}
|
||||||
|
this.properties.forEach(function(prop){
|
||||||
|
prop._walk(visitor);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
}, AST_Scope);
|
||||||
|
|
||||||
|
var AST_DefClass = DEFNODE("DefClass", null, {
|
||||||
|
$documentation: "A class definition",
|
||||||
|
}, AST_Class);
|
||||||
|
|
||||||
|
var AST_ClassExpression = DEFNODE("ClassExpression", null, {
|
||||||
|
$documentation: "A class expression."
|
||||||
|
}, AST_Class);
|
||||||
|
|
||||||
|
var AST_Symbol = DEFNODE("Symbol", "scope name thedef default", {
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
name: "[string] name of this symbol",
|
name: "[string] name of this symbol",
|
||||||
scope: "[AST_Scope/S] the current scope (not necessarily the definition scope)",
|
scope: "[AST_Scope/S] the current scope (not necessarily the definition scope)",
|
||||||
thedef: "[SymbolDef/S] the definition of this symbol"
|
thedef: "[SymbolDef/S] the definition of this symbol",
|
||||||
|
default: "[AST_Expression] The default parameter value, only used when nested inside a binding pattern"
|
||||||
},
|
},
|
||||||
$documentation: "Base class for all symbols",
|
$documentation: "Base class for all symbols",
|
||||||
|
_walk: function (visitor) {
|
||||||
|
return visitor._visit(this, function() {
|
||||||
|
if (this.default) this.default._walk(visitor);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var AST_NewTarget = DEFNODE("NewTarget", null, {
|
||||||
|
$documentation: "A reference to new.target"
|
||||||
});
|
});
|
||||||
|
|
||||||
var AST_SymbolAccessor = DEFNODE("SymbolAccessor", null, {
|
var AST_SymbolAccessor = DEFNODE("SymbolAccessor", null, {
|
||||||
@@ -838,15 +1091,26 @@ var AST_SymbolAccessor = DEFNODE("SymbolAccessor", null, {
|
|||||||
|
|
||||||
var AST_SymbolDeclaration = DEFNODE("SymbolDeclaration", "init", {
|
var AST_SymbolDeclaration = DEFNODE("SymbolDeclaration", "init", {
|
||||||
$documentation: "A declaration symbol (symbol in var/const, function name or argument, symbol in catch)",
|
$documentation: "A declaration symbol (symbol in var/const, function name or argument, symbol in catch)",
|
||||||
|
$propdoc: {
|
||||||
|
init: "[AST_Node*/S] array of initializers for this declaration."
|
||||||
|
},
|
||||||
}, AST_Symbol);
|
}, AST_Symbol);
|
||||||
|
|
||||||
var AST_SymbolVar = DEFNODE("SymbolVar", null, {
|
var AST_SymbolVar = DEFNODE("SymbolVar", null, {
|
||||||
$documentation: "Symbol defining a variable",
|
$documentation: "Symbol defining a variable",
|
||||||
}, AST_SymbolDeclaration);
|
}, AST_SymbolDeclaration);
|
||||||
|
|
||||||
|
var AST_SymbolBlockDeclaration = DEFNODE("SymbolBlockDeclaration", null, {
|
||||||
|
$documentation: "Base class for block-scoped declaration symbols"
|
||||||
|
}, AST_SymbolDeclaration);
|
||||||
|
|
||||||
var AST_SymbolConst = DEFNODE("SymbolConst", null, {
|
var AST_SymbolConst = DEFNODE("SymbolConst", null, {
|
||||||
$documentation: "A constant declaration"
|
$documentation: "A constant declaration"
|
||||||
}, AST_SymbolDeclaration);
|
}, AST_SymbolBlockDeclaration);
|
||||||
|
|
||||||
|
var AST_SymbolLet = DEFNODE("SymbolLet", null, {
|
||||||
|
$documentation: "A block-scoped `let` declaration"
|
||||||
|
}, AST_SymbolBlockDeclaration);
|
||||||
|
|
||||||
var AST_SymbolFunarg = DEFNODE("SymbolFunarg", null, {
|
var AST_SymbolFunarg = DEFNODE("SymbolFunarg", null, {
|
||||||
$documentation: "Symbol naming a function argument",
|
$documentation: "Symbol naming a function argument",
|
||||||
@@ -856,13 +1120,33 @@ var AST_SymbolDefun = DEFNODE("SymbolDefun", null, {
|
|||||||
$documentation: "Symbol defining a function",
|
$documentation: "Symbol defining a function",
|
||||||
}, AST_SymbolDeclaration);
|
}, AST_SymbolDeclaration);
|
||||||
|
|
||||||
|
var AST_SymbolMethod = DEFNODE("SymbolMethod", null, {
|
||||||
|
$documentation: "Symbol in an object defining a method",
|
||||||
|
}, AST_Symbol);
|
||||||
|
|
||||||
var AST_SymbolLambda = DEFNODE("SymbolLambda", null, {
|
var AST_SymbolLambda = DEFNODE("SymbolLambda", null, {
|
||||||
$documentation: "Symbol naming a function expression",
|
$documentation: "Symbol naming a function expression",
|
||||||
}, AST_SymbolDeclaration);
|
}, AST_SymbolDeclaration);
|
||||||
|
|
||||||
|
var AST_SymbolDefClass = DEFNODE("SymbolDefClass", null, {
|
||||||
|
$documentation: "Symbol naming a class's name in a class declaration. Lexically scoped to its containing scope, and accessible within the class."
|
||||||
|
}, AST_SymbolBlockDeclaration);
|
||||||
|
|
||||||
|
var AST_SymbolClass = DEFNODE("SymbolClass", null, {
|
||||||
|
$documentation: "Symbol naming a class's name. Lexically scoped to the class."
|
||||||
|
}, AST_SymbolDeclaration);
|
||||||
|
|
||||||
var AST_SymbolCatch = DEFNODE("SymbolCatch", null, {
|
var AST_SymbolCatch = DEFNODE("SymbolCatch", null, {
|
||||||
$documentation: "Symbol naming the exception in catch",
|
$documentation: "Symbol naming the exception in catch",
|
||||||
}, AST_SymbolDeclaration);
|
}, AST_SymbolBlockDeclaration);
|
||||||
|
|
||||||
|
var AST_SymbolImport = DEFNODE("SymbolImport", null, {
|
||||||
|
$documentation: "Symbol refering to an imported name",
|
||||||
|
}, AST_SymbolBlockDeclaration);
|
||||||
|
|
||||||
|
var AST_SymbolImportForeign = DEFNODE("SymbolImportForeign", null, {
|
||||||
|
$documentation: "A symbol imported from a module, but it is defined in the other module, and its real name is irrelevant for this module's purposes",
|
||||||
|
}, AST_Symbol);
|
||||||
|
|
||||||
var AST_Label = DEFNODE("Label", "references", {
|
var AST_Label = DEFNODE("Label", "references", {
|
||||||
$documentation: "Symbol naming a label (declaration)",
|
$documentation: "Symbol naming a label (declaration)",
|
||||||
@@ -887,6 +1171,10 @@ var AST_This = DEFNODE("This", null, {
|
|||||||
$documentation: "The `this` symbol",
|
$documentation: "The `this` symbol",
|
||||||
}, AST_Symbol);
|
}, AST_Symbol);
|
||||||
|
|
||||||
|
var AST_Super = DEFNODE("Super", null, {
|
||||||
|
$documentation: "The `super` symbol",
|
||||||
|
}, AST_Symbol);
|
||||||
|
|
||||||
var AST_Constant = DEFNODE("Constant", null, {
|
var AST_Constant = DEFNODE("Constant", null, {
|
||||||
$documentation: "Base class for all constants",
|
$documentation: "Base class for all constants",
|
||||||
getValue: function() {
|
getValue: function() {
|
||||||
@@ -960,6 +1248,21 @@ var AST_True = DEFNODE("True", null, {
|
|||||||
value: true
|
value: true
|
||||||
}, AST_Boolean);
|
}, AST_Boolean);
|
||||||
|
|
||||||
|
/* -----[ Yield ]----- */
|
||||||
|
|
||||||
|
var AST_Yield = DEFNODE("Yield", "expression is_star", {
|
||||||
|
$documentation: "A `yield` statement",
|
||||||
|
$propdoc: {
|
||||||
|
expression: "[AST_Node?] the value returned or thrown by this statement; could be null (representing undefined) but only when is_star is set to false",
|
||||||
|
is_star: "[Boolean] Whether this is a yield or yield* statement"
|
||||||
|
},
|
||||||
|
_walk: function(visitor) {
|
||||||
|
return visitor._visit(this, this.expression && function(){
|
||||||
|
this.expression._walk(visitor);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
/* -----[ TreeWalker ]----- */
|
/* -----[ TreeWalker ]----- */
|
||||||
|
|
||||||
function TreeWalker(callback) {
|
function TreeWalker(callback) {
|
||||||
@@ -985,14 +1288,17 @@ TreeWalker.prototype = {
|
|||||||
push: function (node) {
|
push: function (node) {
|
||||||
if (node instanceof AST_Lambda) {
|
if (node instanceof AST_Lambda) {
|
||||||
this.directives = Object.create(this.directives);
|
this.directives = Object.create(this.directives);
|
||||||
} else if (node instanceof AST_Directive && !this.directives[node.value]) {
|
} else if (node instanceof AST_Directive) {
|
||||||
this.directives[node.value] = node;
|
this.directives[node.value] = this.directives[node.value] ? "up" : true;
|
||||||
|
} else if (node instanceof AST_Class) {
|
||||||
|
this.directives = Object.create(this.directives);
|
||||||
|
this.directives["use strict"] = this.directives["use strict"] ? "up" : true;
|
||||||
}
|
}
|
||||||
this.stack.push(node);
|
this.stack.push(node);
|
||||||
},
|
},
|
||||||
pop: function(node) {
|
pop: function(node) {
|
||||||
this.stack.pop();
|
this.stack.pop();
|
||||||
if (node instanceof AST_Lambda) {
|
if (node instanceof AST_Lambda || node instanceof AST_Class) {
|
||||||
this.directives = Object.getPrototypeOf(this.directives);
|
this.directives = Object.getPrototypeOf(this.directives);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1010,11 +1316,11 @@ TreeWalker.prototype = {
|
|||||||
var dir = this.directives[type];
|
var dir = this.directives[type];
|
||||||
if (dir) return dir;
|
if (dir) return dir;
|
||||||
var node = this.stack[this.stack.length - 1];
|
var node = this.stack[this.stack.length - 1];
|
||||||
if (node instanceof AST_Scope) {
|
if (node instanceof AST_Scope && node.body) {
|
||||||
for (var i = 0; i < node.body.length; ++i) {
|
for (var i = 0; i < node.body.length; ++i) {
|
||||||
var st = node.body[i];
|
var st = node.body[i];
|
||||||
if (!(st instanceof AST_Directive)) break;
|
if (!(st instanceof AST_Directive)) break;
|
||||||
if (st.value == type) return st;
|
if (st.value == type) return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1036,16 +1342,16 @@ TreeWalker.prototype = {
|
|||||||
self = p;
|
self = p;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
loopcontrol_target: function(node) {
|
loopcontrol_target: function(label) {
|
||||||
var stack = this.stack;
|
var stack = this.stack;
|
||||||
if (node.label) for (var i = stack.length; --i >= 0;) {
|
if (label) for (var i = stack.length; --i >= 0;) {
|
||||||
var x = stack[i];
|
var x = stack[i];
|
||||||
if (x instanceof AST_LabeledStatement && x.label.name == node.label.name)
|
if (x instanceof AST_LabeledStatement && x.label.name == label.name) {
|
||||||
return x.body;
|
return x.body;
|
||||||
|
}
|
||||||
} else for (var i = stack.length; --i >= 0;) {
|
} else for (var i = stack.length; --i >= 0;) {
|
||||||
var x = stack[i];
|
var x = stack[i];
|
||||||
if (x instanceof AST_IterationStatement
|
if (x instanceof AST_Switch || x instanceof AST_IterationStatement)
|
||||||
|| node instanceof AST_Break && x instanceof AST_Switch)
|
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
2675
lib/compress.js
2675
lib/compress.js
File diff suppressed because it is too large
Load Diff
@@ -111,19 +111,23 @@
|
|||||||
},
|
},
|
||||||
Property: function(M) {
|
Property: function(M) {
|
||||||
var key = M.key;
|
var key = M.key;
|
||||||
|
var name = key.type == "Identifier" ? key.name : key.value;
|
||||||
var args = {
|
var args = {
|
||||||
start : my_start_token(key),
|
start : my_start_token(key),
|
||||||
end : my_end_token(M.value),
|
end : my_end_token(M.value),
|
||||||
key : key.type == "Identifier" ? key.name : key.value,
|
key : name,
|
||||||
value : from_moz(M.value)
|
value : from_moz(M.value)
|
||||||
};
|
};
|
||||||
if (M.kind == "init") return new AST_ObjectKeyVal(args);
|
switch (M.kind) {
|
||||||
args.key = new AST_SymbolAccessor({
|
case "init":
|
||||||
name: args.key
|
return new AST_ObjectKeyVal(args);
|
||||||
});
|
case "set":
|
||||||
args.value = new AST_Accessor(args.value);
|
args.value.name = from_moz(key);
|
||||||
if (M.kind == "get") return new AST_ObjectGetter(args);
|
return new AST_ObjectSetter(args);
|
||||||
if (M.kind == "set") return new AST_ObjectSetter(args);
|
case "get":
|
||||||
|
args.value.name = from_moz(key);
|
||||||
|
return new AST_ObjectGetter(args);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
ArrayExpression: function(M) {
|
ArrayExpression: function(M) {
|
||||||
return new AST_Array({
|
return new AST_Array({
|
||||||
@@ -252,7 +256,10 @@
|
|||||||
map("CallExpression", AST_Call, "callee>expression, arguments@args");
|
map("CallExpression", AST_Call, "callee>expression, arguments@args");
|
||||||
|
|
||||||
def_to_moz(AST_Toplevel, function To_Moz_Program(M) {
|
def_to_moz(AST_Toplevel, function To_Moz_Program(M) {
|
||||||
return to_moz_scope("Program", M);
|
return {
|
||||||
|
type: "Program",
|
||||||
|
body: M.body.map(to_moz)
|
||||||
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
def_to_moz(AST_Defun, function To_Moz_FunctionDeclaration(M) {
|
def_to_moz(AST_Defun, function To_Moz_FunctionDeclaration(M) {
|
||||||
@@ -260,7 +267,7 @@
|
|||||||
type: "FunctionDeclaration",
|
type: "FunctionDeclaration",
|
||||||
id: to_moz(M.name),
|
id: to_moz(M.name),
|
||||||
params: M.argnames.map(to_moz),
|
params: M.argnames.map(to_moz),
|
||||||
body: to_moz_scope("BlockStatement", M)
|
body: to_moz_block(M)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -269,7 +276,7 @@
|
|||||||
type: "FunctionExpression",
|
type: "FunctionExpression",
|
||||||
id: to_moz(M.name),
|
id: to_moz(M.name),
|
||||||
params: M.argnames.map(to_moz),
|
params: M.argnames.map(to_moz),
|
||||||
body: to_moz_scope("BlockStatement", M)
|
body: to_moz_block(M)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -375,10 +382,11 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
def_to_moz(AST_ObjectProperty, function To_Moz_Property(M) {
|
def_to_moz(AST_ObjectProperty, function To_Moz_Property(M) {
|
||||||
var key = {
|
var key = (
|
||||||
type: "Literal",
|
is_identifier(M.key)
|
||||||
value: M.key instanceof AST_SymbolAccessor ? M.key.name : M.key
|
? {type: "Identifier", name: M.key}
|
||||||
};
|
: {type: "Literal", value: M.key}
|
||||||
|
);
|
||||||
var kind;
|
var kind;
|
||||||
if (M instanceof AST_ObjectKeyVal) {
|
if (M instanceof AST_ObjectKeyVal) {
|
||||||
kind = "init";
|
kind = "init";
|
||||||
@@ -539,8 +547,8 @@
|
|||||||
moz_to_me = new Function("U2", "my_start_token", "my_end_token", "from_moz", "return(" + moz_to_me + ")")(
|
moz_to_me = new Function("U2", "my_start_token", "my_end_token", "from_moz", "return(" + moz_to_me + ")")(
|
||||||
exports, my_start_token, my_end_token, from_moz
|
exports, my_start_token, my_end_token, from_moz
|
||||||
);
|
);
|
||||||
me_to_moz = new Function("to_moz", "to_moz_block", "to_moz_scope", "return(" + me_to_moz + ")")(
|
me_to_moz = new Function("to_moz", "to_moz_block", "return(" + me_to_moz + ")")(
|
||||||
to_moz, to_moz_block, to_moz_scope
|
to_moz, to_moz_block
|
||||||
);
|
);
|
||||||
MOZ_TO_ME[moztype] = moz_to_me;
|
MOZ_TO_ME[moztype] = moz_to_me;
|
||||||
def_to_moz(mytype, me_to_moz);
|
def_to_moz(mytype, me_to_moz);
|
||||||
@@ -598,14 +606,4 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
function to_moz_scope(type, node) {
|
|
||||||
var body = node.body.map(to_moz);
|
|
||||||
if (node.body[0] instanceof AST_SimpleStatement && node.body[0].body instanceof AST_String) {
|
|
||||||
body.unshift(to_moz(new AST_EmptyStatement(node.body[0])));
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
type: type,
|
|
||||||
body: body
|
|
||||||
};
|
|
||||||
};
|
|
||||||
})();
|
})();
|
||||||
|
|||||||
590
lib/output.js
590
lib/output.js
@@ -46,38 +46,56 @@
|
|||||||
var EXPECT_DIRECTIVE = /^$|[;{][\s\n]*$/;
|
var EXPECT_DIRECTIVE = /^$|[;{][\s\n]*$/;
|
||||||
|
|
||||||
function is_some_comments(comment) {
|
function is_some_comments(comment) {
|
||||||
|
var text = comment.value;
|
||||||
|
var type = comment.type;
|
||||||
|
if (type == "comment2") {
|
||||||
// multiline comment
|
// multiline comment
|
||||||
return comment.type == "comment2" && /@preserve|@license|@cc_on/i.test(comment.value);
|
return /@preserve|@license|@cc_on/i.test(text);
|
||||||
|
}
|
||||||
|
return type == "comment5";
|
||||||
|
}
|
||||||
|
|
||||||
|
function is_comment5(comment) {
|
||||||
|
return comment.type == "comment5";
|
||||||
}
|
}
|
||||||
|
|
||||||
function OutputStream(options) {
|
function OutputStream(options) {
|
||||||
|
|
||||||
options = defaults(options, {
|
options = defaults(options, {
|
||||||
ascii_only : false,
|
|
||||||
beautify : false,
|
|
||||||
bracketize : false,
|
|
||||||
comments : false,
|
|
||||||
indent_level : 4,
|
|
||||||
indent_start : 0,
|
indent_start : 0,
|
||||||
inline_script : true,
|
indent_level : 4,
|
||||||
keep_quoted_props: false,
|
|
||||||
max_line_len : false,
|
|
||||||
preamble : null,
|
|
||||||
preserve_line : false,
|
|
||||||
quote_keys : false,
|
quote_keys : false,
|
||||||
quote_style : 0,
|
|
||||||
screw_ie8 : true,
|
|
||||||
semicolons : true,
|
|
||||||
shebang : true,
|
|
||||||
source_map : null,
|
|
||||||
space_colon : true,
|
space_colon : true,
|
||||||
|
ascii_only : false,
|
||||||
|
ascii_identifiers: undefined,
|
||||||
unescape_regexps : false,
|
unescape_regexps : false,
|
||||||
|
inline_script : false,
|
||||||
width : 80,
|
width : 80,
|
||||||
|
max_line_len : 32000,
|
||||||
|
beautify : false,
|
||||||
|
source_map : null,
|
||||||
|
bracketize : false,
|
||||||
|
semicolons : true,
|
||||||
|
comments : false,
|
||||||
|
shebang : true,
|
||||||
|
preserve_line : false,
|
||||||
|
screw_ie8 : true,
|
||||||
|
preamble : null,
|
||||||
|
quote_style : 0,
|
||||||
|
keep_quoted_props: false,
|
||||||
|
shorthand : undefined,
|
||||||
|
ecma : 5,
|
||||||
wrap_iife : false,
|
wrap_iife : false,
|
||||||
}, true);
|
}, true);
|
||||||
|
|
||||||
|
if (typeof options.ascii_identifiers === 'undefined')
|
||||||
|
options.ascii_identifiers = options.ascii_only;
|
||||||
|
|
||||||
|
if (options.shorthand === undefined)
|
||||||
|
options.shorthand = options.ecma > 5;
|
||||||
|
|
||||||
// Convert comment option to RegExp if neccessary and set up comments filter
|
// Convert comment option to RegExp if neccessary and set up comments filter
|
||||||
var comment_filter = return_false; // Default case, throw all comments away
|
var comment_filter = options.shebang ? is_comment5 : return_false; // Default case, throw all comments away except shebangs
|
||||||
if (options.comments) {
|
if (options.comments) {
|
||||||
var comments = options.comments;
|
var comments = options.comments;
|
||||||
if (typeof options.comments === "string" && /^\/.*\/[a-zA-Z]*$/.test(options.comments)) {
|
if (typeof options.comments === "string" && /^\/.*\/[a-zA-Z]*$/.test(options.comments)) {
|
||||||
@@ -89,12 +107,12 @@ function OutputStream(options) {
|
|||||||
}
|
}
|
||||||
if (comments instanceof RegExp) {
|
if (comments instanceof RegExp) {
|
||||||
comment_filter = function(comment) {
|
comment_filter = function(comment) {
|
||||||
return comment.type != "comment5" && comments.test(comment.value);
|
return comment.type == "comment5" || comments.test(comment.value);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
else if (typeof comments === "function") {
|
else if (typeof comments === "function") {
|
||||||
comment_filter = function(comment) {
|
comment_filter = function(comment) {
|
||||||
return comment.type != "comment5" && comments(this, comment);
|
return comment.type == "comment5" || comments(this, comment);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
else if (comments === "some") {
|
else if (comments === "some") {
|
||||||
@@ -111,9 +129,19 @@ function OutputStream(options) {
|
|||||||
var OUTPUT = "";
|
var OUTPUT = "";
|
||||||
|
|
||||||
function to_ascii(str, identifier) {
|
function to_ascii(str, identifier) {
|
||||||
return str.replace(/[\u0000-\u001f\u007f-\uffff]/g, function(ch) {
|
return str.replace(/[\ud800-\udbff][\udc00-\udfff]|[\u0000-\u001f\u007f-\uffff]/g, function(ch) {
|
||||||
var code = ch.charCodeAt(0).toString(16);
|
var code = get_full_char_code(ch, 0).toString(16);
|
||||||
if (code.length <= 2 && !identifier) {
|
|
||||||
|
if ((identifier && code.length === 1 && options.ecma >= 6) || code.length > 4) {
|
||||||
|
if (options.ecma < 6) {
|
||||||
|
if (identifier) {
|
||||||
|
return ch; // no \u{} support
|
||||||
|
}
|
||||||
|
return "\\u" + ch.charCodeAt(0).toString(16) + "\\u"
|
||||||
|
+ ch.charCodeAt(1).toString(16);
|
||||||
|
}
|
||||||
|
return "\\u{" + code + "}";
|
||||||
|
} else if (code.length <= 2 && !identifier) {
|
||||||
while (code.length < 2) code = "0" + code;
|
while (code.length < 2) code = "0" + code;
|
||||||
return "\\x" + code;
|
return "\\x" + code;
|
||||||
} else {
|
} else {
|
||||||
@@ -141,7 +169,7 @@ function OutputStream(options) {
|
|||||||
case "\u2029": return "\\u2029";
|
case "\u2029": return "\\u2029";
|
||||||
case "\ufeff": return "\\ufeff";
|
case "\ufeff": return "\\ufeff";
|
||||||
case "\0":
|
case "\0":
|
||||||
return /[0-7]/.test(str.charAt(i+1)) ? "\\x00" : "\\0";
|
return /[0-7]/.test(get_full_char(str, i+1)) ? "\\x00" : "\\0";
|
||||||
}
|
}
|
||||||
return s;
|
return s;
|
||||||
});
|
});
|
||||||
@@ -151,7 +179,22 @@ function OutputStream(options) {
|
|||||||
function quote_double() {
|
function quote_double() {
|
||||||
return '"' + str.replace(/\x22/g, '\\"') + '"';
|
return '"' + str.replace(/\x22/g, '\\"') + '"';
|
||||||
}
|
}
|
||||||
|
function quote_template() {
|
||||||
|
if (!options.ascii_only) {
|
||||||
|
str = str.replace(/\\(n|r|u2028|u2029)/g, function(s, c) {
|
||||||
|
switch(c) {
|
||||||
|
case "n": return "\n";
|
||||||
|
case "r": return "\r";
|
||||||
|
case "u2028": return "\u2028";
|
||||||
|
case "u2029": return "\u2029";
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return '`' + str.replace(/`/g, '\\`') + '`';
|
||||||
|
}
|
||||||
if (options.ascii_only) str = to_ascii(str);
|
if (options.ascii_only) str = to_ascii(str);
|
||||||
|
if (quote === "`") return quote_template();
|
||||||
switch (options.quote_style) {
|
switch (options.quote_style) {
|
||||||
case 1:
|
case 1:
|
||||||
return quote_single();
|
return quote_single();
|
||||||
@@ -176,7 +219,7 @@ function OutputStream(options) {
|
|||||||
|
|
||||||
function make_name(name) {
|
function make_name(name) {
|
||||||
name = name.toString();
|
name = name.toString();
|
||||||
if (options.ascii_only)
|
if (options.ascii_identifiers)
|
||||||
name = to_ascii(name, true);
|
name = to_ascii(name, true);
|
||||||
return name;
|
return name;
|
||||||
};
|
};
|
||||||
@@ -189,42 +232,37 @@ function OutputStream(options) {
|
|||||||
|
|
||||||
var might_need_space = false;
|
var might_need_space = false;
|
||||||
var might_need_semicolon = false;
|
var might_need_semicolon = false;
|
||||||
var might_add_newline = 0;
|
var last = null;
|
||||||
var last = "";
|
|
||||||
|
|
||||||
var ensure_line_len = options.max_line_len ? function() {
|
function last_char() {
|
||||||
if (current_col > options.max_line_len) {
|
var char = last.charAt(last.length - 1);
|
||||||
if (might_add_newline) {
|
|
||||||
var left = OUTPUT.slice(0, might_add_newline);
|
if (is_surrogate_pair_tail(char)) {
|
||||||
var right = OUTPUT.slice(might_add_newline);
|
return last.charAt(last.length - 2) + char;
|
||||||
OUTPUT = left + "\n" + right;
|
|
||||||
current_line++;
|
|
||||||
current_pos++;
|
|
||||||
current_col = right.length;
|
|
||||||
}
|
}
|
||||||
if (current_col > options.max_line_len) {
|
|
||||||
AST_Node.warn("Output exceeds {max_line_len} characters", options);
|
return char;
|
||||||
}
|
};
|
||||||
}
|
|
||||||
might_add_newline = 0;
|
function maybe_newline() {
|
||||||
} : noop;
|
if (options.max_line_len && current_col > options.max_line_len)
|
||||||
|
print("\n");
|
||||||
|
};
|
||||||
|
|
||||||
var requireSemicolonChars = makePredicate("( [ + * / - , .");
|
var requireSemicolonChars = makePredicate("( [ + * / - , .");
|
||||||
|
|
||||||
function print(str) {
|
function print(str) {
|
||||||
str = String(str);
|
str = String(str);
|
||||||
var ch = str.charAt(0);
|
var ch = get_full_char(str, 0);
|
||||||
var prev = last.charAt(last.length - 1);
|
|
||||||
if (might_need_semicolon) {
|
if (might_need_semicolon) {
|
||||||
might_need_semicolon = false;
|
might_need_semicolon = false;
|
||||||
|
|
||||||
if (prev == ":" && ch == "}" || (!ch || ";}".indexOf(ch) < 0) && prev != ";") {
|
if ((!ch || ";}".indexOf(ch) < 0) && !/[;]$/.test(last)) {
|
||||||
if (options.semicolons || requireSemicolonChars(ch)) {
|
if (options.semicolons || requireSemicolonChars(ch)) {
|
||||||
OUTPUT += ";";
|
OUTPUT += ";";
|
||||||
current_col++;
|
current_col++;
|
||||||
current_pos++;
|
current_pos++;
|
||||||
} else {
|
} else {
|
||||||
ensure_line_len();
|
|
||||||
OUTPUT += "\n";
|
OUTPUT += "\n";
|
||||||
current_pos++;
|
current_pos++;
|
||||||
current_line++;
|
current_line++;
|
||||||
@@ -245,7 +283,6 @@ function OutputStream(options) {
|
|||||||
if (!options.beautify && options.preserve_line && stack[stack.length - 1]) {
|
if (!options.beautify && options.preserve_line && stack[stack.length - 1]) {
|
||||||
var target_line = stack[stack.length - 1].start.line;
|
var target_line = stack[stack.length - 1].start.line;
|
||||||
while (current_line < target_line) {
|
while (current_line < target_line) {
|
||||||
ensure_line_len();
|
|
||||||
OUTPUT += "\n";
|
OUTPUT += "\n";
|
||||||
current_pos++;
|
current_pos++;
|
||||||
current_line++;
|
current_line++;
|
||||||
@@ -255,10 +292,10 @@ function OutputStream(options) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (might_need_space) {
|
if (might_need_space) {
|
||||||
|
var prev = last_char();
|
||||||
if ((is_identifier_char(prev)
|
if ((is_identifier_char(prev)
|
||||||
&& (is_identifier_char(ch) || ch == "\\"))
|
&& (is_identifier_char(ch) || ch == "\\"))
|
||||||
|| (ch == "/" && ch == prev)
|
|| (/^[\+\-\/]$/.test(ch) && ch == prev))
|
||||||
|| ((ch == "+" || ch == "-") && ch == last))
|
|
||||||
{
|
{
|
||||||
OUTPUT += " ";
|
OUTPUT += " ";
|
||||||
current_col++;
|
current_col++;
|
||||||
@@ -266,18 +303,22 @@ function OutputStream(options) {
|
|||||||
}
|
}
|
||||||
might_need_space = false;
|
might_need_space = false;
|
||||||
}
|
}
|
||||||
OUTPUT += str;
|
|
||||||
current_pos += str.length;
|
|
||||||
var a = str.split(/\r?\n/), n = a.length - 1;
|
var a = str.split(/\r?\n/), n = a.length - 1;
|
||||||
current_line += n;
|
current_line += n;
|
||||||
current_col += a[0].length;
|
if (n == 0) {
|
||||||
if (n > 0) {
|
current_col += a[n].length;
|
||||||
ensure_line_len();
|
} else {
|
||||||
current_col = a[n].length;
|
current_col = a[n].length;
|
||||||
}
|
}
|
||||||
|
current_pos += str.length;
|
||||||
last = str;
|
last = str;
|
||||||
|
OUTPUT += str;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var star = function(){
|
||||||
|
print("*");
|
||||||
|
}
|
||||||
|
|
||||||
var space = options.beautify ? function() {
|
var space = options.beautify ? function() {
|
||||||
print(" ");
|
print(" ");
|
||||||
} : function() {
|
} : function() {
|
||||||
@@ -301,10 +342,7 @@ function OutputStream(options) {
|
|||||||
|
|
||||||
var newline = options.beautify ? function() {
|
var newline = options.beautify ? function() {
|
||||||
print("\n");
|
print("\n");
|
||||||
} : options.max_line_len ? function() {
|
} : maybe_newline;
|
||||||
ensure_line_len();
|
|
||||||
might_add_newline = OUTPUT.length;
|
|
||||||
} : noop;
|
|
||||||
|
|
||||||
var semicolon = options.beautify ? function() {
|
var semicolon = options.beautify ? function() {
|
||||||
print(";");
|
print(";");
|
||||||
@@ -381,12 +419,13 @@ function OutputStream(options) {
|
|||||||
} : noop;
|
} : noop;
|
||||||
|
|
||||||
function get() {
|
function get() {
|
||||||
if (might_add_newline) {
|
|
||||||
ensure_line_len();
|
|
||||||
}
|
|
||||||
return OUTPUT;
|
return OUTPUT;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (options.preamble) {
|
||||||
|
print(options.preamble.replace(/\r\n?|[\n\u2028\u2029]|\s*$/g, "\n"));
|
||||||
|
}
|
||||||
|
|
||||||
var stack = [];
|
var stack = [];
|
||||||
return {
|
return {
|
||||||
get : get,
|
get : get,
|
||||||
@@ -397,6 +436,7 @@ function OutputStream(options) {
|
|||||||
should_break : function() { return options.width && this.current_width() >= options.width },
|
should_break : function() { return options.width && this.current_width() >= options.width },
|
||||||
newline : newline,
|
newline : newline,
|
||||||
print : print,
|
print : print,
|
||||||
|
star : star,
|
||||||
space : space,
|
space : space,
|
||||||
comma : comma,
|
comma : comma,
|
||||||
colon : colon,
|
colon : colon,
|
||||||
@@ -416,6 +456,10 @@ function OutputStream(options) {
|
|||||||
}
|
}
|
||||||
print(encoded);
|
print(encoded);
|
||||||
},
|
},
|
||||||
|
print_template_string_chars: function(str) {
|
||||||
|
var encoded = encode_string(str, '`').replace(/\${/g, "\\${");
|
||||||
|
return print(encoded.substr(1, encoded.length - 2));
|
||||||
|
},
|
||||||
encode_string : encode_string,
|
encode_string : encode_string,
|
||||||
next_indent : next_indent,
|
next_indent : next_indent,
|
||||||
with_indent : with_indent,
|
with_indent : with_indent,
|
||||||
@@ -430,6 +474,7 @@ function OutputStream(options) {
|
|||||||
pos : function() { return current_pos },
|
pos : function() { return current_pos },
|
||||||
push_node : function(node) { stack.push(node) },
|
push_node : function(node) { stack.push(node) },
|
||||||
pop_node : function() { return stack.pop() },
|
pop_node : function() { return stack.pop() },
|
||||||
|
stack : function() { return stack },
|
||||||
parent : function(n) {
|
parent : function(n) {
|
||||||
return stack[stack.length - 2 - (n || 0)];
|
return stack[stack.length - 2 - (n || 0)];
|
||||||
}
|
}
|
||||||
@@ -506,17 +551,6 @@ function OutputStream(options) {
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (output.pos() == 0) {
|
|
||||||
if (comments.length > 0 && output.option("shebang") && comments[0].type == "comment5") {
|
|
||||||
output.print("#!" + comments.shift().value + "\n");
|
|
||||||
output.indent();
|
|
||||||
}
|
|
||||||
var preamble = output.option("preamble");
|
|
||||||
if (preamble) {
|
|
||||||
output.print(preamble.replace(/\r\n?|[\n\u2028\u2029]|\s*$/g, "\n"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
comments = comments.filter(output.comment_filter, self);
|
comments = comments.filter(output.comment_filter, self);
|
||||||
|
|
||||||
// Keep single line comments after nlb, after nlb
|
// Keep single line comments after nlb, after nlb
|
||||||
@@ -541,6 +575,10 @@ function OutputStream(options) {
|
|||||||
output.space();
|
output.space();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (output.pos() === 0 && c.type == "comment5" && output.option("shebang")) {
|
||||||
|
output.print("#!" + c.value + "\n");
|
||||||
|
output.indent();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -582,10 +620,16 @@ function OutputStream(options) {
|
|||||||
return first_in_statement(output);
|
return first_in_statement(output);
|
||||||
});
|
});
|
||||||
|
|
||||||
PARENS(AST_Unary, function(output){
|
PARENS([ AST_Unary, AST_Undefined ], function(output){
|
||||||
var p = output.parent();
|
var p = output.parent();
|
||||||
return p instanceof AST_PropAccess && p.expression === this
|
return p instanceof AST_PropAccess && p.expression === this
|
||||||
|| p instanceof AST_Call && p.expression === this;
|
|| p instanceof AST_Call && p.expression === this
|
||||||
|
|| p instanceof AST_Binary
|
||||||
|
&& p.operator === "**"
|
||||||
|
&& this instanceof AST_UnaryPrefix
|
||||||
|
&& p.left === this
|
||||||
|
&& this.operator !== "++"
|
||||||
|
&& this.operator !== "--";
|
||||||
});
|
});
|
||||||
|
|
||||||
PARENS(AST_Seq, function(output){
|
PARENS(AST_Seq, function(output){
|
||||||
@@ -597,8 +641,13 @@ function OutputStream(options) {
|
|||||||
|| p instanceof AST_PropAccess // (1, {foo:2}).foo or (1, {foo:2})["foo"] ==> 2
|
|| p instanceof AST_PropAccess // (1, {foo:2}).foo or (1, {foo:2})["foo"] ==> 2
|
||||||
|| p instanceof AST_Array // [ 1, (2, 3), 4 ] ==> [ 1, 3, 4 ]
|
|| p instanceof AST_Array // [ 1, (2, 3), 4 ] ==> [ 1, 3, 4 ]
|
||||||
|| p instanceof AST_ObjectProperty // { foo: (1, 2) }.foo ==> 2
|
|| p instanceof AST_ObjectProperty // { foo: (1, 2) }.foo ==> 2
|
||||||
|
|| (p instanceof AST_SymbolConst && p.default === this) // const { xCover = (0, function() {}) }
|
||||||
|
|| (p instanceof AST_SymbolLet && p.default === this) // let { xCover = (0, function() {}) }
|
||||||
|
|| (p instanceof AST_SymbolVar && p.default === this) // var { xCover = (0, function() {}) }
|
||||||
|
|| (p instanceof AST_SymbolCatch && p.default === this) // } catch (xCover = (0, function() {}) ) {
|
||||||
|| p instanceof AST_Conditional /* (false, true) ? (a = 10, b = 20) : (c = 30)
|
|| p instanceof AST_Conditional /* (false, true) ? (a = 10, b = 20) : (c = 30)
|
||||||
* ==> 20 (side effect, set a := 10 and b := 20) */
|
* ==> 20 (side effect, set a := 10 and b := 20) */
|
||||||
|
|| p instanceof AST_Arrow // x => (x, x)
|
||||||
;
|
;
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -625,6 +674,20 @@ function OutputStream(options) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
PARENS(AST_Yield, function(output){
|
||||||
|
var p = output.parent();
|
||||||
|
// (yield 1) + (yield 2)
|
||||||
|
// a = yield 3
|
||||||
|
if (p instanceof AST_Binary && p.operator !== "=")
|
||||||
|
return true;
|
||||||
|
// (yield 1) ? yield 2 : yield 3
|
||||||
|
if (p instanceof AST_Conditional && p.condition === this)
|
||||||
|
return true;
|
||||||
|
// -(yield 4)
|
||||||
|
if (p instanceof AST_Unary)
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
PARENS(AST_PropAccess, function(output){
|
PARENS(AST_PropAccess, function(output){
|
||||||
var p = output.parent();
|
var p = output.parent();
|
||||||
if (p instanceof AST_New && p.expression === this) {
|
if (p instanceof AST_New && p.expression === this) {
|
||||||
@@ -702,6 +765,34 @@ function OutputStream(options) {
|
|||||||
output.print_string(self.value, self.quote);
|
output.print_string(self.value, self.quote);
|
||||||
output.semicolon();
|
output.semicolon();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
DEFPRINT(AST_Expansion, function (self, output) {
|
||||||
|
output.print('...');
|
||||||
|
self.expression.print(output);
|
||||||
|
});
|
||||||
|
|
||||||
|
DEFPRINT(AST_Destructuring, function (self, output) {
|
||||||
|
output.print(self.is_array ? "[" : "{");
|
||||||
|
var first = true;
|
||||||
|
var len = self.names.length;
|
||||||
|
self.names.forEach(function (name, i) {
|
||||||
|
if (first) first = false; else { output.comma(); output.space(); }
|
||||||
|
name.print(output);
|
||||||
|
// If the final element is a hole, we need to make sure it
|
||||||
|
// doesn't look like a trailing comma, by inserting an actual
|
||||||
|
// trailing comma.
|
||||||
|
if (i === len - 1 && name instanceof AST_Hole)
|
||||||
|
output.comma();
|
||||||
|
})
|
||||||
|
output.print(self.is_array ? "]" : "}");
|
||||||
|
if (self.default) {
|
||||||
|
output.space();
|
||||||
|
output.print('=');
|
||||||
|
output.space();
|
||||||
|
self.default.print(output)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
DEFPRINT(AST_Debugger, function(self, output){
|
DEFPRINT(AST_Debugger, function(self, output){
|
||||||
output.print("debugger");
|
output.print("debugger");
|
||||||
output.semicolon();
|
output.semicolon();
|
||||||
@@ -773,7 +864,7 @@ function OutputStream(options) {
|
|||||||
DEFPRINT(AST_Do, function(self, output){
|
DEFPRINT(AST_Do, function(self, output){
|
||||||
output.print("do");
|
output.print("do");
|
||||||
output.space();
|
output.space();
|
||||||
make_block(self.body, output);
|
self._do_print_body(output);
|
||||||
output.space();
|
output.space();
|
||||||
output.print("while");
|
output.print("while");
|
||||||
output.space();
|
output.space();
|
||||||
@@ -795,7 +886,7 @@ function OutputStream(options) {
|
|||||||
output.print("for");
|
output.print("for");
|
||||||
output.space();
|
output.space();
|
||||||
output.with_parens(function(){
|
output.with_parens(function(){
|
||||||
if (self.init) {
|
if (self.init && !(self.init instanceof AST_EmptyStatement)) {
|
||||||
if (self.init instanceof AST_Definitions) {
|
if (self.init instanceof AST_Definitions) {
|
||||||
self.init.print(output);
|
self.init.print(output);
|
||||||
} else {
|
} else {
|
||||||
@@ -826,7 +917,11 @@ function OutputStream(options) {
|
|||||||
output.with_parens(function(){
|
output.with_parens(function(){
|
||||||
self.init.print(output);
|
self.init.print(output);
|
||||||
output.space();
|
output.space();
|
||||||
|
if (self instanceof AST_ForOf) {
|
||||||
|
output.print("of");
|
||||||
|
} else {
|
||||||
output.print("in");
|
output.print("in");
|
||||||
|
}
|
||||||
output.space();
|
output.space();
|
||||||
self.object.print(output);
|
self.object.print(output);
|
||||||
});
|
});
|
||||||
@@ -848,11 +943,24 @@ function OutputStream(options) {
|
|||||||
var self = this;
|
var self = this;
|
||||||
if (!nokeyword) {
|
if (!nokeyword) {
|
||||||
output.print("function");
|
output.print("function");
|
||||||
|
if (this.is_generator) {
|
||||||
|
output.star();
|
||||||
}
|
}
|
||||||
if (self.name) {
|
if (self.name) {
|
||||||
output.space();
|
output.space();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (self.name instanceof AST_Symbol) {
|
||||||
|
if (typeof self.name.name === "string" && !is_identifier_string(self.name.name)) {
|
||||||
|
output.print_string(self.name.name);
|
||||||
|
} else {
|
||||||
self.name.print(output);
|
self.name.print(output);
|
||||||
}
|
}
|
||||||
|
} else if (nokeyword && self.name instanceof AST_Node) {
|
||||||
|
output.with_square(function() {
|
||||||
|
self.name.print(output); // Computed method name
|
||||||
|
});
|
||||||
|
}
|
||||||
output.with_parens(function(){
|
output.with_parens(function(){
|
||||||
self.argnames.forEach(function(arg, i){
|
self.argnames.forEach(function(arg, i){
|
||||||
if (i) output.comma();
|
if (i) output.comma();
|
||||||
@@ -866,6 +974,56 @@ function OutputStream(options) {
|
|||||||
self._do_print(output);
|
self._do_print(output);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
DEFPRINT(AST_PrefixedTemplateString, function(self, output) {
|
||||||
|
self.prefix.print(output);
|
||||||
|
self.template_string.print(output);
|
||||||
|
});
|
||||||
|
DEFPRINT(AST_TemplateString, function(self, output) {
|
||||||
|
var is_tagged = output.parent() instanceof AST_PrefixedTemplateString;
|
||||||
|
|
||||||
|
output.print("`");
|
||||||
|
for (var i = 0; i < self.segments.length; i++) {
|
||||||
|
if (!(self.segments[i] instanceof AST_TemplateSegment)) {
|
||||||
|
output.print("${");
|
||||||
|
self.segments[i].print(output);
|
||||||
|
output.print("}");
|
||||||
|
} else if (is_tagged) {
|
||||||
|
output.print(self.segments[i].raw);
|
||||||
|
} else {
|
||||||
|
output.print_template_string_chars(self.segments[i].value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
output.print("`");
|
||||||
|
});
|
||||||
|
|
||||||
|
AST_Arrow.DEFMETHOD("_do_print", function(output){
|
||||||
|
var self = this;
|
||||||
|
var parent = output.parent();
|
||||||
|
var needs_parens = parent instanceof AST_Binary ||
|
||||||
|
parent instanceof AST_Unary ||
|
||||||
|
(parent instanceof AST_Call && self === parent.expression);
|
||||||
|
if (needs_parens) { output.print("(") }
|
||||||
|
if (self.argnames.length === 1 && self.argnames[0] instanceof AST_Symbol && !self.argnames[0].default) {
|
||||||
|
self.argnames[0].print(output);
|
||||||
|
} else {
|
||||||
|
output.with_parens(function(){
|
||||||
|
self.argnames.forEach(function(arg, i){
|
||||||
|
if (i) output.comma();
|
||||||
|
arg.print(output);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
output.space();
|
||||||
|
output.print('=>');
|
||||||
|
output.space();
|
||||||
|
if (self.body instanceof AST_Node) {
|
||||||
|
this.body.print(output);
|
||||||
|
} else {
|
||||||
|
print_bracketed(this.body, output);
|
||||||
|
}
|
||||||
|
if (needs_parens) { output.print(")") }
|
||||||
|
});
|
||||||
|
|
||||||
/* -----[ exits ]----- */
|
/* -----[ exits ]----- */
|
||||||
AST_Exit.DEFMETHOD("_do_print", function(output, kind){
|
AST_Exit.DEFMETHOD("_do_print", function(output, kind){
|
||||||
output.print(kind);
|
output.print(kind);
|
||||||
@@ -882,6 +1040,17 @@ function OutputStream(options) {
|
|||||||
self._do_print(output, "throw");
|
self._do_print(output, "throw");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/* -----[ yield ]----- */
|
||||||
|
|
||||||
|
DEFPRINT(AST_Yield, function(self, output){
|
||||||
|
var star = self.is_star ? "*" : "";
|
||||||
|
output.print("yield" + star);
|
||||||
|
if (self.expression) {
|
||||||
|
output.space();
|
||||||
|
self.expression.print(output);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
/* -----[ loop control ]----- */
|
/* -----[ loop control ]----- */
|
||||||
AST_LoopControl.DEFMETHOD("_do_print", function(output, kind){
|
AST_LoopControl.DEFMETHOD("_do_print", function(output, kind){
|
||||||
output.print(kind);
|
output.print(kind);
|
||||||
@@ -900,10 +1069,10 @@ function OutputStream(options) {
|
|||||||
|
|
||||||
/* -----[ if ]----- */
|
/* -----[ if ]----- */
|
||||||
function make_then(self, output) {
|
function make_then(self, output) {
|
||||||
var b = self.body;
|
if (output.option("bracketize")) {
|
||||||
if (output.option("bracketize")
|
make_block(self.body, output);
|
||||||
|| !output.option("screw_ie8") && b instanceof AST_Do)
|
return;
|
||||||
return make_block(b, output);
|
}
|
||||||
// The squeezer replaces "block"-s that contain only a single
|
// The squeezer replaces "block"-s that contain only a single
|
||||||
// statement with the statement itself; technically, the AST
|
// statement with the statement itself; technically, the AST
|
||||||
// is correct, but this can create problems when we output an
|
// is correct, but this can create problems when we output an
|
||||||
@@ -911,7 +1080,18 @@ function OutputStream(options) {
|
|||||||
// IF *without* an ELSE block (then the outer ELSE would refer
|
// IF *without* an ELSE block (then the outer ELSE would refer
|
||||||
// to the inner IF). This function checks for this case and
|
// to the inner IF). This function checks for this case and
|
||||||
// adds the block brackets if needed.
|
// adds the block brackets if needed.
|
||||||
if (!b) return output.force_semicolon();
|
if (!self.body)
|
||||||
|
return output.force_semicolon();
|
||||||
|
if (self.body instanceof AST_Do) {
|
||||||
|
// Unconditionally use the if/do-while workaround for all browsers.
|
||||||
|
// https://github.com/mishoo/UglifyJS/issues/#issue/57 IE
|
||||||
|
// croaks with "syntax error" on code like this: if (foo)
|
||||||
|
// do ... while(cond); else ... we need block brackets
|
||||||
|
// around do/while
|
||||||
|
make_block(self.body, output);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var b = self.body;
|
||||||
while (true) {
|
while (true) {
|
||||||
if (b instanceof AST_If) {
|
if (b instanceof AST_If) {
|
||||||
if (!b.alternative) {
|
if (!b.alternative) {
|
||||||
@@ -939,9 +1119,6 @@ function OutputStream(options) {
|
|||||||
output.space();
|
output.space();
|
||||||
output.print("else");
|
output.print("else");
|
||||||
output.space();
|
output.space();
|
||||||
if (self.alternative instanceof AST_If)
|
|
||||||
self.alternative.print(output);
|
|
||||||
else
|
|
||||||
force_statement(self.alternative, output);
|
force_statement(self.alternative, output);
|
||||||
} else {
|
} else {
|
||||||
self._do_print_body(output);
|
self._do_print_body(output);
|
||||||
@@ -956,24 +1133,24 @@ function OutputStream(options) {
|
|||||||
self.expression.print(output);
|
self.expression.print(output);
|
||||||
});
|
});
|
||||||
output.space();
|
output.space();
|
||||||
var last = self.body.length - 1;
|
if (self.body.length > 0) output.with_block(function(){
|
||||||
if (last < 0) output.print("{}");
|
self.body.forEach(function(stmt, i){
|
||||||
else output.with_block(function(){
|
if (i) output.newline();
|
||||||
self.body.forEach(function(branch, i){
|
|
||||||
output.indent(true);
|
output.indent(true);
|
||||||
branch.print(output);
|
stmt.print(output);
|
||||||
if (i < last && branch.body.length > 0)
|
|
||||||
output.newline();
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
else output.print("{}");
|
||||||
});
|
});
|
||||||
AST_SwitchBranch.DEFMETHOD("_do_print_body", function(output){
|
AST_SwitchBranch.DEFMETHOD("_do_print_body", function(output){
|
||||||
|
if (this.body.length > 0) {
|
||||||
output.newline();
|
output.newline();
|
||||||
this.body.forEach(function(stmt){
|
this.body.forEach(function(stmt){
|
||||||
output.indent();
|
output.indent();
|
||||||
stmt.print(output);
|
stmt.print(output);
|
||||||
output.newline();
|
output.newline();
|
||||||
});
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Default, function(self, output){
|
DEFPRINT(AST_Default, function(self, output){
|
||||||
output.print("default:");
|
output.print("default:");
|
||||||
@@ -1030,12 +1207,77 @@ function OutputStream(options) {
|
|||||||
if (!avoid_semicolon)
|
if (!avoid_semicolon)
|
||||||
output.semicolon();
|
output.semicolon();
|
||||||
});
|
});
|
||||||
|
DEFPRINT(AST_Let, function(self, output){
|
||||||
|
self._do_print(output, "let");
|
||||||
|
});
|
||||||
DEFPRINT(AST_Var, function(self, output){
|
DEFPRINT(AST_Var, function(self, output){
|
||||||
self._do_print(output, "var");
|
self._do_print(output, "var");
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Const, function(self, output){
|
DEFPRINT(AST_Const, function(self, output){
|
||||||
self._do_print(output, "const");
|
self._do_print(output, "const");
|
||||||
});
|
});
|
||||||
|
DEFPRINT(AST_Import, function(self, output) {
|
||||||
|
output.print("import");
|
||||||
|
output.space();
|
||||||
|
if (self.imported_name) {
|
||||||
|
self.imported_name.print(output);
|
||||||
|
}
|
||||||
|
if (self.imported_name && self.imported_names) {
|
||||||
|
output.print(",");
|
||||||
|
output.space();
|
||||||
|
}
|
||||||
|
if (self.imported_names) {
|
||||||
|
output.print("{");
|
||||||
|
self.imported_names.forEach(function(name_import, i) {
|
||||||
|
output.space();
|
||||||
|
name_import.print(output);
|
||||||
|
if (i < self.imported_names.length - 1) {
|
||||||
|
output.print(",");
|
||||||
|
output.space();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
output.space();
|
||||||
|
output.print("}");
|
||||||
|
}
|
||||||
|
if (self.imported_name || self.imported_names) {
|
||||||
|
output.space();
|
||||||
|
output.print("from")
|
||||||
|
output.space();
|
||||||
|
}
|
||||||
|
self.module_name.print(output);
|
||||||
|
output.semicolon();
|
||||||
|
});
|
||||||
|
|
||||||
|
DEFPRINT(AST_NameImport, function(self, output) {
|
||||||
|
var definition = self.name.definition();
|
||||||
|
var names_are_different =
|
||||||
|
(definition && definition.mangled_name || self.name.name) !==
|
||||||
|
self.foreign_name.name;
|
||||||
|
if (names_are_different) {
|
||||||
|
output.print(self.foreign_name.name);
|
||||||
|
output.space();
|
||||||
|
output.print("as");
|
||||||
|
output.space();
|
||||||
|
self.name.print(output);
|
||||||
|
} else {
|
||||||
|
self.name.print(output);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
DEFPRINT(AST_Export, function(self, output) {
|
||||||
|
output.print("export");
|
||||||
|
output.space();
|
||||||
|
if (self.is_default) {
|
||||||
|
output.print("default");
|
||||||
|
output.space();
|
||||||
|
}
|
||||||
|
if (self.exported_value) {
|
||||||
|
self.exported_value.print(output);
|
||||||
|
} else if (self.exported_definition) {
|
||||||
|
self.exported_definition.print(output);
|
||||||
|
}
|
||||||
|
output.semicolon();
|
||||||
|
});
|
||||||
|
|
||||||
function parenthesize_for_noin(node, output, noin) {
|
function parenthesize_for_noin(node, output, noin) {
|
||||||
if (!noin) node.print(output);
|
if (!noin) node.print(output);
|
||||||
@@ -1207,8 +1449,35 @@ function OutputStream(options) {
|
|||||||
});
|
});
|
||||||
else output.print("{}");
|
else output.print("{}");
|
||||||
});
|
});
|
||||||
|
DEFPRINT(AST_Class, function(self, output){
|
||||||
function print_property_name(key, quote, output) {
|
output.print("class");
|
||||||
|
output.space();
|
||||||
|
if (self.name) {
|
||||||
|
self.name.print(output);
|
||||||
|
output.space();
|
||||||
|
}
|
||||||
|
if (self.extends) {
|
||||||
|
output.print("extends");
|
||||||
|
output.space();
|
||||||
|
self.extends.print(output);
|
||||||
|
output.space();
|
||||||
|
}
|
||||||
|
if (self.properties.length > 0) output.with_block(function(){
|
||||||
|
self.properties.forEach(function(prop, i){
|
||||||
|
if (i) {
|
||||||
|
output.newline();
|
||||||
|
}
|
||||||
|
output.indent();
|
||||||
|
prop.print(output);
|
||||||
|
});
|
||||||
|
output.newline();
|
||||||
|
});
|
||||||
|
else output.print("{}");
|
||||||
|
});
|
||||||
|
DEFPRINT(AST_NewTarget, function(self, output) {
|
||||||
|
output.print("new.target");
|
||||||
|
});
|
||||||
|
AST_ObjectProperty.DEFMETHOD("print_property_name", function(key, quote, output) {
|
||||||
if (output.option("quote_keys")) {
|
if (output.option("quote_keys")) {
|
||||||
output.print_string(key + "");
|
output.print_string(key + "");
|
||||||
} else if ((typeof key == "number"
|
} else if ((typeof key == "number"
|
||||||
@@ -1225,33 +1494,108 @@ function OutputStream(options) {
|
|||||||
} else {
|
} else {
|
||||||
output.print_string(key, quote);
|
output.print_string(key, quote);
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
DEFPRINT(AST_ObjectKeyVal, function(self, output){
|
DEFPRINT(AST_ObjectKeyVal, function(self, output){
|
||||||
print_property_name(self.key, self.quote, output);
|
function get_name(self) {
|
||||||
|
var def = self.value.definition();
|
||||||
|
return def ? def.mangled_name || def.name : self.value.name;
|
||||||
|
}
|
||||||
|
if (output.option("shorthand") &&
|
||||||
|
self.value instanceof AST_Symbol &&
|
||||||
|
is_identifier_string(self.key) &&
|
||||||
|
get_name(self) === self.key
|
||||||
|
) {
|
||||||
|
self.print_property_name(self.key, self.quote, output);
|
||||||
|
} else {
|
||||||
|
if (!(self.key instanceof AST_Node)) {
|
||||||
|
self.print_property_name(self.key, self.quote, output);
|
||||||
|
} else {
|
||||||
|
output.with_square(function() {
|
||||||
|
self.key.print(output);
|
||||||
|
});
|
||||||
|
}
|
||||||
output.colon();
|
output.colon();
|
||||||
self.value.print(output);
|
self.value.print(output);
|
||||||
|
}
|
||||||
|
if (self.default) {
|
||||||
|
output.space();
|
||||||
|
output.print('=');
|
||||||
|
output.space();
|
||||||
|
self.default.print(output);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
AST_ObjectProperty.DEFMETHOD("_print_getter_setter", function(type, output) {
|
AST_ObjectProperty.DEFMETHOD("_print_getter_setter", function(type, self, output) {
|
||||||
|
if (self.static) {
|
||||||
|
output.print("static");
|
||||||
|
output.space();
|
||||||
|
}
|
||||||
output.print(type);
|
output.print(type);
|
||||||
output.space();
|
output.space();
|
||||||
print_property_name(this.key.name, this.quote, output);
|
if (self.key instanceof AST_SymbolMethod) {
|
||||||
this.value._do_print(output, true);
|
self.print_property_name(self.key.name, self.quote, output);
|
||||||
|
} else {
|
||||||
|
output.with_square(function() {
|
||||||
|
self.key.print(output);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
self.value._do_print(output, true);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_ObjectSetter, function(self, output){
|
DEFPRINT(AST_ObjectSetter, function(self, output){
|
||||||
self._print_getter_setter("set", output);
|
self._print_getter_setter("set", self, output);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_ObjectGetter, function(self, output){
|
DEFPRINT(AST_ObjectGetter, function(self, output){
|
||||||
self._print_getter_setter("get", output);
|
self._print_getter_setter("get", self, output);
|
||||||
|
});
|
||||||
|
DEFPRINT(AST_ConciseMethod, function(self, output){
|
||||||
|
if (self.static) {
|
||||||
|
output.print("static");
|
||||||
|
output.space();
|
||||||
|
}
|
||||||
|
if (self.is_generator) {
|
||||||
|
output.print("*");
|
||||||
|
}
|
||||||
|
output.space();
|
||||||
|
if (self.key instanceof AST_SymbolMethod) {
|
||||||
|
self.print_property_name(self.key.name, self.quote, output);
|
||||||
|
} else {
|
||||||
|
output.with_square(function() {
|
||||||
|
self.key.print(output);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
self.value._do_print(output, true);
|
||||||
|
});
|
||||||
|
AST_Symbol.DEFMETHOD("_do_print", function(output){
|
||||||
|
var def = this.definition();
|
||||||
|
output.print_name(def ? def.mangled_name || def.name : this.name);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Symbol, function (self, output) {
|
DEFPRINT(AST_Symbol, function (self, output) {
|
||||||
var def = self.definition();
|
self._do_print(output);
|
||||||
output.print_name(def ? def.mangled_name || def.name : self.name);
|
});
|
||||||
|
DEFPRINT(AST_SymbolDeclaration, function(self, output){
|
||||||
|
self._do_print(output);
|
||||||
|
if (self.default) {
|
||||||
|
output.space();
|
||||||
|
output.print('=');
|
||||||
|
output.space();
|
||||||
|
self.default.print(output)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
DEFPRINT(AST_Undefined, function(self, output){
|
||||||
|
output.print("void 0");
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Hole, noop);
|
DEFPRINT(AST_Hole, noop);
|
||||||
|
DEFPRINT(AST_Infinity, function(self, output){
|
||||||
|
output.print("Infinity");
|
||||||
|
});
|
||||||
|
DEFPRINT(AST_NaN, function(self, output){
|
||||||
|
output.print("NaN");
|
||||||
|
});
|
||||||
DEFPRINT(AST_This, function(self, output){
|
DEFPRINT(AST_This, function(self, output){
|
||||||
output.print("this");
|
output.print("this");
|
||||||
});
|
});
|
||||||
|
DEFPRINT(AST_Super, function(self, output){
|
||||||
|
output.print("super");
|
||||||
|
});
|
||||||
DEFPRINT(AST_Constant, function(self, output){
|
DEFPRINT(AST_Constant, function(self, output){
|
||||||
output.print(self.getValue());
|
output.print(self.getValue());
|
||||||
});
|
});
|
||||||
@@ -1314,7 +1658,15 @@ function OutputStream(options) {
|
|||||||
|
|
||||||
function force_statement(stat, output) {
|
function force_statement(stat, output) {
|
||||||
if (output.option("bracketize")) {
|
if (output.option("bracketize")) {
|
||||||
make_block(stat, output);
|
if (!stat || stat instanceof AST_EmptyStatement)
|
||||||
|
output.print("{}");
|
||||||
|
else if (stat instanceof AST_BlockStatement)
|
||||||
|
stat.print(output);
|
||||||
|
else output.with_block(function(){
|
||||||
|
output.indent();
|
||||||
|
stat.print(output);
|
||||||
|
output.newline();
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
if (!stat || stat instanceof AST_EmptyStatement)
|
if (!stat || stat instanceof AST_EmptyStatement)
|
||||||
output.force_semicolon();
|
output.force_semicolon();
|
||||||
@@ -1323,6 +1675,30 @@ function OutputStream(options) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// return true if the node at the top of the stack (that means the
|
||||||
|
// innermost node in the current output) is lexically the first in
|
||||||
|
// a statement.
|
||||||
|
function first_in_statement(output) {
|
||||||
|
var a = output.stack(), i = a.length, node = a[--i], p = a[--i];
|
||||||
|
while (i > 0) {
|
||||||
|
if (p instanceof AST_Statement && p.body === node)
|
||||||
|
return true;
|
||||||
|
if ((p instanceof AST_Seq && p.car === node ) ||
|
||||||
|
(p instanceof AST_Call && p.expression === node && !(p instanceof AST_New) ) ||
|
||||||
|
(p instanceof AST_Dot && p.expression === node ) ||
|
||||||
|
(p instanceof AST_Sub && p.expression === node ) ||
|
||||||
|
(p instanceof AST_Conditional && p.condition === node ) ||
|
||||||
|
(p instanceof AST_Binary && p.left === node ) ||
|
||||||
|
(p instanceof AST_UnaryPostfix && p.expression === node ))
|
||||||
|
{
|
||||||
|
node = p;
|
||||||
|
p = a[--i];
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// self should be AST_New. decide if we want to show parens or not.
|
// self should be AST_New. decide if we want to show parens or not.
|
||||||
function need_constructor_parens(self, output) {
|
function need_constructor_parens(self, output) {
|
||||||
// Always print parentheses with arguments
|
// Always print parentheses with arguments
|
||||||
@@ -1363,11 +1739,11 @@ function OutputStream(options) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
function make_block(stmt, output) {
|
function make_block(stmt, output) {
|
||||||
if (!stmt || stmt instanceof AST_EmptyStatement)
|
if (stmt instanceof AST_BlockStatement) {
|
||||||
output.print("{}");
|
|
||||||
else if (stmt instanceof AST_BlockStatement)
|
|
||||||
stmt.print(output);
|
stmt.print(output);
|
||||||
else output.with_block(function(){
|
return;
|
||||||
|
}
|
||||||
|
output.with_block(function(){
|
||||||
output.indent();
|
output.indent();
|
||||||
stmt.print(output);
|
stmt.print(output);
|
||||||
output.newline();
|
output.newline();
|
||||||
|
|||||||
1436
lib/parse.js
1436
lib/parse.js
File diff suppressed because one or more lines are too long
@@ -44,18 +44,27 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
function find_builtins() {
|
function find_builtins() {
|
||||||
// NaN will be included due to Number.NaN
|
|
||||||
var a = [
|
// Compatibility fix for some standard defined globals not defined on every js environment
|
||||||
"null",
|
var new_globals = ["Symbol", "Map", "Promise", "Proxy", "Reflect", "Set", "WeakMap", "WeakSet"];
|
||||||
"true",
|
var objects = {};
|
||||||
"false",
|
|
||||||
"Infinity",
|
new_globals.forEach(function (new_global) {
|
||||||
"-Infinity",
|
objects[new_global] = global[new_global] || new Function();
|
||||||
"undefined",
|
});
|
||||||
];
|
|
||||||
|
var a = [];
|
||||||
[ Object, Array, Function, Number,
|
[ Object, Array, Function, Number,
|
||||||
String, Boolean, Error, Math,
|
String, Boolean, Error, Math,
|
||||||
Date, RegExp
|
Date, RegExp, objects.Symbol, ArrayBuffer,
|
||||||
|
DataView, decodeURI, decodeURIComponent,
|
||||||
|
encodeURI, encodeURIComponent, eval, EvalError,
|
||||||
|
Float32Array, Float64Array, Int8Array, Int16Array,
|
||||||
|
Int32Array, isFinite, isNaN, JSON, objects.Map, parseFloat,
|
||||||
|
parseInt, objects.Promise, objects.Proxy, RangeError, ReferenceError,
|
||||||
|
objects.Reflect, objects.Set, SyntaxError, TypeError, Uint8Array,
|
||||||
|
Uint8ClampedArray, Uint16Array, Uint32Array, URIError,
|
||||||
|
objects.WeakMap, objects.WeakSet
|
||||||
].forEach(function(ctor){
|
].forEach(function(ctor){
|
||||||
Object.getOwnPropertyNames(ctor).map(add);
|
Object.getOwnPropertyNames(ctor).map(add);
|
||||||
if (ctor.prototype) {
|
if (ctor.prototype) {
|
||||||
@@ -70,12 +79,12 @@ function find_builtins() {
|
|||||||
|
|
||||||
function mangle_properties(ast, options) {
|
function mangle_properties(ast, options) {
|
||||||
options = defaults(options, {
|
options = defaults(options, {
|
||||||
|
reserved : null,
|
||||||
cache : null,
|
cache : null,
|
||||||
debug: false,
|
|
||||||
ignore_quoted: false,
|
|
||||||
only_cache : false,
|
only_cache : false,
|
||||||
regex : null,
|
regex : null,
|
||||||
reserved: null,
|
ignore_quoted : false,
|
||||||
|
debug : false
|
||||||
});
|
});
|
||||||
|
|
||||||
var reserved = options.reserved;
|
var reserved = options.reserved;
|
||||||
@@ -121,6 +130,9 @@ function mangle_properties(ast, options) {
|
|||||||
else if (node instanceof AST_Sub) {
|
else if (node instanceof AST_Sub) {
|
||||||
addStrings(node.property, ignore_quoted);
|
addStrings(node.property, ignore_quoted);
|
||||||
}
|
}
|
||||||
|
else if (node instanceof AST_ConciseMethod) {
|
||||||
|
add(node.name.name);
|
||||||
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
// step 2: transform the tree, renaming properties
|
// step 2: transform the tree, renaming properties
|
||||||
@@ -140,6 +152,11 @@ function mangle_properties(ast, options) {
|
|||||||
if (!ignore_quoted)
|
if (!ignore_quoted)
|
||||||
node.property = mangleStrings(node.property);
|
node.property = mangleStrings(node.property);
|
||||||
}
|
}
|
||||||
|
else if (node instanceof AST_ConciseMethod) {
|
||||||
|
if (should_mangle(node.name.name)) {
|
||||||
|
node.name.name = mangle(node.name.name);
|
||||||
|
}
|
||||||
|
}
|
||||||
// else if (node instanceof AST_String) {
|
// else if (node instanceof AST_String) {
|
||||||
// if (should_mangle(node.value)) {
|
// if (should_mangle(node.value)) {
|
||||||
// AST_Node.warn(
|
// AST_Node.warn(
|
||||||
@@ -162,7 +179,7 @@ function mangle_properties(ast, options) {
|
|||||||
if (options.only_cache) {
|
if (options.only_cache) {
|
||||||
return cache.props.has(name);
|
return cache.props.has(name);
|
||||||
}
|
}
|
||||||
if (/^-?[0-9]+(\.[0-9]+)?(e[+-][0-9]+)?$/.test(name)) return false;
|
if (/^[0-9.]+$/.test(name)) return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
264
lib/scope.js
264
lib/scope.js
@@ -49,8 +49,11 @@ function SymbolDef(scope, index, orig) {
|
|||||||
this.scope = scope;
|
this.scope = scope;
|
||||||
this.references = [];
|
this.references = [];
|
||||||
this.global = false;
|
this.global = false;
|
||||||
|
this.export = false;
|
||||||
this.mangled_name = null;
|
this.mangled_name = null;
|
||||||
|
this.object_destructuring_arg = false;
|
||||||
this.undeclared = false;
|
this.undeclared = false;
|
||||||
|
this.constant = false;
|
||||||
this.index = index;
|
this.index = index;
|
||||||
this.id = SymbolDef.next_id++;
|
this.id = SymbolDef.next_id++;
|
||||||
};
|
};
|
||||||
@@ -62,11 +65,17 @@ SymbolDef.prototype = {
|
|||||||
if (!options) options = {};
|
if (!options) options = {};
|
||||||
|
|
||||||
return (this.global && !options.toplevel)
|
return (this.global && !options.toplevel)
|
||||||
|
|| this.export
|
||||||
|
|| this.object_destructuring_arg
|
||||||
|| this.undeclared
|
|| this.undeclared
|
||||||
|| (!options.eval && (this.scope.uses_eval || this.scope.uses_with))
|
|| (!options.eval && (this.scope.uses_eval || this.scope.uses_with))
|
||||||
|| (options.keep_fnames
|
|| (options.keep_fnames
|
||||||
&& (this.orig[0] instanceof AST_SymbolLambda
|
&& (this.orig[0] instanceof AST_SymbolLambda
|
||||||
|| this.orig[0] instanceof AST_SymbolDefun));
|
|| this.orig[0] instanceof AST_SymbolDefun))
|
||||||
|
|| this.orig[0] instanceof AST_SymbolMethod
|
||||||
|
|| (options.keep_classnames
|
||||||
|
&& (this.orig[0] instanceof AST_SymbolClass
|
||||||
|
|| this.orig[0] instanceof AST_SymbolDefClass));
|
||||||
},
|
},
|
||||||
mangle: function(options) {
|
mangle: function(options) {
|
||||||
var cache = options.cache && options.cache.props;
|
var cache = options.cache && options.cache.props;
|
||||||
@@ -75,13 +84,8 @@ SymbolDef.prototype = {
|
|||||||
}
|
}
|
||||||
else if (!this.mangled_name && !this.unmangleable(options)) {
|
else if (!this.mangled_name && !this.unmangleable(options)) {
|
||||||
var s = this.scope;
|
var s = this.scope;
|
||||||
var sym = this.orig[0];
|
if (!options.screw_ie8 && this.orig[0] instanceof AST_SymbolLambda)
|
||||||
if (!options.screw_ie8 && sym instanceof AST_SymbolLambda)
|
|
||||||
s = s.parent_scope;
|
s = s.parent_scope;
|
||||||
var def;
|
|
||||||
if (this.defun && (def = this.defun.variables.get(this.name))) {
|
|
||||||
this.mangled_name = def.mangled_name || def.name;
|
|
||||||
} else
|
|
||||||
this.mangled_name = s.next_mangled(options, this);
|
this.mangled_name = s.next_mangled(options, this);
|
||||||
if (this.global && cache) {
|
if (this.global && cache) {
|
||||||
cache.set(this.name, this.mangled_name);
|
cache.set(this.name, this.mangled_name);
|
||||||
@@ -92,8 +96,8 @@ SymbolDef.prototype = {
|
|||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
||||||
options = defaults(options, {
|
options = defaults(options, {
|
||||||
cache: null,
|
|
||||||
screw_ie8: true,
|
screw_ie8: true,
|
||||||
|
cache: null
|
||||||
});
|
});
|
||||||
|
|
||||||
// pass 1: setup scope chaining and handle definitions
|
// pass 1: setup scope chaining and handle definitions
|
||||||
@@ -101,28 +105,49 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|||||||
var scope = self.parent_scope = null;
|
var scope = self.parent_scope = null;
|
||||||
var labels = new Dictionary();
|
var labels = new Dictionary();
|
||||||
var defun = null;
|
var defun = null;
|
||||||
|
var last_var_had_const_pragma = false;
|
||||||
|
var nesting = 0;
|
||||||
|
var in_destructuring = null;
|
||||||
|
var in_export;
|
||||||
var tw = new TreeWalker(function(node, descend){
|
var tw = new TreeWalker(function(node, descend){
|
||||||
if (node instanceof AST_Catch) {
|
if (node.is_block_scope()) {
|
||||||
var save_scope = scope;
|
var save_scope = scope;
|
||||||
scope = new AST_Scope(node);
|
scope = new AST_Scope(node);
|
||||||
scope.init_scope_vars(save_scope);
|
scope.init_scope_vars(nesting);
|
||||||
|
scope.parent_scope = save_scope;
|
||||||
|
if (!(node instanceof AST_Scope)) {
|
||||||
|
scope.uses_with = save_scope.uses_with;
|
||||||
|
scope.uses_eval = save_scope.uses_eval;
|
||||||
|
scope.directives = save_scope.directives;
|
||||||
|
}
|
||||||
descend();
|
descend();
|
||||||
scope = save_scope;
|
scope = save_scope;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (node instanceof AST_Destructuring && node.is_array === false) {
|
||||||
|
in_destructuring = node; // These don't nest
|
||||||
|
descend();
|
||||||
|
in_destructuring = null;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (node instanceof AST_Scope) {
|
if (node instanceof AST_Scope) {
|
||||||
node.init_scope_vars(scope);
|
node.init_scope_vars(nesting);
|
||||||
var save_scope = scope;
|
var save_scope = node.parent_scope = scope;
|
||||||
var save_defun = defun;
|
var save_defun = defun;
|
||||||
var save_labels = labels;
|
var save_labels = labels;
|
||||||
defun = scope = node;
|
defun = scope = node;
|
||||||
labels = new Dictionary();
|
labels = new Dictionary();
|
||||||
descend();
|
++nesting; descend(); --nesting;
|
||||||
scope = save_scope;
|
scope = save_scope;
|
||||||
defun = save_defun;
|
defun = save_defun;
|
||||||
labels = save_labels;
|
labels = save_labels;
|
||||||
return true; // don't descend again in TreeWalker
|
return true; // don't descend again in TreeWalker
|
||||||
}
|
}
|
||||||
|
if (node instanceof AST_Export) {
|
||||||
|
in_export = true;
|
||||||
|
descend();
|
||||||
|
in_export = false;
|
||||||
|
}
|
||||||
if (node instanceof AST_LabeledStatement) {
|
if (node instanceof AST_LabeledStatement) {
|
||||||
var l = node.label;
|
var l = node.label;
|
||||||
if (labels.has(l.name)) {
|
if (labels.has(l.name)) {
|
||||||
@@ -141,12 +166,16 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|||||||
if (node instanceof AST_Symbol) {
|
if (node instanceof AST_Symbol) {
|
||||||
node.scope = scope;
|
node.scope = scope;
|
||||||
}
|
}
|
||||||
|
if (node instanceof AST_SymbolFunarg) {
|
||||||
|
node.object_destructuring_arg = !!in_destructuring;
|
||||||
|
defun.def_variable(node, in_export);
|
||||||
|
}
|
||||||
if (node instanceof AST_Label) {
|
if (node instanceof AST_Label) {
|
||||||
node.thedef = node;
|
node.thedef = node;
|
||||||
node.references = [];
|
node.references = [];
|
||||||
}
|
}
|
||||||
if (node instanceof AST_SymbolLambda) {
|
if (node instanceof AST_SymbolLambda) {
|
||||||
defun.def_function(node);
|
defun.def_function(node, in_export);
|
||||||
}
|
}
|
||||||
else if (node instanceof AST_SymbolDefun) {
|
else if (node instanceof AST_SymbolDefun) {
|
||||||
// Careful here, the scope where this should be defined is
|
// Careful here, the scope where this should be defined is
|
||||||
@@ -154,22 +183,37 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|||||||
// scope when we encounter the AST_Defun node (which is
|
// scope when we encounter the AST_Defun node (which is
|
||||||
// instanceof AST_Scope) but we get to the symbol a bit
|
// instanceof AST_Scope) but we get to the symbol a bit
|
||||||
// later.
|
// later.
|
||||||
(node.scope = defun.parent_scope).def_function(node);
|
var parent_lambda = defun.parent_scope;
|
||||||
|
while (parent_lambda.is_block_scope()) {
|
||||||
|
parent_lambda = parent_lambda.parent_scope;
|
||||||
|
}
|
||||||
|
(node.scope = parent_lambda).def_function(node, in_export);
|
||||||
|
}
|
||||||
|
else if (node instanceof AST_SymbolClass) {
|
||||||
|
defun.def_variable(node, in_export);
|
||||||
|
}
|
||||||
|
else if (node instanceof AST_SymbolImport) {
|
||||||
|
scope.def_variable(node, in_export);
|
||||||
|
}
|
||||||
|
else if (node instanceof AST_SymbolDefClass) {
|
||||||
|
// This deals with the name of the class being available
|
||||||
|
// inside the class.
|
||||||
|
(node.scope = defun.parent_scope).def_function(node, in_export);
|
||||||
|
}
|
||||||
|
else if (node instanceof AST_Var) {
|
||||||
|
last_var_had_const_pragma = node.has_const_pragma();
|
||||||
}
|
}
|
||||||
else if (node instanceof AST_SymbolVar
|
else if (node instanceof AST_SymbolVar
|
||||||
|| node instanceof AST_SymbolConst) {
|
|| node instanceof AST_SymbolConst
|
||||||
defun.def_variable(node);
|
|| node instanceof AST_SymbolLet) {
|
||||||
if (defun !== scope) {
|
var def = ((node instanceof AST_SymbolBlockDeclaration) ? scope : defun).def_variable(node, in_export);
|
||||||
node.mark_enclosed(options);
|
def.constant = node instanceof AST_SymbolConst || last_var_had_const_pragma;
|
||||||
var def = scope.find_variable(node);
|
def.destructuring = in_destructuring;
|
||||||
if (node.thedef !== def) {
|
def.init = tw.parent().value;
|
||||||
node.thedef = def;
|
|
||||||
node.reference(options);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (node instanceof AST_SymbolCatch) {
|
else if (node instanceof AST_SymbolCatch) {
|
||||||
scope.def_variable(node).defun = defun;
|
(options.screw_ie8 ? scope : defun)
|
||||||
|
.def_variable(node);
|
||||||
}
|
}
|
||||||
else if (node instanceof AST_LabelRef) {
|
else if (node instanceof AST_LabelRef) {
|
||||||
var sym = labels.get(node.name);
|
var sym = labels.get(node.name);
|
||||||
@@ -185,6 +229,7 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|||||||
|
|
||||||
// pass 2: find back references and eval
|
// pass 2: find back references and eval
|
||||||
var func = null;
|
var func = null;
|
||||||
|
var cls = null;
|
||||||
var globals = self.globals = new Dictionary();
|
var globals = self.globals = new Dictionary();
|
||||||
var tw = new TreeWalker(function(node, descend){
|
var tw = new TreeWalker(function(node, descend){
|
||||||
if (node instanceof AST_Lambda) {
|
if (node instanceof AST_Lambda) {
|
||||||
@@ -194,13 +239,21 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|||||||
func = prev_func;
|
func = prev_func;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (node instanceof AST_Class) {
|
||||||
|
var prev_cls = cls;
|
||||||
|
cls = node;
|
||||||
|
descend();
|
||||||
|
cls = prev_cls;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (node instanceof AST_LoopControl && node.label) {
|
if (node instanceof AST_LoopControl && node.label) {
|
||||||
node.label.thedef.references.push(node);
|
node.label.thedef.references.push(node);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (node instanceof AST_SymbolRef) {
|
if (node instanceof AST_SymbolRef) {
|
||||||
var name = node.name;
|
var name = node.name;
|
||||||
if (name == "eval" && tw.parent() instanceof AST_Call) {
|
var parent = tw.parent();
|
||||||
|
if (name == "eval" && parent instanceof AST_Call) {
|
||||||
for (var s = node.scope; s && !s.uses_eval; s = s.parent_scope) {
|
for (var s = node.scope; s && !s.uses_eval; s = s.parent_scope) {
|
||||||
s.uses_eval = true;
|
s.uses_eval = true;
|
||||||
}
|
}
|
||||||
@@ -210,89 +263,76 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|||||||
node.scope.uses_arguments = true;
|
node.scope.uses_arguments = true;
|
||||||
}
|
}
|
||||||
if (!sym) {
|
if (!sym) {
|
||||||
sym = self.def_global(node);
|
var g;
|
||||||
|
if (globals.has(name)) {
|
||||||
|
g = globals.get(name);
|
||||||
|
} else {
|
||||||
|
g = new SymbolDef(self, globals.size(), node);
|
||||||
|
g.undeclared = true;
|
||||||
|
g.global = true;
|
||||||
|
globals.set(name, g);
|
||||||
|
}
|
||||||
|
sym = g;
|
||||||
}
|
}
|
||||||
node.thedef = sym;
|
node.thedef = sym;
|
||||||
node.reference(options);
|
if (parent instanceof AST_Unary && (parent.operator === '++' || parent.operator === '--')
|
||||||
|
|| parent instanceof AST_Assign && parent.left === node) {
|
||||||
|
sym.modified = true;
|
||||||
|
}
|
||||||
|
node.reference();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
self.walk(tw);
|
self.walk(tw);
|
||||||
|
|
||||||
// pass 3: fix up any scoping issue with IE8
|
|
||||||
if (!options.screw_ie8) {
|
|
||||||
self.walk(new TreeWalker(function(node, descend) {
|
|
||||||
if (node instanceof AST_SymbolCatch) {
|
|
||||||
var name = node.name;
|
|
||||||
var refs = node.thedef.references;
|
|
||||||
var scope = node.thedef.defun;
|
|
||||||
var def = scope.find_variable(name) || self.globals.get(name) || scope.def_variable(node);
|
|
||||||
refs.forEach(function(ref) {
|
|
||||||
ref.thedef = def;
|
|
||||||
ref.reference(options);
|
|
||||||
});
|
|
||||||
node.thedef = def;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (options.cache) {
|
if (options.cache) {
|
||||||
this.cname = options.cache.cname;
|
this.cname = options.cache.cname;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("def_global", function(node){
|
AST_Scope.DEFMETHOD("init_scope_vars", function(nesting){
|
||||||
var globals = this.globals, name = node.name;
|
|
||||||
if (globals.has(name)) {
|
|
||||||
return globals.get(name);
|
|
||||||
} else {
|
|
||||||
var g = new SymbolDef(this, globals.size(), node);
|
|
||||||
g.undeclared = true;
|
|
||||||
g.global = true;
|
|
||||||
globals.set(name, g);
|
|
||||||
return g;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("init_scope_vars", function(parent_scope){
|
|
||||||
this.variables = new Dictionary(); // map name to AST_SymbolVar (variables defined in this scope; includes functions)
|
this.variables = new Dictionary(); // map name to AST_SymbolVar (variables defined in this scope; includes functions)
|
||||||
this.functions = new Dictionary(); // map name to AST_SymbolDefun (functions defined in this scope)
|
this.functions = new Dictionary(); // map name to AST_SymbolDefun (functions defined in this scope)
|
||||||
this.uses_with = false; // will be set to true if this or some nested scope uses the `with` statement
|
this.uses_with = false; // will be set to true if this or some nested scope uses the `with` statement
|
||||||
this.uses_eval = false; // will be set to true if this or nested scope uses the global `eval`
|
this.uses_eval = false; // will be set to true if this or nested scope uses the global `eval`
|
||||||
this.parent_scope = parent_scope; // the parent scope
|
this.parent_scope = null; // the parent scope
|
||||||
this.enclosed = []; // a list of variables from this or outer scope(s) that are referenced from this or inner scopes
|
this.enclosed = []; // a list of variables from this or outer scope(s) that are referenced from this or inner scopes
|
||||||
this.cname = -1; // the current index for mangling functions/variables
|
this.cname = -1; // the current index for mangling functions/variables
|
||||||
|
this.nesting = nesting; // the nesting level of this scope (0 means toplevel)
|
||||||
|
});
|
||||||
|
|
||||||
|
AST_Node.DEFMETHOD("is_block_scope", function(){
|
||||||
|
return false; // Behaviour will be overridden by AST_Block
|
||||||
|
});
|
||||||
|
|
||||||
|
AST_Block.DEFMETHOD("is_block_scope", function(){
|
||||||
|
return (
|
||||||
|
!(this instanceof AST_Lambda) &&
|
||||||
|
!(this instanceof AST_Toplevel) &&
|
||||||
|
!(this instanceof AST_Class) &&
|
||||||
|
!(this instanceof AST_SwitchBranch)
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Lambda.DEFMETHOD("init_scope_vars", function(){
|
AST_Lambda.DEFMETHOD("init_scope_vars", function(){
|
||||||
AST_Scope.prototype.init_scope_vars.apply(this, arguments);
|
AST_Scope.prototype.init_scope_vars.apply(this, arguments);
|
||||||
this.uses_arguments = false;
|
this.uses_arguments = false;
|
||||||
this.def_variable(new AST_SymbolVar({
|
|
||||||
name: "arguments",
|
var symbol = new AST_VarDef({ name: "arguments", start: this.start, end: this.end });
|
||||||
start: this.start,
|
var def = new SymbolDef(this, this.variables.size(), symbol);
|
||||||
end: this.end
|
this.variables.set(symbol.name, def);
|
||||||
}));
|
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("mark_enclosed", function(options) {
|
AST_SymbolRef.DEFMETHOD("reference", function() {
|
||||||
var def = this.definition();
|
var def = this.definition();
|
||||||
|
def.references.push(this);
|
||||||
var s = this.scope;
|
var s = this.scope;
|
||||||
while (s) {
|
while (s) {
|
||||||
push_uniq(s.enclosed, def);
|
push_uniq(s.enclosed, def);
|
||||||
if (options.keep_fnames) {
|
|
||||||
s.functions.each(function(d) {
|
|
||||||
push_uniq(def.scope.enclosed, d);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (s === def.scope) break;
|
if (s === def.scope) break;
|
||||||
s = s.parent_scope;
|
s = s.parent_scope;
|
||||||
}
|
}
|
||||||
});
|
this.frame = this.scope.nesting - def.scope.nesting;
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("reference", function(options) {
|
|
||||||
this.definition().references.push(this);
|
|
||||||
this.mark_enclosed(options);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("find_variable", function(name){
|
AST_Scope.DEFMETHOD("find_variable", function(name){
|
||||||
@@ -301,16 +341,20 @@ AST_Scope.DEFMETHOD("find_variable", function(name){
|
|||||||
|| (this.parent_scope && this.parent_scope.find_variable(name));
|
|| (this.parent_scope && this.parent_scope.find_variable(name));
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("def_function", function(symbol){
|
AST_Scope.DEFMETHOD("def_function", function(symbol, in_export){
|
||||||
this.functions.set(symbol.name, this.def_variable(symbol));
|
this.functions.set(symbol.name, this.def_variable(symbol, in_export));
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("def_variable", function(symbol){
|
AST_Scope.DEFMETHOD("def_variable", function(symbol, in_export){
|
||||||
var def;
|
var def;
|
||||||
if (!this.variables.has(symbol.name)) {
|
if (!this.variables.has(symbol.name)) {
|
||||||
def = new SymbolDef(this, this.variables.size(), symbol);
|
def = new SymbolDef(this, this.variables.size(), symbol);
|
||||||
this.variables.set(symbol.name, def);
|
this.variables.set(symbol.name, def);
|
||||||
def.global = !this.parent_scope;
|
def.object_destructuring_arg = symbol.object_destructuring_arg;
|
||||||
|
if (in_export) {
|
||||||
|
def.export = true;
|
||||||
|
}
|
||||||
|
def.global = !this.parent_scope && !(symbol instanceof AST_SymbolBlockDeclaration);
|
||||||
} else {
|
} else {
|
||||||
def = this.variables.get(symbol.name);
|
def = this.variables.get(symbol.name);
|
||||||
def.orig.push(symbol);
|
def.orig.push(symbol);
|
||||||
@@ -357,8 +401,19 @@ AST_Function.DEFMETHOD("next_mangled", function(options, def){
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
AST_Scope.DEFMETHOD("references", function(sym){
|
||||||
|
if (sym instanceof AST_Symbol) sym = sym.definition();
|
||||||
|
return this.enclosed.indexOf(sym) < 0 ? null : sym;
|
||||||
|
});
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("unmangleable", function(options){
|
AST_Symbol.DEFMETHOD("unmangleable", function(options){
|
||||||
return this.definition().unmangleable(options);
|
var def = this.definition();
|
||||||
|
return def && def.unmangleable(options);
|
||||||
|
});
|
||||||
|
|
||||||
|
// property accessors are not mangleable
|
||||||
|
AST_SymbolAccessor.DEFMETHOD("unmangleable", function(){
|
||||||
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
// labels are always mangleable
|
// labels are always mangleable
|
||||||
@@ -391,14 +446,21 @@ AST_Symbol.DEFMETHOD("global", function(){
|
|||||||
return this.definition().global;
|
return this.definition().global;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
AST_Var.DEFMETHOD("has_const_pragma", function() {
|
||||||
|
var comments_before = this.start && this.start.comments_before;
|
||||||
|
var lastComment = comments_before && comments_before[comments_before.length - 1];
|
||||||
|
return lastComment && /@const\b/.test(lastComment.value);
|
||||||
|
});
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("_default_mangler_options", function(options){
|
AST_Toplevel.DEFMETHOD("_default_mangler_options", function(options){
|
||||||
return defaults(options, {
|
return defaults(options, {
|
||||||
eval : false,
|
|
||||||
except : [],
|
except : [],
|
||||||
keep_fnames : false,
|
eval : false,
|
||||||
screw_ie8 : true,
|
|
||||||
sort : false, // Ignored. Flag retained for backwards compatibility.
|
sort : false, // Ignored. Flag retained for backwards compatibility.
|
||||||
toplevel : false,
|
toplevel : false,
|
||||||
|
screw_ie8 : true,
|
||||||
|
keep_fnames : false,
|
||||||
|
keep_classnames : false
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -447,13 +509,19 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options){
|
|||||||
node.mangled_name = name;
|
node.mangled_name = name;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (options.screw_ie8 && node instanceof AST_SymbolCatch) {
|
var mangle_with_block_scope =
|
||||||
|
(options.screw_ie8 && node instanceof AST_SymbolCatch) ||
|
||||||
|
node instanceof AST_SymbolBlockDeclaration;
|
||||||
|
if (mangle_with_block_scope) {
|
||||||
to_mangle.push(node.definition());
|
to_mangle.push(node.definition());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.walk(tw);
|
this.walk(tw);
|
||||||
to_mangle.forEach(function(def){ def.mangle(options) });
|
to_mangle.forEach(function(def){
|
||||||
|
if (def.destructuring && !def.destructuring.is_array) return;
|
||||||
|
def.mangle(options);
|
||||||
|
});
|
||||||
|
|
||||||
if (options.cache) {
|
if (options.cache) {
|
||||||
options.cache.cname = this.cname;
|
options.cache.cname = this.cname;
|
||||||
@@ -504,21 +572,27 @@ AST_Toplevel.DEFMETHOD("compute_char_frequency", function(options){
|
|||||||
else if (node instanceof AST_With)
|
else if (node instanceof AST_With)
|
||||||
base54.consider("with");
|
base54.consider("with");
|
||||||
else if (node instanceof AST_ObjectSetter)
|
else if (node instanceof AST_ObjectSetter)
|
||||||
base54.consider("set" + node.key);
|
base54.consider("set" + (typeof node.key === "string" ? node.key : ""));
|
||||||
else if (node instanceof AST_ObjectGetter)
|
else if (node instanceof AST_ObjectGetter)
|
||||||
base54.consider("get" + node.key);
|
base54.consider("get" + (typeof node.key === "string" ? node.key : ""));
|
||||||
else if (node instanceof AST_ObjectKeyVal)
|
else if (node instanceof AST_ObjectKeyVal && typeof node.key === "string")
|
||||||
|
base54.consider(node.key);
|
||||||
|
else if (node instanceof AST_ConciseMethod && typeof node.key === "string")
|
||||||
base54.consider(node.key);
|
base54.consider(node.key);
|
||||||
else if (node instanceof AST_New)
|
else if (node instanceof AST_New)
|
||||||
base54.consider("new");
|
base54.consider("new");
|
||||||
else if (node instanceof AST_This)
|
else if (node instanceof AST_This)
|
||||||
base54.consider("this");
|
base54.consider("this");
|
||||||
|
else if (node instanceof AST_Super)
|
||||||
|
base54.consider("super");
|
||||||
else if (node instanceof AST_Try)
|
else if (node instanceof AST_Try)
|
||||||
base54.consider("try");
|
base54.consider("try");
|
||||||
else if (node instanceof AST_Catch)
|
else if (node instanceof AST_Catch)
|
||||||
base54.consider("catch");
|
base54.consider("catch");
|
||||||
else if (node instanceof AST_Finally)
|
else if (node instanceof AST_Finally)
|
||||||
base54.consider("finally");
|
base54.consider("finally");
|
||||||
|
else if (node instanceof AST_Yield)
|
||||||
|
base54.consider("yield");
|
||||||
else if (node instanceof AST_Symbol && node.unmangleable(options))
|
else if (node instanceof AST_Symbol && node.unmangleable(options))
|
||||||
base54.consider(node.name);
|
base54.consider(node.name);
|
||||||
else if (node instanceof AST_Unary || node instanceof AST_Binary)
|
else if (node instanceof AST_Unary || node instanceof AST_Binary)
|
||||||
@@ -571,12 +645,12 @@ var base54 = (function() {
|
|||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("scope_warnings", function(options){
|
AST_Toplevel.DEFMETHOD("scope_warnings", function(options){
|
||||||
options = defaults(options, {
|
options = defaults(options, {
|
||||||
assign_to_global : true,
|
|
||||||
eval : true,
|
|
||||||
func_arguments : true,
|
|
||||||
nested_defuns : true,
|
|
||||||
undeclared : false, // this makes a lot of noise
|
undeclared : false, // this makes a lot of noise
|
||||||
unreferenced : true,
|
unreferenced : true,
|
||||||
|
assign_to_global : true,
|
||||||
|
func_arguments : true,
|
||||||
|
nested_defuns : true,
|
||||||
|
eval : true
|
||||||
});
|
});
|
||||||
var tw = new TreeWalker(function(node){
|
var tw = new TreeWalker(function(node){
|
||||||
if (options.undeclared
|
if (options.undeclared
|
||||||
|
|||||||
@@ -163,10 +163,18 @@ TreeTransformer.prototype = new TreeWalker;
|
|||||||
if (self.value) self.value = self.value.transform(tw);
|
if (self.value) self.value = self.value.transform(tw);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
_(AST_Destructuring, function(self, tw) {
|
||||||
|
self.names = do_list(self.names, tw);
|
||||||
|
});
|
||||||
|
|
||||||
_(AST_Lambda, function(self, tw){
|
_(AST_Lambda, function(self, tw){
|
||||||
if (self.name) self.name = self.name.transform(tw);
|
if (self.name) self.name = self.name.transform(tw);
|
||||||
self.argnames = do_list(self.argnames, tw);
|
self.argnames = do_list(self.argnames, tw);
|
||||||
|
if (self.body instanceof AST_Node) {
|
||||||
|
self.body = self.body.transform(tw);
|
||||||
|
} else {
|
||||||
self.body = do_list(self.body, tw);
|
self.body = do_list(self.body, tw);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
_(AST_Call, function(self, tw){
|
_(AST_Call, function(self, tw){
|
||||||
@@ -188,6 +196,10 @@ TreeTransformer.prototype = new TreeWalker;
|
|||||||
self.property = self.property.transform(tw);
|
self.property = self.property.transform(tw);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
_(AST_Yield, function(self, tw){
|
||||||
|
if (self.expression) self.expression = self.expression.transform(tw);
|
||||||
|
});
|
||||||
|
|
||||||
_(AST_Unary, function(self, tw){
|
_(AST_Unary, function(self, tw){
|
||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
});
|
});
|
||||||
@@ -212,7 +224,32 @@ TreeTransformer.prototype = new TreeWalker;
|
|||||||
});
|
});
|
||||||
|
|
||||||
_(AST_ObjectProperty, function(self, tw){
|
_(AST_ObjectProperty, function(self, tw){
|
||||||
|
if (self.key instanceof AST_Node) {
|
||||||
|
self.key = self.key.transform(tw);
|
||||||
|
}
|
||||||
self.value = self.value.transform(tw);
|
self.value = self.value.transform(tw);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
_(AST_Class, function(self, tw){
|
||||||
|
if (self.name) self.name = self.name.transform(tw);
|
||||||
|
if (self.extends) self.extends = self.extends.transform(tw);
|
||||||
|
self.properties = do_list(self.properties, tw);
|
||||||
|
});
|
||||||
|
|
||||||
|
_(AST_Expansion, function(self, tw){
|
||||||
|
self.expression = self.expression.transform(tw);
|
||||||
|
});
|
||||||
|
|
||||||
|
_(AST_TemplateString, function(self, tw) {
|
||||||
|
for (var i = 0; i < self.segments.length; i++) {
|
||||||
|
if (!(self.segments[i] instanceof AST_TemplateSegment)) {
|
||||||
|
self.segments[i] = self.segments[i].transform(tw);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
_(AST_PrefixedTemplateString, function(self, tw) {
|
||||||
|
self.template_string = self.template_string.transform(tw);
|
||||||
|
});
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|||||||
48
lib/utils.js
48
lib/utils.js
@@ -78,28 +78,13 @@ function repeat_string(str, i) {
|
|||||||
return d;
|
return d;
|
||||||
};
|
};
|
||||||
|
|
||||||
function configure_error_stack(fn) {
|
|
||||||
Object.defineProperty(fn.prototype, "stack", {
|
|
||||||
get: function() {
|
|
||||||
var err = new Error(this.message);
|
|
||||||
err.name = this.name;
|
|
||||||
try {
|
|
||||||
throw err;
|
|
||||||
} catch(e) {
|
|
||||||
return e.stack;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function DefaultsError(msg, defs) {
|
function DefaultsError(msg, defs) {
|
||||||
this.message = msg;
|
Error.call(this, msg);
|
||||||
|
this.msg = msg;
|
||||||
this.defs = defs;
|
this.defs = defs;
|
||||||
};
|
};
|
||||||
DefaultsError.prototype = Object.create(Error.prototype);
|
DefaultsError.prototype = Object.create(Error.prototype);
|
||||||
DefaultsError.prototype.constructor = DefaultsError;
|
DefaultsError.prototype.constructor = DefaultsError;
|
||||||
DefaultsError.prototype.name = "DefaultsError";
|
|
||||||
configure_error_stack(DefaultsError);
|
|
||||||
|
|
||||||
DefaultsError.croak = function(msg, defs) {
|
DefaultsError.croak = function(msg, defs) {
|
||||||
throw new DefaultsError(msg, defs);
|
throw new DefaultsError(msg, defs);
|
||||||
@@ -126,11 +111,9 @@ function merge(obj, ext) {
|
|||||||
return count;
|
return count;
|
||||||
};
|
};
|
||||||
|
|
||||||
function noop() {}
|
function noop() {};
|
||||||
function return_false() { return false; }
|
function return_false() { return false; }
|
||||||
function return_true() { return true; }
|
function return_true() { return true; }
|
||||||
function return_this() { return this; }
|
|
||||||
function return_null() { return null; }
|
|
||||||
|
|
||||||
var MAP = (function(){
|
var MAP = (function(){
|
||||||
function MAP(a, f, backwards) {
|
function MAP(a, f, backwards) {
|
||||||
@@ -187,7 +170,7 @@ function push_uniq(array, el) {
|
|||||||
|
|
||||||
function string_template(text, props) {
|
function string_template(text, props) {
|
||||||
return text.replace(/\{(.+?)\}/g, function(str, p){
|
return text.replace(/\{(.+?)\}/g, function(str, p){
|
||||||
return props && props[p];
|
return props[p];
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -337,26 +320,3 @@ Dictionary.fromObject = function(obj) {
|
|||||||
function HOP(obj, prop) {
|
function HOP(obj, prop) {
|
||||||
return Object.prototype.hasOwnProperty.call(obj, prop);
|
return Object.prototype.hasOwnProperty.call(obj, prop);
|
||||||
}
|
}
|
||||||
|
|
||||||
// return true if the node at the top of the stack (that means the
|
|
||||||
// innermost node in the current output) is lexically the first in
|
|
||||||
// a statement.
|
|
||||||
function first_in_statement(stack) {
|
|
||||||
var node = stack.parent(-1);
|
|
||||||
for (var i = 0, p; p = stack.parent(i); i++) {
|
|
||||||
if (p instanceof AST_Statement && p.body === node)
|
|
||||||
return true;
|
|
||||||
if ((p instanceof AST_Seq && p.car === node ) ||
|
|
||||||
(p instanceof AST_Call && p.expression === node && !(p instanceof AST_New) ) ||
|
|
||||||
(p instanceof AST_Dot && p.expression === node ) ||
|
|
||||||
(p instanceof AST_Sub && p.expression === node ) ||
|
|
||||||
(p instanceof AST_Conditional && p.condition === node ) ||
|
|
||||||
(p instanceof AST_Binary && p.left === node ) ||
|
|
||||||
(p instanceof AST_UnaryPostfix && p.expression === node ))
|
|
||||||
{
|
|
||||||
node = p;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
128
npm-shrinkwrap.json
generated
Normal file
128
npm-shrinkwrap.json
generated
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
{
|
||||||
|
"name": "uglify-js",
|
||||||
|
"version": "2.4.24",
|
||||||
|
"dependencies": {
|
||||||
|
"abbrev": {
|
||||||
|
"version": "1.0.7",
|
||||||
|
"from": "abbrev@>=1.0.0 <2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz"
|
||||||
|
},
|
||||||
|
"amdefine": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"from": "amdefine@>=0.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz"
|
||||||
|
},
|
||||||
|
"async": {
|
||||||
|
"version": "0.2.10",
|
||||||
|
"from": "async@>=0.2.6 <0.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz"
|
||||||
|
},
|
||||||
|
"camelcase": {
|
||||||
|
"version": "1.2.1",
|
||||||
|
"from": "camelcase@>=1.0.2 <2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz"
|
||||||
|
},
|
||||||
|
"decamelize": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"from": "decamelize@>=1.0.0 <2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.0.0.tgz"
|
||||||
|
},
|
||||||
|
"deep-is": {
|
||||||
|
"version": "0.1.3",
|
||||||
|
"from": "deep-is@>=0.1.2 <0.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz"
|
||||||
|
},
|
||||||
|
"esprima": {
|
||||||
|
"version": "1.1.1",
|
||||||
|
"from": "esprima@>=1.1.1 <1.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/esprima/-/esprima-1.1.1.tgz"
|
||||||
|
},
|
||||||
|
"estraverse": {
|
||||||
|
"version": "1.5.1",
|
||||||
|
"from": "estraverse@>=1.5.1 <1.6.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz"
|
||||||
|
},
|
||||||
|
"esutils": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"from": "esutils@>=1.0.0 <1.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz"
|
||||||
|
},
|
||||||
|
"fast-levenshtein": {
|
||||||
|
"version": "1.0.7",
|
||||||
|
"from": "fast-levenshtein@>=1.0.0 <1.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.0.7.tgz"
|
||||||
|
},
|
||||||
|
"levn": {
|
||||||
|
"version": "0.2.5",
|
||||||
|
"from": "levn@>=0.2.5 <0.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/levn/-/levn-0.2.5.tgz"
|
||||||
|
},
|
||||||
|
"nopt": {
|
||||||
|
"version": "2.1.2",
|
||||||
|
"from": "nopt@>=2.1.2 <2.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz"
|
||||||
|
},
|
||||||
|
"optionator": {
|
||||||
|
"version": "0.5.0",
|
||||||
|
"from": "optionator@>=0.5.0 <0.6.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.5.0.tgz"
|
||||||
|
},
|
||||||
|
"prelude-ls": {
|
||||||
|
"version": "1.1.2",
|
||||||
|
"from": "prelude-ls@>=1.1.1 <1.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz"
|
||||||
|
},
|
||||||
|
"reflect": {
|
||||||
|
"version": "0.1.3",
|
||||||
|
"from": "git://github.com/zaach/reflect.js.git",
|
||||||
|
"resolved": "git://github.com/zaach/reflect.js.git#286bcd79661c96ecc404357d3c0e35fdb54a6967"
|
||||||
|
},
|
||||||
|
"source-map": {
|
||||||
|
"version": "0.5.1",
|
||||||
|
"from": "source-map@>=0.5.1 <0.6.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.1.tgz"
|
||||||
|
},
|
||||||
|
"type-check": {
|
||||||
|
"version": "0.3.1",
|
||||||
|
"from": "type-check@>=0.3.1 <0.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.1.tgz"
|
||||||
|
},
|
||||||
|
"uglify-js": {
|
||||||
|
"version": "2.4.24",
|
||||||
|
"from": "git://github.com/mishoo/UglifyJS2.git",
|
||||||
|
"resolved": "git://github.com/mishoo/UglifyJS2.git#2a06c7758e24a64740473c8031eafbb7fefa213f",
|
||||||
|
"dependencies": {
|
||||||
|
"source-map": {
|
||||||
|
"version": "0.1.34",
|
||||||
|
"from": "source-map@0.1.34",
|
||||||
|
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"uglify-to-browserify": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"from": "uglify-to-browserify@>=1.0.0 <1.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz"
|
||||||
|
},
|
||||||
|
"window-size": {
|
||||||
|
"version": "0.1.0",
|
||||||
|
"from": "window-size@0.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz"
|
||||||
|
},
|
||||||
|
"wordwrap": {
|
||||||
|
"version": "0.0.2",
|
||||||
|
"from": "wordwrap@0.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz"
|
||||||
|
},
|
||||||
|
"yargs": {
|
||||||
|
"version": "3.10.0",
|
||||||
|
"from": "yargs@>=3.10.0 <3.11.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz"
|
||||||
|
},
|
||||||
|
"zeparser": {
|
||||||
|
"version": "0.0.7",
|
||||||
|
"from": "git://github.com/qfox/ZeParser.git",
|
||||||
|
"resolved": "git://github.com/qfox/ZeParser.git#c99240c5ba7054c467733800ff38265958a2dda9"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
13
package.json
13
package.json
@@ -4,7 +4,7 @@
|
|||||||
"homepage": "http://lisperator.net/uglifyjs",
|
"homepage": "http://lisperator.net/uglifyjs",
|
||||||
"author": "Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)",
|
"author": "Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)",
|
||||||
"license": "BSD-2-Clause",
|
"license": "BSD-2-Clause",
|
||||||
"version": "2.8.29",
|
"version": "2.7.5",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.8.0"
|
"node": ">=0.8.0"
|
||||||
},
|
},
|
||||||
@@ -29,22 +29,25 @@
|
|||||||
"LICENSE"
|
"LICENSE"
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"async": "~0.2.6",
|
||||||
"source-map": "~0.5.1",
|
"source-map": "~0.5.1",
|
||||||
|
"uglify-to-browserify": "~1.0.0",
|
||||||
"yargs": "~3.10.0"
|
"yargs": "~3.10.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"acorn": "~5.0.3",
|
"acorn": "~0.6.0",
|
||||||
|
"escodegen": "~1.3.3",
|
||||||
|
"esfuzz": "~0.3.1",
|
||||||
|
"estraverse": "~1.5.1",
|
||||||
"mocha": "~2.3.4"
|
"mocha": "~2.3.4"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
|
||||||
"uglify-to-browserify": "~1.0.0"
|
|
||||||
},
|
|
||||||
"browserify": {
|
"browserify": {
|
||||||
"transform": [
|
"transform": [
|
||||||
"uglify-to-browserify"
|
"uglify-to-browserify"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
"shrinkwrap": "rm ./npm-shrinkwrap.json; rm -rf ./node_modules; npm i && npm shrinkwrap && npm outdated",
|
||||||
"test": "node test/run-tests.js"
|
"test": "node test/run-tests.js"
|
||||||
},
|
},
|
||||||
"keywords": ["uglify", "uglify-js", "minify", "minifier"]
|
"keywords": ["uglify", "uglify-js", "minify", "minifier"]
|
||||||
|
|||||||
@@ -1,80 +0,0 @@
|
|||||||
#! /usr/bin/env node
|
|
||||||
// -*- js -*-
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
var createHash = require("crypto").createHash;
|
|
||||||
var fork = require("child_process").fork;
|
|
||||||
var args = process.argv.slice(2);
|
|
||||||
if (!args.length) {
|
|
||||||
args.push("-mc", "warnings=false");
|
|
||||||
}
|
|
||||||
args.push("--stats");
|
|
||||||
var urls = [
|
|
||||||
"https://code.jquery.com/jquery-3.2.1.js",
|
|
||||||
"https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.4/angular.js",
|
|
||||||
"https://cdnjs.cloudflare.com/ajax/libs/mathjs/3.9.0/math.js",
|
|
||||||
"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.js",
|
|
||||||
"https://unpkg.com/react@15.3.2/dist/react.js",
|
|
||||||
"http://builds.emberjs.com/tags/v2.11.0/ember.prod.js",
|
|
||||||
"https://cdn.jsdelivr.net/lodash/4.17.4/lodash.js",
|
|
||||||
"https://cdnjs.cloudflare.com/ajax/libs/d3/4.5.0/d3.js",
|
|
||||||
];
|
|
||||||
var results = {};
|
|
||||||
var remaining = 2 * urls.length;
|
|
||||||
function done() {
|
|
||||||
if (!--remaining) {
|
|
||||||
var failures = [];
|
|
||||||
urls.forEach(function(url) {
|
|
||||||
var info = results[url];
|
|
||||||
console.log();
|
|
||||||
console.log(url);
|
|
||||||
console.log(info.log);
|
|
||||||
var elapsed = 0;
|
|
||||||
info.log.replace(/: ([0-9]+\.[0-9]{3})s/g, function(match, time) {
|
|
||||||
elapsed += parseFloat(time);
|
|
||||||
});
|
|
||||||
console.log("Run-time:", elapsed.toFixed(3), "s");
|
|
||||||
console.log("Original:", info.input, "bytes");
|
|
||||||
console.log("Uglified:", info.output, "bytes");
|
|
||||||
console.log("SHA1 sum:", info.sha1);
|
|
||||||
if (info.code) {
|
|
||||||
failures.push(url);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (failures.length) {
|
|
||||||
console.error("Benchmark failed:");
|
|
||||||
failures.forEach(function(url) {
|
|
||||||
console.error(url);
|
|
||||||
});
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
urls.forEach(function(url) {
|
|
||||||
results[url] = {
|
|
||||||
input: 0,
|
|
||||||
output: 0,
|
|
||||||
log: ""
|
|
||||||
};
|
|
||||||
require(url.slice(0, url.indexOf(":"))).get(url, function(res) {
|
|
||||||
var uglifyjs = fork("bin/uglifyjs", args, { silent: true });
|
|
||||||
res.on("data", function(data) {
|
|
||||||
results[url].input += data.length;
|
|
||||||
}).pipe(uglifyjs.stdin);
|
|
||||||
uglifyjs.stdout.on("data", function(data) {
|
|
||||||
results[url].output += data.length;
|
|
||||||
}).pipe(createHash("sha1")).on("data", function(data) {
|
|
||||||
results[url].sha1 = data.toString("hex");
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
uglifyjs.stderr.setEncoding("utf8");
|
|
||||||
uglifyjs.stderr.on("data", function(data) {
|
|
||||||
results[url].log += data;
|
|
||||||
});
|
|
||||||
uglifyjs.on("exit", function(code) {
|
|
||||||
results[url].code = code;
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
// NOTE trailing comma doesn't contribute to length of an array
|
||||||
|
// That also means the array changes length if previous element is a hole too and got cut off
|
||||||
holes_and_undefined: {
|
holes_and_undefined: {
|
||||||
input: {
|
input: {
|
||||||
w = [1,,];
|
w = [1,,];
|
||||||
@@ -21,19 +23,10 @@ constant_join: {
|
|||||||
input: {
|
input: {
|
||||||
var a = [ "foo", "bar", "baz" ].join("");
|
var a = [ "foo", "bar", "baz" ].join("");
|
||||||
var a1 = [ "foo", "bar", "baz" ].join();
|
var a1 = [ "foo", "bar", "baz" ].join();
|
||||||
var a2 = [ "foo", "bar", "baz" ].join(null);
|
|
||||||
var a3 = [ "foo", "bar", "baz" ].join(void 0);
|
|
||||||
var a4 = [ "foo", , "baz" ].join();
|
|
||||||
var a5 = [ "foo", null, "baz" ].join();
|
|
||||||
var a6 = [ "foo", void 0, "baz" ].join();
|
|
||||||
var b = [ "foo", 1, 2, 3, "bar" ].join("");
|
var b = [ "foo", 1, 2, 3, "bar" ].join("");
|
||||||
var c = [ boo(), "foo", 1, 2, 3, "bar", bar() ].join("");
|
var c = [ boo(), "foo", 1, 2, 3, "bar", bar() ].join("");
|
||||||
var c1 = [ boo(), bar(), "foo", 1, 2, 3, "bar", bar() ].join("");
|
var c1 = [ boo(), bar(), "foo", 1, 2, 3, "bar", bar() ].join("");
|
||||||
var c2 = [ 1, 2, "foo", "bar", baz() ].join("");
|
var c2 = [ 1, 2, "foo", "bar", baz() ].join("");
|
||||||
var c3 = [ boo() + bar() + "foo", 1, 2, 3, "bar", bar() + "foo" ].join("");
|
|
||||||
var c4 = [ 1, 2, null, undefined, "foo", "bar", baz() ].join("");
|
|
||||||
var c5 = [ boo() + bar() + "foo", 1, 2, 3, "bar", bar() + "foo" ].join();
|
|
||||||
var c6 = [ 1, 2, null, undefined, "foo", "bar", baz() ].join();
|
|
||||||
var d = [ "foo", 1 + 2 + "bar", "baz" ].join("-");
|
var d = [ "foo", 1 + 2 + "bar", "baz" ].join("-");
|
||||||
var e = [].join(foo + bar);
|
var e = [].join(foo + bar);
|
||||||
var f = [].join("");
|
var f = [].join("");
|
||||||
@@ -42,19 +35,10 @@ constant_join: {
|
|||||||
expect: {
|
expect: {
|
||||||
var a = "foobarbaz";
|
var a = "foobarbaz";
|
||||||
var a1 = "foo,bar,baz";
|
var a1 = "foo,bar,baz";
|
||||||
var a2 = "foonullbarnullbaz";
|
|
||||||
var a3 = "foo,bar,baz";
|
|
||||||
var a4 = "foo,,baz";
|
|
||||||
var a5 = "foo,,baz";
|
|
||||||
var a6 = "foo,,baz";
|
|
||||||
var b = "foo123bar";
|
var b = "foo123bar";
|
||||||
var c = boo() + "foo123bar" + bar();
|
var c = boo() + "foo123bar" + bar();
|
||||||
var c1 = "" + boo() + bar() + "foo123bar" + bar();
|
var c1 = "" + boo() + bar() + "foo123bar" + bar();
|
||||||
var c2 = "12foobar" + baz();
|
var c2 = "12foobar" + baz();
|
||||||
var c3 = boo() + bar() + "foo123bar" + bar() + "foo";
|
|
||||||
var c4 = "12foobar" + baz();
|
|
||||||
var c5 = [ boo() + bar() + "foo", 1, 2, 3, "bar", bar() + "foo" ].join();
|
|
||||||
var c6 = [ "1,2,,,foo,bar", baz() ].join();
|
|
||||||
var d = "foo-3bar-baz";
|
var d = "foo-3bar-baz";
|
||||||
var e = [].join(foo + bar);
|
var e = [].join(foo + bar);
|
||||||
var f = "";
|
var f = "";
|
||||||
@@ -91,87 +75,75 @@ constant_join_2: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
constant_join_3: {
|
spread_with_variable_as_last_element: {
|
||||||
options = {
|
|
||||||
unsafe: true,
|
|
||||||
evaluate: true,
|
|
||||||
};
|
|
||||||
input: {
|
input: {
|
||||||
var a = [ null ].join();
|
var values = [4, 5, 6];
|
||||||
var b = [ , ].join();
|
var a = [1, 2, 3, ...values];
|
||||||
var c = [ , 1, , 3 ].join();
|
|
||||||
var d = [ foo ].join();
|
|
||||||
var e = [ foo, null, undefined, bar ].join("-");
|
|
||||||
var f = [ foo, bar ].join("");
|
|
||||||
var g = [ null, "foo", null, bar + "baz" ].join("");
|
|
||||||
var h = [ null, "foo", null, bar + "baz" ].join("-");
|
|
||||||
var i = [ "foo" + bar, null, baz + "moo" ].join("");
|
|
||||||
var j = [ foo + "bar", baz ].join("");
|
|
||||||
var k = [ foo, "bar" + baz ].join("");
|
|
||||||
var l = [ foo, bar + "baz" ].join("");
|
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a = "";
|
var values = [4, 5, 6];
|
||||||
var b = "";
|
var a = [1, 2, 3, ...values];
|
||||||
var c = ",1,,3";
|
|
||||||
var d = "" + foo;
|
|
||||||
var e = [ foo, "-", bar ].join("-");
|
|
||||||
var f = "" + foo + bar;
|
|
||||||
var g = "foo" + bar + "baz";
|
|
||||||
var h = [ "-foo-", bar + "baz" ].join("-");
|
|
||||||
var i = "foo" + bar + baz + "moo";
|
|
||||||
var j = foo + "bar" + baz;
|
|
||||||
var k = foo + "bar" + baz;
|
|
||||||
var l = foo + (bar + "baz");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for_loop: {
|
spread_with_variable_in_middle: {
|
||||||
options = {
|
|
||||||
unsafe : true,
|
|
||||||
unused : true,
|
|
||||||
evaluate : true,
|
|
||||||
reduce_vars : true
|
|
||||||
};
|
|
||||||
input: {
|
input: {
|
||||||
function f0() {
|
var values = [4, 5, 6];
|
||||||
var a = [1, 2, 3];
|
var a = [1, 2, 3, ...values, 7,,,];
|
||||||
for (var i = 0; i < a.length; i++) {
|
|
||||||
console.log(a[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function f1() {
|
|
||||||
var a = [1, 2, 3];
|
|
||||||
for (var i = 0, len = a.length; i < len; i++) {
|
|
||||||
console.log(a[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function f2() {
|
|
||||||
var a = [1, 2, 3];
|
|
||||||
for (var i = 0; i < a.length; i++) {
|
|
||||||
a[i]++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f0() {
|
var values = [4, 5, 6];
|
||||||
var a = [1, 2, 3];
|
var a = [1, 2, 3, ...values, 7,,,];
|
||||||
for (var i = 0; i < 3; i++)
|
}
|
||||||
console.log(a[i]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function f1() {
|
spread_with_variable_at_front: {
|
||||||
var a = [1, 2, 3];
|
input: {
|
||||||
for (var i = 0; i < 3; i++)
|
var values = [1, 2, 3];
|
||||||
console.log(a[i]);
|
var a = [...values, 4, 5, 6];
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var values = [1, 2, 3];
|
||||||
|
var a = [...values, 4, 5, 6];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function f2() {
|
spread_with_variable_at_front_after_elisions: {
|
||||||
var a = [1, 2, 3];
|
input: {
|
||||||
for (var i = 0; i < a.length; i++)
|
var values = [1, 2, 3];
|
||||||
a[i]++;
|
var a = [,,,...values, 4, 5, 6];
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var values = [1, 2, 3];
|
||||||
|
var a = [,,,...values, 4, 5, 6];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spread_with_array_at_end: {
|
||||||
|
input: {
|
||||||
|
var a = [1, 2, ...[4, 5, 6]];
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = [1, 2, ...[4, 5, 6]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
spread_with_logical_expression_at_end: {
|
||||||
|
options = { evaluate: true }
|
||||||
|
input: {
|
||||||
|
var a = [1, 2, 3, ...[2+2]]
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = [1, 2, 3, ...[4]]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
spread_with_logical_expression_at_middle: {
|
||||||
|
options = { evaluate: true }
|
||||||
|
input: {
|
||||||
|
var a = [1, 1, ...[1+1, 1+2, 2+3], 8]
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = [1, 1, ...[2, 3, 5], 8]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
128
test/compress/arrow.js
Normal file
128
test/compress/arrow.js
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
arrow_functions_without_body: {
|
||||||
|
input: {
|
||||||
|
var a1 = () => 42;
|
||||||
|
var a2 = (p) => p;
|
||||||
|
var a3 = p => p;
|
||||||
|
var a4 = (...p) => p;
|
||||||
|
var a5 = (b, c) => b + c;
|
||||||
|
var a6 = (b, ...c) => b + c[0];
|
||||||
|
var a7 = (...b) => b.join();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a1 = () => 42;
|
||||||
|
var a2 = (p) => p;
|
||||||
|
var a3 = p => p;
|
||||||
|
var a4 = (...p) => p;
|
||||||
|
var a5 = (b, c) => b + c;
|
||||||
|
var a6 = (b, ...c) => b + c[0];
|
||||||
|
var a7 = (...b) => b.join();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
arrow_functions_with_body: {
|
||||||
|
input: {
|
||||||
|
var a1 = () => {
|
||||||
|
var a = 42 * Math.random();
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
var a2 = (p) => {
|
||||||
|
var a = Math.random() * p;
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
var a3 = p => {
|
||||||
|
var a = Math.random() * p;
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
var a4 = (...p) => {
|
||||||
|
var a = Math.random() * p;
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
var a5 = (b, c) => {
|
||||||
|
var result = b * c + b / c;
|
||||||
|
return result
|
||||||
|
};
|
||||||
|
var a6 = (b, ...c) => {
|
||||||
|
var result = b;
|
||||||
|
for (var i = 0; i < c.length; i++)
|
||||||
|
result += c[i];
|
||||||
|
return result
|
||||||
|
};
|
||||||
|
var a7 = (...b) => {
|
||||||
|
b.join();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a1 = () => {
|
||||||
|
var a = 42 * Math.random();
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
var a2 = (p) => {
|
||||||
|
var a = Math.random() * p;
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
var a3 = p => {
|
||||||
|
var a = Math.random() * p;
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
var a4 = (...p) => {
|
||||||
|
var a = Math.random() * p;
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
var a5 = (b, c) => {
|
||||||
|
var result = b * c + b / c;
|
||||||
|
return result
|
||||||
|
};
|
||||||
|
var a6 = (b, ...c) => {
|
||||||
|
var result = b;
|
||||||
|
for (var i = 0; i < c.length; i++)
|
||||||
|
result += c[i];
|
||||||
|
return result
|
||||||
|
};
|
||||||
|
var a7 = (...b) => {
|
||||||
|
b.join();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
arrow_function_with_single_parameter_with_default: {
|
||||||
|
input: {
|
||||||
|
var foo = (a = 0) => doSomething(a);
|
||||||
|
}
|
||||||
|
expect_exact: "var foo=(a=0)=>doSomething(a);"
|
||||||
|
}
|
||||||
|
|
||||||
|
arrow_binding_pattern: {
|
||||||
|
input: {
|
||||||
|
var foo = ([]) => "foo";
|
||||||
|
var bar = ({}) => "bar";
|
||||||
|
var with_default = (foo = "default") => foo;
|
||||||
|
var object_with_default = ({foo = "default", bar: baz = "default"}) => foo;
|
||||||
|
var array_after_spread = (...[foo]) => foo;
|
||||||
|
var array_after_spread = (...{foo}) => foo;
|
||||||
|
var computed = ({ [compute()]: x }) => {};
|
||||||
|
var array_hole = ([, , ...x] = [1, 2]) => {};
|
||||||
|
var object_trailing_elision = ({foo,}) => {};
|
||||||
|
var spread_empty_array = (...[]) => "foo";
|
||||||
|
var spread_empty_object = (...{}) => "foo";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var foo = ([]) => "foo";
|
||||||
|
var bar = ({}) => "bar";
|
||||||
|
var with_default = (foo = "default") => foo;
|
||||||
|
var object_with_default = ({foo = "default", bar: baz = "default"}) => foo;
|
||||||
|
var array_after_spread = (...[foo]) => foo;
|
||||||
|
var array_after_spread = (...{foo}) => foo;
|
||||||
|
var computed = ({ [compute()]: x }) => {};
|
||||||
|
var array_hole = ([, , ...x] = [1, 2]) => {};
|
||||||
|
var object_trailing_elision = ({foo,}) => {};
|
||||||
|
var spread_empty_array = (...[]) => "foo";
|
||||||
|
var spread_empty_object = (...{}) => "foo";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
arrow_binding_pattern_strict: {
|
||||||
|
input: {
|
||||||
|
var foo = ([,]) => "foo";
|
||||||
|
}
|
||||||
|
expect_exact: 'var foo=([,])=>"foo";'
|
||||||
|
}
|
||||||
174
test/compress/block-scope.js
Normal file
174
test/compress/block-scope.js
Normal file
@@ -0,0 +1,174 @@
|
|||||||
|
|
||||||
|
let_statement: {
|
||||||
|
input: {
|
||||||
|
let x = 6;
|
||||||
|
}
|
||||||
|
expect_exact: "let x=6;"
|
||||||
|
}
|
||||||
|
|
||||||
|
do_not_hoist_let: {
|
||||||
|
options = {
|
||||||
|
hoist_vars: true,
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
function x() {
|
||||||
|
if (FOO) {
|
||||||
|
let let1;
|
||||||
|
let let2;
|
||||||
|
var var1;
|
||||||
|
var var2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function x() {
|
||||||
|
var var1, var2;
|
||||||
|
if (FOO) {
|
||||||
|
let let1;
|
||||||
|
let let2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
do_not_remove_anon_blocks_if_they_have_decls: {
|
||||||
|
input: {
|
||||||
|
function x() {
|
||||||
|
{
|
||||||
|
let x;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
var x;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const y;
|
||||||
|
class Zee {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
let y;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
var y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function x(){
|
||||||
|
{
|
||||||
|
let x
|
||||||
|
}
|
||||||
|
var x;
|
||||||
|
{
|
||||||
|
const y;
|
||||||
|
class Zee {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
let y
|
||||||
|
}
|
||||||
|
var y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_unused_in_global_block: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
{
|
||||||
|
let x;
|
||||||
|
const y;
|
||||||
|
class Zee {};
|
||||||
|
var w;
|
||||||
|
}
|
||||||
|
let ex;
|
||||||
|
const why;
|
||||||
|
class Zed {};
|
||||||
|
var wut;
|
||||||
|
console.log(x, y, Zee);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var w;
|
||||||
|
var wut;
|
||||||
|
console.log(x, y, Zee);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
regression_block_scope_resolves: {
|
||||||
|
mangle = { };
|
||||||
|
options = {
|
||||||
|
dead_code: false
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
(function () {
|
||||||
|
if(1) {
|
||||||
|
let x;
|
||||||
|
const y;
|
||||||
|
class Zee {};
|
||||||
|
}
|
||||||
|
if(1) {
|
||||||
|
let ex;
|
||||||
|
const why;
|
||||||
|
class Zi {};
|
||||||
|
}
|
||||||
|
console.log(x, y, Zee, ex, why, Zi);
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function () {
|
||||||
|
if (1) {
|
||||||
|
let o;
|
||||||
|
const n;
|
||||||
|
class c {};
|
||||||
|
}
|
||||||
|
if (1) {
|
||||||
|
let o;
|
||||||
|
const n;
|
||||||
|
class c {};
|
||||||
|
}
|
||||||
|
console.log(x, y, Zee, ex, why, Zi);
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch_block_scope_mangler: {
|
||||||
|
mangle = {}
|
||||||
|
input: {
|
||||||
|
var fn = function(code) {
|
||||||
|
switch (code) {
|
||||||
|
case 1:
|
||||||
|
let apple = code + 1;
|
||||||
|
let dog = code + 4;
|
||||||
|
console.log(apple, dog);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
let banana = code + 2;
|
||||||
|
console.log(banana);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
let cat = code + 3;
|
||||||
|
console.log(cat);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var fn = function(o) {
|
||||||
|
switch (o) {
|
||||||
|
case 1:
|
||||||
|
let e = o + 1
|
||||||
|
let c = o + 4;
|
||||||
|
console.log(e, c);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
let l = o + 2;
|
||||||
|
console.log(l);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
let a = o + 3;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -43,7 +43,6 @@ collapse_vars_side_effects_1: {
|
|||||||
z = i += 4;
|
z = i += 4;
|
||||||
log(x, z, y, i);
|
log(x, z, y, i);
|
||||||
}
|
}
|
||||||
f1(), f2(), f3(), f4();
|
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f1() {
|
function f1() {
|
||||||
@@ -74,9 +73,7 @@ collapse_vars_side_effects_1: {
|
|||||||
y = i += 3;
|
y = i += 3;
|
||||||
log(x, i += 4, y, i);
|
log(x, i += 4, y, i);
|
||||||
}
|
}
|
||||||
f1(), f2(), f3(), f4();
|
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
collapse_vars_side_effects_2: {
|
collapse_vars_side_effects_2: {
|
||||||
@@ -341,13 +338,12 @@ collapse_vars_while: {
|
|||||||
collapse_vars_do_while: {
|
collapse_vars_do_while: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
||||||
comparisons:true, evaluate:true, booleans:false, loops:false, unused:"keep_assign",
|
comparisons:true, evaluate:true, booleans:false, loops:false, unused:true, hoist_funs:true,
|
||||||
hoist_funs:true, keep_fargs:true, if_return:true, join_vars:true, cascade:true,
|
keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true
|
||||||
side_effects:true
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1(y) {
|
function f1(y) {
|
||||||
// The constant do-while condition `c` will not be replaced.
|
// The constant do-while condition `c` will be replaced.
|
||||||
var c = 9;
|
var c = 9;
|
||||||
do { } while (c === 77);
|
do { } while (c === 77);
|
||||||
}
|
}
|
||||||
@@ -384,8 +380,7 @@ collapse_vars_do_while: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f1(y) {
|
function f1(y) {
|
||||||
var c = 9;
|
do ; while (false);
|
||||||
do ; while (77 === c);
|
|
||||||
}
|
}
|
||||||
function f2(y) {
|
function f2(y) {
|
||||||
var c = 5 - y;
|
var c = 5 - y;
|
||||||
@@ -414,80 +409,6 @@ collapse_vars_do_while: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
collapse_vars_do_while_drop_assign: {
|
|
||||||
options = {
|
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
|
||||||
comparisons:true, evaluate:true, booleans:false, loops:false, unused:true, hoist_funs:true,
|
|
||||||
keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f1(y) {
|
|
||||||
// The constant do-while condition `c` will be not replaced.
|
|
||||||
var c = 9;
|
|
||||||
do {} while (c === 77);
|
|
||||||
}
|
|
||||||
function f2(y) {
|
|
||||||
// The non-constant do-while condition `c` will not be replaced.
|
|
||||||
var c = 5 - y;
|
|
||||||
do { } while (c);
|
|
||||||
}
|
|
||||||
function f3(y) {
|
|
||||||
// The constant `x` will be replaced in the do loop body.
|
|
||||||
function fn(n) { console.log(n); }
|
|
||||||
var a = 2, x = 7;
|
|
||||||
do {
|
|
||||||
fn(a = x);
|
|
||||||
break;
|
|
||||||
} while (y);
|
|
||||||
}
|
|
||||||
function f4(y) {
|
|
||||||
// The non-constant `a` will not be replaced in the do loop body.
|
|
||||||
var a = y / 4;
|
|
||||||
do {
|
|
||||||
return a;
|
|
||||||
} while (y);
|
|
||||||
}
|
|
||||||
function f5(y) {
|
|
||||||
function p(x) { console.log(x); }
|
|
||||||
do {
|
|
||||||
// The non-constant `a` will be replaced in p(a)
|
|
||||||
// because it is declared in same block.
|
|
||||||
var a = y - 3;
|
|
||||||
p(a);
|
|
||||||
} while (--y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f1(y) {
|
|
||||||
var c = 9;
|
|
||||||
do ; while (77 === c);
|
|
||||||
}
|
|
||||||
function f2(y) {
|
|
||||||
var c = 5 - y;
|
|
||||||
do ; while (c);
|
|
||||||
}
|
|
||||||
function f3(y) {
|
|
||||||
function fn(n) { console.log(n); }
|
|
||||||
do {
|
|
||||||
fn(7);
|
|
||||||
break;
|
|
||||||
} while (y);
|
|
||||||
}
|
|
||||||
function f4(y) {
|
|
||||||
var a = y / 4;
|
|
||||||
do
|
|
||||||
return a;
|
|
||||||
while (y);
|
|
||||||
}
|
|
||||||
function f5(y) {
|
|
||||||
function p(x) { console.log(x); }
|
|
||||||
do {
|
|
||||||
p(y - 3);
|
|
||||||
} while (--y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
collapse_vars_seq: {
|
collapse_vars_seq: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
||||||
@@ -646,9 +567,8 @@ collapse_vars_assignment: {
|
|||||||
collapse_vars_lvalues: {
|
collapse_vars_lvalues: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:"keep_assign",
|
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
||||||
hoist_funs:true, keep_fargs:true, if_return:true, join_vars:true, cascade:true,
|
keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true
|
||||||
side_effects:true
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f0(x) { var i = ++x; return x += i; }
|
function f0(x) { var i = ++x; return x += i; }
|
||||||
@@ -673,38 +593,7 @@ collapse_vars_lvalues: {
|
|||||||
function f7(x) { var w = e1(), v = e2(), c = v - x; return (w = x) - c; }
|
function f7(x) { var w = e1(), v = e2(), c = v - x; return (w = x) - c; }
|
||||||
function f8(x) { var w = e1(), v = e2(); return (w = x) - (v - x); }
|
function f8(x) { var w = e1(), v = e2(); return (w = x) - (v - x); }
|
||||||
function f9(x) { var w = e1(); return e2() - x - (w = x); }
|
function f9(x) { var w = e1(); return e2() - x - (w = x); }
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
collapse_vars_lvalues_drop_assign: {
|
|
||||||
options = {
|
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
|
||||||
keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f0(x) { var i = ++x; return x += i; }
|
|
||||||
function f1(x) { var a = (x -= 3); return x += a; }
|
|
||||||
function f2(x) { var z = x, a = ++z; return z += a; }
|
|
||||||
function f3(x) { var a = (x -= 3), b = x + a; return b; }
|
|
||||||
function f4(x) { var a = (x -= 3); return x + a; }
|
|
||||||
function f5(x) { var w = e1(), v = e2(), c = v = --x, b = w = x; return b - c; }
|
|
||||||
function f6(x) { var w = e1(), v = e2(), c = v = --x, b = w = x; return c - b; }
|
|
||||||
function f7(x) { var w = e1(), v = e2(), c = v - x, b = w = x; return b - c; }
|
|
||||||
function f8(x) { var w = e1(), v = e2(), b = w = x, c = v - x; return b - c; }
|
|
||||||
function f9(x) { var w = e1(), v = e2(), b = w = x, c = v - x; return c - b; }
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f0(x) { var i = ++x; return x += i; }
|
|
||||||
function f1(x) { var a = (x -= 3); return x += a; }
|
|
||||||
function f2(x) { var z = x, a = ++z; return z += a; }
|
|
||||||
function f3(x) { var a = (x -= 3); return x + a; }
|
|
||||||
function f4(x) { var a = (x -= 3); return x + a; }
|
|
||||||
function f5(x) { var v = (e1(), e2()), c = v = --x; return x - c; }
|
|
||||||
function f6(x) { e1(), e2(); return --x - x; }
|
|
||||||
function f7(x) { var v = (e1(), e2()), c = v - x; return x - c; }
|
|
||||||
function f8(x) { var v = (e1(), e2()); return x - (v - x); }
|
|
||||||
function f9(x) { e1(); return e2() - x - x; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -826,7 +715,6 @@ collapse_vars_repeated: {
|
|||||||
console.log(e + "!");
|
console.log(e + "!");
|
||||||
})("!");
|
})("!");
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
collapse_vars_closures: {
|
collapse_vars_closures: {
|
||||||
@@ -894,8 +782,7 @@ collapse_vars_unary: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f0(o, p) {
|
function f0(o, p) {
|
||||||
var x = o[p];
|
delete o[p];
|
||||||
delete x;
|
|
||||||
}
|
}
|
||||||
function f1(n) {
|
function f1(n) {
|
||||||
return n > +!!n
|
return n > +!!n
|
||||||
@@ -1114,7 +1001,6 @@ collapse_vars_eval_and_with: {
|
|||||||
return function() { with (o) console.log(a) };
|
return function() { with (o) console.log(a) };
|
||||||
})()();
|
})()();
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
collapse_vars_constants: {
|
collapse_vars_constants: {
|
||||||
@@ -1149,7 +1035,7 @@ collapse_vars_constants: {
|
|||||||
function f3(x) {
|
function f3(x) {
|
||||||
var b = x.prop;
|
var b = x.prop;
|
||||||
sideeffect1();
|
sideeffect1();
|
||||||
return b + -9;
|
return b + (function() { return -9; })();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1158,8 +1044,7 @@ collapse_vars_arguments: {
|
|||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true,
|
keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true
|
||||||
toplevel:true
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var outer = function() {
|
var outer = function() {
|
||||||
@@ -1174,7 +1059,6 @@ collapse_vars_arguments: {
|
|||||||
(function(){console.log(arguments);})(7, 1);
|
(function(){console.log(arguments);})(7, 1);
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
collapse_vars_short_circuit: {
|
collapse_vars_short_circuit: {
|
||||||
@@ -1319,322 +1203,9 @@ collapse_vars_regexp: {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
(function(){
|
(function(){
|
||||||
var result, s = "acdabcdeabbb", rx = /ab*/g;
|
var result, rx = /ab*/g;
|
||||||
while (result = rx.exec(s))
|
while (result = rx.exec('acdabcdeabbb'))
|
||||||
console.log(result[0]);
|
console.log(result[0]);
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1537: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var k = '';
|
|
||||||
for (k in {prop: 'val'}){}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var k = '';
|
|
||||||
for (k in {prop: 'val'});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1562: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var v = 1, B = 2;
|
|
||||||
for (v in objs) f(B);
|
|
||||||
|
|
||||||
var x = 3, C = 10;
|
|
||||||
while(x + 2) bar(C);
|
|
||||||
|
|
||||||
var y = 4, D = 20;
|
|
||||||
do bar(D); while(y + 2);
|
|
||||||
|
|
||||||
var z = 5, E = 30;
|
|
||||||
for (; f(z + 2) ;) bar(E);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var v = 1;
|
|
||||||
for (v in objs) f(2);
|
|
||||||
|
|
||||||
var x = 3;
|
|
||||||
while(x + 2) bar(10);
|
|
||||||
|
|
||||||
var y = 4;
|
|
||||||
do bar(20); while(y + 2);
|
|
||||||
|
|
||||||
var z = 5;
|
|
||||||
for (; f(z + 2) ;) bar(30);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1605_1: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function foo(x) {
|
|
||||||
var y = x;
|
|
||||||
return y;
|
|
||||||
}
|
|
||||||
var o = new Object;
|
|
||||||
o.p = 1;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function foo(x) {
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
var o = new Object;
|
|
||||||
o.p = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1605_2: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
toplevel: "vars",
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function foo(x) {
|
|
||||||
var y = x;
|
|
||||||
return y;
|
|
||||||
}
|
|
||||||
var o = new Object;
|
|
||||||
o.p = 1;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function foo(x) {
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
(new Object).p = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1631_1: {
|
|
||||||
options = {
|
|
||||||
cascade: true,
|
|
||||||
collapse_vars: true,
|
|
||||||
hoist_funs: true,
|
|
||||||
join_vars: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var pc = 0;
|
|
||||||
function f(x) {
|
|
||||||
pc = 200;
|
|
||||||
return 100;
|
|
||||||
}
|
|
||||||
function x() {
|
|
||||||
var t = f();
|
|
||||||
pc += t;
|
|
||||||
return pc;
|
|
||||||
}
|
|
||||||
console.log(x());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(x) {
|
|
||||||
return pc = 200, 100;
|
|
||||||
}
|
|
||||||
function x() {
|
|
||||||
var t = f();
|
|
||||||
return pc += t;
|
|
||||||
}
|
|
||||||
var pc = 0;
|
|
||||||
console.log(x());
|
|
||||||
}
|
|
||||||
expect_stdout: "300"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1631_2: {
|
|
||||||
options = {
|
|
||||||
cascade: true,
|
|
||||||
collapse_vars: true,
|
|
||||||
hoist_funs: true,
|
|
||||||
join_vars: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 0, b = 1;
|
|
||||||
function f() {
|
|
||||||
a = 2;
|
|
||||||
return 4;
|
|
||||||
}
|
|
||||||
function g() {
|
|
||||||
var t = f();
|
|
||||||
b = a + t;
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
console.log(g());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {
|
|
||||||
return a = 2, 4;
|
|
||||||
}
|
|
||||||
function g() {
|
|
||||||
var t = f();
|
|
||||||
return b = a + t;
|
|
||||||
}
|
|
||||||
var a = 0, b = 1;
|
|
||||||
console.log(g());
|
|
||||||
}
|
|
||||||
expect_stdout: "6"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1631_3: {
|
|
||||||
options = {
|
|
||||||
cascade: true,
|
|
||||||
collapse_vars: true,
|
|
||||||
hoist_funs: true,
|
|
||||||
join_vars: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function g() {
|
|
||||||
var a = 0, b = 1;
|
|
||||||
function f() {
|
|
||||||
a = 2;
|
|
||||||
return 4;
|
|
||||||
}
|
|
||||||
var t = f();
|
|
||||||
b = a + t;
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
console.log(g());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function g() {
|
|
||||||
function f() {
|
|
||||||
return a = 2, 4;
|
|
||||||
}
|
|
||||||
var a = 0, b = 1, t = f();
|
|
||||||
return b = a + t;
|
|
||||||
}
|
|
||||||
console.log(g());
|
|
||||||
}
|
|
||||||
expect_stdout: "6"
|
|
||||||
}
|
|
||||||
|
|
||||||
var_side_effects_1: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var print = console.log.bind(console);
|
|
||||||
function foo(x) {
|
|
||||||
var twice = x * 2;
|
|
||||||
print('Foo:', twice);
|
|
||||||
}
|
|
||||||
foo(10);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var print = console.log.bind(console);
|
|
||||||
function foo(x) {
|
|
||||||
print('Foo:', 2 * x);
|
|
||||||
}
|
|
||||||
foo(10);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
var_side_effects_2: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var print = console.log.bind(console);
|
|
||||||
function foo(x) {
|
|
||||||
var twice = x.y * 2;
|
|
||||||
print('Foo:', twice);
|
|
||||||
}
|
|
||||||
foo({ y: 10 });
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var print = console.log.bind(console);
|
|
||||||
function foo(x) {
|
|
||||||
var twice = 2 * x.y;
|
|
||||||
print('Foo:', twice);
|
|
||||||
}
|
|
||||||
foo({ y: 10 });
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
var_side_effects_3: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
pure_getters: true,
|
|
||||||
unsafe: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var print = console.log.bind(console);
|
|
||||||
function foo(x) {
|
|
||||||
var twice = x.y * 2;
|
|
||||||
print('Foo:', twice);
|
|
||||||
}
|
|
||||||
foo({ y: 10 });
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var print = console.log.bind(console);
|
|
||||||
function foo(x) {
|
|
||||||
print('Foo:', 2 * x.y);
|
|
||||||
}
|
|
||||||
foo({ y: 10 });
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
reassign_const_1: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
const a = 1;
|
|
||||||
a = 2;
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
console.log(f());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {
|
|
||||||
const a = 1;
|
|
||||||
a = 2;
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
console.log(f());
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
reassign_const_2: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
const a = 1;
|
|
||||||
++a;
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
console.log(f());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {
|
|
||||||
const a = 1;
|
|
||||||
++a;
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
console.log(f());
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,200 +24,3 @@ concat_1: {
|
|||||||
var f = "\x00360\08\0";
|
var f = "\x00360\08\0";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
concat_2: {
|
|
||||||
options = {};
|
|
||||||
input: {
|
|
||||||
console.log(
|
|
||||||
1 + (2 + 3),
|
|
||||||
1 + (2 + "3"),
|
|
||||||
1 + ("2" + 3),
|
|
||||||
1 + ("2" + "3"),
|
|
||||||
"1" + (2 + 3),
|
|
||||||
"1" + (2 + "3"),
|
|
||||||
"1" + ("2" + 3),
|
|
||||||
"1" + ("2" + "3")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(
|
|
||||||
1 + (2 + 3),
|
|
||||||
1 + (2 + "3"),
|
|
||||||
1 + "2" + 3,
|
|
||||||
1 + "2" + "3",
|
|
||||||
"1" + (2 + 3),
|
|
||||||
"1" + 2 + "3",
|
|
||||||
"1" + "2" + 3,
|
|
||||||
"1" + "2" + "3"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
concat_3: {
|
|
||||||
options = {};
|
|
||||||
input: {
|
|
||||||
console.log(
|
|
||||||
1 + 2 + (3 + 4 + 5),
|
|
||||||
1 + 2 + (3 + 4 + "5"),
|
|
||||||
1 + 2 + (3 + "4" + 5),
|
|
||||||
1 + 2 + (3 + "4" + "5"),
|
|
||||||
1 + 2 + ("3" + 4 + 5),
|
|
||||||
1 + 2 + ("3" + 4 + "5"),
|
|
||||||
1 + 2 + ("3" + "4" + 5),
|
|
||||||
1 + 2 + ("3" + "4" + "5")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(
|
|
||||||
1 + 2 + (3 + 4 + 5),
|
|
||||||
1 + 2 + (3 + 4 + "5"),
|
|
||||||
1 + 2 + (3 + "4") + 5,
|
|
||||||
1 + 2 + (3 + "4") + "5",
|
|
||||||
1 + 2 + "3" + 4 + 5,
|
|
||||||
1 + 2 + "3" + 4 + "5",
|
|
||||||
1 + 2 + "3" + "4" + 5,
|
|
||||||
1 + 2 + "3" + "4" + "5"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
concat_4: {
|
|
||||||
options = {};
|
|
||||||
input: {
|
|
||||||
console.log(
|
|
||||||
1 + "2" + (3 + 4 + 5),
|
|
||||||
1 + "2" + (3 + 4 + "5"),
|
|
||||||
1 + "2" + (3 + "4" + 5),
|
|
||||||
1 + "2" + (3 + "4" + "5"),
|
|
||||||
1 + "2" + ("3" + 4 + 5),
|
|
||||||
1 + "2" + ("3" + 4 + "5"),
|
|
||||||
1 + "2" + ("3" + "4" + 5),
|
|
||||||
1 + "2" + ("3" + "4" + "5")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(
|
|
||||||
1 + "2" + (3 + 4 + 5),
|
|
||||||
1 + "2" + (3 + 4) + "5",
|
|
||||||
1 + "2" + 3 + "4" + 5,
|
|
||||||
1 + "2" + 3 + "4" + "5",
|
|
||||||
1 + "2" + "3" + 4 + 5,
|
|
||||||
1 + "2" + "3" + 4 + "5",
|
|
||||||
1 + "2" + "3" + "4" + 5,
|
|
||||||
1 + "2" + "3" + "4" + "5"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
concat_5: {
|
|
||||||
options = {};
|
|
||||||
input: {
|
|
||||||
console.log(
|
|
||||||
"1" + 2 + (3 + 4 + 5),
|
|
||||||
"1" + 2 + (3 + 4 + "5"),
|
|
||||||
"1" + 2 + (3 + "4" + 5),
|
|
||||||
"1" + 2 + (3 + "4" + "5"),
|
|
||||||
"1" + 2 + ("3" + 4 + 5),
|
|
||||||
"1" + 2 + ("3" + 4 + "5"),
|
|
||||||
"1" + 2 + ("3" + "4" + 5),
|
|
||||||
"1" + 2 + ("3" + "4" + "5")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(
|
|
||||||
"1" + 2 + (3 + 4 + 5),
|
|
||||||
"1" + 2 + (3 + 4) + "5",
|
|
||||||
"1" + 2 + 3 + "4" + 5,
|
|
||||||
"1" + 2 + 3 + "4" + "5",
|
|
||||||
"1" + 2 + "3" + 4 + 5,
|
|
||||||
"1" + 2 + "3" + 4 + "5",
|
|
||||||
"1" + 2 + "3" + "4" + 5,
|
|
||||||
"1" + 2 + "3" + "4" + "5"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
concat_6: {
|
|
||||||
options = {};
|
|
||||||
input: {
|
|
||||||
console.log(
|
|
||||||
"1" + "2" + (3 + 4 + 5),
|
|
||||||
"1" + "2" + (3 + 4 + "5"),
|
|
||||||
"1" + "2" + (3 + "4" + 5),
|
|
||||||
"1" + "2" + (3 + "4" + "5"),
|
|
||||||
"1" + "2" + ("3" + 4 + 5),
|
|
||||||
"1" + "2" + ("3" + 4 + "5"),
|
|
||||||
"1" + "2" + ("3" + "4" + 5),
|
|
||||||
"1" + "2" + ("3" + "4" + "5")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(
|
|
||||||
"1" + "2" + (3 + 4 + 5),
|
|
||||||
"1" + "2" + (3 + 4) + "5",
|
|
||||||
"1" + "2" + 3 + "4" + 5,
|
|
||||||
"1" + "2" + 3 + "4" + "5",
|
|
||||||
"1" + "2" + "3" + 4 + 5,
|
|
||||||
"1" + "2" + "3" + 4 + "5",
|
|
||||||
"1" + "2" + "3" + "4" + 5,
|
|
||||||
"1" + "2" + "3" + "4" + "5"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
concat_7: {
|
|
||||||
input: {
|
|
||||||
console.log(
|
|
||||||
"" + 1,
|
|
||||||
"" + "1",
|
|
||||||
"" + 1 + 2,
|
|
||||||
"" + 1 + "2",
|
|
||||||
"" + "1" + 2,
|
|
||||||
"" + "1" + "2",
|
|
||||||
"" + (x += "foo")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(
|
|
||||||
"" + 1,
|
|
||||||
"1",
|
|
||||||
"" + 1 + 2,
|
|
||||||
1 + "2",
|
|
||||||
"1" + 2,
|
|
||||||
"1" + "2",
|
|
||||||
x += "foo"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
concat_8: {
|
|
||||||
input: {
|
|
||||||
console.log(
|
|
||||||
1 + "",
|
|
||||||
"1" + "",
|
|
||||||
1 + 2 + "",
|
|
||||||
1 + "2" + "",
|
|
||||||
"1" + 2 + "",
|
|
||||||
"1" + "2" + "",
|
|
||||||
(x += "foo") + ""
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(
|
|
||||||
1 + "",
|
|
||||||
"1",
|
|
||||||
1 + 2 + "",
|
|
||||||
1 + "2",
|
|
||||||
"1" + 2,
|
|
||||||
"1" + "2",
|
|
||||||
x += "foo"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -50,8 +50,7 @@ ifs_3_should_warn: {
|
|||||||
conditionals : true,
|
conditionals : true,
|
||||||
dead_code : true,
|
dead_code : true,
|
||||||
evaluate : true,
|
evaluate : true,
|
||||||
booleans : true,
|
booleans : true
|
||||||
side_effects : true,
|
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
var x, y;
|
var x, y;
|
||||||
@@ -136,28 +135,16 @@ ifs_6: {
|
|||||||
comparisons: true
|
comparisons: true
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
var x, y;
|
var x;
|
||||||
if (!foo && !bar && !baz && !boo) {
|
if (!foo && !bar && !baz && !boo) {
|
||||||
x = 10;
|
x = 10;
|
||||||
} else {
|
} else {
|
||||||
x = 20;
|
x = 20;
|
||||||
}
|
}
|
||||||
if (y) {
|
|
||||||
x[foo] = 10;
|
|
||||||
} else {
|
|
||||||
x[foo] = 20;
|
|
||||||
}
|
|
||||||
if (foo) {
|
|
||||||
x[bar] = 10;
|
|
||||||
} else {
|
|
||||||
x[bar] = 20;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var x, y;
|
var x;
|
||||||
x = foo || bar || baz || boo ? 20 : 10;
|
x = foo || bar || baz || boo ? 20 : 10;
|
||||||
x[foo] = y ? 10 : 20;
|
|
||||||
foo ? x[bar] = 10 : x[bar] = 20;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -172,16 +159,10 @@ cond_1: {
|
|||||||
} else {
|
} else {
|
||||||
do_something(y);
|
do_something(y);
|
||||||
}
|
}
|
||||||
if (some_condition()) {
|
|
||||||
side_effects(x);
|
|
||||||
} else {
|
|
||||||
side_effects(y);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var do_something;
|
var do_something;
|
||||||
do_something(some_condition() ? x : y);
|
do_something(some_condition() ? x : y);
|
||||||
some_condition() ? side_effects(x) : side_effects(y);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -232,16 +213,10 @@ cond_4: {
|
|||||||
} else {
|
} else {
|
||||||
do_something();
|
do_something();
|
||||||
}
|
}
|
||||||
if (some_condition()) {
|
|
||||||
side_effects();
|
|
||||||
} else {
|
|
||||||
side_effects();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var do_something;
|
var do_something;
|
||||||
some_condition(), do_something();
|
some_condition(), do_something();
|
||||||
some_condition(), side_effects();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -275,8 +250,7 @@ cond_5: {
|
|||||||
cond_7: {
|
cond_7: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate : true,
|
evaluate : true
|
||||||
side_effects: true,
|
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
var x, y, z, a, b;
|
var x, y, z, a, b;
|
||||||
@@ -661,6 +635,166 @@ ternary_boolean_alternative: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
conditional_and: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
evaluate : true
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
// compress these
|
||||||
|
|
||||||
|
a = true && condition;
|
||||||
|
a = 1 && console.log("a");
|
||||||
|
a = 2 * 3 && 2 * condition;
|
||||||
|
a = 5 == 5 && condition + 3;
|
||||||
|
a = "string" && 4 - condition;
|
||||||
|
a = 5 + "" && condition / 5;
|
||||||
|
a = -4.5 && 6 << condition;
|
||||||
|
a = 6 && 7;
|
||||||
|
|
||||||
|
a = false && condition;
|
||||||
|
a = NaN && console.log("b");
|
||||||
|
a = 0 && console.log("c");
|
||||||
|
a = undefined && 2 * condition;
|
||||||
|
a = null && condition + 3;
|
||||||
|
a = 2 * 3 - 6 && 4 - condition;
|
||||||
|
a = 10 == 7 && condition / 5;
|
||||||
|
a = !"string" && 6 % condition;
|
||||||
|
a = 0 && 7;
|
||||||
|
|
||||||
|
// don't compress these
|
||||||
|
|
||||||
|
a = condition && true;
|
||||||
|
a = console.log("a") && 2;
|
||||||
|
a = 4 - condition && "string";
|
||||||
|
a = 6 << condition && -4.5;
|
||||||
|
|
||||||
|
a = condition && false;
|
||||||
|
a = console.log("b") && NaN;
|
||||||
|
a = console.log("c") && 0;
|
||||||
|
a = 2 * condition && undefined;
|
||||||
|
a = condition + 3 && null;
|
||||||
|
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
|
||||||
|
a = condition;
|
||||||
|
a = console.log("a");
|
||||||
|
a = 2 * condition;
|
||||||
|
a = condition + 3;
|
||||||
|
a = 4 - condition;
|
||||||
|
a = condition / 5;
|
||||||
|
a = 6 << condition;
|
||||||
|
a = 7;
|
||||||
|
|
||||||
|
a = false;
|
||||||
|
a = NaN;
|
||||||
|
a = 0;
|
||||||
|
a = void 0;
|
||||||
|
a = null;
|
||||||
|
a = 0;
|
||||||
|
a = false;
|
||||||
|
a = false;
|
||||||
|
a = 0;
|
||||||
|
|
||||||
|
a = condition && true;
|
||||||
|
a = console.log("a") && 2;
|
||||||
|
a = 4 - condition && "string";
|
||||||
|
a = 6 << condition && -4.5;
|
||||||
|
|
||||||
|
a = condition && false;
|
||||||
|
a = console.log("b") && NaN;
|
||||||
|
a = console.log("c") && 0;
|
||||||
|
a = 2 * condition && void 0;
|
||||||
|
a = condition + 3 && null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
conditional_or: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
evaluate : true
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
// compress these
|
||||||
|
|
||||||
|
a = true || condition;
|
||||||
|
a = 1 || console.log("a");
|
||||||
|
a = 2 * 3 || 2 * condition;
|
||||||
|
a = 5 == 5 || condition + 3;
|
||||||
|
a = "string" || 4 - condition;
|
||||||
|
a = 5 + "" || condition / 5;
|
||||||
|
a = -4.5 || 6 << condition;
|
||||||
|
a = 6 || 7;
|
||||||
|
|
||||||
|
a = false || condition;
|
||||||
|
a = 0 || console.log("b");
|
||||||
|
a = NaN || console.log("c");
|
||||||
|
a = undefined || 2 * condition;
|
||||||
|
a = null || condition + 3;
|
||||||
|
a = 2 * 3 - 6 || 4 - condition;
|
||||||
|
a = 10 == 7 || condition / 5;
|
||||||
|
a = !"string" || 6 % condition;
|
||||||
|
a = null || 7;
|
||||||
|
|
||||||
|
a = console.log(undefined && condition || null);
|
||||||
|
a = console.log(undefined || condition && null);
|
||||||
|
|
||||||
|
// don't compress these
|
||||||
|
|
||||||
|
a = condition || true;
|
||||||
|
a = console.log("a") || 2;
|
||||||
|
a = 4 - condition || "string";
|
||||||
|
a = 6 << condition || -4.5;
|
||||||
|
|
||||||
|
a = condition || false;
|
||||||
|
a = console.log("b") || NaN;
|
||||||
|
a = console.log("c") || 0;
|
||||||
|
a = 2 * condition || undefined;
|
||||||
|
a = condition + 3 || null;
|
||||||
|
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
|
||||||
|
a = true;
|
||||||
|
a = 1;
|
||||||
|
a = 6;
|
||||||
|
a = true;
|
||||||
|
a = "string";
|
||||||
|
a = "5";
|
||||||
|
a = -4.5;
|
||||||
|
a = 6;
|
||||||
|
|
||||||
|
a = condition;
|
||||||
|
a = console.log("b");
|
||||||
|
a = console.log("c");
|
||||||
|
a = 2 * condition;
|
||||||
|
a = condition + 3;
|
||||||
|
a = 4 - condition;
|
||||||
|
a = condition / 5;
|
||||||
|
a = 6 % condition;
|
||||||
|
a = 7;
|
||||||
|
|
||||||
|
a = console.log(null);
|
||||||
|
a = console.log(condition && null);
|
||||||
|
|
||||||
|
a = condition || true;
|
||||||
|
a = console.log("a") || 2;
|
||||||
|
a = 4 - condition || "string";
|
||||||
|
a = 6 << condition || -4.5;
|
||||||
|
|
||||||
|
a = condition || false;
|
||||||
|
a = console.log("b") || NaN;
|
||||||
|
a = console.log("c") || 0;
|
||||||
|
a = 2 * condition || void 0;
|
||||||
|
a = condition + 3 || null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
trivial_boolean_ternary_expressions : {
|
trivial_boolean_ternary_expressions : {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
@@ -740,7 +874,6 @@ issue_1154: {
|
|||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate : true,
|
evaluate : true,
|
||||||
booleans : true,
|
booleans : true,
|
||||||
side_effects: true,
|
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
function f1(x) { return x ? -1 : -1; }
|
function f1(x) { return x ? -1 : -1; }
|
||||||
@@ -769,249 +902,7 @@ issue_1154: {
|
|||||||
function g2() { return g(), 2; }
|
function g2() { return g(), 2; }
|
||||||
function g3() { return g(), -4; }
|
function g3() { return g(), -4; }
|
||||||
function g4() { return g(), !1; }
|
function g4() { return g(), !1; }
|
||||||
function g5() { return void g(); }
|
function g5() { return g(), void 0; }
|
||||||
function g6() { return g(), "number"; }
|
function g6() { return g(), "number"; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
no_evaluate: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
evaluate : false,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(b) {
|
|
||||||
a = b ? !0 : !0;
|
|
||||||
a = b ? ~1 : ~1;
|
|
||||||
a = b ? -2 : -2;
|
|
||||||
a = b ? +3 : +3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(b) {
|
|
||||||
a = !0;
|
|
||||||
a = ~1;
|
|
||||||
a = -2;
|
|
||||||
a = +3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
equality_conditionals_false: {
|
|
||||||
options = {
|
|
||||||
conditionals: false,
|
|
||||||
sequences: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a, b, c) {
|
|
||||||
console.log(
|
|
||||||
a == (b ? a : a),
|
|
||||||
a == (b ? a : c),
|
|
||||||
a != (b ? a : a),
|
|
||||||
a != (b ? a : c),
|
|
||||||
a === (b ? a : a),
|
|
||||||
a === (b ? a : c),
|
|
||||||
a !== (b ? a : a),
|
|
||||||
a !== (b ? a : c)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
f(0, 0, 0);
|
|
||||||
f(0, true, 0);
|
|
||||||
f(1, 2, 3);
|
|
||||||
f(1, null, 3);
|
|
||||||
f(NaN);
|
|
||||||
f(NaN, "foo");
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a, b, c) {
|
|
||||||
console.log(
|
|
||||||
a == (b ? a : a),
|
|
||||||
a == (b ? a : c),
|
|
||||||
a != (b ? a : a),
|
|
||||||
a != (b ? a : c),
|
|
||||||
a === (b ? a : a),
|
|
||||||
a === (b ? a : c),
|
|
||||||
a !== (b ? a : a),
|
|
||||||
a !== (b ? a : c)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
f(0, 0, 0),
|
|
||||||
f(0, true, 0),
|
|
||||||
f(1, 2, 3),
|
|
||||||
f(1, null, 3),
|
|
||||||
f(NaN),
|
|
||||||
f(NaN, "foo");
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
equality_conditionals_true: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
sequences: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a, b, c) {
|
|
||||||
console.log(
|
|
||||||
a == (b ? a : a),
|
|
||||||
a == (b ? a : c),
|
|
||||||
a != (b ? a : a),
|
|
||||||
a != (b ? a : c),
|
|
||||||
a === (b ? a : a),
|
|
||||||
a === (b ? a : c),
|
|
||||||
a !== (b ? a : a),
|
|
||||||
a !== (b ? a : c)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
f(0, 0, 0);
|
|
||||||
f(0, true, 0);
|
|
||||||
f(1, 2, 3);
|
|
||||||
f(1, null, 3);
|
|
||||||
f(NaN);
|
|
||||||
f(NaN, "foo");
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a, b, c) {
|
|
||||||
console.log(
|
|
||||||
(b, a == a),
|
|
||||||
a == (b ? a : c),
|
|
||||||
(b, a != a),
|
|
||||||
a != (b ? a : c),
|
|
||||||
(b, a === a),
|
|
||||||
a === (b ? a : c),
|
|
||||||
(b, a !== a),
|
|
||||||
a !== (b ? a : c)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
f(0, 0, 0),
|
|
||||||
f(0, true, 0),
|
|
||||||
f(1, 2, 3),
|
|
||||||
f(1, null, 3),
|
|
||||||
f(NaN),
|
|
||||||
f(NaN, "foo");
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1645_1: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 100, b = 10;
|
|
||||||
(b = a) ? a++ + (b += a) ? b += a : b += a : b ^= a;
|
|
||||||
console.log(a, b);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 100, b = 10;
|
|
||||||
(b = a) ? (a++ + (b += a), b += a) : b ^= a;
|
|
||||||
console.log(a,b);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1645_2: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 0;
|
|
||||||
function f() {
|
|
||||||
return a++;
|
|
||||||
}
|
|
||||||
f() ? a += 2 : a += 4;
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 0;
|
|
||||||
function f(){
|
|
||||||
return a++;
|
|
||||||
}
|
|
||||||
f() ? a += 2 : a += 4;
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
condition_symbol_matches_consequent: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function foo(x, y) {
|
|
||||||
return x ? x : y;
|
|
||||||
}
|
|
||||||
function bar() {
|
|
||||||
return g ? g : h;
|
|
||||||
}
|
|
||||||
var g = 4;
|
|
||||||
var h = 5;
|
|
||||||
console.log(foo(3, null), foo(0, 7), foo(true, false), bar());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function foo(x, y) {
|
|
||||||
return x || y;
|
|
||||||
}
|
|
||||||
function bar() {
|
|
||||||
return g || h;
|
|
||||||
}
|
|
||||||
var g = 4;
|
|
||||||
var h = 5;
|
|
||||||
console.log(foo(3, null), foo(0, 7), foo(true, false), bar());
|
|
||||||
}
|
|
||||||
expect_stdout: "3 7 true 4"
|
|
||||||
}
|
|
||||||
|
|
||||||
delete_conditional_1: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
conditionals: true,
|
|
||||||
evaluate: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(delete (1 ? undefined : x));
|
|
||||||
console.log(delete (1 ? void 0 : x));
|
|
||||||
console.log(delete (1 ? Infinity : x));
|
|
||||||
console.log(delete (1 ? 1 / 0 : x));
|
|
||||||
console.log(delete (1 ? NaN : x));
|
|
||||||
console.log(delete (1 ? 0 / 0 : x));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log((void 0, !0));
|
|
||||||
console.log((void 0, !0));
|
|
||||||
console.log((1 / 0, !0));
|
|
||||||
console.log((1 / 0, !0));
|
|
||||||
console.log((NaN, !0));
|
|
||||||
console.log((NaN, !0));
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
delete_conditional_2: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
conditionals: true,
|
|
||||||
evaluate: true,
|
|
||||||
keep_infinity: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(delete (0 ? x : undefined));
|
|
||||||
console.log(delete (0 ? x : void 0));
|
|
||||||
console.log(delete (0 ? x : Infinity));
|
|
||||||
console.log(delete (0 ? x : 1 / 0));
|
|
||||||
console.log(delete (0 ? x : NaN));
|
|
||||||
console.log(delete (0 ? x : 0 / 0));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log((void 0, !0));
|
|
||||||
console.log((void 0, !0));
|
|
||||||
console.log((Infinity, !0));
|
|
||||||
console.log((1 / 0, !0));
|
|
||||||
console.log((NaN, !0));
|
|
||||||
console.log((NaN, !0));
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,166 +0,0 @@
|
|||||||
issue_1191: {
|
|
||||||
options = {
|
|
||||||
evaluate : true,
|
|
||||||
booleans : true,
|
|
||||||
comparisons : true,
|
|
||||||
dead_code : true,
|
|
||||||
conditionals : true,
|
|
||||||
side_effects : true,
|
|
||||||
unused : true,
|
|
||||||
hoist_funs : true,
|
|
||||||
if_return : true,
|
|
||||||
join_vars : true,
|
|
||||||
sequences : false,
|
|
||||||
collapse_vars : false,
|
|
||||||
reduce_vars : true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function foo(rot) {
|
|
||||||
const rotTol = 5;
|
|
||||||
if (rot < -rotTol || rot > rotTol)
|
|
||||||
bar();
|
|
||||||
baz();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function foo(rot) {
|
|
||||||
(rot < -5 || rot > 5) && bar();
|
|
||||||
baz();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1194: {
|
|
||||||
options = {
|
|
||||||
evaluate : true,
|
|
||||||
booleans : true,
|
|
||||||
comparisons : true,
|
|
||||||
dead_code : true,
|
|
||||||
conditionals : true,
|
|
||||||
side_effects : true,
|
|
||||||
unused : true,
|
|
||||||
hoist_funs : true,
|
|
||||||
if_return : true,
|
|
||||||
join_vars : true,
|
|
||||||
sequences : false,
|
|
||||||
collapse_vars : false,
|
|
||||||
reduce_vars : true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f1() {const a = "X"; return a + a;}
|
|
||||||
function f2() {const aa = "X"; return aa + aa;}
|
|
||||||
function f3() {const aaa = "X"; return aaa + aaa;}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f1(){return"XX"}
|
|
||||||
function f2(){return"XX"}
|
|
||||||
function f3(){return"XX"}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1396: {
|
|
||||||
options = {
|
|
||||||
evaluate : true,
|
|
||||||
booleans : true,
|
|
||||||
comparisons : true,
|
|
||||||
dead_code : true,
|
|
||||||
conditionals : true,
|
|
||||||
side_effects : true,
|
|
||||||
unused : true,
|
|
||||||
hoist_funs : true,
|
|
||||||
if_return : true,
|
|
||||||
join_vars : true,
|
|
||||||
sequences : false,
|
|
||||||
collapse_vars : false,
|
|
||||||
reduce_vars : true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function foo(a) {
|
|
||||||
const VALUE = 1;
|
|
||||||
console.log(2 | VALUE);
|
|
||||||
console.log(VALUE + 1);
|
|
||||||
console.log(VALUE);
|
|
||||||
console.log(a & VALUE);
|
|
||||||
}
|
|
||||||
function bar() {
|
|
||||||
const s = "01234567890123456789";
|
|
||||||
console.log(s + s + s + s + s);
|
|
||||||
|
|
||||||
const CONSTANT = "abc";
|
|
||||||
console.log(CONSTANT + CONSTANT + CONSTANT + CONSTANT + CONSTANT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function foo(a) {
|
|
||||||
console.log(3);
|
|
||||||
console.log(2);
|
|
||||||
console.log(1);
|
|
||||||
console.log(1 & a);
|
|
||||||
}
|
|
||||||
function bar() {
|
|
||||||
const s = "01234567890123456789";
|
|
||||||
console.log(s + s + s + s + s);
|
|
||||||
|
|
||||||
console.log("abcabcabcabcabc");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unused_regexp_literal: {
|
|
||||||
options = {
|
|
||||||
evaluate : true,
|
|
||||||
booleans : true,
|
|
||||||
comparisons : true,
|
|
||||||
dead_code : true,
|
|
||||||
conditionals : true,
|
|
||||||
side_effects : true,
|
|
||||||
unused : true,
|
|
||||||
hoist_funs : true,
|
|
||||||
if_return : true,
|
|
||||||
join_vars : true,
|
|
||||||
sequences : false,
|
|
||||||
collapse_vars : false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(){ var a = /b/; }
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(){}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
regexp_literal_not_const: {
|
|
||||||
options = {
|
|
||||||
evaluate : true,
|
|
||||||
booleans : true,
|
|
||||||
comparisons : true,
|
|
||||||
dead_code : true,
|
|
||||||
conditionals : true,
|
|
||||||
side_effects : true,
|
|
||||||
unused : true,
|
|
||||||
hoist_funs : true,
|
|
||||||
if_return : true,
|
|
||||||
join_vars : true,
|
|
||||||
sequences : false,
|
|
||||||
collapse_vars : false,
|
|
||||||
reduce_vars : true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function(){
|
|
||||||
var result;
|
|
||||||
const s = 'acdabcdeabbb';
|
|
||||||
const REGEXP_LITERAL = /ab*/g;
|
|
||||||
while (result = REGEXP_LITERAL.exec(s)) {
|
|
||||||
console.log(result[0]);
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function() {
|
|
||||||
var result;
|
|
||||||
const REGEXP_LITERAL = /ab*/g;
|
|
||||||
while (result = REGEXP_LITERAL.exec("acdabcdeabbb")) console.log(result[0]);
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
@@ -64,8 +64,7 @@ dead_code_constant_boolean_should_warn_more: {
|
|||||||
loops : true,
|
loops : true,
|
||||||
booleans : true,
|
booleans : true,
|
||||||
conditionals : true,
|
conditionals : true,
|
||||||
evaluate : true,
|
evaluate : true
|
||||||
side_effects : true,
|
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
while (!((foo && bar) || (x + "0"))) {
|
while (!((foo && bar) || (x + "0"))) {
|
||||||
@@ -87,7 +86,28 @@ dead_code_constant_boolean_should_warn_more: {
|
|||||||
var x = 10, y;
|
var x = 10, y;
|
||||||
var moo;
|
var moo;
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
}
|
||||||
|
|
||||||
|
dead_code_block_decls_die: {
|
||||||
|
options = {
|
||||||
|
dead_code : true,
|
||||||
|
conditionals : true,
|
||||||
|
booleans : true,
|
||||||
|
evaluate : true
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
if (0) {
|
||||||
|
let foo = 6;
|
||||||
|
const bar = 12;
|
||||||
|
class Baz {};
|
||||||
|
var qux;
|
||||||
|
}
|
||||||
|
console.log(foo, bar, Baz);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var qux;
|
||||||
|
console.log(foo, bar, Baz);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dead_code_const_declaration: {
|
dead_code_const_declaration: {
|
||||||
@@ -96,8 +116,7 @@ dead_code_const_declaration: {
|
|||||||
loops : true,
|
loops : true,
|
||||||
booleans : true,
|
booleans : true,
|
||||||
conditionals : true,
|
conditionals : true,
|
||||||
evaluate : true,
|
evaluate : true
|
||||||
reduce_vars : true,
|
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
var unused;
|
var unused;
|
||||||
@@ -114,7 +133,6 @@ dead_code_const_declaration: {
|
|||||||
var moo;
|
var moo;
|
||||||
function bar() {}
|
function bar() {}
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dead_code_const_annotation: {
|
dead_code_const_annotation: {
|
||||||
@@ -123,9 +141,7 @@ dead_code_const_annotation: {
|
|||||||
loops : true,
|
loops : true,
|
||||||
booleans : true,
|
booleans : true,
|
||||||
conditionals : true,
|
conditionals : true,
|
||||||
evaluate : true,
|
evaluate : true
|
||||||
reduce_vars : true,
|
|
||||||
toplevel : true,
|
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
var unused;
|
var unused;
|
||||||
@@ -142,7 +158,6 @@ dead_code_const_annotation: {
|
|||||||
var moo;
|
var moo;
|
||||||
function bar() {}
|
function bar() {}
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dead_code_const_annotation_regex: {
|
dead_code_const_annotation_regex: {
|
||||||
@@ -166,7 +181,6 @@ dead_code_const_annotation_regex: {
|
|||||||
var CONST_FOO_ANN = !1;
|
var CONST_FOO_ANN = !1;
|
||||||
CONST_FOO_ANN && console.log('reachable');
|
CONST_FOO_ANN && console.log('reachable');
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dead_code_const_annotation_complex_scope: {
|
dead_code_const_annotation_complex_scope: {
|
||||||
@@ -175,9 +189,7 @@ dead_code_const_annotation_complex_scope: {
|
|||||||
loops : true,
|
loops : true,
|
||||||
booleans : true,
|
booleans : true,
|
||||||
conditionals : true,
|
conditionals : true,
|
||||||
evaluate : true,
|
evaluate : true
|
||||||
reduce_vars : true,
|
|
||||||
toplevel : true,
|
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
var unused_var;
|
var unused_var;
|
||||||
@@ -211,64 +223,6 @@ dead_code_const_annotation_complex_scope: {
|
|||||||
var beef = 'good';
|
var beef = 'good';
|
||||||
var meat = 'beef';
|
var meat = 'beef';
|
||||||
var pork = 'bad';
|
var pork = 'bad';
|
||||||
}
|
'good' === pork && console.log('reached, not const');
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
try_catch_finally: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 1;
|
|
||||||
!function() {
|
|
||||||
try {
|
|
||||||
if (false) throw x;
|
|
||||||
} catch (a) {
|
|
||||||
var a = 2;
|
|
||||||
console.log("FAIL");
|
|
||||||
} finally {
|
|
||||||
a = 3;
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
}();
|
|
||||||
try {
|
|
||||||
console.log(a);
|
|
||||||
} finally {
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect: {
|
|
||||||
var a = 1;
|
|
||||||
!function() {
|
|
||||||
var a;
|
|
||||||
a = 3;
|
|
||||||
console.log("PASS");
|
|
||||||
}();
|
|
||||||
try {
|
|
||||||
console.log(a);
|
|
||||||
} finally {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"PASS",
|
|
||||||
"1",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
accessor: {
|
|
||||||
options = {
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
({
|
|
||||||
get a() {},
|
|
||||||
set a(v){
|
|
||||||
this.b = 2;
|
|
||||||
},
|
|
||||||
b: 1
|
|
||||||
});
|
|
||||||
}
|
|
||||||
expect: {}
|
|
||||||
}
|
|
||||||
|
|||||||
106
test/compress/destructuring.js
Normal file
106
test/compress/destructuring.js
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
destructuring_arrays: {
|
||||||
|
input: {
|
||||||
|
{const [aa, bb] = cc;}
|
||||||
|
{const [aa, [bb, cc]] = dd;}
|
||||||
|
{let [aa, bb] = cc;}
|
||||||
|
{let [aa, [bb, cc]] = dd;}
|
||||||
|
var [aa, bb] = cc;
|
||||||
|
var [aa, [bb, cc]] = dd;
|
||||||
|
var [,[,,,,,],,,zz,] = xx; // Trailing comma
|
||||||
|
var [,,zzz,,] = xxx; // Trailing comma after hole
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
{const [aa, bb] = cc;}
|
||||||
|
{const [aa, [bb, cc]] = dd;}
|
||||||
|
{let [aa, bb] = cc;}
|
||||||
|
{let [aa, [bb, cc]] = dd;}
|
||||||
|
var [aa, bb] = cc;
|
||||||
|
var [aa, [bb, cc]] = dd;
|
||||||
|
var [,[,,,,,],,,zz] = xx;
|
||||||
|
var [,,zzz,,] = xxx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
destructuring_arrays_holes: {
|
||||||
|
input: {
|
||||||
|
var [,,,,] = a;
|
||||||
|
var [,,b,] = c;
|
||||||
|
var [d,,] = e;
|
||||||
|
}
|
||||||
|
expect_exact: "var[,,,,]=a;var[,,b]=c;var[d,,]=e;"
|
||||||
|
}
|
||||||
|
|
||||||
|
destructuring_objects: {
|
||||||
|
input: {
|
||||||
|
{const {aa, bb} = {aa:1, bb:2};}
|
||||||
|
{const {aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}};}
|
||||||
|
{let {aa, bb} = {aa:1, bb:2};}
|
||||||
|
{let {aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}};}
|
||||||
|
var {aa, bb} = {aa:1, bb:2};
|
||||||
|
var {aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
{const {aa, bb} = {aa:1, bb:2};}
|
||||||
|
{const {aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}};}
|
||||||
|
{let {aa, bb} = {aa:1, bb:2};}
|
||||||
|
{let {aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}};}
|
||||||
|
var {aa, bb} = {aa:1, bb:2};
|
||||||
|
var {aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
destructuring_objects_trailing_elision: {
|
||||||
|
input: {
|
||||||
|
var {cc,} = foo;
|
||||||
|
}
|
||||||
|
expect_exact: "var{cc}=foo;"
|
||||||
|
}
|
||||||
|
|
||||||
|
nested_destructuring_objects: {
|
||||||
|
input: {
|
||||||
|
const [{a},b] = c;
|
||||||
|
let [{a},b] = c;
|
||||||
|
var [{a},b] = c;
|
||||||
|
}
|
||||||
|
expect_exact: 'const[{a},b]=c;let[{a},b]=c;var[{a},b]=c;';
|
||||||
|
}
|
||||||
|
|
||||||
|
destructuring_constdef_in_loops: {
|
||||||
|
input: {
|
||||||
|
for (const [x,y] in pairs);
|
||||||
|
for (const [a] = 0;;);
|
||||||
|
for (const {c} of cees);
|
||||||
|
}
|
||||||
|
expect_exact: "for(const[x,y]in pairs);for(const[a]=0;;);for(const{c}of cees);"
|
||||||
|
}
|
||||||
|
|
||||||
|
destructuring_letdef_in_loops: {
|
||||||
|
input: {
|
||||||
|
for (let [x,y] in pairs);
|
||||||
|
for (let [a] = 0;;);
|
||||||
|
for (let {c} of cees);
|
||||||
|
}
|
||||||
|
expect_exact: "for(let[x,y]in pairs);for(let[a]=0;;);for(let{c}of cees);"
|
||||||
|
}
|
||||||
|
|
||||||
|
destructuring_vardef_in_loops: {
|
||||||
|
input: {
|
||||||
|
for (var [x,y] in pairs);
|
||||||
|
for (var [a] = 0;;);
|
||||||
|
for (var {c} of cees);
|
||||||
|
}
|
||||||
|
expect_exact: "for(var[x,y]in pairs);for(var[a]=0;;);for(var{c}of cees);"
|
||||||
|
}
|
||||||
|
|
||||||
|
destructuring_expressions: {
|
||||||
|
beautify = {
|
||||||
|
ecma: 6
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({a, b});
|
||||||
|
[{a}];
|
||||||
|
f({x});
|
||||||
|
}
|
||||||
|
expect_exact: "({a,b});[{a}];f({x});"
|
||||||
|
}
|
||||||
|
|
||||||
10
test/compress/directives.js
Normal file
10
test/compress/directives.js
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
class_directives_compression: {
|
||||||
|
input: {
|
||||||
|
class foo {
|
||||||
|
foo() {
|
||||||
|
"use strict";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "class foo{foo(){}}"
|
||||||
|
}
|
||||||
@@ -10,7 +10,7 @@ drop_console_1: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
drop_console_2: {
|
drop_console_1: {
|
||||||
options = { drop_console: true };
|
options = { drop_console: true };
|
||||||
input: {
|
input: {
|
||||||
console.log('foo');
|
console.log('foo');
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
28
test/compress/expansions.js
Normal file
28
test/compress/expansions.js
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
|
||||||
|
expand_arguments: {
|
||||||
|
input: {
|
||||||
|
func(a, ...rest);
|
||||||
|
func(...all);
|
||||||
|
}
|
||||||
|
expect_exact: "func(a,...rest);func(...all);"
|
||||||
|
}
|
||||||
|
|
||||||
|
expand_expression_arguments: {
|
||||||
|
input: {
|
||||||
|
f(...a.b);
|
||||||
|
f(...a.b());
|
||||||
|
f(...(a));
|
||||||
|
f(...(a.b));
|
||||||
|
f(...a[i]);
|
||||||
|
}
|
||||||
|
expect_exact: "f(...a.b);f(...a.b());f(...a);f(...a.b);f(...a[i]);"
|
||||||
|
}
|
||||||
|
|
||||||
|
expand_parameters: {
|
||||||
|
input: {
|
||||||
|
(function (a, ...b){});
|
||||||
|
(function (...args){});
|
||||||
|
}
|
||||||
|
expect_exact: "(function(a,...b){});(function(...args){});"
|
||||||
|
}
|
||||||
|
|
||||||
52
test/compress/expression.js
Normal file
52
test/compress/expression.js
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
pow: {
|
||||||
|
input: {
|
||||||
|
var a = 2 ** 7;
|
||||||
|
var b = 3;
|
||||||
|
b **= 2;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 2 ** 7;
|
||||||
|
var b = 3;
|
||||||
|
b **= 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pow_with_number_constants: {
|
||||||
|
input: {
|
||||||
|
var a = 5 ** NaN;
|
||||||
|
var b = 42 ** +0;
|
||||||
|
var c = 42 ** -0;
|
||||||
|
var d = NaN ** 1;
|
||||||
|
var e = 2 ** Infinity;
|
||||||
|
var f = 2 ** -Infinity;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 5 ** NaN;
|
||||||
|
var b = 42 ** +0;
|
||||||
|
var c = 42 ** -0;
|
||||||
|
var d = NaN ** 1;
|
||||||
|
var e = 2 ** (1/0);
|
||||||
|
var f = 2 ** -(1/0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pow_with_parentheses: {
|
||||||
|
input: {
|
||||||
|
var g = (-7) ** (0.5);
|
||||||
|
var h = 2324334 ** 34343443;
|
||||||
|
var i = (-2324334) ** 34343443;
|
||||||
|
var j = 2 ** (-3);
|
||||||
|
var k = 2.0 ** -3;
|
||||||
|
var l = 2.0 ** (5 - 7);
|
||||||
|
}
|
||||||
|
expect_exact: "var g=(-7)**.5;var h=2324334**34343443;var i=(-2324334)**34343443;var j=2**-3;var k=2**-3;var l=2**(5-7);"
|
||||||
|
}
|
||||||
|
|
||||||
|
pow_with_unary_between_brackets: {
|
||||||
|
input: {
|
||||||
|
var a = (-(+5)) ** 3;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = (-+5)**3;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,149 +0,0 @@
|
|||||||
non_ascii_function_identifier_name: {
|
|
||||||
input: {
|
|
||||||
function fooλ(δλ) {}
|
|
||||||
function λ(δλ) {}
|
|
||||||
(function λ(δλ) {})()
|
|
||||||
}
|
|
||||||
expect_exact: "function fooλ(δλ){}function λ(δλ){}(function λ(δλ){})();"
|
|
||||||
}
|
|
||||||
|
|
||||||
iifes_returning_constants_keep_fargs_true: {
|
|
||||||
options = {
|
|
||||||
keep_fargs : true,
|
|
||||||
side_effects : true,
|
|
||||||
evaluate : true,
|
|
||||||
unused : true,
|
|
||||||
dead_code : true,
|
|
||||||
conditionals : true,
|
|
||||||
comparisons : true,
|
|
||||||
booleans : true,
|
|
||||||
if_return : true,
|
|
||||||
join_vars : true,
|
|
||||||
reduce_vars : true,
|
|
||||||
cascade : true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function(){ return -1.23; }());
|
|
||||||
console.log( function foo(){ return "okay"; }() );
|
|
||||||
console.log( function foo(x, y, z){ return 123; }() );
|
|
||||||
console.log( function(x, y, z){ return z; }() );
|
|
||||||
console.log( function(x, y, z){ if (x) return y; return z; }(1, 2, 3) );
|
|
||||||
console.log( function(x, y){ return x * y; }(2, 3) );
|
|
||||||
console.log( function(x, y){ return x * y; }(2, 3, a(), b()) );
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log("okay");
|
|
||||||
console.log(123);
|
|
||||||
console.log(void 0);
|
|
||||||
console.log(2);
|
|
||||||
console.log(6);
|
|
||||||
console.log((a(), b(), 6));
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
iifes_returning_constants_keep_fargs_false: {
|
|
||||||
options = {
|
|
||||||
keep_fargs : false,
|
|
||||||
side_effects : true,
|
|
||||||
evaluate : true,
|
|
||||||
unused : true,
|
|
||||||
dead_code : true,
|
|
||||||
conditionals : true,
|
|
||||||
comparisons : true,
|
|
||||||
booleans : true,
|
|
||||||
if_return : true,
|
|
||||||
join_vars : true,
|
|
||||||
reduce_vars : true,
|
|
||||||
cascade : true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function(){ return -1.23; }());
|
|
||||||
console.log( function foo(){ return "okay"; }() );
|
|
||||||
console.log( function foo(x, y, z){ return 123; }() );
|
|
||||||
console.log( function(x, y, z){ return z; }() );
|
|
||||||
console.log( function(x, y, z){ if (x) return y; return z; }(1, 2, 3) );
|
|
||||||
console.log( function(x, y){ return x * y; }(2, 3) );
|
|
||||||
console.log( function(x, y){ return x * y; }(2, 3, a(), b()) );
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log("okay");
|
|
||||||
console.log(123);
|
|
||||||
console.log(void 0);
|
|
||||||
console.log(2);
|
|
||||||
console.log(6);
|
|
||||||
console.log((a(), b(), 6));
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_485_crashing_1530: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function(a) {
|
|
||||||
if (true) return;
|
|
||||||
var b = 42;
|
|
||||||
})(this);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
this, void 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1841_1: {
|
|
||||||
options = {
|
|
||||||
keep_fargs: false,
|
|
||||||
pure_getters: "strict",
|
|
||||||
reduce_vars: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var b = 10;
|
|
||||||
!function(arg) {
|
|
||||||
for (var key in "hi")
|
|
||||||
var n = arg.baz, n = [ b = 42 ];
|
|
||||||
}(--b);
|
|
||||||
console.log(b);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var b = 10;
|
|
||||||
!function() {
|
|
||||||
for (var key in "hi") {
|
|
||||||
b = 42;
|
|
||||||
}
|
|
||||||
}(--b);
|
|
||||||
console.log(b);
|
|
||||||
}
|
|
||||||
expect_exact: "42"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1841_2: {
|
|
||||||
options = {
|
|
||||||
keep_fargs: false,
|
|
||||||
pure_getters: false,
|
|
||||||
reduce_vars: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var b = 10;
|
|
||||||
!function(arg) {
|
|
||||||
for (var key in "hi")
|
|
||||||
var n = arg.baz, n = [ b = 42 ];
|
|
||||||
}(--b);
|
|
||||||
console.log(b);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var b = 10;
|
|
||||||
!function(arg) {
|
|
||||||
for (var key in "hi") {
|
|
||||||
arg.baz, b = 42;
|
|
||||||
}
|
|
||||||
}(--b);
|
|
||||||
console.log(b);
|
|
||||||
}
|
|
||||||
expect_exact: "42"
|
|
||||||
}
|
|
||||||
@@ -1,162 +0,0 @@
|
|||||||
must_replace: {
|
|
||||||
options = {
|
|
||||||
global_defs: {
|
|
||||||
D: "foo bar",
|
|
||||||
}
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(D);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log("foo bar");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
keyword: {
|
|
||||||
options = {
|
|
||||||
global_defs: {
|
|
||||||
undefined: 0,
|
|
||||||
NaN: 1,
|
|
||||||
Infinity: 2,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(undefined, NaN, Infinity);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(0, 1, 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
object: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
global_defs: {
|
|
||||||
CONFIG: {
|
|
||||||
DEBUG: [ 0 ],
|
|
||||||
VALUE: 42,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
unsafe: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(CONFIG) {
|
|
||||||
// CONFIG not global - do not replace
|
|
||||||
return CONFIG.VALUE;
|
|
||||||
}
|
|
||||||
function g() {
|
|
||||||
var CONFIG = { VALUE: 1 };
|
|
||||||
// CONFIG not global - do not replace
|
|
||||||
return CONFIG.VALUE;
|
|
||||||
}
|
|
||||||
function h() {
|
|
||||||
return CONFIG.VALUE;
|
|
||||||
}
|
|
||||||
if (CONFIG.DEBUG[0])
|
|
||||||
console.debug("foo");
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(CONFIG) {
|
|
||||||
return CONFIG.VALUE;
|
|
||||||
}
|
|
||||||
function g() {
|
|
||||||
var CONFIG = { VALUE: 1 };
|
|
||||||
return CONFIG.VALUE;
|
|
||||||
}
|
|
||||||
function h() {
|
|
||||||
return 42;
|
|
||||||
}
|
|
||||||
if (0)
|
|
||||||
console.debug("foo");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
expanded: {
|
|
||||||
options = {
|
|
||||||
global_defs: {
|
|
||||||
"CONFIG.DEBUG": [ 0 ],
|
|
||||||
"CONFIG.VALUE": 42,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(CONFIG) {
|
|
||||||
// CONFIG not global - do not replace
|
|
||||||
return CONFIG.VALUE;
|
|
||||||
}
|
|
||||||
function g() {
|
|
||||||
var CONFIG = { VALUE: 1 };
|
|
||||||
// CONFIG not global - do not replace
|
|
||||||
return CONFIG.VALUE;
|
|
||||||
}
|
|
||||||
function h() {
|
|
||||||
return CONFIG.VALUE;
|
|
||||||
}
|
|
||||||
if (CONFIG.DEBUG[0])
|
|
||||||
console.debug("foo");
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(CONFIG) {
|
|
||||||
return CONFIG.VALUE;
|
|
||||||
}
|
|
||||||
function g() {
|
|
||||||
var CONFIG = { VALUE: 1 };
|
|
||||||
return CONFIG.VALUE;
|
|
||||||
}
|
|
||||||
function h() {
|
|
||||||
return 42;
|
|
||||||
}
|
|
||||||
if ([0][0])
|
|
||||||
console.debug("foo");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mixed: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
global_defs: {
|
|
||||||
"CONFIG.VALUE": 42,
|
|
||||||
"FOO.BAR": "moo",
|
|
||||||
},
|
|
||||||
properties: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
const FOO = { BAR: 0 };
|
|
||||||
console.log(FOO.BAR);
|
|
||||||
console.log(++CONFIG.DEBUG);
|
|
||||||
console.log(++CONFIG.VALUE);
|
|
||||||
console.log(++CONFIG["VAL" + "UE"]);
|
|
||||||
console.log(++DEBUG[CONFIG.VALUE]);
|
|
||||||
CONFIG.VALUE.FOO = "bar";
|
|
||||||
console.log(CONFIG);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
const FOO = { BAR: 0 };
|
|
||||||
console.log("moo");
|
|
||||||
console.log(++CONFIG.DEBUG);
|
|
||||||
console.log(++CONFIG.VALUE);
|
|
||||||
console.log(++CONFIG.VALUE);
|
|
||||||
console.log(++DEBUG[42]);
|
|
||||||
CONFIG.VALUE.FOO = "bar";
|
|
||||||
console.log(CONFIG);
|
|
||||||
}
|
|
||||||
expect_warnings: [
|
|
||||||
'WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:126,22]',
|
|
||||||
'WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:127,22]',
|
|
||||||
'WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:129,8]',
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1801: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
global_defs: {
|
|
||||||
"CONFIG.FOO.BAR": true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(CONFIG.FOO.BAR);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(!0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
288
test/compress/harmony.js
Normal file
288
test/compress/harmony.js
Normal file
@@ -0,0 +1,288 @@
|
|||||||
|
arrow_function_parens: {
|
||||||
|
input: {
|
||||||
|
something && (() => {});
|
||||||
|
}
|
||||||
|
expect_exact: "something&&(()=>{});"
|
||||||
|
}
|
||||||
|
arrow_function_parens_2: {
|
||||||
|
input: {
|
||||||
|
(() => null)();
|
||||||
|
}
|
||||||
|
expect_exact: "(()=>null)();"
|
||||||
|
}
|
||||||
|
|
||||||
|
typeof_arrow_functions: {
|
||||||
|
options = {
|
||||||
|
evaluate: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var foo = typeof (x) => null;
|
||||||
|
}
|
||||||
|
expect_exact: "var foo=\"function\";"
|
||||||
|
}
|
||||||
|
|
||||||
|
classes: {
|
||||||
|
input: {
|
||||||
|
class SomeClass {
|
||||||
|
constructor() {
|
||||||
|
};
|
||||||
|
foo() {};
|
||||||
|
};
|
||||||
|
class NoSemi {
|
||||||
|
constructor(...args) {
|
||||||
|
}
|
||||||
|
foo() {}
|
||||||
|
};
|
||||||
|
class ChildClass extends SomeClass {};
|
||||||
|
var asExpression = class AsExpression {};
|
||||||
|
var nameless = class {};
|
||||||
|
}
|
||||||
|
expect_exact: "class SomeClass{constructor(){}foo(){}}class NoSemi{constructor(...args){}foo(){}}class ChildClass extends SomeClass{}var asExpression=class AsExpression{};var nameless=class{};"
|
||||||
|
}
|
||||||
|
|
||||||
|
class_statics: {
|
||||||
|
input: {
|
||||||
|
x = class {
|
||||||
|
static staticMethod() {}
|
||||||
|
static get foo() {}
|
||||||
|
static set bar() {}
|
||||||
|
static() { /* "static" can be a method name! */ }
|
||||||
|
get() { /* "get" can be a method name! */ }
|
||||||
|
set() { /* "set" can be a method name! */ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "x=class{static staticMethod(){}static get foo(){}static set bar(){}static(){}get(){}set(){}};"
|
||||||
|
}
|
||||||
|
|
||||||
|
class_name_can_be_mangled: {
|
||||||
|
mangle = { };
|
||||||
|
input: {
|
||||||
|
function x() {
|
||||||
|
class Foo {
|
||||||
|
}
|
||||||
|
var class1 = Foo
|
||||||
|
var class2 = class Bar {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function x() {
|
||||||
|
class a { }
|
||||||
|
var n = a
|
||||||
|
var r = class a {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class_name_can_be_preserved: {
|
||||||
|
mangle = {
|
||||||
|
keep_classnames: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function x() {
|
||||||
|
(class Baz { });
|
||||||
|
class Foo {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function x() {
|
||||||
|
(class Baz { });
|
||||||
|
class Foo {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
classes_can_have_generators: {
|
||||||
|
input: {
|
||||||
|
class Foo {
|
||||||
|
*bar() {}
|
||||||
|
static *baz() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
class Foo {
|
||||||
|
*bar() {}
|
||||||
|
static *baz() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
classes_can_have_computed_generators: {
|
||||||
|
input: {
|
||||||
|
class C4 {
|
||||||
|
*['constructor']() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
class C4 {
|
||||||
|
*['constructor']() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
classes_can_have_computed_static: {
|
||||||
|
input: {
|
||||||
|
class C4 {
|
||||||
|
static ['constructor']() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
class C4 {
|
||||||
|
static ['constructor']() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class_methods_and_getters_with_keep_quoted_props_enabled: {
|
||||||
|
beautify = {
|
||||||
|
quote_style: 3,
|
||||||
|
keep_quoted_props: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
class clss {
|
||||||
|
a() {}
|
||||||
|
"b"() {}
|
||||||
|
get c() { return "c"}
|
||||||
|
get "d"() { return "d"}
|
||||||
|
set e(a) { doSomething(a); }
|
||||||
|
set 'f'(a) { doSomething(b); }
|
||||||
|
static g() {}
|
||||||
|
static "h"() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: 'class clss{a(){}"b"(){}get c(){return"c"}get"d"(){return"d"}set e(a){doSomething(a)}set\'f\'(a){doSomething(b)}static g(){}static"h"(){}}'
|
||||||
|
}
|
||||||
|
|
||||||
|
new_target: {
|
||||||
|
input: {
|
||||||
|
new.target;
|
||||||
|
new.target.name;
|
||||||
|
}
|
||||||
|
expect_exact: "new.target;new.target.name;"
|
||||||
|
}
|
||||||
|
|
||||||
|
number_literals: {
|
||||||
|
input: {
|
||||||
|
0b1001;
|
||||||
|
0B1001;
|
||||||
|
0o11;
|
||||||
|
0O11;
|
||||||
|
}
|
||||||
|
|
||||||
|
expect: {
|
||||||
|
9;
|
||||||
|
9;
|
||||||
|
9;
|
||||||
|
9;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
import_statement: {
|
||||||
|
input: {
|
||||||
|
import "mod-name";
|
||||||
|
import Foo from "bar";
|
||||||
|
import { Bar, Baz } from 'lel';
|
||||||
|
import Bar, { Foo } from 'lel';
|
||||||
|
import { Bar as kex, Baz as food } from 'lel';
|
||||||
|
}
|
||||||
|
expect_exact: "import\"mod-name\";import Foo from\"bar\";import{Bar,Baz}from\"lel\";import Bar,{Foo}from\"lel\";import{Bar as kex,Baz as food}from\"lel\";"
|
||||||
|
}
|
||||||
|
|
||||||
|
export_statement: {
|
||||||
|
input: {
|
||||||
|
export default 1;
|
||||||
|
export var foo = 4;
|
||||||
|
export let foo = 6;
|
||||||
|
export const foo = 6;
|
||||||
|
export function foo() {};
|
||||||
|
export class foo { };
|
||||||
|
}
|
||||||
|
expect_exact: "export default 1;export var foo=4;export let foo=6;export const foo=6;export function foo(){};export class foo{};"
|
||||||
|
}
|
||||||
|
|
||||||
|
import_statement_mangling: {
|
||||||
|
mangle = { };
|
||||||
|
input: {
|
||||||
|
import Foo from "foo";
|
||||||
|
import Bar, {Food} from "lel";
|
||||||
|
import {What as Whatever} from "lel";
|
||||||
|
Foo();
|
||||||
|
Bar();
|
||||||
|
Food();
|
||||||
|
Whatever();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
import l from "foo";
|
||||||
|
import e, {Food as o} from "lel";
|
||||||
|
import {What as f} from "lel";
|
||||||
|
l();
|
||||||
|
e();
|
||||||
|
o();
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export_statement_mangling: {
|
||||||
|
mangle = { };
|
||||||
|
input: {
|
||||||
|
export var foo = 6;
|
||||||
|
export function bar() { }
|
||||||
|
export class Baz { }
|
||||||
|
bar(foo, Baz)
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export var foo = 6;
|
||||||
|
export function bar() { }
|
||||||
|
export class Baz { }
|
||||||
|
bar(foo, Baz)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://github.com/mishoo/UglifyJS2/issues/1021
|
||||||
|
regression_for_of_const: {
|
||||||
|
input: {
|
||||||
|
for (const x of y) {}
|
||||||
|
for (const x in y) {}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
for (const x of y);for (const x in y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fabio: My patches accidentally caused a crash whenever
|
||||||
|
// there's an extraneous set of parens around an object.
|
||||||
|
regression_cannot_destructure: {
|
||||||
|
input: {
|
||||||
|
var x = ({ x : 3 });
|
||||||
|
x(({ x: 3 }));
|
||||||
|
}
|
||||||
|
expect_exact: "var x={x:3};x({x:3});";
|
||||||
|
}
|
||||||
|
|
||||||
|
regression_cannot_use_of: {
|
||||||
|
input: {
|
||||||
|
function of() {
|
||||||
|
}
|
||||||
|
var of = "is a valid variable name";
|
||||||
|
of = { of: "is ok" };
|
||||||
|
x.of;
|
||||||
|
of: foo()
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function of(){}
|
||||||
|
var of="is a valid variable name";
|
||||||
|
of={of:"is ok"};
|
||||||
|
x.of;
|
||||||
|
foo(); /* Label statement missing? No prob. */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fat_arrow_as_param: {
|
||||||
|
input: {
|
||||||
|
foo(x => x);
|
||||||
|
foo(x => x, y => y);
|
||||||
|
|
||||||
|
foo(x => (x, x));
|
||||||
|
foo(x => (x, x), y => (y, y));
|
||||||
|
}
|
||||||
|
expect_exact: "foo(x=>x);foo(x=>x,y=>y);foo(x=>(x,x));foo(x=>(x,x),y=>(y,y));"
|
||||||
|
}
|
||||||
85
test/compress/hoist.js
Normal file
85
test/compress/hoist.js
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
|
||||||
|
hoist_vars: {
|
||||||
|
options = {
|
||||||
|
hoist_vars: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function a() {
|
||||||
|
bar();
|
||||||
|
var var1;
|
||||||
|
var var2;
|
||||||
|
}
|
||||||
|
function b(anArg) {
|
||||||
|
bar();
|
||||||
|
var var1;
|
||||||
|
var anArg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function a() {
|
||||||
|
var var1, var2; // Vars go up and are joined
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
function b(anArg) {
|
||||||
|
var var1;
|
||||||
|
bar();
|
||||||
|
// But vars named like arguments go away!
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hoist_funs: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function a() {
|
||||||
|
bar();
|
||||||
|
function foo() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function a() {
|
||||||
|
function foo() {} // Funs go up
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hoist_no_destructurings: {
|
||||||
|
options = {
|
||||||
|
hoist_vars: true,
|
||||||
|
hoist_funs: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function a([anArg]) {
|
||||||
|
bar();
|
||||||
|
var var1;
|
||||||
|
var anArg; // Because anArg is already declared, this goes away!
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function a([anArg]) {
|
||||||
|
var var1;
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dont_hoist_var_destructurings: {
|
||||||
|
options = {
|
||||||
|
hoist_vars: true,
|
||||||
|
hoist_funs: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function x() {
|
||||||
|
// If foo is null or undefined, this should be an exception
|
||||||
|
var {x,y} = foo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function x() {
|
||||||
|
var {x,y} = foo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
statements: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: false,
|
|
||||||
hoist_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
var a = 1;
|
|
||||||
var b = 2;
|
|
||||||
var c = 3;
|
|
||||||
function g() {}
|
|
||||||
return g(a, b, c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {
|
|
||||||
var a = 1, b = 2, c = 3;
|
|
||||||
function g() {}
|
|
||||||
return g(a, b, c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
statements_funs: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
hoist_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
var a = 1;
|
|
||||||
var b = 2;
|
|
||||||
var c = 3;
|
|
||||||
function g() {}
|
|
||||||
return g(a, b, c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {
|
|
||||||
function g() {}
|
|
||||||
var a = 1, b = 2, c = 3;
|
|
||||||
return g(a, b, c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sequences: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: false,
|
|
||||||
hoist_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
var a = 1, b = 2;
|
|
||||||
function g() {}
|
|
||||||
var c = 3;
|
|
||||||
return g(a, b, c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {
|
|
||||||
var c, a = 1, b = 2;
|
|
||||||
function g() {}
|
|
||||||
c = 3;
|
|
||||||
return g(a, b, c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sequences_funs: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
hoist_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
var a = 1, b = 2;
|
|
||||||
function g() {}
|
|
||||||
var c = 3;
|
|
||||||
return g(a, b, c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {
|
|
||||||
function g() {}
|
|
||||||
var a = 1, b = 2, c = 3;
|
|
||||||
return g(a, b, c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -47,9 +47,34 @@ html_comment_in_greater_than_or_equal: {
|
|||||||
expect_exact: "function f(a,b){return a-- >=b}";
|
expect_exact: "function f(a,b){return a-- >=b}";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
html_comment_in_right_shift_assign: {
|
||||||
|
input: {
|
||||||
|
// Note: illegal javascript
|
||||||
|
function f(a, b) { return a-- >>= b; }
|
||||||
|
}
|
||||||
|
expect_exact: "function f(a,b){return a-- >>=b}";
|
||||||
|
}
|
||||||
|
|
||||||
|
html_comment_in_zero_fill_right_shift_assign: {
|
||||||
|
input: {
|
||||||
|
// Note: illegal javascript
|
||||||
|
function f(a, b) { return a-- >>>= b; }
|
||||||
|
}
|
||||||
|
expect_exact: "function f(a,b){return a-- >>>=b}";
|
||||||
|
}
|
||||||
|
|
||||||
html_comment_in_string_literal: {
|
html_comment_in_string_literal: {
|
||||||
input: {
|
input: {
|
||||||
function f() { return "<!--HTML-->comment in<!--string literal-->"; }
|
function f() { return "<!--HTML-->comment in<!--string literal-->"; }
|
||||||
}
|
}
|
||||||
expect_exact: 'function f(){return"\\x3c!--HTML--\\x3ecomment in\\x3c!--string literal--\\x3e"}';
|
expect_exact: 'function f(){return"\\x3c!--HTML--\\x3ecomment in\\x3c!--string literal--\\x3e"}';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
html_comment_after_multiline_comment: {
|
||||||
|
input: {
|
||||||
|
var foo; /*
|
||||||
|
*/--> var bar;
|
||||||
|
var foobar;
|
||||||
|
}
|
||||||
|
expect_exact: "var foo;var foobar;"
|
||||||
|
}
|
||||||
|
|||||||
@@ -170,51 +170,8 @@ if_return_7: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f(x){if(x)return!0;foo(),bar()}
|
// suboptimal
|
||||||
}
|
function f(x){return!!x||(foo(),void bar())}
|
||||||
}
|
|
||||||
|
|
||||||
if_return_8: {
|
|
||||||
options = {
|
|
||||||
if_return: true,
|
|
||||||
sequences: true,
|
|
||||||
conditionals: true,
|
|
||||||
side_effects : true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(e) {
|
|
||||||
if (2 == e) return foo();
|
|
||||||
if (3 == e) return bar();
|
|
||||||
if (4 == e) return baz();
|
|
||||||
fail(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
function g(e) {
|
|
||||||
if (a(e)) return foo();
|
|
||||||
if (b(e)) return bar();
|
|
||||||
if (c(e)) return baz();
|
|
||||||
fail(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
function h(e) {
|
|
||||||
if (a(e)) return foo();
|
|
||||||
else if (b(e)) return bar();
|
|
||||||
else if (c(e)) return baz();
|
|
||||||
else fail(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
function i(e) {
|
|
||||||
if (a(e)) return foo();
|
|
||||||
else if (b(e)) return bar();
|
|
||||||
else if (c(e)) return baz();
|
|
||||||
fail(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(e){return 2==e?foo():3==e?bar():4==e?baz():void fail(e)}
|
|
||||||
function g(e){return a(e)?foo():b(e)?bar():c(e)?baz():void fail(e)}
|
|
||||||
function h(e){return a(e)?foo():b(e)?bar():c(e)?baz():void fail(e)}
|
|
||||||
function i(e){return a(e)?foo():b(e)?bar():c(e)?baz():void fail(e)}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -248,57 +205,3 @@ issue_1089: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1437: {
|
|
||||||
options = {
|
|
||||||
if_return : true,
|
|
||||||
sequences : true,
|
|
||||||
conditionals : false
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function x() {
|
|
||||||
if (a())
|
|
||||||
return b();
|
|
||||||
if (c())
|
|
||||||
return d();
|
|
||||||
else
|
|
||||||
e();
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function x() {
|
|
||||||
if (a())
|
|
||||||
return b();
|
|
||||||
if (c())
|
|
||||||
return d();
|
|
||||||
else
|
|
||||||
e()
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1437_conditionals: {
|
|
||||||
options = {
|
|
||||||
conditionals : true,
|
|
||||||
if_return : true,
|
|
||||||
sequences : true
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function x() {
|
|
||||||
if (a())
|
|
||||||
return b();
|
|
||||||
if (c())
|
|
||||||
return d();
|
|
||||||
else
|
|
||||||
e();
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function x() {
|
|
||||||
return a() ? b() : c() ? d() : (e(), f(), void 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
8
test/compress/issue-1001.js
Normal file
8
test/compress/issue-1001.js
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
parenthesis_strings_in_parenthesis: {
|
||||||
|
input: {
|
||||||
|
var foo = ('(');
|
||||||
|
a(')');
|
||||||
|
|
||||||
|
}
|
||||||
|
expect_exact: 'var foo="(";a(")");'
|
||||||
|
}
|
||||||
@@ -39,7 +39,7 @@ non_hoisted_function_after_return_2a: {
|
|||||||
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
||||||
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
||||||
if_return: true, join_vars: true, cascade: true, side_effects: true,
|
if_return: true, join_vars: true, cascade: true, side_effects: true,
|
||||||
collapse_vars: false, passes: 2, warnings: "verbose"
|
collapse_vars: false, passes: 2
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo(x) {
|
function foo(x) {
|
||||||
@@ -75,7 +75,7 @@ non_hoisted_function_after_return_2a: {
|
|||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:53,12]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:53,12]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:56,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:56,12]",
|
||||||
"WARN: Dropping unused variable b [test/compress/issue-1034.js:51,20]",
|
"WARN: Dropping unused variable b [test/compress/issue-1034.js:51,20]",
|
||||||
"WARN: Dropping unused variable c [test/compress/issue-1034.js:53,16]",
|
"WARN: Dropping unused variable c [test/compress/issue-1034.js:53,16]"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,5 +114,8 @@ non_hoisted_function_after_return_2b: {
|
|||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:97,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:97,12]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:97,12]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:97,12]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:101,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:101,12]",
|
||||||
|
"WARN: Dropping unused variable b [test/compress/issue-1034.js:95,20]",
|
||||||
|
"WARN: Dropping unused variable c [test/compress/issue-1034.js:97,16]"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,8 +13,7 @@ const_declaration: {
|
|||||||
|
|
||||||
const_pragma: {
|
const_pragma: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true
|
||||||
reduce_vars: true,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
input: {
|
input: {
|
||||||
@@ -28,8 +27,7 @@ const_pragma: {
|
|||||||
// for completeness' sake
|
// for completeness' sake
|
||||||
not_const: {
|
not_const: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true
|
||||||
reduce_vars: true,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
input: {
|
input: {
|
||||||
|
|||||||
30
test/compress/issue-1043.js
Normal file
30
test/compress/issue-1043.js
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
issue_1043: {
|
||||||
|
options = {
|
||||||
|
side_effects: true
|
||||||
|
};
|
||||||
|
|
||||||
|
input: {
|
||||||
|
function* range(start = 0, end = null, step = 1) {
|
||||||
|
if (end == null) {
|
||||||
|
end = start;
|
||||||
|
start = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = start; i < end; i += step) {
|
||||||
|
yield i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
expect: {
|
||||||
|
function* range(start = 0, end = null, step = 1) {
|
||||||
|
if (null == end) {
|
||||||
|
end = start;
|
||||||
|
start = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = start; i < end; i += step)
|
||||||
|
yield i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
9
test/compress/issue-1044.js
Normal file
9
test/compress/issue-1044.js
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
issue_1044: {
|
||||||
|
options = { evaluate: true, conditionals: true };
|
||||||
|
input: {
|
||||||
|
const mixed = Base ? class extends Base {} : class {}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
const mixed = Base ? class extends Base {} : class {}
|
||||||
|
}
|
||||||
|
}
|
||||||
25
test/compress/issue-105.js
Normal file
25
test/compress/issue-105.js
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
typeof_eq_undefined: {
|
||||||
|
options = {
|
||||||
|
comparisons: true
|
||||||
|
};
|
||||||
|
input: { a = typeof b.c != "undefined" }
|
||||||
|
expect: { a = "undefined" != typeof b.c }
|
||||||
|
}
|
||||||
|
|
||||||
|
typeof_eq_undefined_unsafe: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
unsafe: true
|
||||||
|
};
|
||||||
|
input: { a = typeof b.c != "undefined" }
|
||||||
|
expect: { a = void 0 !== b.c }
|
||||||
|
}
|
||||||
|
|
||||||
|
typeof_eq_undefined_unsafe2: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
unsafe: true
|
||||||
|
};
|
||||||
|
input: { a = "undefined" != typeof b.c }
|
||||||
|
expect: { a = void 0 !== b.c }
|
||||||
|
}
|
||||||
@@ -193,15 +193,13 @@ assorted_Infinity_NaN_undefined_in_with_scope: {
|
|||||||
cascade: true,
|
cascade: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
sequences: false,
|
sequences: false,
|
||||||
keep_infinity: false,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var f = console.log;
|
|
||||||
var o = {
|
var o = {
|
||||||
undefined : 3,
|
undefined : 3,
|
||||||
NaN : 4,
|
NaN : 4,
|
||||||
Infinity : 5,
|
Infinity : 5,
|
||||||
};
|
}
|
||||||
if (o) {
|
if (o) {
|
||||||
f(undefined, void 0);
|
f(undefined, void 0);
|
||||||
f(NaN, 0/0);
|
f(NaN, 0/0);
|
||||||
@@ -218,88 +216,25 @@ assorted_Infinity_NaN_undefined_in_with_scope: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var f = console.log, o = {
|
var o = {
|
||||||
undefined : 3,
|
undefined : 3,
|
||||||
NaN : 4,
|
NaN : 4,
|
||||||
Infinity : 5
|
Infinity : 5
|
||||||
};
|
}
|
||||||
if (o) {
|
if (o) {
|
||||||
f(void 0, void 0);
|
f(void 0, void 0);
|
||||||
f(NaN, NaN);
|
f(NaN, NaN);
|
||||||
f(1/0, 1/0);
|
f(1/0, 1/0);
|
||||||
f(-1/0, -1/0);
|
f(-(1/0), -(1/0));
|
||||||
f(NaN, NaN);
|
f(NaN, NaN);
|
||||||
}
|
}
|
||||||
with (o) {
|
with (o) {
|
||||||
f(undefined, void 0);
|
f(undefined, void 0);
|
||||||
f(NaN, 0/0);
|
f(NaN, 0/0);
|
||||||
f(Infinity, 1/0);
|
f(Infinity, 1/0);
|
||||||
f(-Infinity, -1/0);
|
f(-Infinity, -(1/0));
|
||||||
f(9 + undefined, 9 + void 0);
|
f(9 + undefined, 9 + void 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
assorted_Infinity_NaN_undefined_in_with_scope_keep_infinity: {
|
|
||||||
options = {
|
|
||||||
unused: true,
|
|
||||||
evaluate: true,
|
|
||||||
dead_code: true,
|
|
||||||
conditionals: true,
|
|
||||||
comparisons: true,
|
|
||||||
booleans: true,
|
|
||||||
hoist_funs: true,
|
|
||||||
keep_fargs: true,
|
|
||||||
if_return: true,
|
|
||||||
join_vars: true,
|
|
||||||
cascade: true,
|
|
||||||
side_effects: true,
|
|
||||||
sequences: false,
|
|
||||||
keep_infinity: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var f = console.log;
|
|
||||||
var o = {
|
|
||||||
undefined : 3,
|
|
||||||
NaN : 4,
|
|
||||||
Infinity : 5,
|
|
||||||
};
|
|
||||||
if (o) {
|
|
||||||
f(undefined, void 0);
|
|
||||||
f(NaN, 0/0);
|
|
||||||
f(Infinity, 1/0);
|
|
||||||
f(-Infinity, -(1/0));
|
|
||||||
f(2 + 7 + undefined, 2 + 7 + void 0);
|
|
||||||
}
|
|
||||||
with (o) {
|
|
||||||
f(undefined, void 0);
|
|
||||||
f(NaN, 0/0);
|
|
||||||
f(Infinity, 1/0);
|
|
||||||
f(-Infinity, -(1/0));
|
|
||||||
f(2 + 7 + undefined, 2 + 7 + void 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var f = console.log, o = {
|
|
||||||
undefined : 3,
|
|
||||||
NaN : 4,
|
|
||||||
Infinity : 5
|
|
||||||
};
|
|
||||||
if (o) {
|
|
||||||
f(void 0, void 0);
|
|
||||||
f(NaN, NaN);
|
|
||||||
f(Infinity, 1/0);
|
|
||||||
f(-Infinity, -1/0);
|
|
||||||
f(NaN, NaN);
|
|
||||||
}
|
|
||||||
with (o) {
|
|
||||||
f(undefined, void 0);
|
|
||||||
f(NaN, 0/0);
|
|
||||||
f(Infinity, 1/0);
|
|
||||||
f(-Infinity, -1/0);
|
|
||||||
f(9 + undefined, 9 + void 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -49,3 +49,4 @@ mangle_keep_fnames_true: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
76
test/compress/issue-1212.js
Normal file
76
test/compress/issue-1212.js
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
issue_1212_debug_false: {
|
||||||
|
options = {
|
||||||
|
global_defs : { DEBUG: false },
|
||||||
|
sequences : true,
|
||||||
|
properties : true,
|
||||||
|
dead_code : true,
|
||||||
|
conditionals : true,
|
||||||
|
comparisons : true,
|
||||||
|
evaluate : true,
|
||||||
|
booleans : true,
|
||||||
|
loops : true,
|
||||||
|
unused : true,
|
||||||
|
hoist_funs : true,
|
||||||
|
keep_fargs : true,
|
||||||
|
if_return : true,
|
||||||
|
join_vars : true,
|
||||||
|
cascade : true,
|
||||||
|
side_effects : true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
class foo {
|
||||||
|
bar() {
|
||||||
|
if (DEBUG)
|
||||||
|
console.log("DEV");
|
||||||
|
else
|
||||||
|
console.log("PROD");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
new foo().bar();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
class foo{
|
||||||
|
bar() { console.log("PROD") }
|
||||||
|
}
|
||||||
|
(new foo).bar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1212_debug_true: {
|
||||||
|
options = {
|
||||||
|
global_defs : { DEBUG: true },
|
||||||
|
sequences : true,
|
||||||
|
properties : true,
|
||||||
|
dead_code : true,
|
||||||
|
conditionals : true,
|
||||||
|
comparisons : true,
|
||||||
|
evaluate : true,
|
||||||
|
booleans : true,
|
||||||
|
loops : true,
|
||||||
|
unused : true,
|
||||||
|
hoist_funs : true,
|
||||||
|
keep_fargs : true,
|
||||||
|
if_return : true,
|
||||||
|
join_vars : true,
|
||||||
|
cascade : true,
|
||||||
|
side_effects : true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
class foo {
|
||||||
|
bar() {
|
||||||
|
if (DEBUG)
|
||||||
|
console.log("DEV");
|
||||||
|
else
|
||||||
|
console.log("PROD");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
new foo().bar();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
class foo{
|
||||||
|
bar() { console.log("DEV") }
|
||||||
|
}
|
||||||
|
(new foo).bar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,176 +0,0 @@
|
|||||||
pure_function_calls: {
|
|
||||||
options = {
|
|
||||||
evaluate : true,
|
|
||||||
conditionals : true,
|
|
||||||
comparisons : true,
|
|
||||||
side_effects : true,
|
|
||||||
booleans : true,
|
|
||||||
unused : true,
|
|
||||||
if_return : true,
|
|
||||||
join_vars : true,
|
|
||||||
cascade : true,
|
|
||||||
negate_iife : true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
// pure top-level IIFE will be dropped
|
|
||||||
// @__PURE__ - comment
|
|
||||||
(function() {
|
|
||||||
console.log("iife0");
|
|
||||||
})();
|
|
||||||
|
|
||||||
// pure top-level IIFE assigned to unreferenced var will not be dropped
|
|
||||||
var iife1 = /*@__PURE__*/(function() {
|
|
||||||
console.log("iife1");
|
|
||||||
function iife1() {}
|
|
||||||
return iife1;
|
|
||||||
})();
|
|
||||||
|
|
||||||
(function(){
|
|
||||||
// pure IIFE in function scope assigned to unreferenced var will be dropped
|
|
||||||
var iife2 = /*#__PURE__*/(function() {
|
|
||||||
console.log("iife2");
|
|
||||||
function iife2() {}
|
|
||||||
return iife2;
|
|
||||||
})();
|
|
||||||
})();
|
|
||||||
|
|
||||||
// comment #__PURE__ comment
|
|
||||||
bar(), baz(), quux();
|
|
||||||
a.b(), /* @__PURE__ */ c.d.e(), f.g();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var iife1 = function() {
|
|
||||||
console.log("iife1");
|
|
||||||
function iife1() {}
|
|
||||||
return iife1;
|
|
||||||
}();
|
|
||||||
|
|
||||||
baz(), quux();
|
|
||||||
a.b(), f.g();
|
|
||||||
}
|
|
||||||
expect_warnings: [
|
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:17,8]",
|
|
||||||
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:17,8]",
|
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:30,37]",
|
|
||||||
"WARN: Dropping unused variable iife2 [test/compress/issue-1261.js:30,16]",
|
|
||||||
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:28,8]",
|
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:38,8]",
|
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:39,31]",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
pure_function_calls_toplevel: {
|
|
||||||
options = {
|
|
||||||
evaluate : true,
|
|
||||||
conditionals : true,
|
|
||||||
comparisons : true,
|
|
||||||
side_effects : true,
|
|
||||||
booleans : true,
|
|
||||||
unused : true,
|
|
||||||
if_return : true,
|
|
||||||
join_vars : true,
|
|
||||||
cascade : true,
|
|
||||||
negate_iife : true,
|
|
||||||
toplevel : true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
// pure top-level IIFE will be dropped
|
|
||||||
// @__PURE__ - comment
|
|
||||||
(function() {
|
|
||||||
console.log("iife0");
|
|
||||||
})();
|
|
||||||
|
|
||||||
// pure top-level IIFE assigned to unreferenced var will be dropped
|
|
||||||
var iife1 = /*@__PURE__*/(function() {
|
|
||||||
console.log("iife1");
|
|
||||||
function iife1() {}
|
|
||||||
return iife1;
|
|
||||||
})();
|
|
||||||
|
|
||||||
(function(){
|
|
||||||
// pure IIFE in function scope assigned to unreferenced var will be dropped
|
|
||||||
var iife2 = /*#__PURE__*/(function() {
|
|
||||||
console.log("iife2");
|
|
||||||
function iife2() {}
|
|
||||||
return iife2;
|
|
||||||
})();
|
|
||||||
})();
|
|
||||||
|
|
||||||
// comment #__PURE__ comment
|
|
||||||
bar(), baz(), quux();
|
|
||||||
a.b(), /* @__PURE__ */ c.d.e(), f.g();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
baz(), quux();
|
|
||||||
a.b(), f.g();
|
|
||||||
}
|
|
||||||
expect_warnings: [
|
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:79,8]",
|
|
||||||
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:79,8]",
|
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:92,37]",
|
|
||||||
"WARN: Dropping unused variable iife2 [test/compress/issue-1261.js:92,16]",
|
|
||||||
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:90,8]",
|
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:100,8]",
|
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:101,31]",
|
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:84,33]",
|
|
||||||
"WARN: Dropping unused variable iife1 [test/compress/issue-1261.js:84,12]",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
should_warn: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
conditionals: true,
|
|
||||||
evaluate: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
/* @__PURE__ */(function(){x})(), void/* @__PURE__ */(function(){y})();
|
|
||||||
/* @__PURE__ */(function(){x})() || true ? foo() : bar();
|
|
||||||
true || /* @__PURE__ */(function(){y})() ? foo() : bar();
|
|
||||||
/* @__PURE__ */(function(){x})() && false ? foo() : bar();
|
|
||||||
false && /* @__PURE__ */(function(){y})() ? foo() : bar();
|
|
||||||
/* @__PURE__ */(function(){x})() + "foo" ? bar() : baz();
|
|
||||||
"foo" + /* @__PURE__ */(function(){y})() ? bar() : baz();
|
|
||||||
/* @__PURE__ */(function(){x})() ? foo() : foo();
|
|
||||||
[/* @__PURE__ */(function(){x})()] ? foo() : bar();
|
|
||||||
!{ foo: /* @__PURE__ */(function(){x})() } ? bar() : baz();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
foo();
|
|
||||||
foo();
|
|
||||||
bar();
|
|
||||||
bar();
|
|
||||||
bar();
|
|
||||||
bar();
|
|
||||||
foo();
|
|
||||||
foo();
|
|
||||||
baz();
|
|
||||||
}
|
|
||||||
expect_warnings: [
|
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:128,61]",
|
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:128,23]",
|
|
||||||
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:128,23]",
|
|
||||||
"WARN: Boolean || always true [test/compress/issue-1261.js:129,23]",
|
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:129,23]",
|
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:129,23]",
|
|
||||||
"WARN: Condition left of || always true [test/compress/issue-1261.js:130,8]",
|
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:130,8]",
|
|
||||||
"WARN: Boolean && always false [test/compress/issue-1261.js:131,23]",
|
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:131,23]",
|
|
||||||
"WARN: Condition always false [test/compress/issue-1261.js:131,23]",
|
|
||||||
"WARN: Condition left of && always false [test/compress/issue-1261.js:132,8]",
|
|
||||||
"WARN: Condition always false [test/compress/issue-1261.js:132,8]",
|
|
||||||
"WARN: + in boolean context always true [test/compress/issue-1261.js:133,23]",
|
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:133,23]",
|
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:133,23]",
|
|
||||||
"WARN: + in boolean context always true [test/compress/issue-1261.js:134,8]",
|
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:134,31]",
|
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:134,8]",
|
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:135,23]",
|
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:136,24]",
|
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:136,8]",
|
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:137,31]",
|
|
||||||
"WARN: Condition always false [test/compress/issue-1261.js:137,8]",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -35,7 +35,7 @@ string_plus_optimization: {
|
|||||||
throw "nope";
|
throw "nope";
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
console.log((throwing_function(), "yes"));
|
console.log('0' + throwing_function() ? "yes" : "no");
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
console.log(ex);
|
console.log(ex);
|
||||||
}
|
}
|
||||||
@@ -46,5 +46,4 @@ string_plus_optimization: {
|
|||||||
}
|
}
|
||||||
foo();
|
foo();
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ issue_1321_no_debug: {
|
|||||||
x["a"] = 2 * x.b;
|
x["a"] = 2 * x.b;
|
||||||
console.log(x.b, x["a"]);
|
console.log(x.b, x["a"]);
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1321_debug: {
|
issue_1321_debug: {
|
||||||
@@ -34,7 +33,6 @@ issue_1321_debug: {
|
|||||||
x["_$foo$_"] = 2 * x.a;
|
x["_$foo$_"] = 2 * x.a;
|
||||||
console.log(x.a, x["_$foo$_"]);
|
console.log(x.a, x["_$foo$_"]);
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1321_with_quoted: {
|
issue_1321_with_quoted: {
|
||||||
@@ -53,5 +51,4 @@ issue_1321_with_quoted: {
|
|||||||
x["b"] = 2 * x.a;
|
x["b"] = 2 * x.a;
|
||||||
console.log(x.a, x["b"]);
|
console.log(x.a, x["b"]);
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,151 +0,0 @@
|
|||||||
level_zero: {
|
|
||||||
options = {
|
|
||||||
keep_fnames: true
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
keep_fnames: true
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(x) {
|
|
||||||
function n(a) {
|
|
||||||
return a * a;
|
|
||||||
}
|
|
||||||
return function() {
|
|
||||||
return x;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(r) {
|
|
||||||
function n(n) {
|
|
||||||
return n * n;
|
|
||||||
}
|
|
||||||
return function() {
|
|
||||||
return r;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
level_one: {
|
|
||||||
options = {
|
|
||||||
keep_fnames: true
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
keep_fnames: true
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(x) {
|
|
||||||
return function() {
|
|
||||||
function n(a) {
|
|
||||||
return a * a;
|
|
||||||
}
|
|
||||||
return x(n);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(r) {
|
|
||||||
return function() {
|
|
||||||
function n(n) {
|
|
||||||
return n * n;
|
|
||||||
}
|
|
||||||
return r(n);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
level_two: {
|
|
||||||
options = {
|
|
||||||
keep_fnames: true
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
keep_fnames: true
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(x) {
|
|
||||||
return function() {
|
|
||||||
function r(a) {
|
|
||||||
return a * a;
|
|
||||||
}
|
|
||||||
return function() {
|
|
||||||
function n(a) {
|
|
||||||
return a * a;
|
|
||||||
}
|
|
||||||
return x(n);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(t) {
|
|
||||||
return function() {
|
|
||||||
function r(n) {
|
|
||||||
return n * n;
|
|
||||||
}
|
|
||||||
return function() {
|
|
||||||
function n(n) {
|
|
||||||
return n * n;
|
|
||||||
}
|
|
||||||
return t(n);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
level_three: {
|
|
||||||
options = {
|
|
||||||
keep_fnames: true
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
keep_fnames: true
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(x) {
|
|
||||||
return function() {
|
|
||||||
function r(a) {
|
|
||||||
return a * a;
|
|
||||||
}
|
|
||||||
return [
|
|
||||||
function() {
|
|
||||||
function t(a) {
|
|
||||||
return a * a;
|
|
||||||
}
|
|
||||||
return t;
|
|
||||||
},
|
|
||||||
function() {
|
|
||||||
function n(a) {
|
|
||||||
return a * a;
|
|
||||||
}
|
|
||||||
return x(n);
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(t) {
|
|
||||||
return function() {
|
|
||||||
function r(n) {
|
|
||||||
return n * n;
|
|
||||||
}
|
|
||||||
return [
|
|
||||||
function() {
|
|
||||||
function t(n) {
|
|
||||||
return n * n;
|
|
||||||
}
|
|
||||||
return t;
|
|
||||||
},
|
|
||||||
function() {
|
|
||||||
function n(n) {
|
|
||||||
return n * n;
|
|
||||||
}
|
|
||||||
return t(n);
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
// tests assume that variable `undefined` not redefined and has `void 0` as value
|
|
||||||
|
|
||||||
unsafe_undefined: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
if_return: true,
|
|
||||||
unsafe: true
|
|
||||||
}
|
|
||||||
mangle = {}
|
|
||||||
input: {
|
|
||||||
function f(undefined) {
|
|
||||||
return function() {
|
|
||||||
if (a)
|
|
||||||
return b;
|
|
||||||
if (c)
|
|
||||||
return d;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(n) {
|
|
||||||
return function() {
|
|
||||||
return a ? b : c ? d : n;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
keep_fnames: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
if_return: true,
|
|
||||||
unsafe: true
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
keep_fnames: true
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(undefined) {
|
|
||||||
return function() {
|
|
||||||
function n(a) {
|
|
||||||
return a * a;
|
|
||||||
}
|
|
||||||
if (a)
|
|
||||||
return b;
|
|
||||||
if (c)
|
|
||||||
return d;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(r) {
|
|
||||||
return function() {
|
|
||||||
function n(n) {
|
|
||||||
return n * n;
|
|
||||||
}
|
|
||||||
return a ? b : c ? d : r;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
typeof_eq_undefined: {
|
|
||||||
options = {
|
|
||||||
comparisons: true
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = typeof b != "undefined";
|
|
||||||
b = typeof a != "undefined";
|
|
||||||
var c = typeof d.e !== "undefined";
|
|
||||||
var f = "undefined" === typeof g;
|
|
||||||
g = "undefined" === typeof f;
|
|
||||||
var h = "undefined" == typeof i.j;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = "undefined" != typeof b;
|
|
||||||
b = void 0 !== a;
|
|
||||||
var c = void 0 !== d.e;
|
|
||||||
var f = "undefined" == typeof g;
|
|
||||||
g = void 0 === f;
|
|
||||||
var h = void 0 === i.j;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
typeof_eq_undefined_ie8: {
|
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
screw_ie8: false
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = typeof b != "undefined";
|
|
||||||
b = typeof a != "undefined";
|
|
||||||
var c = typeof d.e !== "undefined";
|
|
||||||
var f = "undefined" === typeof g;
|
|
||||||
g = "undefined" === typeof f;
|
|
||||||
var h = "undefined" == typeof i.j;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = "undefined" != typeof b;
|
|
||||||
b = void 0 !== a;
|
|
||||||
var c = "undefined" != typeof d.e;
|
|
||||||
var f = "undefined" == typeof g;
|
|
||||||
g = void 0 === f;
|
|
||||||
var h = "undefined" == typeof i.j;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
undefined_redefined: {
|
|
||||||
options = {
|
|
||||||
comparisons: true
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(undefined) {
|
|
||||||
var n = 1;
|
|
||||||
return typeof n == "undefined";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_exact: "function f(undefined){var n=1;return void 0===n}"
|
|
||||||
}
|
|
||||||
|
|
||||||
undefined_redefined_mangle: {
|
|
||||||
options = {
|
|
||||||
comparisons: true
|
|
||||||
}
|
|
||||||
mangle = {}
|
|
||||||
input: {
|
|
||||||
function f(undefined) {
|
|
||||||
var n = 1;
|
|
||||||
return typeof n == "undefined";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_exact: "function f(n){var r=1;return void 0===r}"
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
else_with_empty_block: {
|
|
||||||
options = {}
|
|
||||||
input: {
|
|
||||||
if (x)
|
|
||||||
yes();
|
|
||||||
else {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_exact: "if(x)yes();"
|
|
||||||
}
|
|
||||||
|
|
||||||
else_with_empty_statement: {
|
|
||||||
options = {}
|
|
||||||
input: {
|
|
||||||
if (x)
|
|
||||||
yes();
|
|
||||||
else
|
|
||||||
;
|
|
||||||
}
|
|
||||||
expect_exact: "if(x)yes();"
|
|
||||||
}
|
|
||||||
|
|
||||||
conditional_false_stray_else_in_loop: {
|
|
||||||
options = {
|
|
||||||
evaluate : true,
|
|
||||||
comparisons : true,
|
|
||||||
booleans : true,
|
|
||||||
unused : true,
|
|
||||||
loops : true,
|
|
||||||
side_effects : true,
|
|
||||||
dead_code : true,
|
|
||||||
hoist_vars : true,
|
|
||||||
join_vars : true,
|
|
||||||
if_return : true,
|
|
||||||
cascade : true,
|
|
||||||
conditionals : false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
for (var i = 1; i <= 4; ++i) {
|
|
||||||
if (i <= 2) continue;
|
|
||||||
console.log(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_exact: "for(var i=1;i<=4;++i)if(!(i<=2))console.log(i);"
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
inner_reference: {
|
|
||||||
options = {
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
!function f(a) {
|
|
||||||
return a && f(a - 1) + a;
|
|
||||||
}(42);
|
|
||||||
!function g(a) {
|
|
||||||
return a;
|
|
||||||
}(42);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
!function f(a) {
|
|
||||||
return a && f(a - 1) + a;
|
|
||||||
}(42);
|
|
||||||
!void 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
screw_ie8: {
|
|
||||||
options = {
|
|
||||||
screw_ie8: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
screw_ie8: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
try { throw "foo"; } catch (x) { console.log(x); }
|
|
||||||
}
|
|
||||||
expect_exact: 'try{throw"foo"}catch(o){console.log(o)}'
|
|
||||||
expect_stdout: [
|
|
||||||
"foo"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
support_ie8: {
|
|
||||||
options = {
|
|
||||||
screw_ie8: false,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
screw_ie8: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
try { throw "foo"; } catch (x) { console.log(x); }
|
|
||||||
}
|
|
||||||
expect_exact: 'try{throw"foo"}catch(x){console.log(x)}'
|
|
||||||
expect_stdout: "foo"
|
|
||||||
}
|
|
||||||
|
|
||||||
safe_undefined: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
if_return: true,
|
|
||||||
unsafe: false,
|
|
||||||
}
|
|
||||||
mangle = {}
|
|
||||||
input: {
|
|
||||||
var a, c;
|
|
||||||
console.log(function(undefined) {
|
|
||||||
return function() {
|
|
||||||
if (a)
|
|
||||||
return b;
|
|
||||||
if (c)
|
|
||||||
return d;
|
|
||||||
};
|
|
||||||
}(1)());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a, c;
|
|
||||||
console.log(function(n) {
|
|
||||||
return function() {
|
|
||||||
return a ? b : c ? d : void 0;
|
|
||||||
};
|
|
||||||
}(1)());
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe_undefined: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
if_return: true,
|
|
||||||
unsafe: true,
|
|
||||||
}
|
|
||||||
mangle = {}
|
|
||||||
input: {
|
|
||||||
var a, c;
|
|
||||||
console.log(function(undefined) {
|
|
||||||
return function() {
|
|
||||||
if (a)
|
|
||||||
return b;
|
|
||||||
if (c)
|
|
||||||
return d;
|
|
||||||
};
|
|
||||||
}()());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a, c;
|
|
||||||
console.log(function(n) {
|
|
||||||
return function() {
|
|
||||||
return a ? b : c ? d : n;
|
|
||||||
};
|
|
||||||
}()());
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
runtime_error: {
|
|
||||||
input: {
|
|
||||||
const a = 1;
|
|
||||||
console.log(a++);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
const a = 1;
|
|
||||||
console.log(a++);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
chained_evaluation_1: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
evaluate: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function() {
|
|
||||||
var a = 1;
|
|
||||||
(function() {
|
|
||||||
var b = a, c;
|
|
||||||
c = f(b);
|
|
||||||
c.bar = b;
|
|
||||||
})();
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function() {
|
|
||||||
(function() {
|
|
||||||
var c;
|
|
||||||
c = f(1);
|
|
||||||
c.bar = 1;
|
|
||||||
})();
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
chained_evaluation_2: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
evaluate: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function() {
|
|
||||||
var a = "long piece of string";
|
|
||||||
(function() {
|
|
||||||
var b = a, c;
|
|
||||||
c = f(b);
|
|
||||||
c.bar = b;
|
|
||||||
})();
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function() {
|
|
||||||
(function() {
|
|
||||||
var c, b = "long piece of string";
|
|
||||||
c = f(b);
|
|
||||||
c.bar = b;
|
|
||||||
})();
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
|
|
||||||
issue_1639_1: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
cascade: true,
|
|
||||||
conditionals: true,
|
|
||||||
evaluate: true,
|
|
||||||
join_vars: true,
|
|
||||||
loops: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 100, b = 10;
|
|
||||||
|
|
||||||
var L1 = 5;
|
|
||||||
while (--L1 > 0) {
|
|
||||||
if ((--b), false) {
|
|
||||||
if (b) {
|
|
||||||
var ignore = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log(a, b);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
for (var a = 100, b = 10, L1 = 5; --L1 > 0;)
|
|
||||||
if (--b, !1) var ignore = 0;
|
|
||||||
console.log(a, b);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1639_2: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
cascade: true,
|
|
||||||
conditionals: true,
|
|
||||||
evaluate: true,
|
|
||||||
join_vars: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 100, b = 10;
|
|
||||||
|
|
||||||
function f19() {
|
|
||||||
if (++a, false)
|
|
||||||
if (a)
|
|
||||||
if (++a);
|
|
||||||
}
|
|
||||||
f19();
|
|
||||||
|
|
||||||
console.log(a, b);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 100, b = 10;
|
|
||||||
function f19() {
|
|
||||||
++a, 1;
|
|
||||||
}
|
|
||||||
f19(),
|
|
||||||
console.log(a, b);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1639_3: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
cascade: true,
|
|
||||||
conditionals: true,
|
|
||||||
evaluate: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 100, b = 10;
|
|
||||||
a++ && false && a ? 0 : 0;
|
|
||||||
console.log(a, b);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 100, b = 10;
|
|
||||||
a++,
|
|
||||||
console.log(a, b);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
f7: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
cascade: true,
|
|
||||||
collapse_vars: true,
|
|
||||||
comparisons: true,
|
|
||||||
conditionals: true,
|
|
||||||
dead_code: true,
|
|
||||||
drop_debugger: true,
|
|
||||||
evaluate: true,
|
|
||||||
hoist_funs: true,
|
|
||||||
if_return: true,
|
|
||||||
join_vars: true,
|
|
||||||
loops: true,
|
|
||||||
negate_iife: true,
|
|
||||||
passes: 3,
|
|
||||||
properties: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
beautify: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 100, b = 10;
|
|
||||||
function f22464() {
|
|
||||||
var brake146670 = 5;
|
|
||||||
while (((b = a) ? !a : ~a ? null : b += a) && --brake146670 > 0) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
f22464();
|
|
||||||
console.log(a, b);
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"var b = 10;",
|
|
||||||
"",
|
|
||||||
"!function() {",
|
|
||||||
" for (;b = 100, !1; ) ;",
|
|
||||||
"}(), console.log(100, b);",
|
|
||||||
]
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
@@ -1,161 +0,0 @@
|
|||||||
side_effects_catch: {
|
|
||||||
options = {
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
function g() {
|
|
||||||
try {
|
|
||||||
throw 0;
|
|
||||||
} catch (e) {
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
g();
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {
|
|
||||||
(function() {
|
|
||||||
try {
|
|
||||||
throw 0;
|
|
||||||
} catch (e) {
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
side_effects_else: {
|
|
||||||
options = {
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(x) {
|
|
||||||
function g() {
|
|
||||||
if (x);
|
|
||||||
else console.log("PASS");
|
|
||||||
}
|
|
||||||
g();
|
|
||||||
}
|
|
||||||
f(0);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(x) {
|
|
||||||
(function() {
|
|
||||||
if (x);
|
|
||||||
else console.log("PASS");
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
f(0);
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
side_effects_finally: {
|
|
||||||
options = {
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
function g() {
|
|
||||||
try {
|
|
||||||
x();
|
|
||||||
} catch (e) {
|
|
||||||
} finally {
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
g();
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {
|
|
||||||
(function() {
|
|
||||||
try {
|
|
||||||
x();
|
|
||||||
} catch (e) {
|
|
||||||
} finally {
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
side_effects_label: {
|
|
||||||
options = {
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(x) {
|
|
||||||
function g() {
|
|
||||||
L: {
|
|
||||||
console.log("PASS");
|
|
||||||
break L;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
g();
|
|
||||||
}
|
|
||||||
f(0);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(x) {
|
|
||||||
(function() {
|
|
||||||
L: {
|
|
||||||
console.log("PASS");
|
|
||||||
break L;
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
f(0);
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
side_effects_switch: {
|
|
||||||
options = {
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
function g() {
|
|
||||||
switch (0) {
|
|
||||||
default:
|
|
||||||
case console.log("PASS"):
|
|
||||||
}
|
|
||||||
}
|
|
||||||
g();
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {
|
|
||||||
(function() {
|
|
||||||
switch (0) {
|
|
||||||
default:
|
|
||||||
case console.log("PASS"):
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
@@ -1,347 +0,0 @@
|
|||||||
mangle_catch: {
|
|
||||||
options = {
|
|
||||||
screw_ie8: true,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
screw_ie8: true,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "FAIL";
|
|
||||||
try {
|
|
||||||
throw 1;
|
|
||||||
} catch (args) {
|
|
||||||
a = "PASS";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'var a="FAIL";try{throw 1}catch(o){a="PASS"}console.log(a);'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_ie8: {
|
|
||||||
options = {
|
|
||||||
screw_ie8: false,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
screw_ie8: false,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "FAIL";
|
|
||||||
try {
|
|
||||||
throw 1;
|
|
||||||
} catch (args) {
|
|
||||||
a = "PASS";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'var a="FAIL";try{throw 1}catch(args){a="PASS"}console.log(a);'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_var: {
|
|
||||||
options = {
|
|
||||||
screw_ie8: true,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
screw_ie8: true,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "FAIL";
|
|
||||||
try {
|
|
||||||
throw 1;
|
|
||||||
} catch (args) {
|
|
||||||
var a = "PASS";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'var a="FAIL";try{throw 1}catch(o){var a="PASS"}console.log(a);'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_var_ie8: {
|
|
||||||
options = {
|
|
||||||
screw_ie8: false,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
screw_ie8: false,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "FAIL";
|
|
||||||
try {
|
|
||||||
throw 1;
|
|
||||||
} catch (args) {
|
|
||||||
var a = "PASS";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'var a="FAIL";try{throw 1}catch(args){var a="PASS"}console.log(a);'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_toplevel: {
|
|
||||||
options = {
|
|
||||||
screw_ie8: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
screw_ie8: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "FAIL";
|
|
||||||
try {
|
|
||||||
throw 1;
|
|
||||||
} catch (args) {
|
|
||||||
a = "PASS";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'var o="FAIL";try{throw 1}catch(c){o="PASS"}console.log(o);'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_ie8_toplevel: {
|
|
||||||
options = {
|
|
||||||
screw_ie8: false,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
screw_ie8: false,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "FAIL";
|
|
||||||
try {
|
|
||||||
throw 1;
|
|
||||||
} catch (args) {
|
|
||||||
a = "PASS";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'var o="FAIL";try{throw 1}catch(c){o="PASS"}console.log(o);'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_var_toplevel: {
|
|
||||||
options = {
|
|
||||||
screw_ie8: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
screw_ie8: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "FAIL";
|
|
||||||
try {
|
|
||||||
throw 1;
|
|
||||||
} catch (args) {
|
|
||||||
var a = "PASS";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'var o="FAIL";try{throw 1}catch(r){var o="PASS"}console.log(o);'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_var_ie8_toplevel: {
|
|
||||||
options = {
|
|
||||||
screw_ie8: false,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
screw_ie8: false,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "FAIL";
|
|
||||||
try {
|
|
||||||
throw 1;
|
|
||||||
} catch (args) {
|
|
||||||
var a = "PASS";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'var o="FAIL";try{throw 1}catch(r){var o="PASS"}console.log(o);'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_redef_1: {
|
|
||||||
options = {
|
|
||||||
screw_ie8: true,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
screw_ie8: true,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "PASS";
|
|
||||||
try {
|
|
||||||
throw "FAIL1";
|
|
||||||
} catch (a) {
|
|
||||||
var a = "FAIL2";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'var a="PASS";try{throw"FAIL1"}catch(a){var a="FAIL2"}console.log(a);'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_redef_1_ie8: {
|
|
||||||
options = {
|
|
||||||
screw_ie8: false,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
screw_ie8: false,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "PASS";
|
|
||||||
try {
|
|
||||||
throw "FAIL1";
|
|
||||||
} catch (a) {
|
|
||||||
var a = "FAIL2";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'var a="PASS";try{throw"FAIL1"}catch(a){var a="FAIL2"}console.log(a);'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_redef_1_toplevel: {
|
|
||||||
options = {
|
|
||||||
screw_ie8: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
screw_ie8: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "PASS";
|
|
||||||
try {
|
|
||||||
throw "FAIL1";
|
|
||||||
} catch (a) {
|
|
||||||
var a = "FAIL2";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'var o="PASS";try{throw"FAIL1"}catch(o){var o="FAIL2"}console.log(o);'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_redef_1_ie8_toplevel: {
|
|
||||||
options = {
|
|
||||||
screw_ie8: false,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
screw_ie8: false,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "PASS";
|
|
||||||
try {
|
|
||||||
throw "FAIL1";
|
|
||||||
} catch (a) {
|
|
||||||
var a = "FAIL2";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'var o="PASS";try{throw"FAIL1"}catch(o){var o="FAIL2"}console.log(o);'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_redef_2: {
|
|
||||||
options = {
|
|
||||||
screw_ie8: true,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
screw_ie8: true,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
try {
|
|
||||||
throw "FAIL1";
|
|
||||||
} catch (a) {
|
|
||||||
var a = "FAIL2";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'try{throw"FAIL1"}catch(a){var a="FAIL2"}console.log(a);'
|
|
||||||
expect_stdout: "undefined"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_redef_2_ie8: {
|
|
||||||
options = {
|
|
||||||
screw_ie8: false,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
screw_ie8: false,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
try {
|
|
||||||
throw "FAIL1";
|
|
||||||
} catch (a) {
|
|
||||||
var a = "FAIL2";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'try{throw"FAIL1"}catch(a){var a="FAIL2"}console.log(a);'
|
|
||||||
expect_stdout: "undefined"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_redef_2_toplevel: {
|
|
||||||
options = {
|
|
||||||
screw_ie8: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
screw_ie8: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
try {
|
|
||||||
throw "FAIL1";
|
|
||||||
} catch (a) {
|
|
||||||
var a = "FAIL2";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'try{throw"FAIL1"}catch(o){var o="FAIL2"}console.log(o);'
|
|
||||||
expect_stdout: "undefined"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_redef_2_ie8_toplevel: {
|
|
||||||
options = {
|
|
||||||
screw_ie8: false,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
screw_ie8: false,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
try {
|
|
||||||
throw "FAIL1";
|
|
||||||
} catch (a) {
|
|
||||||
var a = "FAIL2";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'try{throw"FAIL1"}catch(o){var o="FAIL2"}console.log(o);'
|
|
||||||
expect_stdout: "undefined"
|
|
||||||
}
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
function_iife_catch: {
|
|
||||||
mangle = {
|
|
||||||
screw_ie8: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(n) {
|
|
||||||
!function() {
|
|
||||||
try {
|
|
||||||
throw 0;
|
|
||||||
} catch (n) {
|
|
||||||
var a = 1;
|
|
||||||
console.log(n, a);
|
|
||||||
}
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect_exact: "function f(o){!function(){try{throw 0}catch(c){var o=1;console.log(c,o)}}()}f();"
|
|
||||||
expect_stdout: "0 1"
|
|
||||||
}
|
|
||||||
|
|
||||||
function_iife_catch_ie8: {
|
|
||||||
mangle = {
|
|
||||||
screw_ie8: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(n) {
|
|
||||||
!function() {
|
|
||||||
try {
|
|
||||||
throw 0;
|
|
||||||
} catch (n) {
|
|
||||||
var a = 1;
|
|
||||||
console.log(n, a);
|
|
||||||
}
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect_exact: "function f(o){!function(){try{throw 0}catch(o){var c=1;console.log(o,c)}}()}f();"
|
|
||||||
expect_stdout: "0 1"
|
|
||||||
}
|
|
||||||
|
|
||||||
function_catch_catch: {
|
|
||||||
mangle = {
|
|
||||||
screw_ie8: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = 0;
|
|
||||||
function f() {
|
|
||||||
try {
|
|
||||||
throw 1;
|
|
||||||
} catch (c) {
|
|
||||||
try {
|
|
||||||
throw 2;
|
|
||||||
} catch (o) {
|
|
||||||
var o = 3;
|
|
||||||
console.log(o);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
console.log(o);
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect_exact: "var o=0;function f(){try{throw 1}catch(c){try{throw 2}catch(o){var o=3;console.log(o)}}console.log(o)}f();"
|
|
||||||
expect_stdout: [
|
|
||||||
"3",
|
|
||||||
"undefined",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
function_catch_catch_ie8: {
|
|
||||||
mangle = {
|
|
||||||
screw_ie8: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = 0;
|
|
||||||
function f() {
|
|
||||||
try {
|
|
||||||
throw 1;
|
|
||||||
} catch (c) {
|
|
||||||
try {
|
|
||||||
throw 2;
|
|
||||||
} catch (o) {
|
|
||||||
var o = 3;
|
|
||||||
console.log(o);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
console.log(o);
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect_exact: "var o=0;function f(){try{throw 1}catch(c){try{throw 2}catch(o){var o=3;console.log(o)}}console.log(o)}f();"
|
|
||||||
expect_stdout: [
|
|
||||||
"3",
|
|
||||||
"undefined",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
case_1: {
|
|
||||||
options = {
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 0, b = 1;
|
|
||||||
switch (true) {
|
|
||||||
case a, true:
|
|
||||||
default:
|
|
||||||
b = 2;
|
|
||||||
case true:
|
|
||||||
}
|
|
||||||
console.log(a, b);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 0, b = 1;
|
|
||||||
switch (true) {
|
|
||||||
case a, true:
|
|
||||||
b = 2;
|
|
||||||
}
|
|
||||||
console.log(a, b);
|
|
||||||
}
|
|
||||||
expect_stdout: "0 2"
|
|
||||||
}
|
|
||||||
|
|
||||||
case_2: {
|
|
||||||
options = {
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 0, b = 1;
|
|
||||||
switch (0) {
|
|
||||||
default:
|
|
||||||
b = 2;
|
|
||||||
case a:
|
|
||||||
a = 3;
|
|
||||||
case 0:
|
|
||||||
}
|
|
||||||
console.log(a, b);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 0, b = 1;
|
|
||||||
switch (0) {
|
|
||||||
case a:
|
|
||||||
a = 3;
|
|
||||||
}
|
|
||||||
console.log(a, b);
|
|
||||||
}
|
|
||||||
expect_stdout: "3 1"
|
|
||||||
}
|
|
||||||
@@ -1,239 +0,0 @@
|
|||||||
mangle_props: {
|
|
||||||
mangle_props = {}
|
|
||||||
input: {
|
|
||||||
var obj = {
|
|
||||||
undefined: 1,
|
|
||||||
NaN: 2,
|
|
||||||
Infinity: 3,
|
|
||||||
"-Infinity": 4,
|
|
||||||
null: 5,
|
|
||||||
};
|
|
||||||
console.log(
|
|
||||||
obj[void 0],
|
|
||||||
obj[undefined],
|
|
||||||
obj["undefined"],
|
|
||||||
obj[0/0],
|
|
||||||
obj[NaN],
|
|
||||||
obj["NaN"],
|
|
||||||
obj[1/0],
|
|
||||||
obj[Infinity],
|
|
||||||
obj["Infinity"],
|
|
||||||
obj[-1/0],
|
|
||||||
obj[-Infinity],
|
|
||||||
obj["-Infinity"],
|
|
||||||
obj[null],
|
|
||||||
obj["null"]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var obj = {
|
|
||||||
undefined: 1,
|
|
||||||
NaN: 2,
|
|
||||||
Infinity: 3,
|
|
||||||
"-Infinity": 4,
|
|
||||||
null: 5,
|
|
||||||
};
|
|
||||||
console.log(
|
|
||||||
obj[void 0],
|
|
||||||
obj[void 0],
|
|
||||||
obj["undefined"],
|
|
||||||
obj[0/0],
|
|
||||||
obj[NaN],
|
|
||||||
obj["NaN"],
|
|
||||||
obj[1/0],
|
|
||||||
obj[1/0],
|
|
||||||
obj["Infinity"],
|
|
||||||
obj[-1/0],
|
|
||||||
obj[-1/0],
|
|
||||||
obj["-Infinity"],
|
|
||||||
obj[null],
|
|
||||||
obj["null"]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect_stdout: "1 1 1 2 2 2 3 3 3 4 4 4 5 5"
|
|
||||||
}
|
|
||||||
|
|
||||||
numeric_literal: {
|
|
||||||
beautify = {
|
|
||||||
beautify: true,
|
|
||||||
}
|
|
||||||
mangle_props = {}
|
|
||||||
input: {
|
|
||||||
var obj = {
|
|
||||||
0: 0,
|
|
||||||
"-0": 1,
|
|
||||||
42: 2,
|
|
||||||
"42": 3,
|
|
||||||
0x25: 4,
|
|
||||||
"0x25": 5,
|
|
||||||
1E42: 6,
|
|
||||||
"1E42": 7,
|
|
||||||
"1e+42": 8,
|
|
||||||
};
|
|
||||||
console.log(obj[-0], obj[-""], obj["-0"]);
|
|
||||||
console.log(obj[42], obj["42"]);
|
|
||||||
console.log(obj[0x25], obj["0x25"], obj[37], obj["37"]);
|
|
||||||
console.log(obj[1E42], obj["1E42"], obj["1e+42"]);
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
'var obj = {',
|
|
||||||
' 0: 0,',
|
|
||||||
' "-0": 1,',
|
|
||||||
' 42: 2,',
|
|
||||||
' "42": 3,',
|
|
||||||
' 37: 4,',
|
|
||||||
' a: 5,',
|
|
||||||
' 1e42: 6,',
|
|
||||||
' b: 7,',
|
|
||||||
' "1e+42": 8',
|
|
||||||
'};',
|
|
||||||
'',
|
|
||||||
'console.log(obj[-0], obj[-""], obj["-0"]);',
|
|
||||||
'',
|
|
||||||
'console.log(obj[42], obj["42"]);',
|
|
||||||
'',
|
|
||||||
'console.log(obj[37], obj["a"], obj[37], obj["37"]);',
|
|
||||||
'',
|
|
||||||
'console.log(obj[1e42], obj["b"], obj["1e+42"]);',
|
|
||||||
]
|
|
||||||
expect_stdout: [
|
|
||||||
"0 0 1",
|
|
||||||
"3 3",
|
|
||||||
"4 5 4 4",
|
|
||||||
"8 7 8",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
identifier: {
|
|
||||||
mangle_props = {}
|
|
||||||
input: {
|
|
||||||
var obj = {
|
|
||||||
abstract: 1,
|
|
||||||
boolean: 2,
|
|
||||||
byte: 3,
|
|
||||||
char: 4,
|
|
||||||
class: 5,
|
|
||||||
double: 6,
|
|
||||||
enum: 7,
|
|
||||||
export: 8,
|
|
||||||
extends: 9,
|
|
||||||
final: 10,
|
|
||||||
float: 11,
|
|
||||||
goto: 12,
|
|
||||||
implements: 13,
|
|
||||||
import: 14,
|
|
||||||
int: 15,
|
|
||||||
interface: 16,
|
|
||||||
let: 17,
|
|
||||||
long: 18,
|
|
||||||
native: 19,
|
|
||||||
package: 20,
|
|
||||||
private: 21,
|
|
||||||
protected: 22,
|
|
||||||
public: 23,
|
|
||||||
short: 24,
|
|
||||||
static: 25,
|
|
||||||
super: 26,
|
|
||||||
synchronized: 27,
|
|
||||||
this: 28,
|
|
||||||
throws: 29,
|
|
||||||
transient: 30,
|
|
||||||
volatile: 31,
|
|
||||||
yield: 32,
|
|
||||||
false: 33,
|
|
||||||
null: 34,
|
|
||||||
true: 35,
|
|
||||||
break: 36,
|
|
||||||
case: 37,
|
|
||||||
catch: 38,
|
|
||||||
const: 39,
|
|
||||||
continue: 40,
|
|
||||||
debugger: 41,
|
|
||||||
default: 42,
|
|
||||||
delete: 43,
|
|
||||||
do: 44,
|
|
||||||
else: 45,
|
|
||||||
finally: 46,
|
|
||||||
for: 47,
|
|
||||||
function: 48,
|
|
||||||
if: 49,
|
|
||||||
in: 50,
|
|
||||||
instanceof: 51,
|
|
||||||
new: 52,
|
|
||||||
return: 53,
|
|
||||||
switch: 54,
|
|
||||||
throw: 55,
|
|
||||||
try: 56,
|
|
||||||
typeof: 57,
|
|
||||||
var: 58,
|
|
||||||
void: 59,
|
|
||||||
while: 60,
|
|
||||||
with: 61,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var obj = {
|
|
||||||
a: 1,
|
|
||||||
b: 2,
|
|
||||||
c: 3,
|
|
||||||
d: 4,
|
|
||||||
e: 5,
|
|
||||||
f: 6,
|
|
||||||
g: 7,
|
|
||||||
h: 8,
|
|
||||||
i: 9,
|
|
||||||
j: 10,
|
|
||||||
k: 11,
|
|
||||||
l: 12,
|
|
||||||
m: 13,
|
|
||||||
n: 14,
|
|
||||||
o: 15,
|
|
||||||
p: 16,
|
|
||||||
q: 17,
|
|
||||||
r: 18,
|
|
||||||
s: 19,
|
|
||||||
t: 20,
|
|
||||||
u: 21,
|
|
||||||
v: 22,
|
|
||||||
w: 23,
|
|
||||||
x: 24,
|
|
||||||
y: 25,
|
|
||||||
z: 26,
|
|
||||||
A: 27,
|
|
||||||
B: 28,
|
|
||||||
C: 29,
|
|
||||||
D: 30,
|
|
||||||
F: 31,
|
|
||||||
G: 32,
|
|
||||||
false: 33,
|
|
||||||
null: 34,
|
|
||||||
true: 35,
|
|
||||||
H: 36,
|
|
||||||
I: 37,
|
|
||||||
J: 38,
|
|
||||||
K: 39,
|
|
||||||
L: 40,
|
|
||||||
M: 41,
|
|
||||||
N: 42,
|
|
||||||
O: 43,
|
|
||||||
P: 44,
|
|
||||||
Q: 45,
|
|
||||||
R: 46,
|
|
||||||
S: 47,
|
|
||||||
T: 48,
|
|
||||||
U: 49,
|
|
||||||
V: 50,
|
|
||||||
W: 51,
|
|
||||||
X: 52,
|
|
||||||
Y: 53,
|
|
||||||
Z: 54,
|
|
||||||
$: 55,
|
|
||||||
_: 56,
|
|
||||||
aa: 57,
|
|
||||||
ba: 58,
|
|
||||||
ca: 59,
|
|
||||||
da: 60,
|
|
||||||
ea: 61,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
unary_prefix: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(function() {
|
|
||||||
var x = -(2 / 3);
|
|
||||||
return x;
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(function() {
|
|
||||||
return -2 / 3;
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
@@ -1,134 +0,0 @@
|
|||||||
iife_for: {
|
|
||||||
options = {
|
|
||||||
negate_iife: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
function g() {
|
|
||||||
L: for (;;) break L;
|
|
||||||
}
|
|
||||||
g();
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
!function() {
|
|
||||||
!function() {
|
|
||||||
L: for (;;) break L;
|
|
||||||
}();
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
iife_for_in: {
|
|
||||||
options = {
|
|
||||||
negate_iife: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
function g() {
|
|
||||||
L: for (var a in x) break L;
|
|
||||||
}
|
|
||||||
g();
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
!function() {
|
|
||||||
!function() {
|
|
||||||
L: for (var a in x) break L;
|
|
||||||
}();
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
iife_do: {
|
|
||||||
options = {
|
|
||||||
negate_iife: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
function g() {
|
|
||||||
L: do {
|
|
||||||
break L;
|
|
||||||
} while (1);
|
|
||||||
}
|
|
||||||
g();
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
!function() {
|
|
||||||
!function() {
|
|
||||||
L: do {
|
|
||||||
break L;
|
|
||||||
} while (1);
|
|
||||||
}();
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
iife_while: {
|
|
||||||
options = {
|
|
||||||
negate_iife: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
function g() {
|
|
||||||
L: while (1) break L;
|
|
||||||
}
|
|
||||||
g();
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
!function() {
|
|
||||||
!function() {
|
|
||||||
L: while (1) break L;
|
|
||||||
}();
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
label_do: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
loops: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
L: do {
|
|
||||||
continue L;
|
|
||||||
} while (0);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
L: do {
|
|
||||||
continue L;
|
|
||||||
} while (0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
label_while: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
dead_code: true,
|
|
||||||
loops: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
L: while (0) continue L;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_exact: "function f(){L:;}"
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
operator: {
|
|
||||||
input: {
|
|
||||||
a. //comment
|
|
||||||
typeof
|
|
||||||
}
|
|
||||||
expect_exact: "a.typeof;"
|
|
||||||
}
|
|
||||||
|
|
||||||
name: {
|
|
||||||
input: {
|
|
||||||
a. //comment
|
|
||||||
b
|
|
||||||
}
|
|
||||||
expect_exact: "a.b;"
|
|
||||||
}
|
|
||||||
|
|
||||||
keyword: {
|
|
||||||
input: {
|
|
||||||
a. //comment
|
|
||||||
default
|
|
||||||
}
|
|
||||||
expect_exact: "a.default;"
|
|
||||||
}
|
|
||||||
|
|
||||||
atom: {
|
|
||||||
input: {
|
|
||||||
a. //comment
|
|
||||||
true
|
|
||||||
}
|
|
||||||
expect_exact: "a.true;"
|
|
||||||
}
|
|
||||||
30
test/compress/issue-203.js
Normal file
30
test/compress/issue-203.js
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
|
||||||
|
compress_new_function: {
|
||||||
|
options = {
|
||||||
|
unsafe: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
new Function("aa, bb", 'return aa;');
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
Function("a", "b", "return a");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
compress_new_function_with_destruct: {
|
||||||
|
options = {
|
||||||
|
unsafe: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
new Function("aa, [bb]", 'return aa;');
|
||||||
|
new Function("aa, {bb}", 'return aa;');
|
||||||
|
new Function("[[aa]], [{bb}]", 'return aa;');
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
Function("a", "[b]", "return a");
|
||||||
|
Function("a", "{bb}", "return a");
|
||||||
|
Function("[[a]]", "[{bb}]", 'return a');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1,70 +1,11 @@
|
|||||||
do_not_update_lhs: {
|
do_not_update_lhs: {
|
||||||
options = {
|
options = { global_defs: { DEBUG: false } };
|
||||||
global_defs: { DEBUG: 0 }
|
input: { DEBUG = false; }
|
||||||
}
|
expect: { DEBUG = false; }
|
||||||
input: {
|
|
||||||
DEBUG++;
|
|
||||||
DEBUG += 1;
|
|
||||||
DEBUG = 1;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
DEBUG++;
|
|
||||||
DEBUG += 1;
|
|
||||||
DEBUG = 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
do_update_rhs: {
|
do_update_rhs: {
|
||||||
options = {
|
options = { global_defs: { DEBUG: false } };
|
||||||
global_defs: { DEBUG: 0 }
|
input: { MY_DEBUG = DEBUG; }
|
||||||
}
|
expect: { MY_DEBUG = false; }
|
||||||
input: {
|
|
||||||
MY_DEBUG = DEBUG;
|
|
||||||
MY_DEBUG += DEBUG;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
MY_DEBUG = 0;
|
|
||||||
MY_DEBUG += 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mixed: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
global_defs: {
|
|
||||||
DEBUG: 0,
|
|
||||||
ENV: 1,
|
|
||||||
FOO: 2,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
const ENV = 3;
|
|
||||||
var FOO = 4;
|
|
||||||
f(ENV * 10);
|
|
||||||
--FOO;
|
|
||||||
DEBUG = 1;
|
|
||||||
DEBUG++;
|
|
||||||
DEBUG += 1;
|
|
||||||
f(DEBUG);
|
|
||||||
x = DEBUG;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
const ENV = 3;
|
|
||||||
var FOO = 4;
|
|
||||||
f(10);
|
|
||||||
--FOO;
|
|
||||||
DEBUG = 1;
|
|
||||||
DEBUG++;
|
|
||||||
DEBUG += 1;
|
|
||||||
f(0);
|
|
||||||
x = 0;
|
|
||||||
}
|
|
||||||
expect_warnings: [
|
|
||||||
'WARN: global_defs ENV redefined [test/compress/issue-208.js:41,14]',
|
|
||||||
'WARN: global_defs FOO redefined [test/compress/issue-208.js:42,12]',
|
|
||||||
'WARN: global_defs FOO redefined [test/compress/issue-208.js:44,10]',
|
|
||||||
'WARN: global_defs DEBUG redefined [test/compress/issue-208.js:45,8]',
|
|
||||||
'WARN: global_defs DEBUG redefined [test/compress/issue-208.js:46,8]',
|
|
||||||
'WARN: global_defs DEBUG redefined [test/compress/issue-208.js:47,8]',
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,55 +0,0 @@
|
|||||||
collapse: {
|
|
||||||
options = {
|
|
||||||
cascade: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f1() {
|
|
||||||
var a;
|
|
||||||
a = typeof b === 'function' ? b() : b;
|
|
||||||
return a !== undefined && c();
|
|
||||||
}
|
|
||||||
function f2(b) {
|
|
||||||
var a;
|
|
||||||
b = c();
|
|
||||||
a = typeof b === 'function' ? b() : b;
|
|
||||||
return 'stirng' == typeof a && d();
|
|
||||||
}
|
|
||||||
function f3(c) {
|
|
||||||
var a;
|
|
||||||
a = b(a / 2);
|
|
||||||
if (a < 0) {
|
|
||||||
a++;
|
|
||||||
++c;
|
|
||||||
return c / 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function f4(c) {
|
|
||||||
var a;
|
|
||||||
a = b(a / 2);
|
|
||||||
if (a < 0) {
|
|
||||||
a++;
|
|
||||||
c++;
|
|
||||||
return c / 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f1() {
|
|
||||||
return void 0 !== ('function' === typeof b ? b() : b) && c();
|
|
||||||
}
|
|
||||||
function f2(b) {
|
|
||||||
return b = c(), 'stirng' == typeof ('function' === typeof b ? b() : b) && d();
|
|
||||||
}
|
|
||||||
function f3(c) {
|
|
||||||
var a;
|
|
||||||
if ((a = b(a / 2)) < 0) return a++, ++c / 2;
|
|
||||||
}
|
|
||||||
function f4(c) {
|
|
||||||
var a;
|
|
||||||
if ((a = b(a / 2)) < 0) return a++, ++c / 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -6,7 +6,7 @@ NaN_and_Infinity_must_have_parens: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
(1/0).toString();
|
(1/0).toString();
|
||||||
NaN.toString();
|
NaN.toString(); // transformation to 0/0 dropped
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -23,135 +23,3 @@ NaN_and_Infinity_should_not_be_replaced_when_they_are_redefined: {
|
|||||||
NaN.toString();
|
NaN.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NaN_and_Infinity_must_have_parens_evaluate: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(123456789 / 0).toString();
|
|
||||||
(+"foo").toString();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(1/0).toString();
|
|
||||||
NaN.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
NaN_and_Infinity_should_not_be_replaced_when_they_are_redefined_evaluate: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var Infinity, NaN;
|
|
||||||
(123456789 / 0).toString();
|
|
||||||
(+"foo").toString();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var Infinity, NaN;
|
|
||||||
(1/0).toString();
|
|
||||||
(0/0).toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
beautify_off_1: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
beautify: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var NaN;
|
|
||||||
console.log(
|
|
||||||
null,
|
|
||||||
undefined,
|
|
||||||
Infinity,
|
|
||||||
NaN,
|
|
||||||
Infinity * undefined,
|
|
||||||
Infinity.toString(),
|
|
||||||
NaN.toString(),
|
|
||||||
(Infinity * undefined).toString()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect_exact: "var NaN;console.log(null,void 0,1/0,NaN,0/0,(1/0).toString(),NaN.toString(),(0/0).toString());"
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
beautify_off_2: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
beautify: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(
|
|
||||||
null.toString(),
|
|
||||||
undefined.toString()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect_exact: "console.log(null.toString(),(void 0).toString());"
|
|
||||||
}
|
|
||||||
|
|
||||||
beautify_on_1: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
beautify: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var NaN;
|
|
||||||
console.log(
|
|
||||||
null,
|
|
||||||
undefined,
|
|
||||||
Infinity,
|
|
||||||
NaN,
|
|
||||||
Infinity * undefined,
|
|
||||||
Infinity.toString(),
|
|
||||||
NaN.toString(),
|
|
||||||
(Infinity * undefined).toString()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"var NaN;",
|
|
||||||
"",
|
|
||||||
"console.log(null, void 0, 1 / 0, NaN, 0 / 0, (1 / 0).toString(), NaN.toString(), (0 / 0).toString());",
|
|
||||||
]
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
beautify_on_2: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
beautify: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(
|
|
||||||
null.toString(),
|
|
||||||
undefined.toString()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect_exact: "console.log(null.toString(), (void 0).toString());"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1724: {
|
|
||||||
input: {
|
|
||||||
var a = 0;
|
|
||||||
++a % Infinity | Infinity ? a++ : 0;
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: "var a=0;++a%(1/0)|1/0?a++:0;console.log(a);"
|
|
||||||
expect_stdout: "2"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1725: {
|
|
||||||
input: {
|
|
||||||
([].length === 0) % Infinity ? console.log("PASS") : console.log("FAIL");
|
|
||||||
}
|
|
||||||
expect_exact: '(0===[].length)%(1/0)?console.log("PASS"):console.log("FAIL");'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,320 +0,0 @@
|
|||||||
cond_5: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
expression: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
if (some_condition()) {
|
|
||||||
if (some_other_condition()) {
|
|
||||||
do_something();
|
|
||||||
} else {
|
|
||||||
alternate();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
alternate();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (some_condition()) {
|
|
||||||
if (some_other_condition()) {
|
|
||||||
do_something();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
some_condition() && some_other_condition() ? do_something() : alternate();
|
|
||||||
if (some_condition() && some_other_condition()) do_something();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dead_code_const_annotation_regex: {
|
|
||||||
options = {
|
|
||||||
booleans : true,
|
|
||||||
conditionals : true,
|
|
||||||
dead_code : true,
|
|
||||||
evaluate : true,
|
|
||||||
expression : true,
|
|
||||||
loops : true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var unused;
|
|
||||||
// @constraint this shouldn't be a constant
|
|
||||||
var CONST_FOO_ANN = false;
|
|
||||||
if (CONST_FOO_ANN) {
|
|
||||||
console.log("reachable");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var unused;
|
|
||||||
var CONST_FOO_ANN = !1;
|
|
||||||
if (CONST_FOO_ANN) console.log('reachable');
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
drop_console_2: {
|
|
||||||
options = {
|
|
||||||
drop_console: true,
|
|
||||||
expression: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log('foo');
|
|
||||||
console.log.apply(console, arguments);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
// with regular compression these will be stripped out as well
|
|
||||||
void 0;
|
|
||||||
void 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
drop_value: {
|
|
||||||
options = {
|
|
||||||
expression: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(1, [2, foo()], 3, {a:1, b:bar()});
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
foo(), {a:1, b:bar()};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
wrongly_optimized: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
booleans: true,
|
|
||||||
evaluate: true,
|
|
||||||
expression: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function func() {
|
|
||||||
foo();
|
|
||||||
}
|
|
||||||
if (func() || true) {
|
|
||||||
bar();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function func() {
|
|
||||||
foo();
|
|
||||||
}
|
|
||||||
// TODO: optimize to `func(), bar()`
|
|
||||||
if (func(), !0) bar();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
negate_iife_1: {
|
|
||||||
options = {
|
|
||||||
expression: true,
|
|
||||||
negate_iife: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function(){ stuff() })();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function(){ stuff() })();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
negate_iife_3: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
expression: true,
|
|
||||||
negate_iife: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function(){ return t })() ? console.log(true) : console.log(false);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function(){ return t })() ? console.log(true) : console.log(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
negate_iife_3_off: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
expression: true,
|
|
||||||
negate_iife: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function(){ return t })() ? console.log(true) : console.log(false);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function(){ return t })() ? console.log(true) : console.log(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
negate_iife_4: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
expression: true,
|
|
||||||
negate_iife: true,
|
|
||||||
sequences: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function(){ return t })() ? console.log(true) : console.log(false);
|
|
||||||
(function(){
|
|
||||||
console.log("something");
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function(){ return t })() ? console.log(true) : console.log(false), function(){
|
|
||||||
console.log("something");
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
negate_iife_5: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
expression: true,
|
|
||||||
negate_iife: true,
|
|
||||||
sequences: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
if ((function(){ return t })()) {
|
|
||||||
foo(true);
|
|
||||||
} else {
|
|
||||||
bar(false);
|
|
||||||
}
|
|
||||||
(function(){
|
|
||||||
console.log("something");
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function(){ return t })() ? foo(true) : bar(false), function(){
|
|
||||||
console.log("something");
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
negate_iife_5_off: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
expression: true,
|
|
||||||
negate_iife: false,
|
|
||||||
sequences: true,
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
if ((function(){ return t })()) {
|
|
||||||
foo(true);
|
|
||||||
} else {
|
|
||||||
bar(false);
|
|
||||||
}
|
|
||||||
(function(){
|
|
||||||
console.log("something");
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function(){ return t })() ? foo(true) : bar(false), function(){
|
|
||||||
console.log("something");
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1254_negate_iife_true: {
|
|
||||||
options = {
|
|
||||||
expression: true,
|
|
||||||
negate_iife: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function() {
|
|
||||||
return function() {
|
|
||||||
console.log('test')
|
|
||||||
};
|
|
||||||
})()();
|
|
||||||
}
|
|
||||||
expect_exact: '(function(){return function(){console.log("test")}})()();'
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1254_negate_iife_nested: {
|
|
||||||
options = {
|
|
||||||
expression: true,
|
|
||||||
negate_iife: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function() {
|
|
||||||
return function() {
|
|
||||||
console.log('test')
|
|
||||||
};
|
|
||||||
})()()()()();
|
|
||||||
}
|
|
||||||
expect_exact: '(function(){return function(){console.log("test")}})()()()()();'
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
conditional: {
|
|
||||||
options = {
|
|
||||||
expression: true,
|
|
||||||
pure_funcs: [ "pure" ],
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
pure(1 | a() ? 2 & b() : 7 ^ c());
|
|
||||||
pure(1 | a() ? 2 & b() : 5);
|
|
||||||
pure(1 | a() ? 4 : 7 ^ c());
|
|
||||||
pure(1 | a() ? 4 : 5);
|
|
||||||
pure(3 ? 2 & b() : 7 ^ c());
|
|
||||||
pure(3 ? 2 & b() : 5);
|
|
||||||
pure(3 ? 4 : 7 ^ c());
|
|
||||||
pure(3 ? 4 : 5);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
1 | a() ? b() : c();
|
|
||||||
1 | a() && b();
|
|
||||||
1 | a() || c();
|
|
||||||
a();
|
|
||||||
3 ? b() : c();
|
|
||||||
3 && b();
|
|
||||||
3 || c();
|
|
||||||
pure(3 ? 4 : 5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
limit_1: {
|
|
||||||
options = {
|
|
||||||
expression: true,
|
|
||||||
sequences: 3,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
a;
|
|
||||||
b;
|
|
||||||
c;
|
|
||||||
d;
|
|
||||||
e;
|
|
||||||
f;
|
|
||||||
g;
|
|
||||||
h;
|
|
||||||
i;
|
|
||||||
j;
|
|
||||||
k;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
// Turned into a single return statement
|
|
||||||
// so it can no longer be split into lines
|
|
||||||
a,b,c,d,e,f,g,h,i,j,k;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
iife: {
|
|
||||||
options = {
|
|
||||||
expression: true,
|
|
||||||
sequences: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
x = 42;
|
|
||||||
(function a() {})();
|
|
||||||
!function b() {}();
|
|
||||||
~function c() {}();
|
|
||||||
+function d() {}();
|
|
||||||
-function e() {}();
|
|
||||||
void function f() {}();
|
|
||||||
typeof function g() {}();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
x = 42, function a() {}(), function b() {}(), function c() {}(),
|
|
||||||
function d() {}(), function e() {}(), function f() {}(), typeof function g() {}();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -29,5 +29,4 @@ dont_mangle_arguments: {
|
|||||||
})(5,6,7);
|
})(5,6,7);
|
||||||
}
|
}
|
||||||
expect_exact: "(function(){var arguments=arguments,o=9;console.log(o,arguments)})(5,6,7);"
|
expect_exact: "(function(){var arguments=arguments,o=9;console.log(o,arguments)})(5,6,7);"
|
||||||
expect_stdout: true
|
|
||||||
}
|
}
|
||||||
|
|||||||
9
test/compress/issue-926.js
Normal file
9
test/compress/issue-926.js
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
template_strings: {
|
||||||
|
input: {
|
||||||
|
foo(
|
||||||
|
`<span>${contents}</span>`,
|
||||||
|
`<a href="${url}">${text}</a>`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect_exact: "foo(`<span>${contents}</span>`,`<a href=\"${url}\">${text}</a>`);"
|
||||||
|
}
|
||||||
@@ -50,7 +50,6 @@ this_binding_conditionals: {
|
|||||||
this_binding_collapse_vars: {
|
this_binding_collapse_vars: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
toplevel: true,
|
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
var c = a; c();
|
var c = a; c();
|
||||||
|
|||||||
@@ -42,7 +42,6 @@ eval_collapse_vars: {
|
|||||||
eval("console.log(a);");
|
eval("console.log(a);");
|
||||||
})(eval);
|
})(eval);
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
eval_unused: {
|
eval_unused: {
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ issue979_test_negated_is_best: {
|
|||||||
1!=a||2!=b||foo();
|
1!=a||2!=b||foo();
|
||||||
}
|
}
|
||||||
function f7() {
|
function f7() {
|
||||||
if(1!=a&&2!=b)return bar();foo()
|
return 1!=a&&2!=b?bar():void foo();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
40
test/compress/join-vars.js
Normal file
40
test/compress/join-vars.js
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
only_vars: {
|
||||||
|
options = { join_vars: true };
|
||||||
|
input: {
|
||||||
|
let netmaskBinary = '';
|
||||||
|
for (let i = 0; i < netmaskBits; ++i) {
|
||||||
|
netmaskBinary += '1';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
let netmaskBinary = '';
|
||||||
|
for (let i = 0; i < netmaskBits; ++i) netmaskBinary += '1';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1079_with_vars: {
|
||||||
|
options = { join_vars: true };
|
||||||
|
input: {
|
||||||
|
var netmaskBinary = '';
|
||||||
|
for (var i = 0; i < netmaskBits; ++i) {
|
||||||
|
netmaskBinary += '1';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
for (var netmaskBinary = '', i = 0; i < netmaskBits; ++i) netmaskBinary += '1';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1079_with_mixed: {
|
||||||
|
options = { join_vars: true };
|
||||||
|
input: {
|
||||||
|
var netmaskBinary = '';
|
||||||
|
for (let i = 0; i < netmaskBits; ++i) {
|
||||||
|
netmaskBinary += '1';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var netmaskBinary = ''
|
||||||
|
for (let i = 0; i < netmaskBits; ++i) netmaskBinary += '1';
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,7 +9,6 @@ labels_1: {
|
|||||||
expect: {
|
expect: {
|
||||||
foo || console.log("bar");
|
foo || console.log("bar");
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
labels_2: {
|
labels_2: {
|
||||||
@@ -41,7 +40,6 @@ labels_3: {
|
|||||||
for (var i = 0; i < 5; ++i)
|
for (var i = 0; i < 5; ++i)
|
||||||
i < 3 || console.log(i);
|
i < 3 || console.log(i);
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
labels_4: {
|
labels_4: {
|
||||||
@@ -56,7 +54,6 @@ labels_4: {
|
|||||||
for (var i = 0; i < 5; ++i)
|
for (var i = 0; i < 5; ++i)
|
||||||
i < 3 || console.log(i);
|
i < 3 || console.log(i);
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
labels_5: {
|
labels_5: {
|
||||||
|
|||||||
@@ -166,7 +166,6 @@ keep_collapse_const_in_own_block_scope: {
|
|||||||
console.log(i);
|
console.log(i);
|
||||||
console.log(c);
|
console.log(c);
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
keep_collapse_const_in_own_block_scope_2: {
|
keep_collapse_const_in_own_block_scope_2: {
|
||||||
@@ -187,296 +186,4 @@ keep_collapse_const_in_own_block_scope_2: {
|
|||||||
console.log(i);
|
console.log(i);
|
||||||
console.log(c);
|
console.log(c);
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
evaluate: {
|
|
||||||
options = {
|
|
||||||
loops: true,
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
while (true) {
|
|
||||||
a();
|
|
||||||
}
|
|
||||||
while (false) {
|
|
||||||
b();
|
|
||||||
}
|
|
||||||
do {
|
|
||||||
c();
|
|
||||||
} while (true);
|
|
||||||
do {
|
|
||||||
d();
|
|
||||||
} while (false);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
for(;;)
|
|
||||||
a();
|
|
||||||
for(;;)
|
|
||||||
c();
|
|
||||||
d();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1532: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
loops: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(x, y) {
|
|
||||||
do {
|
|
||||||
if (x) break;
|
|
||||||
foo();
|
|
||||||
} while (false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(x, y) {
|
|
||||||
do {
|
|
||||||
if (x) break;
|
|
||||||
foo();
|
|
||||||
} while (false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_186: {
|
|
||||||
beautify = {
|
|
||||||
beautify: false,
|
|
||||||
screw_ie8: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var x = 3;
|
|
||||||
if (foo())
|
|
||||||
do
|
|
||||||
do
|
|
||||||
alert(x);
|
|
||||||
while (--x);
|
|
||||||
while (x);
|
|
||||||
else
|
|
||||||
bar();
|
|
||||||
}
|
|
||||||
expect_exact: 'var x=3;if(foo())do{do{alert(x)}while(--x)}while(x);else bar();'
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_186_ie8: {
|
|
||||||
beautify = {
|
|
||||||
beautify: false,
|
|
||||||
screw_ie8: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var x = 3;
|
|
||||||
if (foo())
|
|
||||||
do
|
|
||||||
do
|
|
||||||
alert(x);
|
|
||||||
while (--x);
|
|
||||||
while (x);
|
|
||||||
else
|
|
||||||
bar();
|
|
||||||
}
|
|
||||||
expect_exact: 'var x=3;if(foo()){do{do{alert(x)}while(--x)}while(x)}else bar();'
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_186_beautify: {
|
|
||||||
beautify = {
|
|
||||||
beautify: true,
|
|
||||||
screw_ie8: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var x = 3;
|
|
||||||
if (foo())
|
|
||||||
do
|
|
||||||
do
|
|
||||||
alert(x);
|
|
||||||
while (--x);
|
|
||||||
while (x);
|
|
||||||
else
|
|
||||||
bar();
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
'var x = 3;',
|
|
||||||
'',
|
|
||||||
'if (foo()) do {',
|
|
||||||
' do {',
|
|
||||||
' alert(x);',
|
|
||||||
' } while (--x);',
|
|
||||||
'} while (x); else bar();',
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_186_beautify_ie8: {
|
|
||||||
beautify = {
|
|
||||||
beautify: true,
|
|
||||||
screw_ie8: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var x = 3;
|
|
||||||
if (foo())
|
|
||||||
do
|
|
||||||
do
|
|
||||||
alert(x);
|
|
||||||
while (--x);
|
|
||||||
while (x);
|
|
||||||
else
|
|
||||||
bar();
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
'var x = 3;',
|
|
||||||
'',
|
|
||||||
'if (foo()) {',
|
|
||||||
' do {',
|
|
||||||
' do {',
|
|
||||||
' alert(x);',
|
|
||||||
' } while (--x);',
|
|
||||||
' } while (x);',
|
|
||||||
'} else bar();',
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_186_bracketize: {
|
|
||||||
beautify = {
|
|
||||||
beautify: false,
|
|
||||||
bracketize: true,
|
|
||||||
screw_ie8: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var x = 3;
|
|
||||||
if (foo())
|
|
||||||
do
|
|
||||||
do
|
|
||||||
alert(x);
|
|
||||||
while (--x);
|
|
||||||
while (x);
|
|
||||||
else
|
|
||||||
bar();
|
|
||||||
}
|
|
||||||
expect_exact: 'var x=3;if(foo()){do{do{alert(x)}while(--x)}while(x)}else{bar()}'
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_186_bracketize_ie8: {
|
|
||||||
beautify = {
|
|
||||||
beautify: false,
|
|
||||||
bracketize: true,
|
|
||||||
screw_ie8: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var x = 3;
|
|
||||||
if (foo())
|
|
||||||
do
|
|
||||||
do
|
|
||||||
alert(x);
|
|
||||||
while (--x);
|
|
||||||
while (x);
|
|
||||||
else
|
|
||||||
bar();
|
|
||||||
}
|
|
||||||
expect_exact: 'var x=3;if(foo()){do{do{alert(x)}while(--x)}while(x)}else{bar()}'
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_186_beautify_bracketize: {
|
|
||||||
beautify = {
|
|
||||||
beautify: true,
|
|
||||||
bracketize: true,
|
|
||||||
screw_ie8: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var x = 3;
|
|
||||||
if (foo())
|
|
||||||
do
|
|
||||||
do
|
|
||||||
alert(x);
|
|
||||||
while (--x);
|
|
||||||
while (x);
|
|
||||||
else
|
|
||||||
bar();
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
'var x = 3;',
|
|
||||||
'',
|
|
||||||
'if (foo()) {',
|
|
||||||
' do {',
|
|
||||||
' do {',
|
|
||||||
' alert(x);',
|
|
||||||
' } while (--x);',
|
|
||||||
' } while (x);',
|
|
||||||
'} else {',
|
|
||||||
' bar();',
|
|
||||||
'}',
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_186_beautify_bracketize_ie8: {
|
|
||||||
beautify = {
|
|
||||||
beautify: true,
|
|
||||||
bracketize: true,
|
|
||||||
screw_ie8: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var x = 3;
|
|
||||||
if (foo())
|
|
||||||
do
|
|
||||||
do
|
|
||||||
alert(x);
|
|
||||||
while (--x);
|
|
||||||
while (x);
|
|
||||||
else
|
|
||||||
bar();
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
'var x = 3;',
|
|
||||||
'',
|
|
||||||
'if (foo()) {',
|
|
||||||
' do {',
|
|
||||||
' do {',
|
|
||||||
' alert(x);',
|
|
||||||
' } while (--x);',
|
|
||||||
' } while (x);',
|
|
||||||
'} else {',
|
|
||||||
' bar();',
|
|
||||||
'}',
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1648: {
|
|
||||||
options = {
|
|
||||||
join_vars: true,
|
|
||||||
loops: true,
|
|
||||||
passes: 2,
|
|
||||||
sequences: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
x();
|
|
||||||
var b = 1;
|
|
||||||
while (1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_exact: "function f(){for(x();1;);}"
|
|
||||||
}
|
|
||||||
|
|
||||||
do_switch: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
loops: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
do {
|
|
||||||
switch (a) {
|
|
||||||
case b:
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
} while (false);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
do {
|
|
||||||
switch (a) {
|
|
||||||
case b:
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
} while (false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,39 +0,0 @@
|
|||||||
too_short: {
|
|
||||||
beautify = {
|
|
||||||
max_line_len: 10,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a) {
|
|
||||||
return { c: 42, d: a(), e: "foo"};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
'function f(a){',
|
|
||||||
'return{',
|
|
||||||
'c:42,',
|
|
||||||
'd:a(),',
|
|
||||||
'e:"foo"}}',
|
|
||||||
]
|
|
||||||
expect_warnings: [
|
|
||||||
"WARN: Output exceeds 10 characters"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
just_enough: {
|
|
||||||
beautify = {
|
|
||||||
max_line_len: 14,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a) {
|
|
||||||
return { c: 42, d: a(), e: "foo"};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
'function f(a){',
|
|
||||||
'return{c:42,',
|
|
||||||
'd:a(),e:"foo"}',
|
|
||||||
'}',
|
|
||||||
]
|
|
||||||
expect_warnings: [
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -10,16 +10,6 @@ negate_iife_1: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
negate_iife_1_off: {
|
|
||||||
options = {
|
|
||||||
negate_iife: false,
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
(function(){ stuff() })();
|
|
||||||
}
|
|
||||||
expect_exact: '(function(){stuff()})();'
|
|
||||||
}
|
|
||||||
|
|
||||||
negate_iife_2: {
|
negate_iife_2: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: true
|
negate_iife: true
|
||||||
@@ -32,151 +22,44 @@ negate_iife_2: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
negate_iife_2_side_effects: {
|
negate_iife_3: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
side_effects: true,
|
};
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
(function(){ return {} })().x = 10; // should not transform this one
|
(function(){ return true })() ? console.log(true) : console.log(false);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
(function(){ return {} })().x = 10;
|
!function(){ return true }() ? console.log(false) : console.log(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
negate_iife_3: {
|
negate_iife_3: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
conditionals: true
|
sequences: true
|
||||||
};
|
};
|
||||||
input: {
|
|
||||||
(function(){ return t })() ? console.log(true) : console.log(false);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
!function(){ return t }() ? console.log(false) : console.log(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
negate_iife_3_evaluate: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
evaluate: true,
|
|
||||||
negate_iife: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
(function(){ return true })() ? console.log(true) : console.log(false);
|
(function(){ return true })() ? console.log(true) : console.log(false);
|
||||||
|
(function(){
|
||||||
|
console.log("something");
|
||||||
|
})();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(true);
|
!function(){ return true }() ? console.log(false) : console.log(true), function(){
|
||||||
|
console.log("something");
|
||||||
|
}();
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
negate_iife_3_side_effects: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
negate_iife: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function(){ return t })() ? console.log(true) : console.log(false);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
!function(){ return t }() ? console.log(false) : console.log(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
negate_iife_3_off: {
|
|
||||||
options = {
|
|
||||||
negate_iife: false,
|
|
||||||
conditionals: true,
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
(function(){ return t })() ? console.log(true) : console.log(false);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
!function(){ return t }() ? console.log(false) : console.log(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
negate_iife_3_off_evaluate: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
evaluate: true,
|
|
||||||
negate_iife: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function(){ return true })() ? console.log(true) : console.log(false);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(true);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
negate_iife_4: {
|
negate_iife_4: {
|
||||||
options = {
|
|
||||||
negate_iife: true,
|
|
||||||
conditionals: true,
|
|
||||||
sequences: true
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
(function(){ return t })() ? console.log(true) : console.log(false);
|
|
||||||
(function(){
|
|
||||||
console.log("something");
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
!function(){ return t }() ? console.log(false) : console.log(true), function(){
|
|
||||||
console.log("something");
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sequence_off: {
|
|
||||||
options = {
|
|
||||||
negate_iife: false,
|
|
||||||
conditionals: true,
|
|
||||||
sequences: true,
|
|
||||||
passes: 2,
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
(function(){ return t })() ? console.log(true) : console.log(false);
|
|
||||||
(function(){
|
|
||||||
console.log("something");
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
function g() {
|
|
||||||
(function(){
|
|
||||||
console.log("something");
|
|
||||||
})();
|
|
||||||
(function(){ return t })() ? console.log(true) : console.log(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {
|
|
||||||
!function(){ return t }() ? console.log(false) : console.log(true), function(){
|
|
||||||
console.log("something");
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
function g() {
|
|
||||||
(function(){
|
|
||||||
console.log("something");
|
|
||||||
})(), function(){ return t }() ? console.log(true) : console.log(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
negate_iife_5: {
|
|
||||||
options = {
|
options = {
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
if ((function(){ return t })()) {
|
if ((function(){ return true })()) {
|
||||||
foo(true);
|
foo(true);
|
||||||
} else {
|
} else {
|
||||||
bar(false);
|
bar(false);
|
||||||
@@ -186,30 +69,7 @@ negate_iife_5: {
|
|||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
!function(){ return t }() ? bar(false) : foo(true), function(){
|
!function(){ return true }() ? bar(false) : foo(true), function(){
|
||||||
console.log("something");
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
negate_iife_5_off: {
|
|
||||||
options = {
|
|
||||||
negate_iife: false,
|
|
||||||
sequences: true,
|
|
||||||
conditionals: true,
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
if ((function(){ return t })()) {
|
|
||||||
foo(true);
|
|
||||||
} else {
|
|
||||||
bar(false);
|
|
||||||
}
|
|
||||||
(function(){
|
|
||||||
console.log("something");
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
!function(){ return t }() ? bar(false) : foo(true), function(){
|
|
||||||
console.log("something");
|
console.log("something");
|
||||||
}();
|
}();
|
||||||
}
|
}
|
||||||
@@ -245,40 +105,6 @@ negate_iife_nested: {
|
|||||||
}(7);
|
}(7);
|
||||||
}).f();
|
}).f();
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
negate_iife_nested_off: {
|
|
||||||
options = {
|
|
||||||
negate_iife: false,
|
|
||||||
sequences: true,
|
|
||||||
conditionals: true,
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
function Foo(f) {
|
|
||||||
this.f = f;
|
|
||||||
}
|
|
||||||
new Foo(function() {
|
|
||||||
(function(x) {
|
|
||||||
(function(y) {
|
|
||||||
console.log(y);
|
|
||||||
})(x);
|
|
||||||
})(7);
|
|
||||||
}).f();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function Foo(f) {
|
|
||||||
this.f = f;
|
|
||||||
}
|
|
||||||
new Foo(function() {
|
|
||||||
(function(x) {
|
|
||||||
(function(y) {
|
|
||||||
console.log(y);
|
|
||||||
})(x);
|
|
||||||
})(7);
|
|
||||||
}).f();
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
negate_iife_issue_1073: {
|
negate_iife_issue_1073: {
|
||||||
@@ -303,7 +129,6 @@ negate_iife_issue_1073: {
|
|||||||
};
|
};
|
||||||
}(7))();
|
}(7))();
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1254_negate_iife_false: {
|
issue_1254_negate_iife_false: {
|
||||||
@@ -318,7 +143,6 @@ issue_1254_negate_iife_false: {
|
|||||||
})()();
|
})()();
|
||||||
}
|
}
|
||||||
expect_exact: '(function(){return function(){console.log("test")}})()();'
|
expect_exact: '(function(){return function(){console.log("test")}})()();'
|
||||||
expect_stdout: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1254_negate_iife_true: {
|
issue_1254_negate_iife_true: {
|
||||||
@@ -333,7 +157,6 @@ issue_1254_negate_iife_true: {
|
|||||||
})()();
|
})()();
|
||||||
}
|
}
|
||||||
expect_exact: '!function(){return function(){console.log("test")}}()();'
|
expect_exact: '!function(){return function(){console.log("test")}}()();'
|
||||||
expect_stdout: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1254_negate_iife_nested: {
|
issue_1254_negate_iife_nested: {
|
||||||
@@ -348,71 +171,4 @@ issue_1254_negate_iife_nested: {
|
|||||||
})()()()()();
|
})()()()()();
|
||||||
}
|
}
|
||||||
expect_exact: '!function(){return function(){console.log("test")}}()()()()();'
|
expect_exact: '!function(){return function(){console.log("test")}}()()()()();'
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1288: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
negate_iife: true,
|
|
||||||
side_effects: false,
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
if (w) ;
|
|
||||||
else {
|
|
||||||
(function f() {})();
|
|
||||||
}
|
|
||||||
if (!x) {
|
|
||||||
(function() {
|
|
||||||
x = {};
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
if (y)
|
|
||||||
(function() {})();
|
|
||||||
else
|
|
||||||
(function(z) {
|
|
||||||
return z;
|
|
||||||
})(0);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
w || !function f() {}();
|
|
||||||
x || !function() {
|
|
||||||
x = {};
|
|
||||||
}();
|
|
||||||
y ? !function() {}() : !function(z) {
|
|
||||||
return z;
|
|
||||||
}(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1288_side_effects: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
negate_iife: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
if (w) ;
|
|
||||||
else {
|
|
||||||
(function f() {})();
|
|
||||||
}
|
|
||||||
if (!x) {
|
|
||||||
(function() {
|
|
||||||
x = {};
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
if (y)
|
|
||||||
(function() {})();
|
|
||||||
else
|
|
||||||
(function(z) {
|
|
||||||
return z;
|
|
||||||
})(0);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
w;
|
|
||||||
x || function() {
|
|
||||||
x = {};
|
|
||||||
}();
|
|
||||||
y;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,188 +17,3 @@ hex_numbers_in_parentheses_for_prototype_functions: {
|
|||||||
}
|
}
|
||||||
expect_exact: "-2;(-2).toFixed(0);2;2..toFixed(0);.2;.2.toFixed(0);2e-8;2e-8.toFixed(0);0xde0b6b3a7640080;(0xde0b6b3a7640080).toFixed(0);"
|
expect_exact: "-2;(-2).toFixed(0);2;2..toFixed(0);.2;.2.toFixed(0);2e-8;2e-8.toFixed(0);0xde0b6b3a7640080;(0xde0b6b3a7640080).toFixed(0);"
|
||||||
}
|
}
|
||||||
|
|
||||||
comparisons: {
|
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(
|
|
||||||
~x === 42,
|
|
||||||
x % n === 42
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(
|
|
||||||
42 == ~x,
|
|
||||||
x % n == 42
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
evaluate_1: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
unsafe_math: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(
|
|
||||||
x + 1 + 2,
|
|
||||||
x * 1 * 2,
|
|
||||||
+x + 1 + 2,
|
|
||||||
1 + x + 2 + 3,
|
|
||||||
1 | x | 2 | 3,
|
|
||||||
1 + x-- + 2 + 3,
|
|
||||||
1 + (x*y + 2) + 3,
|
|
||||||
1 + (2 + x + 3),
|
|
||||||
1 + (2 + ~x + 3),
|
|
||||||
-y + (2 + ~x + 3),
|
|
||||||
1 & (2 & x & 3),
|
|
||||||
1 + (2 + (x |= 0) + 3)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(
|
|
||||||
x + 1 + 2,
|
|
||||||
1 * x * 2,
|
|
||||||
+x + 1 + 2,
|
|
||||||
1 + x + 2 + 3,
|
|
||||||
3 | x,
|
|
||||||
1 + x-- + 2 + 3,
|
|
||||||
x*y + 2 + 1 + 3,
|
|
||||||
1 + (2 + x + 3),
|
|
||||||
2 + ~x + 3 + 1,
|
|
||||||
-y + (2 + ~x + 3),
|
|
||||||
0 & x,
|
|
||||||
2 + (x |= 0) + 3 + 1
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
evaluate_2: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
unsafe_math: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(
|
|
||||||
x + 1 + 2,
|
|
||||||
x * 1 * 2,
|
|
||||||
+x + 1 + 2,
|
|
||||||
1 + x + 2 + 3,
|
|
||||||
1 | x | 2 | 3,
|
|
||||||
1 + x-- + 2 + 3,
|
|
||||||
1 + (x*y + 2) + 3,
|
|
||||||
1 + (2 + x + 3),
|
|
||||||
1 & (2 & x & 3),
|
|
||||||
1 + (2 + (x |= 0) + 3)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(
|
|
||||||
x + 1 + 2,
|
|
||||||
2 * x,
|
|
||||||
3 + +x,
|
|
||||||
1 + x + 2 + 3,
|
|
||||||
3 | x,
|
|
||||||
6 + x--,
|
|
||||||
6 + x*y,
|
|
||||||
1 + (2 + x + 3),
|
|
||||||
0 & x,
|
|
||||||
6 + (x |= 0)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
evaluate_3: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
unsafe: true,
|
|
||||||
unsafe_math: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(1 + Number(x) + 2);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(3 + +x);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
evaluate_4: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(
|
|
||||||
1+ +a,
|
|
||||||
+a+1,
|
|
||||||
1+-a,
|
|
||||||
-a+1,
|
|
||||||
+a+ +b,
|
|
||||||
+a+-b,
|
|
||||||
-a+ +b,
|
|
||||||
-a+-b
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(
|
|
||||||
+a+1,
|
|
||||||
+a+1,
|
|
||||||
1-a,
|
|
||||||
1-a,
|
|
||||||
+a+ +b,
|
|
||||||
+a-b,
|
|
||||||
-a+ +b,
|
|
||||||
-a-b
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1710: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var x = {};
|
|
||||||
console.log((x += 1) + -x);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var x = {};
|
|
||||||
console.log((x += 1) + -x);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
unary_binary_parenthesis: {
|
|
||||||
input: {
|
|
||||||
var v = [ 0, 1, NaN, Infinity, null, undefined, true, false, "", "foo", /foo/ ];
|
|
||||||
v.forEach(function(x) {
|
|
||||||
v.forEach(function(y) {
|
|
||||||
console.log(
|
|
||||||
+(x*y),
|
|
||||||
+(x/y),
|
|
||||||
+(x%y),
|
|
||||||
-(x*y),
|
|
||||||
-(x/y),
|
|
||||||
-(x%y)
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var v = [ 0, 1, NaN, 1/0, null, void 0, true, false, "", "foo", /foo/ ];
|
|
||||||
v.forEach(function(x) {
|
|
||||||
v.forEach(function(y) {
|
|
||||||
console.log(
|
|
||||||
+x*y,
|
|
||||||
+x/y,
|
|
||||||
+x%y,
|
|
||||||
-x*y,
|
|
||||||
-x/y,
|
|
||||||
-x%y
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|||||||
504
test/compress/object.js
Normal file
504
test/compress/object.js
Normal file
@@ -0,0 +1,504 @@
|
|||||||
|
getter_setter: {
|
||||||
|
input: {
|
||||||
|
var get = "bar";
|
||||||
|
var a = {
|
||||||
|
get,
|
||||||
|
set: "foo",
|
||||||
|
get bar() {
|
||||||
|
return this.get;
|
||||||
|
},
|
||||||
|
get 5() {
|
||||||
|
return "five";
|
||||||
|
},
|
||||||
|
get 0xf55() {
|
||||||
|
return "f five five";
|
||||||
|
},
|
||||||
|
get "five"() {
|
||||||
|
return 5;
|
||||||
|
},
|
||||||
|
set one(value) {
|
||||||
|
this._one = value;
|
||||||
|
},
|
||||||
|
set 9(value) {
|
||||||
|
this._nine = value;
|
||||||
|
},
|
||||||
|
set 0b1010(value) {
|
||||||
|
this._ten = value;
|
||||||
|
},
|
||||||
|
set "eleven"(value) {
|
||||||
|
this._eleven = value;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var b = {
|
||||||
|
get() { return "gift"; },
|
||||||
|
set: function(code) { return "Storing code " + code; }
|
||||||
|
};
|
||||||
|
var c = {
|
||||||
|
["get"]: "foo",
|
||||||
|
["set"]: "bar"
|
||||||
|
};
|
||||||
|
var d = {
|
||||||
|
get: "foo",
|
||||||
|
set: "bar"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var get = "bar";
|
||||||
|
var a = {
|
||||||
|
get,
|
||||||
|
set: "foo",
|
||||||
|
get bar() {
|
||||||
|
return this.get;
|
||||||
|
},
|
||||||
|
get 5() {
|
||||||
|
return "five";
|
||||||
|
},
|
||||||
|
get 0xf55() {
|
||||||
|
return "f five five";
|
||||||
|
},
|
||||||
|
get "five"() {
|
||||||
|
return 5;
|
||||||
|
},
|
||||||
|
set one(value) {
|
||||||
|
this._one = value;
|
||||||
|
},
|
||||||
|
set 9(value) {
|
||||||
|
this._nine = value;
|
||||||
|
},
|
||||||
|
set 0b1010(value) {
|
||||||
|
this._ten = value;
|
||||||
|
},
|
||||||
|
set "eleven"(value) {
|
||||||
|
this._eleven = value;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var b = {
|
||||||
|
get() { return "gift"; },
|
||||||
|
set: function(code) { return "Storing code " + code; }
|
||||||
|
};
|
||||||
|
var c = {
|
||||||
|
["get"]: "foo",
|
||||||
|
["set"]: "bar"
|
||||||
|
};
|
||||||
|
var d = {
|
||||||
|
get: "foo",
|
||||||
|
set: "bar"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getter_setter_mangler: {
|
||||||
|
mangle = {}
|
||||||
|
beautify = {
|
||||||
|
ecma: 6
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(get,set) {
|
||||||
|
return {
|
||||||
|
get,
|
||||||
|
set,
|
||||||
|
get g(){},
|
||||||
|
set s(n){},
|
||||||
|
c,
|
||||||
|
a:1,
|
||||||
|
m(){}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "function f(n,t){return{get:n,set:t,get g(){},set s(n){},c,a:1,m(){}}}"
|
||||||
|
}
|
||||||
|
|
||||||
|
use_shorthand_opportunity: {
|
||||||
|
beautify = {
|
||||||
|
ecma: 6
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var foo = 123;
|
||||||
|
var obj = {foo: foo};
|
||||||
|
}
|
||||||
|
expect_exact: "var foo=123;var obj={foo};"
|
||||||
|
}
|
||||||
|
|
||||||
|
computed_property_names: {
|
||||||
|
input: {
|
||||||
|
obj({ ["x" + "x"]: 6 });
|
||||||
|
}
|
||||||
|
expect_exact: 'obj({["x"+"x"]:6});'
|
||||||
|
}
|
||||||
|
|
||||||
|
computed_property_names_evaluated_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
obj({
|
||||||
|
[1 + 1]: 2,
|
||||||
|
["x" + "x"]: 6
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_exact: 'obj({[2]:2,["xx"]:6});'
|
||||||
|
}
|
||||||
|
|
||||||
|
computed_property_names_evaluated_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var foo = something();
|
||||||
|
|
||||||
|
var obj = {
|
||||||
|
[foo]() {
|
||||||
|
return "blah";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: 'var foo=something();var obj={[foo](){return"blah"}};'
|
||||||
|
}
|
||||||
|
|
||||||
|
shorthand_properties: {
|
||||||
|
mangle = true;
|
||||||
|
input: (function() {
|
||||||
|
var prop = 1;
|
||||||
|
const value = {prop};
|
||||||
|
return value;
|
||||||
|
})();
|
||||||
|
expect: (function() {
|
||||||
|
var n = 1;
|
||||||
|
const r = {prop:n};
|
||||||
|
return r;
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
|
||||||
|
concise_methods: {
|
||||||
|
input: {
|
||||||
|
x = {
|
||||||
|
foo(a, b) {
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
y = {
|
||||||
|
foo([{a}]) {
|
||||||
|
return a;
|
||||||
|
},
|
||||||
|
bar(){}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "x={foo(a,b){return x}};y={foo([{a}]){return a},bar(){}};"
|
||||||
|
}
|
||||||
|
|
||||||
|
concise_methods_with_computed_property: {
|
||||||
|
options = {
|
||||||
|
evaluate: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var foo = {
|
||||||
|
[Symbol.iterator]() {
|
||||||
|
return { /* stuff */ }
|
||||||
|
},
|
||||||
|
[1 + 2]() {
|
||||||
|
return 3;
|
||||||
|
},
|
||||||
|
["1" + "4"]() {
|
||||||
|
return 14;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var foo = {
|
||||||
|
[Symbol.iterator]() {
|
||||||
|
return { /* stuff */ }
|
||||||
|
},
|
||||||
|
[3]() {
|
||||||
|
return 3;
|
||||||
|
},
|
||||||
|
["14"]() {
|
||||||
|
return 14;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
concise_methods_with_computed_property2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var foo = {
|
||||||
|
[[1]](){
|
||||||
|
return "success";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
doSomething(foo[[1]]());
|
||||||
|
}
|
||||||
|
expect_exact: {
|
||||||
|
'var foo={[[1]](){return"success"}};doSomething(foo[[1]]());'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
concise_methods_with_various_property_names: {
|
||||||
|
input: {
|
||||||
|
var get = "bar";
|
||||||
|
var a = {
|
||||||
|
bar() {
|
||||||
|
return this.get;
|
||||||
|
},
|
||||||
|
5() {
|
||||||
|
return "five";
|
||||||
|
},
|
||||||
|
0xf55() {
|
||||||
|
return "f five five";
|
||||||
|
},
|
||||||
|
"five"() {
|
||||||
|
return 5;
|
||||||
|
},
|
||||||
|
0b1010(value) {
|
||||||
|
this._ten = value;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var get = "bar";
|
||||||
|
var a = {
|
||||||
|
bar() {
|
||||||
|
return this.get;
|
||||||
|
},
|
||||||
|
5() {
|
||||||
|
return "five";
|
||||||
|
},
|
||||||
|
0xf55() {
|
||||||
|
return "f five five";
|
||||||
|
},
|
||||||
|
"five"() {
|
||||||
|
return 5;
|
||||||
|
},
|
||||||
|
0b1010(value) {
|
||||||
|
this._ten = value;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
concise_methods_and_mangle_props: {
|
||||||
|
mangle_props = {
|
||||||
|
regex: /_/
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
function x() {
|
||||||
|
obj = {
|
||||||
|
_foo() { return 1; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function x() {
|
||||||
|
obj = {
|
||||||
|
a() { return 1; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
concise_generators: {
|
||||||
|
input: {
|
||||||
|
x = {
|
||||||
|
*foo(a, b) {
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
y = {
|
||||||
|
*foo([{a}]) {
|
||||||
|
yield a;
|
||||||
|
},
|
||||||
|
bar(){}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "x={*foo(a,b){return x}};y={*foo([{a}]){yield a},bar(){}};"
|
||||||
|
}
|
||||||
|
|
||||||
|
concise_methods_and_keyword_names: {
|
||||||
|
input: {
|
||||||
|
x = {
|
||||||
|
catch() {},
|
||||||
|
throw() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
x={catch(){},throw(){}};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getter_setter_with_computed_value: {
|
||||||
|
input: {
|
||||||
|
class C {
|
||||||
|
get ['a']() {
|
||||||
|
return 'A';
|
||||||
|
}
|
||||||
|
set ['a'](value) {
|
||||||
|
do_something(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var x = {
|
||||||
|
get [a.b]() {
|
||||||
|
return 42;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
class MyArray extends Array {
|
||||||
|
get [Symbol.species]() {
|
||||||
|
return Array;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: 'class C{get["a"](){return"A"}set["a"](value){do_something(a)}}var x={get[a.b](){return 42}};class MyArray extends Array{get[Symbol.species](){return Array}}'
|
||||||
|
}
|
||||||
|
|
||||||
|
property_with_operator_value: {
|
||||||
|
input: {
|
||||||
|
var foo = {
|
||||||
|
"*": 1,
|
||||||
|
get "*"() {
|
||||||
|
return 2;
|
||||||
|
},
|
||||||
|
*"*"() {
|
||||||
|
return 3;
|
||||||
|
},
|
||||||
|
"%": 1,
|
||||||
|
get "%"() {
|
||||||
|
return 2;
|
||||||
|
},
|
||||||
|
*"%"() {
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class bar {
|
||||||
|
get "*"() {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
*"*"() {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
get "%"() {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
*"%"() {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: 'var foo={"*":1,get"*"(){return 2},*"*"(){return 3},"%":1,get"%"(){return 2},*"%"(){return 3}};class bar{get"*"(){return 1}*"*"(){return 2}get"%"(){return 1}*"%"(){return 2}}'
|
||||||
|
}
|
||||||
|
|
||||||
|
property_with_unprintable: {
|
||||||
|
input: {
|
||||||
|
var foo = {
|
||||||
|
"\x00\x01": "foo",
|
||||||
|
get "\x00\x01"() {
|
||||||
|
return "bar";
|
||||||
|
},
|
||||||
|
set "\x00\x01"(foo) {
|
||||||
|
save(foo);
|
||||||
|
},
|
||||||
|
*"\x00\x01"() {
|
||||||
|
return "foobar";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class bar {
|
||||||
|
get "\x00\x01"() {
|
||||||
|
return "bar"
|
||||||
|
}
|
||||||
|
set "\x00\x01"(foo) {
|
||||||
|
save(foo);
|
||||||
|
}
|
||||||
|
*"\x00\x01"() {
|
||||||
|
return "foobar";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: 'var foo={"\\0\x01":"foo",get"\\0\x01"(){return"bar"},set"\\0\x01"(foo){save(foo)},*"\\0\x01"(){return"foobar"}};class bar{get"\\0\x01"(){return"bar"}set"\\0\x01"(foo){save(foo)}*"\\0\x01"(){return"foobar"}}'
|
||||||
|
}
|
||||||
|
|
||||||
|
property_with_unprintable_ascii_only: {
|
||||||
|
beautify = {
|
||||||
|
ascii_only: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var foo = {
|
||||||
|
"\x00\x01": "foo",
|
||||||
|
get "\x00\x01"() {
|
||||||
|
return "bar";
|
||||||
|
},
|
||||||
|
set "\x00\x01"(foo) {
|
||||||
|
save(foo);
|
||||||
|
},
|
||||||
|
*"\x00\x01"() {
|
||||||
|
return "foobar";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class bar {
|
||||||
|
get "\x00\x01"() {
|
||||||
|
return "bar"
|
||||||
|
}
|
||||||
|
set "\x00\x01"(foo) {
|
||||||
|
save(foo);
|
||||||
|
}
|
||||||
|
*"\x00\x01"() {
|
||||||
|
return "foobar";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: 'var foo={"\\0\\x01":"foo",get"\\0\\x01"(){return"bar"},set"\\0\\x01"(foo){save(foo)},*"\\0\\x01"(){return"foobar"}};class bar{get"\\0\\x01"(){return"bar"}set"\\0\\x01"(foo){save(foo)}*"\\0\\x01"(){return"foobar"}}'
|
||||||
|
}
|
||||||
|
|
||||||
|
property_with_unprintable_ascii_only_static: {
|
||||||
|
beautify = {
|
||||||
|
ascii_only: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
class foo {
|
||||||
|
static get "\x02\x03"() {
|
||||||
|
return "bar";
|
||||||
|
}
|
||||||
|
static set "\x04\x05"(foo) {
|
||||||
|
save(foo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: 'class foo{static get"\\x02\\x03"(){return"bar"}static set"\\x04\\x05"(foo){save(foo)}}'
|
||||||
|
}
|
||||||
|
|
||||||
|
methods_and_getters_with_keep_quoted_props_enabled: {
|
||||||
|
beautify = {
|
||||||
|
quote_style: 3,
|
||||||
|
keep_quoted_props: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var obj = {
|
||||||
|
a() {},
|
||||||
|
"b"() {},
|
||||||
|
get c() { return "c"},
|
||||||
|
get "d"() { return "d"},
|
||||||
|
set e(a) { doSomething(a); },
|
||||||
|
set f(a) { doSomething(b); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: 'var obj={a(){},"b"(){},get c(){return"c"},get"d"(){return"d"},set e(a){doSomething(a)},set f(a){doSomething(b)}};'
|
||||||
|
}
|
||||||
|
|
||||||
|
allow_assignments_to_property_values: {
|
||||||
|
input: {
|
||||||
|
var foo = {123: foo = 123} = {foo: "456"};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var foo = {123: foo = 123} = {foo: "456"};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
variable_as_computed_property: {
|
||||||
|
input: {
|
||||||
|
function getLine(header) {
|
||||||
|
return {
|
||||||
|
[header]: {}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "function getLine(header){return{[header]:{}}}"
|
||||||
|
}
|
||||||
159
test/compress/parameters.js
Normal file
159
test/compress/parameters.js
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
arrow_functions: {
|
||||||
|
input: {
|
||||||
|
(a) => b; // 1 args
|
||||||
|
(a, b) => c; // n args
|
||||||
|
() => b; // 0 args
|
||||||
|
(a) => (b) => c; // func returns func returns func
|
||||||
|
(a) => ((b) => c); // So these parens are dropped
|
||||||
|
() => (b,c) => d; // func returns func returns func
|
||||||
|
a=>{return b;}
|
||||||
|
a => 'lel'; // Dropping the parens
|
||||||
|
}
|
||||||
|
expect_exact: "a=>b;(a,b)=>c;()=>b;a=>b=>c;a=>b=>c;()=>(b,c)=>d;a=>{return b};a=>\"lel\";"
|
||||||
|
}
|
||||||
|
|
||||||
|
regression_arrow_functions_and_hoist: {
|
||||||
|
options = {
|
||||||
|
hoist_vars: true,
|
||||||
|
hoist_funs: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(a) => b;
|
||||||
|
}
|
||||||
|
expect_exact: "a=>b;"
|
||||||
|
}
|
||||||
|
|
||||||
|
regression_assign_arrow_functions: {
|
||||||
|
input: {
|
||||||
|
oninstall = e => false;
|
||||||
|
oninstall = () => false;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
oninstall=e=>false;
|
||||||
|
oninstall=()=>false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
destructuring_arguments_1: {
|
||||||
|
input: {
|
||||||
|
(function ( a ) { });
|
||||||
|
(function ( [ a ] ) { });
|
||||||
|
(function ( [ a, b ] ) { });
|
||||||
|
(function ( [ [ a ] ] ) { });
|
||||||
|
(function ( [ [ a, b ] ] ) { });
|
||||||
|
(function ( [ a, [ b ] ] ) { });
|
||||||
|
(function ( [ [ b ], a ] ) { });
|
||||||
|
|
||||||
|
(function ( { a } ) { });
|
||||||
|
(function ( { a, b } ) { });
|
||||||
|
|
||||||
|
(function ( [ { a } ] ) { });
|
||||||
|
(function ( [ { a, b } ] ) { });
|
||||||
|
(function ( [ a, { b } ] ) { });
|
||||||
|
(function ( [ { b }, a ] ) { });
|
||||||
|
|
||||||
|
( [ a ] ) => { };
|
||||||
|
( [ a, b ] ) => { };
|
||||||
|
|
||||||
|
( { a } ) => { };
|
||||||
|
( { a, b, c, d, e } ) => { };
|
||||||
|
|
||||||
|
( [ a ] ) => b;
|
||||||
|
( [ a, b ] ) => c;
|
||||||
|
|
||||||
|
( { a } ) => b;
|
||||||
|
( { a, b } ) => c;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a){});
|
||||||
|
(function([a]){});
|
||||||
|
(function([a,b]){});
|
||||||
|
(function([[a]]){});
|
||||||
|
(function([[a,b]]){});
|
||||||
|
(function([a,[b]]){});
|
||||||
|
(function([[b],a]){});
|
||||||
|
|
||||||
|
(function({a}){});
|
||||||
|
(function({a,b}){});
|
||||||
|
|
||||||
|
(function([{a}]){});
|
||||||
|
(function([{a,b}]){});
|
||||||
|
(function([a,{b}]){});
|
||||||
|
(function([{b},a]){});
|
||||||
|
|
||||||
|
([a])=>{};
|
||||||
|
([a,b])=>{};
|
||||||
|
|
||||||
|
({a})=>{};
|
||||||
|
({a,b,c,d,e})=>{};
|
||||||
|
|
||||||
|
([a])=>b;
|
||||||
|
([a,b])=>c;
|
||||||
|
|
||||||
|
({a})=>b;
|
||||||
|
({a,b})=>c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
destructuring_arguments_2: {
|
||||||
|
input: {
|
||||||
|
(function([]) {});
|
||||||
|
(function({}) {});
|
||||||
|
(function([,,,,,]) {});
|
||||||
|
(function ([a, {b: c}]) {});
|
||||||
|
(function ([...args]) {});
|
||||||
|
(function ({x,}) {});
|
||||||
|
class a { *method({ [thrower()]: x } = {}) {}};
|
||||||
|
(function(a, b, c, d, [{e: [...f]}]){})(1, 2, 3, 4, [{e: [1, 2, 3]}]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function([]) {});
|
||||||
|
(function({}) {});
|
||||||
|
(function([,,,,,]) {});
|
||||||
|
(function ([a, {b: c}]) {});
|
||||||
|
(function ([...args]) {});
|
||||||
|
(function ({x,}) {});
|
||||||
|
class a { *method({ [thrower()]: x } = {}) {}};
|
||||||
|
(function(a, b, c, d, [{e: [...f]}]){})(1, 2, 3, 4, [{e: [1, 2, 3]}]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
destructuring_arguments_3: {
|
||||||
|
input: {
|
||||||
|
function fn3({x: {y: {z: {} = 42}}}) {}
|
||||||
|
const { cover = (function () {}), xCover = (0, function() {}) } = {};
|
||||||
|
let { cover = (function () {}), xCover = (0, function() {}) } = {};
|
||||||
|
var { cover = (function () {}), xCover = (0, function() {}) } = {};
|
||||||
|
}
|
||||||
|
expect_exact: "function fn3({x:{y:{z:{}=42}}}){}const{cover=function(){},xCover=(0,function(){})}={};let{cover=function(){},xCover=(0,function(){})}={};var{cover=function(){},xCover=(0,function(){})}={};"
|
||||||
|
}
|
||||||
|
|
||||||
|
default_arguments: {
|
||||||
|
input: {
|
||||||
|
function x(a = 6) { }
|
||||||
|
function x(a = (6 + 5)) { }
|
||||||
|
function x({ foo } = {}, [ bar ] = [ 1 ]) { }
|
||||||
|
}
|
||||||
|
expect_exact: "function x(a=6){}function x(a=6+5){}function x({foo}={},[bar]=[1]){}"
|
||||||
|
}
|
||||||
|
|
||||||
|
default_values_in_destructurings: {
|
||||||
|
input: {
|
||||||
|
function x({a=(4), b}) {}
|
||||||
|
function x([b, c=(12)]) {}
|
||||||
|
var { x = (6), y } = x;
|
||||||
|
var [ x, y = (6) ] = x;
|
||||||
|
}
|
||||||
|
expect_exact: "function x({a=4,b}){}function x([b,c=12]){}var{x=6,y}=x;var[x,y=6]=x;"
|
||||||
|
}
|
||||||
|
|
||||||
|
accept_duplicated_parameters_in_non_strict_without_spread_or_default_assignment: {
|
||||||
|
input: {
|
||||||
|
function a(b, b){}
|
||||||
|
function b({c: test, c: test}){}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function a(b, b){}
|
||||||
|
function b({c: test, c: test}){}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -54,56 +54,7 @@ dot_properties_es5: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub_properties: {
|
evaluate_length: {
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
properties: true
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
a[0] = 0;
|
|
||||||
a["0"] = 1;
|
|
||||||
a[3.14] = 2;
|
|
||||||
a["3" + ".14"] = 3;
|
|
||||||
a["i" + "f"] = 4;
|
|
||||||
a["foo" + " bar"] = 5;
|
|
||||||
a[0 / 0] = 6;
|
|
||||||
a[null] = 7;
|
|
||||||
a[undefined] = 8;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
a[0] = 0;
|
|
||||||
a[0] = 1;
|
|
||||||
a[3.14] = 2;
|
|
||||||
a[3.14] = 3;
|
|
||||||
a.if = 4;
|
|
||||||
a["foo bar"] = 5;
|
|
||||||
a[NaN] = 6;
|
|
||||||
a[null] = 7;
|
|
||||||
a[void 0] = 8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
evaluate_array_length: {
|
|
||||||
options = {
|
|
||||||
properties: true,
|
|
||||||
unsafe: true,
|
|
||||||
evaluate: true
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
a = [1, 2, 3].length;
|
|
||||||
a = [1, 2, 3].join()["len" + "gth"];
|
|
||||||
a = [1, 2, b].length;
|
|
||||||
a = [1, 2, 3].join(b).length;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
a = 3;
|
|
||||||
a = 5;
|
|
||||||
a = [1, 2, b].length;
|
|
||||||
a = [1, 2, 3].join(b).length;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
evaluate_string_length: {
|
|
||||||
options = {
|
options = {
|
||||||
properties: true,
|
properties: true,
|
||||||
unsafe: true,
|
unsafe: true,
|
||||||
@@ -148,7 +99,8 @@ mangle_unquoted_properties: {
|
|||||||
properties: false
|
properties: false
|
||||||
}
|
}
|
||||||
mangle_props = {
|
mangle_props = {
|
||||||
ignore_quoted: true
|
ignore_quoted: true,
|
||||||
|
reserved: []
|
||||||
}
|
}
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: false,
|
beautify: false,
|
||||||
@@ -539,121 +491,3 @@ first_256_hex_chars_as_properties: {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
native_prototype: {
|
|
||||||
options = {
|
|
||||||
unsafe_proto: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
Array.prototype.splice.apply(a, [1, 2, b, c]);
|
|
||||||
Object.prototype.hasOwnProperty.call(d, "foo");
|
|
||||||
String.prototype.indexOf.call(e, "bar");
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
[].splice.apply(a, [1, 2, b, c]);
|
|
||||||
({}).hasOwnProperty.call(d, "foo");
|
|
||||||
"".indexOf.call(e, "bar");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
accessor_boolean: {
|
|
||||||
input: {
|
|
||||||
var a = 1;
|
|
||||||
var b = {
|
|
||||||
get true() {
|
|
||||||
return a;
|
|
||||||
},
|
|
||||||
set false(c) {
|
|
||||||
a = c;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
console.log(b.true, b.false = 2, b.true);
|
|
||||||
}
|
|
||||||
expect_exact: 'var a=1;var b={get true(){return a},set false(c){a=c}};console.log(b.true,b.false=2,b.true);'
|
|
||||||
expect_stdout: "1 2 2"
|
|
||||||
}
|
|
||||||
|
|
||||||
accessor_get_set: {
|
|
||||||
input: {
|
|
||||||
var a = 1;
|
|
||||||
var b = {
|
|
||||||
get set() {
|
|
||||||
return a;
|
|
||||||
},
|
|
||||||
set get(c) {
|
|
||||||
a = c;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
console.log(b.set, b.get = 2, b.set);
|
|
||||||
}
|
|
||||||
expect_exact: 'var a=1;var b={get set(){return a},set get(c){a=c}};console.log(b.set,b.get=2,b.set);'
|
|
||||||
expect_stdout: "1 2 2"
|
|
||||||
}
|
|
||||||
|
|
||||||
accessor_null_undefined: {
|
|
||||||
input: {
|
|
||||||
var a = 1;
|
|
||||||
var b = {
|
|
||||||
get null() {
|
|
||||||
return a;
|
|
||||||
},
|
|
||||||
set undefined(c) {
|
|
||||||
a = c;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
console.log(b.null, b.undefined = 2, b.null);
|
|
||||||
}
|
|
||||||
expect_exact: 'var a=1;var b={get null(){return a},set undefined(c){a=c}};console.log(b.null,b.undefined=2,b.null);'
|
|
||||||
expect_stdout: "1 2 2"
|
|
||||||
}
|
|
||||||
|
|
||||||
accessor_number: {
|
|
||||||
input: {
|
|
||||||
var a = 1;
|
|
||||||
var b = {
|
|
||||||
get 42() {
|
|
||||||
return a;
|
|
||||||
},
|
|
||||||
set 42(c) {
|
|
||||||
a = c;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
console.log(b[42], b[42] = 2, b[42]);
|
|
||||||
}
|
|
||||||
expect_exact: 'var a=1;var b={get 42(){return a},set 42(c){a=c}};console.log(b[42],b[42]=2,b[42]);'
|
|
||||||
expect_stdout: "1 2 2"
|
|
||||||
}
|
|
||||||
|
|
||||||
accessor_string: {
|
|
||||||
input: {
|
|
||||||
var a = 1;
|
|
||||||
var b = {
|
|
||||||
get "a-b"() {
|
|
||||||
return a;
|
|
||||||
},
|
|
||||||
set "a-b"(c) {
|
|
||||||
a = c;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
console.log(b["a-b"], b["a-b"] = 2, b["a-b"]);
|
|
||||||
}
|
|
||||||
expect_exact: 'var a=1;var b={get"a-b"(){return a},set"a-b"(c){a=c}};console.log(b["a-b"],b["a-b"]=2,b["a-b"]);'
|
|
||||||
expect_stdout: "1 2 2"
|
|
||||||
}
|
|
||||||
|
|
||||||
accessor_this: {
|
|
||||||
input: {
|
|
||||||
var a = 1;
|
|
||||||
var b = {
|
|
||||||
get this() {
|
|
||||||
return a;
|
|
||||||
},
|
|
||||||
set this(c) {
|
|
||||||
a = c;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
console.log(b.this, b.this = 2, b.this);
|
|
||||||
}
|
|
||||||
expect_exact: 'var a=1;var b={get this(){return a},set this(c){a=c}};console.log(b.this,b.this=2,b.this);'
|
|
||||||
expect_stdout: "1 2 2"
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,295 +0,0 @@
|
|||||||
array: {
|
|
||||||
options = {
|
|
||||||
pure_funcs: [ "Math.floor" ],
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a;
|
|
||||||
function f(b) {
|
|
||||||
Math.floor(a / b);
|
|
||||||
Math.floor(c / b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a;
|
|
||||||
function f(b) {
|
|
||||||
c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func: {
|
|
||||||
options = {
|
|
||||||
pure_funcs: function(node) {
|
|
||||||
return !~node.args[0].print_to_string().indexOf("a");
|
|
||||||
},
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a, b) {
|
|
||||||
Math.floor(a / b);
|
|
||||||
Math.floor(c / b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a, b) {
|
|
||||||
Math.floor(c / b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
side_effects: {
|
|
||||||
options = {
|
|
||||||
pure_funcs: [ "console.log" ],
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a, b) {
|
|
||||||
console.log(a());
|
|
||||||
console.log(b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a, b) {
|
|
||||||
a();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unused: {
|
|
||||||
options = {
|
|
||||||
pure_funcs: [ "pure" ],
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function foo() {
|
|
||||||
var u = pure(1);
|
|
||||||
var x = pure(2);
|
|
||||||
var y = pure(x);
|
|
||||||
var z = pure(pure(side_effects()));
|
|
||||||
return pure(3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function foo() {
|
|
||||||
side_effects();
|
|
||||||
return pure(3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
babel: {
|
|
||||||
options = {
|
|
||||||
pure_funcs: [ "_classCallCheck" ],
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function _classCallCheck(instance, Constructor) {
|
|
||||||
if (!(instance instanceof Constructor))
|
|
||||||
throw new TypeError("Cannot call a class as a function");
|
|
||||||
}
|
|
||||||
var Foo = function Foo() {
|
|
||||||
_classCallCheck(this, Foo);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function _classCallCheck(instance, Constructor) {
|
|
||||||
if (!(instance instanceof Constructor))
|
|
||||||
throw new TypeError("Cannot call a class as a function");
|
|
||||||
}
|
|
||||||
var Foo = function() {
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
conditional: {
|
|
||||||
options = {
|
|
||||||
pure_funcs: [ "pure" ],
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
pure(1 | a() ? 2 & b() : 7 ^ c());
|
|
||||||
pure(1 | a() ? 2 & b() : 5);
|
|
||||||
pure(1 | a() ? 4 : 7 ^ c());
|
|
||||||
pure(1 | a() ? 4 : 5);
|
|
||||||
pure(3 ? 2 & b() : 7 ^ c());
|
|
||||||
pure(3 ? 2 & b() : 5);
|
|
||||||
pure(3 ? 4 : 7 ^ c());
|
|
||||||
pure(3 ? 4 : 5);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
1 | a() ? b() : c();
|
|
||||||
1 | a() && b();
|
|
||||||
1 | a() || c();
|
|
||||||
a();
|
|
||||||
3 ? b() : c();
|
|
||||||
3 && b();
|
|
||||||
3 || c();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
relational: {
|
|
||||||
options = {
|
|
||||||
pure_funcs: [ "foo" ],
|
|
||||||
side_effects :true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
foo() in foo();
|
|
||||||
foo() instanceof bar();
|
|
||||||
foo() < "bar";
|
|
||||||
bar() > foo();
|
|
||||||
bar() != bar();
|
|
||||||
bar() !== "bar";
|
|
||||||
"bar" == foo();
|
|
||||||
"bar" === bar();
|
|
||||||
"bar" >= "bar";
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
bar();
|
|
||||||
bar();
|
|
||||||
bar(), bar();
|
|
||||||
bar();
|
|
||||||
bar();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
arithmetic: {
|
|
||||||
options = {
|
|
||||||
pure_funcs: [ "foo" ],
|
|
||||||
side_effects :true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
foo() + foo();
|
|
||||||
foo() - bar();
|
|
||||||
foo() * "bar";
|
|
||||||
bar() / foo();
|
|
||||||
bar() & bar();
|
|
||||||
bar() | "bar";
|
|
||||||
"bar" >> foo();
|
|
||||||
"bar" << bar();
|
|
||||||
"bar" >>> "bar";
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
bar();
|
|
||||||
bar();
|
|
||||||
bar(), bar();
|
|
||||||
bar();
|
|
||||||
bar();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean_and: {
|
|
||||||
options = {
|
|
||||||
pure_funcs: [ "foo" ],
|
|
||||||
side_effects :true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
foo() && foo();
|
|
||||||
foo() && bar();
|
|
||||||
foo() && "bar";
|
|
||||||
bar() && foo();
|
|
||||||
bar() && bar();
|
|
||||||
bar() && "bar";
|
|
||||||
"bar" && foo();
|
|
||||||
"bar" && bar();
|
|
||||||
"bar" && "bar";
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
foo() && bar();
|
|
||||||
bar();
|
|
||||||
bar() && bar();
|
|
||||||
bar();
|
|
||||||
"bar" && bar();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean_or: {
|
|
||||||
options = {
|
|
||||||
pure_funcs: [ "foo" ],
|
|
||||||
side_effects :true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
foo() || foo();
|
|
||||||
foo() || bar();
|
|
||||||
foo() || "bar";
|
|
||||||
bar() || foo();
|
|
||||||
bar() || bar();
|
|
||||||
bar() || "bar";
|
|
||||||
"bar" || foo();
|
|
||||||
"bar" || bar();
|
|
||||||
"bar" || "bar";
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
foo() || bar();
|
|
||||||
bar();
|
|
||||||
bar() || bar();
|
|
||||||
bar();
|
|
||||||
"bar" || bar();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
assign: {
|
|
||||||
options = {
|
|
||||||
pure_funcs: [ "foo" ],
|
|
||||||
side_effects :true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a;
|
|
||||||
function f(b) {
|
|
||||||
a = foo();
|
|
||||||
b *= 4 + foo();
|
|
||||||
c >>= 0 | foo();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a;
|
|
||||||
function f(b) {
|
|
||||||
a = foo();
|
|
||||||
b *= 4 + foo();
|
|
||||||
c >>= 0 | foo();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unary: {
|
|
||||||
options = {
|
|
||||||
pure_funcs: [ "foo" ],
|
|
||||||
side_effects :true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
typeof foo();
|
|
||||||
typeof bar();
|
|
||||||
typeof "bar";
|
|
||||||
void foo();
|
|
||||||
void bar();
|
|
||||||
void "bar";
|
|
||||||
delete a[foo()];
|
|
||||||
delete a[bar()];
|
|
||||||
delete a["bar"];
|
|
||||||
a[foo()]++;
|
|
||||||
a[bar()]++;
|
|
||||||
a["bar"]++;
|
|
||||||
--a[foo()];
|
|
||||||
--a[bar()];
|
|
||||||
--a["bar"];
|
|
||||||
~foo();
|
|
||||||
~bar();
|
|
||||||
~"bar";
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
bar();
|
|
||||||
bar();
|
|
||||||
delete a[foo()];
|
|
||||||
delete a[bar()];
|
|
||||||
delete a["bar"];
|
|
||||||
a[foo()]++;
|
|
||||||
a[bar()]++;
|
|
||||||
a["bar"]++;
|
|
||||||
--a[foo()];
|
|
||||||
--a[bar()];
|
|
||||||
--a["bar"];
|
|
||||||
bar();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,180 +0,0 @@
|
|||||||
strict: {
|
|
||||||
options = {
|
|
||||||
pure_getters: "strict",
|
|
||||||
reduce_vars: false,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a, b = null, c = {};
|
|
||||||
a.prop;
|
|
||||||
b.prop;
|
|
||||||
c.prop;
|
|
||||||
d.prop;
|
|
||||||
null.prop;
|
|
||||||
(void 0).prop;
|
|
||||||
undefined.prop;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a, b = null, c = {};
|
|
||||||
a.prop;
|
|
||||||
b.prop;
|
|
||||||
c.prop;
|
|
||||||
d.prop;
|
|
||||||
null.prop;
|
|
||||||
(void 0).prop;
|
|
||||||
(void 0).prop;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
strict_reduce_vars: {
|
|
||||||
options = {
|
|
||||||
pure_getters: "strict",
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a, b = null, c = {};
|
|
||||||
a.prop;
|
|
||||||
b.prop;
|
|
||||||
c.prop;
|
|
||||||
d.prop;
|
|
||||||
null.prop;
|
|
||||||
(void 0).prop;
|
|
||||||
undefined.prop;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a, b = null, c = {};
|
|
||||||
a.prop;
|
|
||||||
b.prop;
|
|
||||||
d.prop;
|
|
||||||
null.prop;
|
|
||||||
(void 0).prop;
|
|
||||||
(void 0).prop;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe: {
|
|
||||||
options = {
|
|
||||||
pure_getters: true,
|
|
||||||
reduce_vars: false,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a, b = null, c = {};
|
|
||||||
a.prop;
|
|
||||||
b.prop;
|
|
||||||
c.prop;
|
|
||||||
d.prop;
|
|
||||||
null.prop;
|
|
||||||
(void 0).prop;
|
|
||||||
undefined.prop;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a, b = null, c = {};
|
|
||||||
d;
|
|
||||||
null.prop;
|
|
||||||
(void 0).prop;
|
|
||||||
(void 0).prop;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe_reduce_vars: {
|
|
||||||
options = {
|
|
||||||
pure_getters: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a, b = null, c = {};
|
|
||||||
a.prop;
|
|
||||||
b.prop;
|
|
||||||
c.prop;
|
|
||||||
d.prop;
|
|
||||||
null.prop;
|
|
||||||
(void 0).prop;
|
|
||||||
undefined.prop;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a, b = null, c = {};
|
|
||||||
d;
|
|
||||||
null.prop;
|
|
||||||
(void 0).prop;
|
|
||||||
(void 0).prop;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
chained: {
|
|
||||||
options = {
|
|
||||||
pure_getters: "strict",
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
a.b.c;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
a.b.c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impure_getter_1: {
|
|
||||||
options = {
|
|
||||||
pure_getters: "strict",
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
({
|
|
||||||
get a() {
|
|
||||||
console.log(1);
|
|
||||||
},
|
|
||||||
b: 1
|
|
||||||
}).a;
|
|
||||||
({
|
|
||||||
get a() {
|
|
||||||
console.log(1);
|
|
||||||
},
|
|
||||||
b: 1
|
|
||||||
}).b;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
({
|
|
||||||
get a() {
|
|
||||||
console.log(1);
|
|
||||||
},
|
|
||||||
b: 1
|
|
||||||
}).a;
|
|
||||||
({
|
|
||||||
get a() {
|
|
||||||
console.log(1);
|
|
||||||
},
|
|
||||||
b: 1
|
|
||||||
}).b;
|
|
||||||
}
|
|
||||||
expect_stdout: "1"
|
|
||||||
}
|
|
||||||
|
|
||||||
impure_getter_2: {
|
|
||||||
options = {
|
|
||||||
pure_getters: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
// will produce incorrect output because getter is not pure
|
|
||||||
({
|
|
||||||
get a() {
|
|
||||||
console.log(1);
|
|
||||||
},
|
|
||||||
b: 1
|
|
||||||
}).a;
|
|
||||||
({
|
|
||||||
get a() {
|
|
||||||
console.log(1);
|
|
||||||
},
|
|
||||||
b: 1
|
|
||||||
}).b;
|
|
||||||
}
|
|
||||||
expect: {}
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,49 +1,20 @@
|
|||||||
do_screw: {
|
do_screw: {
|
||||||
options = {
|
options = { screw_ie8: true };
|
||||||
screw_ie8: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
beautify = {
|
||||||
screw_ie8: true,
|
screw_ie8: true,
|
||||||
ascii_only: true,
|
ascii_only: true
|
||||||
}
|
};
|
||||||
input: {
|
|
||||||
f("\v");
|
input: f("\v");
|
||||||
}
|
expect_exact: 'f("\\v");';
|
||||||
expect_exact: 'f("\\v");'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dont_screw: {
|
dont_screw: {
|
||||||
options = {
|
options = { screw_ie8: false };
|
||||||
screw_ie8: false,
|
beautify = { screw_ie8: false, ascii_only: true };
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
screw_ie8: false,
|
|
||||||
ascii_only: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
f("\v");
|
|
||||||
}
|
|
||||||
expect_exact: 'f("\\x0B");'
|
|
||||||
}
|
|
||||||
|
|
||||||
do_screw_constants: {
|
input: f("\v");
|
||||||
options = {
|
expect_exact: 'f("\\x0B");';
|
||||||
screw_ie8: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
f(undefined, Infinity);
|
|
||||||
}
|
|
||||||
expect_exact: "f(void 0,1/0);"
|
|
||||||
}
|
|
||||||
|
|
||||||
dont_screw_constants: {
|
|
||||||
options = {
|
|
||||||
screw_ie8: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
f(undefined, Infinity);
|
|
||||||
}
|
|
||||||
expect_exact: "f(undefined,Infinity);"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
do_screw_try_catch: {
|
do_screw_try_catch: {
|
||||||
@@ -91,11 +62,11 @@ dont_screw_try_catch: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
bad = function(n){
|
bad = function(n){
|
||||||
return function(t){
|
return function(n){
|
||||||
try{
|
try{
|
||||||
n()
|
t()
|
||||||
} catch(n) {
|
} catch(t) {
|
||||||
t(n)
|
n(t)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -128,7 +99,6 @@ do_screw_try_catch_undefined: {
|
|||||||
return void 0===o
|
return void 0===o
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dont_screw_try_catch_undefined: {
|
dont_screw_try_catch_undefined: {
|
||||||
@@ -147,87 +117,14 @@ dont_screw_try_catch_undefined: {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function a(n){
|
function a(o){
|
||||||
try{
|
try{
|
||||||
throw "Stuff"
|
throw "Stuff"
|
||||||
} catch (undefined) {
|
} catch (n) {
|
||||||
console.log("caught: " + undefined)
|
console.log("caught: "+n)
|
||||||
}
|
}
|
||||||
console.log("undefined is " + undefined);
|
console.log("undefined is " + void 0);
|
||||||
return n === undefined
|
return void 0===o
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
reduce_vars: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
screw_ie8: false,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
screw_ie8: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
var a;
|
|
||||||
try {
|
|
||||||
x();
|
|
||||||
} catch (a) {
|
|
||||||
y();
|
|
||||||
}
|
|
||||||
alert(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {
|
|
||||||
var t;
|
|
||||||
try {
|
|
||||||
x();
|
|
||||||
} catch (t) {
|
|
||||||
y();
|
|
||||||
}
|
|
||||||
alert(t);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1586_1: {
|
|
||||||
options = {
|
|
||||||
screw_ie8: false,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
screw_ie8: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
try {
|
|
||||||
x();
|
|
||||||
} catch (err) {
|
|
||||||
console.log(err.message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_exact: "function f(){try{x()}catch(c){console.log(c.message)}}"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1586_2: {
|
|
||||||
options = {
|
|
||||||
screw_ie8: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
screw_ie8: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
try {
|
|
||||||
x();
|
|
||||||
} catch (err) {
|
|
||||||
console.log(err.message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_exact: "function f(){try{x()}catch(c){console.log(c.message)}}"
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -86,7 +86,6 @@ make_sequences_4: {
|
|||||||
switch (x = 5, y) {}
|
switch (x = 5, y) {}
|
||||||
with (x = 5, obj);
|
with (x = 5, obj);
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
lift_sequences_1: {
|
lift_sequences_1: {
|
||||||
@@ -104,18 +103,15 @@ lift_sequences_1: {
|
|||||||
lift_sequences_2: {
|
lift_sequences_2: {
|
||||||
options = { sequences: true, evaluate: true };
|
options = { sequences: true, evaluate: true };
|
||||||
input: {
|
input: {
|
||||||
var foo = 1, bar;
|
var foo, bar;
|
||||||
foo.x = (foo = {}, 10);
|
foo.x = (foo = {}, 10);
|
||||||
bar = (bar = {}, 10);
|
bar = (bar = {}, 10);
|
||||||
console.log(foo, bar);
|
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var foo = 1, bar;
|
var foo, bar;
|
||||||
foo.x = (foo = {}, 10),
|
foo.x = (foo = {}, 10),
|
||||||
bar = {}, bar = 10,
|
bar = {}, bar = 10;
|
||||||
console.log(foo, bar);
|
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
lift_sequences_3: {
|
lift_sequences_3: {
|
||||||
@@ -142,23 +138,6 @@ lift_sequences_4: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lift_sequences_5: {
|
|
||||||
options = {
|
|
||||||
sequences: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 2, b;
|
|
||||||
a *= (b, a = 4, 3);
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 2, b;
|
|
||||||
b, a *= (a = 4, 3),
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: "6"
|
|
||||||
}
|
|
||||||
|
|
||||||
for_sequences: {
|
for_sequences: {
|
||||||
options = { sequences: true };
|
options = { sequences: true };
|
||||||
input: {
|
input: {
|
||||||
@@ -190,447 +169,3 @@ for_sequences: {
|
|||||||
for (y = 5; false;);
|
for (y = 5; false;);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
limit_1: {
|
|
||||||
options = {
|
|
||||||
sequences: 3,
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
a;
|
|
||||||
b;
|
|
||||||
c;
|
|
||||||
d;
|
|
||||||
e;
|
|
||||||
f;
|
|
||||||
g;
|
|
||||||
h;
|
|
||||||
i;
|
|
||||||
j;
|
|
||||||
k;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
a, b, c;
|
|
||||||
d, e, f;
|
|
||||||
g, h, i;
|
|
||||||
j, k;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
limit_2: {
|
|
||||||
options = {
|
|
||||||
sequences: 3,
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
a, b;
|
|
||||||
c, d;
|
|
||||||
e, f;
|
|
||||||
g, h;
|
|
||||||
i, j;
|
|
||||||
k;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
a, b, c, d;
|
|
||||||
e, f, g, h;
|
|
||||||
i, j, k;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
negate_iife_for: {
|
|
||||||
options = {
|
|
||||||
sequences: true,
|
|
||||||
negate_iife: true,
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
(function() {})();
|
|
||||||
for (i = 0; i < 5; i++) console.log(i);
|
|
||||||
|
|
||||||
(function() {})();
|
|
||||||
for (; i < 5; i++) console.log(i);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
for (!function() {}(), i = 0; i < 5; i++) console.log(i);
|
|
||||||
for (function() {}(); i < 5; i++) console.log(i);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
iife: {
|
|
||||||
options = {
|
|
||||||
sequences: true,
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
x = 42;
|
|
||||||
(function a() {})();
|
|
||||||
!function b() {}();
|
|
||||||
~function c() {}();
|
|
||||||
+function d() {}();
|
|
||||||
-function e() {}();
|
|
||||||
void function f() {}();
|
|
||||||
typeof function g() {}();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
x = 42, function a() {}(), function b() {}(), function c() {}(),
|
|
||||||
function d() {}(), function e() {}(), function f() {}(), function g() {}();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe_undefined: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
if_return: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
unsafe: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(undefined) {
|
|
||||||
if (a)
|
|
||||||
return b;
|
|
||||||
if (c)
|
|
||||||
return d;
|
|
||||||
}
|
|
||||||
function g(undefined) {
|
|
||||||
if (a)
|
|
||||||
return b;
|
|
||||||
if (c)
|
|
||||||
return d;
|
|
||||||
e();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(undefined) {
|
|
||||||
return a ? b : c ? d : undefined;
|
|
||||||
}
|
|
||||||
function g(undefined) {
|
|
||||||
return a ? b : c ? d : void e();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1685: {
|
|
||||||
options = {
|
|
||||||
cascade: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 100, b = 10;
|
|
||||||
function f() {
|
|
||||||
var a = (a--, delete a && --b);
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
console.log(a, b);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 100, b = 10;
|
|
||||||
function f() {
|
|
||||||
var a = (a--, delete a && --b);
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
console.log(a, b);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
func_def_1: {
|
|
||||||
options = {
|
|
||||||
cascade: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
return f = 0, !!f;
|
|
||||||
}
|
|
||||||
console.log(f());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {
|
|
||||||
return !!(f = 0);
|
|
||||||
}
|
|
||||||
console.log(f());
|
|
||||||
}
|
|
||||||
expect_stdout: "false"
|
|
||||||
}
|
|
||||||
|
|
||||||
func_def_2: {
|
|
||||||
options = {
|
|
||||||
cascade: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(function f() {
|
|
||||||
return f = 0, !!f;
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(function f() {
|
|
||||||
return f = 0, !!f;
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect_stdout: "true"
|
|
||||||
}
|
|
||||||
|
|
||||||
func_def_3: {
|
|
||||||
options = {
|
|
||||||
cascade: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
function g() {}
|
|
||||||
return g = 0, !!g;
|
|
||||||
}
|
|
||||||
console.log(f());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {
|
|
||||||
function g() {}
|
|
||||||
return !!(g = 0);
|
|
||||||
}
|
|
||||||
console.log(f());
|
|
||||||
}
|
|
||||||
expect_stdout: "false"
|
|
||||||
}
|
|
||||||
|
|
||||||
func_def_4: {
|
|
||||||
options = {
|
|
||||||
cascade: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
function g() {
|
|
||||||
return g = 0, !!g;
|
|
||||||
}
|
|
||||||
return g();
|
|
||||||
}
|
|
||||||
console.log(f());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {
|
|
||||||
function g() {
|
|
||||||
return !!(g = 0);
|
|
||||||
}
|
|
||||||
return g();
|
|
||||||
}
|
|
||||||
console.log(f());
|
|
||||||
}
|
|
||||||
expect_stdout: "false"
|
|
||||||
}
|
|
||||||
|
|
||||||
func_def_5: {
|
|
||||||
options = {
|
|
||||||
cascade: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
return function g(){
|
|
||||||
return g = 0, !!g;
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
console.log(f());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {
|
|
||||||
return function g(){
|
|
||||||
return g = 0, !!g;
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
console.log(f());
|
|
||||||
}
|
|
||||||
expect_stdout: "true"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1758: {
|
|
||||||
options = {
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(function(c) {
|
|
||||||
var undefined = 42;
|
|
||||||
return function() {
|
|
||||||
c--;
|
|
||||||
c--, c.toString();
|
|
||||||
return;
|
|
||||||
}();
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(function(c) {
|
|
||||||
var undefined = 42;
|
|
||||||
return function() {
|
|
||||||
return c--, c--, c.toString(), void 0;
|
|
||||||
}();
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect_stdout: "undefined"
|
|
||||||
}
|
|
||||||
|
|
||||||
delete_seq_1: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(delete (1, undefined));
|
|
||||||
console.log(delete (1, void 0));
|
|
||||||
console.log(delete (1, Infinity));
|
|
||||||
console.log(delete (1, 1 / 0));
|
|
||||||
console.log(delete (1, NaN));
|
|
||||||
console.log(delete (1, 0 / 0));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log((void 0, !0));
|
|
||||||
console.log((void 0, !0));
|
|
||||||
console.log((1 / 0, !0));
|
|
||||||
console.log((1 / 0, !0));
|
|
||||||
console.log((NaN, !0));
|
|
||||||
console.log((0 / 0, !0));
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
delete_seq_2: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(delete (1, 2, undefined));
|
|
||||||
console.log(delete (1, 2, void 0));
|
|
||||||
console.log(delete (1, 2, Infinity));
|
|
||||||
console.log(delete (1, 2, 1 / 0));
|
|
||||||
console.log(delete (1, 2, NaN));
|
|
||||||
console.log(delete (1, 2, 0 / 0));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log((void 0, !0));
|
|
||||||
console.log((void 0, !0));
|
|
||||||
console.log((1 / 0, !0));
|
|
||||||
console.log((1 / 0, !0));
|
|
||||||
console.log((NaN, !0));
|
|
||||||
console.log((0 / 0, !0));
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
delete_seq_3: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
keep_infinity: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(delete (1, 2, undefined));
|
|
||||||
console.log(delete (1, 2, void 0));
|
|
||||||
console.log(delete (1, 2, Infinity));
|
|
||||||
console.log(delete (1, 2, 1 / 0));
|
|
||||||
console.log(delete (1, 2, NaN));
|
|
||||||
console.log(delete (1, 2, 0 / 0));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log((void 0, !0));
|
|
||||||
console.log((void 0, !0));
|
|
||||||
console.log((Infinity, !0));
|
|
||||||
console.log((1 / 0, !0));
|
|
||||||
console.log((NaN, !0));
|
|
||||||
console.log((0 / 0, !0));
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
delete_seq_4: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {}
|
|
||||||
console.log(delete (f(), undefined));
|
|
||||||
console.log(delete (f(), void 0));
|
|
||||||
console.log(delete (f(), Infinity));
|
|
||||||
console.log(delete (f(), 1 / 0));
|
|
||||||
console.log(delete (f(), NaN));
|
|
||||||
console.log(delete (f(), 0 / 0));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {}
|
|
||||||
console.log((f(), !0)),
|
|
||||||
console.log((f(), !0)),
|
|
||||||
console.log((f(), !0)),
|
|
||||||
console.log((f(), !0)),
|
|
||||||
console.log((f(), !0)),
|
|
||||||
console.log((f(), !0));
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
delete_seq_5: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
keep_infinity: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {}
|
|
||||||
console.log(delete (f(), undefined));
|
|
||||||
console.log(delete (f(), void 0));
|
|
||||||
console.log(delete (f(), Infinity));
|
|
||||||
console.log(delete (f(), 1 / 0));
|
|
||||||
console.log(delete (f(), NaN));
|
|
||||||
console.log(delete (f(), 0 / 0));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {}
|
|
||||||
console.log((f(), !0)),
|
|
||||||
console.log((f(), !0)),
|
|
||||||
console.log((f(), !0)),
|
|
||||||
console.log((f(), !0)),
|
|
||||||
console.log((f(), !0)),
|
|
||||||
console.log((f(), !0));
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
delete_seq_6: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a;
|
|
||||||
console.log(delete (1, a));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a;
|
|
||||||
console.log((a, !0));
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
reassign_const: {
|
|
||||||
options = {
|
|
||||||
cascade: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
const a = 1;
|
|
||||||
a++;
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
console.log(f());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {
|
|
||||||
const a = 1;
|
|
||||||
return a++, a;
|
|
||||||
}
|
|
||||||
console.log(f());
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|||||||
9
test/compress/super.js
Normal file
9
test/compress/super.js
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
|
||||||
|
super_can_be_parsed: {
|
||||||
|
input: {
|
||||||
|
super(1,2);
|
||||||
|
super.meth();
|
||||||
|
}
|
||||||
|
expect_exact: "super(1,2);super.meth();"
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,10 +1,5 @@
|
|||||||
constant_switch_1: {
|
constant_switch_1: {
|
||||||
options = {
|
options = { dead_code: true, evaluate: true };
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
side_effects: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
switch (1+1) {
|
switch (1+1) {
|
||||||
case 1: foo(); break;
|
case 1: foo(); break;
|
||||||
@@ -18,12 +13,7 @@ constant_switch_1: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
constant_switch_2: {
|
constant_switch_2: {
|
||||||
options = {
|
options = { dead_code: true, evaluate: true };
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
side_effects: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
switch (1) {
|
switch (1) {
|
||||||
case 1: foo();
|
case 1: foo();
|
||||||
@@ -38,12 +28,7 @@ constant_switch_2: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
constant_switch_3: {
|
constant_switch_3: {
|
||||||
options = {
|
options = { dead_code: true, evaluate: true };
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
side_effects: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
switch (10) {
|
switch (10) {
|
||||||
case 1: foo();
|
case 1: foo();
|
||||||
@@ -59,12 +44,7 @@ constant_switch_3: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
constant_switch_4: {
|
constant_switch_4: {
|
||||||
options = {
|
options = { dead_code: true, evaluate: true };
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
side_effects: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
switch (2) {
|
switch (2) {
|
||||||
case 1:
|
case 1:
|
||||||
@@ -85,12 +65,7 @@ constant_switch_4: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
constant_switch_5: {
|
constant_switch_5: {
|
||||||
options = {
|
options = { dead_code: true, evaluate: true };
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
side_effects: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
switch (1) {
|
switch (1) {
|
||||||
case 1:
|
case 1:
|
||||||
@@ -119,12 +94,7 @@ constant_switch_5: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
constant_switch_6: {
|
constant_switch_6: {
|
||||||
options = {
|
options = { dead_code: true, evaluate: true };
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
side_effects: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
OUT: {
|
OUT: {
|
||||||
foo();
|
foo();
|
||||||
@@ -153,12 +123,7 @@ constant_switch_6: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
constant_switch_7: {
|
constant_switch_7: {
|
||||||
options = {
|
options = { dead_code: true, evaluate: true };
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
side_effects: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
OUT: {
|
OUT: {
|
||||||
foo();
|
foo();
|
||||||
@@ -196,12 +161,7 @@ constant_switch_7: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
constant_switch_8: {
|
constant_switch_8: {
|
||||||
options = {
|
options = { dead_code: true, evaluate: true };
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
side_effects: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
OUT: switch (1) {
|
OUT: switch (1) {
|
||||||
case 1:
|
case 1:
|
||||||
@@ -225,12 +185,7 @@ constant_switch_8: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
constant_switch_9: {
|
constant_switch_9: {
|
||||||
options = {
|
options = { dead_code: true, evaluate: true };
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
side_effects: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
OUT: switch (1) {
|
OUT: switch (1) {
|
||||||
case 1:
|
case 1:
|
||||||
@@ -255,10 +210,7 @@ constant_switch_9: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_default_1: {
|
drop_default_1: {
|
||||||
options = {
|
options = { dead_code: true };
|
||||||
dead_code: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
switch (foo) {
|
switch (foo) {
|
||||||
case 'bar': baz();
|
case 'bar': baz();
|
||||||
@@ -273,10 +225,7 @@ drop_default_1: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_default_2: {
|
drop_default_2: {
|
||||||
options = {
|
options = { dead_code: true };
|
||||||
dead_code: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
switch (foo) {
|
switch (foo) {
|
||||||
case 'bar': baz(); break;
|
case 'bar': baz(); break;
|
||||||
@@ -292,10 +241,7 @@ drop_default_2: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
keep_default: {
|
keep_default: {
|
||||||
options = {
|
options = { dead_code: true };
|
||||||
dead_code: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
switch (foo) {
|
switch (foo) {
|
||||||
case 'bar': baz();
|
case 'bar': baz();
|
||||||
@@ -312,507 +258,3 @@ keep_default: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1663: {
|
|
||||||
options = {
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
side_effects: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 100, b = 10;
|
|
||||||
function f() {
|
|
||||||
switch (1) {
|
|
||||||
case 1:
|
|
||||||
b = a++;
|
|
||||||
return ++b;
|
|
||||||
default:
|
|
||||||
var b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
console.log(a, b);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 100, b = 10;
|
|
||||||
function f() {
|
|
||||||
var b;
|
|
||||||
b = a++;
|
|
||||||
return ++b;
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
console.log(a, b);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
drop_case: {
|
|
||||||
options = {
|
|
||||||
dead_code: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
switch (foo) {
|
|
||||||
case 'bar': baz(); break;
|
|
||||||
case 'moo':
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
switch (foo) {
|
|
||||||
case 'bar': baz();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
keep_case: {
|
|
||||||
options = {
|
|
||||||
dead_code: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
switch (foo) {
|
|
||||||
case 'bar': baz(); break;
|
|
||||||
case moo:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
switch (foo) {
|
|
||||||
case 'bar': baz(); break;
|
|
||||||
case moo:
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_376: {
|
|
||||||
options = {
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
switch (true) {
|
|
||||||
case boolCondition:
|
|
||||||
console.log(1);
|
|
||||||
break;
|
|
||||||
case false:
|
|
||||||
console.log(2);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
switch (true) {
|
|
||||||
case boolCondition:
|
|
||||||
console.log(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_441_1: {
|
|
||||||
options = {
|
|
||||||
dead_code: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
switch (foo) {
|
|
||||||
case bar:
|
|
||||||
qux();
|
|
||||||
break;
|
|
||||||
case baz:
|
|
||||||
qux();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
qux();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
switch (foo) {
|
|
||||||
case bar:
|
|
||||||
case baz:
|
|
||||||
default:
|
|
||||||
qux();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_441_2: {
|
|
||||||
options = {
|
|
||||||
dead_code: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
switch (foo) {
|
|
||||||
case bar:
|
|
||||||
// TODO: Fold into the case below
|
|
||||||
qux();
|
|
||||||
break;
|
|
||||||
case fall:
|
|
||||||
case baz:
|
|
||||||
qux();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
qux();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
switch (foo) {
|
|
||||||
case bar:
|
|
||||||
qux();
|
|
||||||
break;
|
|
||||||
case fall:
|
|
||||||
case baz:
|
|
||||||
default:
|
|
||||||
qux();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1674: {
|
|
||||||
options = {
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
side_effects: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
switch (0) {
|
|
||||||
default:
|
|
||||||
console.log("FAIL");
|
|
||||||
break;
|
|
||||||
case 0:
|
|
||||||
console.log("PASS");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1679: {
|
|
||||||
options = {
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 100, b = 10;
|
|
||||||
function f() {
|
|
||||||
switch (--b) {
|
|
||||||
default:
|
|
||||||
case !function x() {}:
|
|
||||||
break;
|
|
||||||
case b--:
|
|
||||||
switch (0) {
|
|
||||||
default:
|
|
||||||
case a--:
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case (a++):
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
console.log(a, b);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 100, b = 10;
|
|
||||||
function f() {
|
|
||||||
switch (--b) {
|
|
||||||
default:
|
|
||||||
case !function x() {}:
|
|
||||||
break;
|
|
||||||
case b--:
|
|
||||||
switch (0) {
|
|
||||||
default:
|
|
||||||
case a--:
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case (a++):
|
|
||||||
}
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
console.log(a, b);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1680_1: {
|
|
||||||
options = {
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(x) {
|
|
||||||
console.log(x);
|
|
||||||
return x + 1;
|
|
||||||
}
|
|
||||||
switch (2) {
|
|
||||||
case f(0):
|
|
||||||
case f(1):
|
|
||||||
f(2);
|
|
||||||
case 2:
|
|
||||||
case f(3):
|
|
||||||
case f(4):
|
|
||||||
f(5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(x) {
|
|
||||||
console.log(x);
|
|
||||||
return x + 1;
|
|
||||||
}
|
|
||||||
switch (2) {
|
|
||||||
case f(0):
|
|
||||||
case f(1):
|
|
||||||
f(2);
|
|
||||||
case 2:
|
|
||||||
f(5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"0",
|
|
||||||
"1",
|
|
||||||
"2",
|
|
||||||
"5",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1680_2: {
|
|
||||||
options = {
|
|
||||||
dead_code: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 100, b = 10;
|
|
||||||
switch (b) {
|
|
||||||
case a--:
|
|
||||||
break;
|
|
||||||
case b:
|
|
||||||
var c;
|
|
||||||
break;
|
|
||||||
case a:
|
|
||||||
break;
|
|
||||||
case a--:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
console.log(a, b);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 100, b = 10;
|
|
||||||
switch (b) {
|
|
||||||
case a--:
|
|
||||||
break;
|
|
||||||
case b:
|
|
||||||
var c;
|
|
||||||
break;
|
|
||||||
case a:
|
|
||||||
case a--:
|
|
||||||
}
|
|
||||||
console.log(a, b);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1690_1: {
|
|
||||||
options = {
|
|
||||||
dead_code: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
switch (console.log("PASS")) {}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1690_2: {
|
|
||||||
options = {
|
|
||||||
dead_code: false,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
switch (console.log("PASS")) {}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
switch (console.log("PASS")) {}
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
if_switch_typeof: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
dead_code: true,
|
|
||||||
side_effects: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
if (a) switch(typeof b) {}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1698: {
|
|
||||||
options = {
|
|
||||||
side_effects: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 1;
|
|
||||||
!function() {
|
|
||||||
switch (a++) {}
|
|
||||||
}();
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 1;
|
|
||||||
!function() {
|
|
||||||
switch (a++) {}
|
|
||||||
}();
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: "2"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1705_1: {
|
|
||||||
options = {
|
|
||||||
dead_code: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 0;
|
|
||||||
switch (a) {
|
|
||||||
default:
|
|
||||||
console.log("FAIL");
|
|
||||||
case 0:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 0;
|
|
||||||
switch (a) {
|
|
||||||
default:
|
|
||||||
console.log("FAIL");
|
|
||||||
case 0:
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1705_2: {
|
|
||||||
options = {
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
switches: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 0;
|
|
||||||
switch (a) {
|
|
||||||
default:
|
|
||||||
console.log("FAIL");
|
|
||||||
case 0:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1705_3: {
|
|
||||||
options = {
|
|
||||||
dead_code: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
switch (a) {
|
|
||||||
case 0:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
a;
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
beautify: {
|
|
||||||
beautify = {
|
|
||||||
beautify: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
switch (a) {
|
|
||||||
case 0:
|
|
||||||
case 1:
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
default:
|
|
||||||
}
|
|
||||||
switch (b) {
|
|
||||||
case 3:
|
|
||||||
foo();
|
|
||||||
bar();
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"switch (a) {",
|
|
||||||
" case 0:",
|
|
||||||
" case 1:",
|
|
||||||
" break;",
|
|
||||||
"",
|
|
||||||
" case 2:",
|
|
||||||
" default:",
|
|
||||||
"}",
|
|
||||||
"",
|
|
||||||
"switch (b) {",
|
|
||||||
" case 3:",
|
|
||||||
" foo();",
|
|
||||||
" bar();",
|
|
||||||
"",
|
|
||||||
" default:",
|
|
||||||
" break;",
|
|
||||||
"}",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1758: {
|
|
||||||
options = {
|
|
||||||
dead_code: true,
|
|
||||||
switches: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 1, b = 2;
|
|
||||||
switch (a--) {
|
|
||||||
default:
|
|
||||||
b++;
|
|
||||||
}
|
|
||||||
console.log(a, b);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 1, b = 2;
|
|
||||||
a--;
|
|
||||||
b++;
|
|
||||||
console.log(a, b);
|
|
||||||
}
|
|
||||||
expect_stdout: "0 3"
|
|
||||||
}
|
|
||||||
|
|||||||
379
test/compress/template-string.js
Normal file
379
test/compress/template-string.js
Normal file
@@ -0,0 +1,379 @@
|
|||||||
|
template_strings: {
|
||||||
|
beautify = {
|
||||||
|
quote_style: 3
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
``;
|
||||||
|
`xx\`x`;
|
||||||
|
`${ foo + 2 }`;
|
||||||
|
` foo ${ bar + `baz ${ qux }` }`;
|
||||||
|
}
|
||||||
|
expect_exact: "``;`xx\\`x`;`${foo+2}`;` foo ${bar+`baz ${qux}`}`;";
|
||||||
|
}
|
||||||
|
|
||||||
|
template_string_prefixes: {
|
||||||
|
beautify = {
|
||||||
|
quote_style: 3
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
String.raw`foo`;
|
||||||
|
foo `bar`;
|
||||||
|
}
|
||||||
|
expect_exact: "String.raw`foo`;foo`bar`;";
|
||||||
|
}
|
||||||
|
|
||||||
|
template_strings_ascii_only: {
|
||||||
|
beautify = {
|
||||||
|
ascii_only: true,
|
||||||
|
quote_style: 3
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var foo = `foo
|
||||||
|
bar
|
||||||
|
ↂωↂ`;
|
||||||
|
var bar = `\``;
|
||||||
|
}
|
||||||
|
expect_exact: "var foo=`foo\\n bar\\n \\u2182\\u03c9\\u2182`;var bar=`\\``;"
|
||||||
|
}
|
||||||
|
|
||||||
|
template_strings_without_ascii_only: {
|
||||||
|
beautify = {
|
||||||
|
quote_style: 3
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var foo = `foo
|
||||||
|
bar
|
||||||
|
ↂωↂ`
|
||||||
|
}
|
||||||
|
expect_exact: "var foo=`foo\n bar\n ↂωↂ`;"
|
||||||
|
}
|
||||||
|
|
||||||
|
template_string_with_constant_expression: {
|
||||||
|
options = {
|
||||||
|
evaluate: true
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
quote_style: 3
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var foo = `${4 + 4} equals 4 + 4`;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var foo = `8 equals 4 + 4`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template_string_with_predefined_constants: {
|
||||||
|
options = {
|
||||||
|
evaluate: true
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
quote_style: 3
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var foo = `This is ${undefined}`;
|
||||||
|
var bar = `This is ${NaN}`;
|
||||||
|
var baz = `This is ${null}`;
|
||||||
|
var foofoo = `This is ${Infinity}`;
|
||||||
|
var foobar = "This is ${1/0}";
|
||||||
|
var foobaz = 'This is ${1/0}';
|
||||||
|
var barfoo = "This is ${NaN}";
|
||||||
|
var bazfoo = "This is ${null}";
|
||||||
|
var bazbaz = `This is ${1/0}`;
|
||||||
|
var barbar = `This is ${0/0}`;
|
||||||
|
var barbar = "This is ${0/0}";
|
||||||
|
var barber = 'This is ${0/0}';
|
||||||
|
|
||||||
|
var a = `${4**11}`; // 8 in template vs 7 chars - 4194304
|
||||||
|
var b = `${4**12}`; // 8 in template vs 8 chars - 16777216
|
||||||
|
var c = `${4**14}`; // 8 in template vs 9 chars - 268435456
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var foo = `This is undefined`;
|
||||||
|
var bar = `This is NaN`;
|
||||||
|
var baz = `This is null`;
|
||||||
|
var foofoo = `This is ${1/0}`;
|
||||||
|
var foobar = "This is ${1/0}";
|
||||||
|
var foobaz = 'This is ${1/0}';
|
||||||
|
var barfoo = "This is ${NaN}";
|
||||||
|
var bazfoo = "This is ${null}";
|
||||||
|
var bazbaz = `This is ${1/0}`;
|
||||||
|
var barbar = `This is NaN`;
|
||||||
|
var barbar = "This is ${0/0}";
|
||||||
|
var barber = 'This is ${0/0}';
|
||||||
|
|
||||||
|
var a = `4194304`;
|
||||||
|
var b = `16777216`; // Potential for further concatentation
|
||||||
|
var c = `${4**14}`; // Not worth converting
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template_string_evaluate_with_many_segments: {
|
||||||
|
options = {
|
||||||
|
evaluate: true
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
quote_style: 3
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var foo = `Hello ${guest()}, welcome to ${location()}${"."}`;
|
||||||
|
var bar = `${1}${2}${3}${4}${5}${6}${7}${8}${9}${0}`;
|
||||||
|
var baz = `${foobar()}${foobar()}${foobar()}${foobar()}`;
|
||||||
|
var buzz = `${1}${foobar()}${2}${foobar()}${3}${foobar()}`;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var foo = `Hello ${guest()}, welcome to ${location()}.`;
|
||||||
|
var bar = `1234567890`;
|
||||||
|
var baz = `${foobar()}${foobar()}${foobar()}${foobar()}`;
|
||||||
|
var buzz = `1${foobar()}2${foobar()}3${foobar()}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template_string_with_many_segments: {
|
||||||
|
beautify = {
|
||||||
|
quote_style: 3
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var foo = `Hello ${guest()}, welcome to ${location()}${"."}`;
|
||||||
|
var bar = `${1}${2}${3}${4}${5}${6}${7}${8}${9}${0}`;
|
||||||
|
var baz = `${foobar()}${foobar()}${foobar()}${foobar()}`;
|
||||||
|
var buzz = `${1}${foobar()}${2}${foobar()}${3}${foobar()}`;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var foo = `Hello ${guest()}, welcome to ${location()}${"."}`;
|
||||||
|
var bar = `${1}${2}${3}${4}${5}${6}${7}${8}${9}${0}`;
|
||||||
|
var baz = `${foobar()}${foobar()}${foobar()}${foobar()}`;
|
||||||
|
var buzz = `${1}${foobar()}${2}${foobar()}${3}${foobar()}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template_string_to_normal_string: {
|
||||||
|
options = {
|
||||||
|
evaluate: true
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
quote_style: 0
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var foo = `This is ${undefined}`;
|
||||||
|
var bar = "Decimals " + `${1}${2}${3}${4}${5}${6}${7}${8}${9}${0}`;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var foo = `This is undefined`;
|
||||||
|
var bar = "Decimals 1234567890";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template_concattenating_string: {
|
||||||
|
options = {
|
||||||
|
evaluate: true
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
quote_style: 3 // Yes, keep quotes
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var foo = "Have a nice " + `day. ${`day. ` + `day.`}`;
|
||||||
|
var bar = "Have a nice " + `${day()}`;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var foo = "Have a nice day. day. day.";
|
||||||
|
var bar = "Have a nice " + `${day()}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
evaluate_nested_templates: {
|
||||||
|
options = {
|
||||||
|
evaluate: true
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
quote_style: 0
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var baz = `${`${`${`foo`}`}`}`;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var baz = `foo`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enforce_double_quotes: {
|
||||||
|
beautify = {
|
||||||
|
quote_style: 1
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var foo = `Hello world`;
|
||||||
|
var bar = `Hello ${'world'}`;
|
||||||
|
var baz = `Hello ${world()}`;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var foo = `Hello world`;
|
||||||
|
var bar = `Hello ${"world"}`;
|
||||||
|
var baz = `Hello ${world()}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enforce_single_quotes: {
|
||||||
|
beautify = {
|
||||||
|
quote_style: 2
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var foo = `Hello world`;
|
||||||
|
var bar = `Hello ${"world"}`;
|
||||||
|
var baz = `Hello ${world()}`;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var foo = `Hello world`;
|
||||||
|
var bar = `Hello ${'world'}`;
|
||||||
|
var baz = `Hello ${world()}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enforce_double_quotes_and_evaluate: {
|
||||||
|
beautify = {
|
||||||
|
quote_style: 1
|
||||||
|
}
|
||||||
|
options = {
|
||||||
|
evaluate: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var foo = `Hello world`;
|
||||||
|
var bar = `Hello ${'world'}`;
|
||||||
|
var baz = `Hello ${world()}`;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var foo = `Hello world`;
|
||||||
|
var bar = `Hello world`;
|
||||||
|
var baz = `Hello ${world()}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enforce_single_quotes_and_evaluate: {
|
||||||
|
beautify = {
|
||||||
|
quote_style: 2
|
||||||
|
}
|
||||||
|
options = {
|
||||||
|
evaluate: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var foo = `Hello world`;
|
||||||
|
var bar = `Hello ${"world"}`;
|
||||||
|
var baz = `Hello ${world()}`;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var foo = `Hello world`;
|
||||||
|
var bar = `Hello world`;
|
||||||
|
var baz = `Hello ${world()}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
respect_inline_script: {
|
||||||
|
beautify = {
|
||||||
|
inline_script: true,
|
||||||
|
quote_style: 3
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var foo = `</script>${content}`;
|
||||||
|
var bar = `<!--`;
|
||||||
|
var baz = `-->`;
|
||||||
|
}
|
||||||
|
expect_exact: "var foo=`<\\/script>${content}`;var bar=`\\x3c!--`;var baz=`--\\x3e`;";
|
||||||
|
}
|
||||||
|
|
||||||
|
do_not_optimize_tagged_template_1: {
|
||||||
|
beautify = {
|
||||||
|
quote_style: 0
|
||||||
|
}
|
||||||
|
options = {
|
||||||
|
evaluate: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var foo = tag`Shall not be optimized. ${"But " + "this " + "is " + "fine."}`;
|
||||||
|
var bar = tag`Don't even mind changing my quotes!`;
|
||||||
|
}
|
||||||
|
expect_exact:
|
||||||
|
'var foo=tag`Shall not be optimized. ${"But this is fine."}`;var bar=tag`Don\'t even mind changing my quotes!`;';
|
||||||
|
}
|
||||||
|
|
||||||
|
do_not_optimize_tagged_template_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var foo = tag`test` + " something out";
|
||||||
|
}
|
||||||
|
expect_exact: 'var foo=tag`test`+" something out";';
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_raw_content_in_tagged_template: {
|
||||||
|
options = {
|
||||||
|
evaluate: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var foo = tag`\u0020\u{20}\u{00020}\x20\40\040 `;
|
||||||
|
}
|
||||||
|
expect_exact: "var foo=tag`\\u0020\\u{20}\\u{00020}\\x20\\40\\040 `;";
|
||||||
|
}
|
||||||
|
|
||||||
|
allow_chained_templates: {
|
||||||
|
input: {
|
||||||
|
var foo = tag`a``b``c``d`;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var foo = tag`a``b``c``d`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
check_escaped_chars: {
|
||||||
|
input: {
|
||||||
|
var foo = `\u0020\u{20}\u{00020}\x20\40\040 `;
|
||||||
|
}
|
||||||
|
expect_exact: "var foo=` `;";
|
||||||
|
}
|
||||||
|
|
||||||
|
escape_dollar_curly: {
|
||||||
|
options = {
|
||||||
|
evaluate: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(`\$\{ beep \}`)
|
||||||
|
console.log(`${1-0}\${2-0}$\{3-0}${4-0}`)
|
||||||
|
console.log(`$${""}{not an expression}`)
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(`\\${ beep }`);console.log(`1\\${2-0}\\${3-0}4`);console.log(`\\${not an expression}`);"
|
||||||
|
}
|
||||||
|
|
||||||
|
template_starting_with_newline: {
|
||||||
|
options = {
|
||||||
|
dead_code: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function foo(e) {
|
||||||
|
return `
|
||||||
|
this is a template string!`;
|
||||||
|
};
|
||||||
|
} expect_exact: "function foo(e){return`\nthis is a template string!`}"
|
||||||
|
}
|
||||||
|
|
||||||
|
template_with_newline: {
|
||||||
|
options = {
|
||||||
|
dead_code: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function foo(e) {
|
||||||
|
return `yep,
|
||||||
|
this is a template string!`;
|
||||||
|
};
|
||||||
|
} expect_exact: "function foo(e){return`yep,\nthis is a template string!`}"
|
||||||
|
}
|
||||||
|
|
||||||
|
template_ending_with_newline: {
|
||||||
|
options = {
|
||||||
|
dead_code: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function foo(e) {
|
||||||
|
return `this is a template string!
|
||||||
|
`;
|
||||||
|
};
|
||||||
|
} expect_exact: "function foo(e){return`this is a template string!\n`}"
|
||||||
|
}
|
||||||
@@ -1,130 +0,0 @@
|
|||||||
booleans_evaluate: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(typeof void 0 != "undefined");
|
|
||||||
console.log(1 == 1, 1 === 1)
|
|
||||||
console.log(1 != 1, 1 !== 1)
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(!1);
|
|
||||||
console.log(!0, !0);
|
|
||||||
console.log(!1, !1);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
booleans_global_defs: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
evaluate: true,
|
|
||||||
global_defs: {
|
|
||||||
A: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(A == 1);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(!0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
condition_evaluate: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
dead_code: false,
|
|
||||||
evaluate: true,
|
|
||||||
loops: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
while (1 === 2);
|
|
||||||
for (; 1 == true;);
|
|
||||||
if (void 0 == null);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
while (!1);
|
|
||||||
for (; !0;);
|
|
||||||
if (!0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if_else_empty: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
if ({} ? a : b); else {}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
!{} ? b : a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
label_if_break: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
L: if (true) {
|
|
||||||
a;
|
|
||||||
break L;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
while_if_break: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
loops: true,
|
|
||||||
sequences: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
while (a) {
|
|
||||||
if (b) if(c) d;
|
|
||||||
if (e) break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
for(; a && (b && c && d, !e););
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if_return: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
conditionals: true,
|
|
||||||
if_return: true,
|
|
||||||
sequences: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(w, x, y, z) {
|
|
||||||
if (x) return;
|
|
||||||
if (w) {
|
|
||||||
if (y) return;
|
|
||||||
} else if (z) return;
|
|
||||||
if (x == y) return true;
|
|
||||||
|
|
||||||
if (x) w();
|
|
||||||
if (y) z();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(w, x, y, z) {
|
|
||||||
if (!x) {
|
|
||||||
if (w) {
|
|
||||||
if (y) return;
|
|
||||||
} else if (z) return;
|
|
||||||
return x == y || (x && w(), y && z(), !0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
9
test/compress/try-catch.js
Normal file
9
test/compress/try-catch.js
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
catch_destructuring_with_sequence: {
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
throw {};
|
||||||
|
} catch ({xCover = (0, function() {})} ) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "try{throw{}}catch({xCover=(0,function(){})}){}"
|
||||||
|
}
|
||||||
@@ -29,7 +29,6 @@ typeof_in_boolean_context: {
|
|||||||
booleans : true,
|
booleans : true,
|
||||||
evaluate : true,
|
evaluate : true,
|
||||||
conditionals : true,
|
conditionals : true,
|
||||||
side_effects : true,
|
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
function f1(x) { return typeof x ? "yes" : "no"; }
|
function f1(x) { return typeof x ? "yes" : "no"; }
|
||||||
@@ -37,26 +36,12 @@ typeof_in_boolean_context: {
|
|||||||
typeof 0 ? foo() : bar();
|
typeof 0 ? foo() : bar();
|
||||||
!typeof console.log(1);
|
!typeof console.log(1);
|
||||||
var a = !typeof console.log(2);
|
var a = !typeof console.log(2);
|
||||||
if (typeof (1 + foo()));
|
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f1(x) { return "yes"; }
|
function f1(x) { return "yes"; }
|
||||||
function f2() { return g(), "Yes"; }
|
function f2() { return g(), "Yes"; }
|
||||||
foo();
|
foo();
|
||||||
console.log(1);
|
!(console.log(1), !0);
|
||||||
var a = !(console.log(2), !0);
|
var a = !(console.log(2), !0);
|
||||||
foo();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1668: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
if (typeof bar);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
if (!0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,3 +15,106 @@ unicode_parse_variables: {
|
|||||||
var l০ = 3;
|
var l০ = 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unicode_escaped_identifier: {
|
||||||
|
beautify = {ecma: 6}
|
||||||
|
input: {
|
||||||
|
var \u{61} = "foo";
|
||||||
|
var \u{10000} = "bar";
|
||||||
|
}
|
||||||
|
expect_exact: 'var a="foo";var \u{10000}="bar";';
|
||||||
|
}
|
||||||
|
|
||||||
|
unicode_identifier_ascii_only: {
|
||||||
|
beautify = {ascii_only: true, ecma: 6}
|
||||||
|
input: {
|
||||||
|
var \u{0061} = "hi";
|
||||||
|
var bar = "h\u{0065}llo";
|
||||||
|
var \u{10000} = "testing \u{101111}";
|
||||||
|
}
|
||||||
|
expect_exact: 'var a="hi";var bar="hello";var \\u{10000}="testing \\u{101111}";'
|
||||||
|
}
|
||||||
|
|
||||||
|
unicode_string_literals: {
|
||||||
|
beautify = {ascii_only: true, ecma: 6}
|
||||||
|
input: {
|
||||||
|
var a = "6 length unicode character: \u{101111}";
|
||||||
|
}
|
||||||
|
expect_exact: 'var a="6 length unicode character: \\u{101111}";'
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't escape identifiers below es6 (or in this case double escaped in expect_exact)
|
||||||
|
unicode_output_es5_surrogates: {
|
||||||
|
beautify = {ascii_only: true, ecma: 5}
|
||||||
|
input: {
|
||||||
|
var \u{10000} = "6 length unicode character: \u{10FFFF}";
|
||||||
|
}
|
||||||
|
expect_exact: 'var \u{10000}="6 length unicode character: \\udbff\\udfff";'
|
||||||
|
}
|
||||||
|
|
||||||
|
check_escape_style: {
|
||||||
|
beautify = {ascii_only: true, ecma: 6}
|
||||||
|
input: {
|
||||||
|
var a = "\x01";
|
||||||
|
var \ua0081 = "\x10"; // \u0081 only in ID_Continue
|
||||||
|
var \u0100 = "\u0100";
|
||||||
|
var \u1000 = "\u1000";
|
||||||
|
var \u{10000} = "\u{10000}";
|
||||||
|
var \u{2f800} = "\u{100000}";
|
||||||
|
}
|
||||||
|
expect_exact: 'var a="\\x01";var \\ua0081="\\x10";var \\u0100="\\u0100";var \\u1000="\\u1000";var \\u{10000}="\\u{10000}";var \\u{2f800}="\\u{100000}";'
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't escape identifiers below es6, no escaped identifiers support and no \u{} syntax
|
||||||
|
check_escape_style_es5: {
|
||||||
|
beautify = {ascii_only: true, ecma: 5}
|
||||||
|
input: {
|
||||||
|
var a = "\x01";
|
||||||
|
var \ua0081 = "\x10"; // \u0081 only in ID_Continue
|
||||||
|
var \u0100 = "\u0100";
|
||||||
|
var \u1000 = "\u1000";
|
||||||
|
var \u{10000} = "\u{10000}"; // Identifier won't be escaped in es 5.1
|
||||||
|
var \u{2f800} = "\u{100000}"; // Same
|
||||||
|
}
|
||||||
|
expect_exact: 'var a="\\x01";var \\ua0081="\\x10";var \\u0100="\\u0100";var \\u1000="\\u1000";var \ud800\udc00="\\ud800\\udc00";var \ud87e\udc00="\\udbc0\\udc00";'
|
||||||
|
}
|
||||||
|
|
||||||
|
ID_continue_with_surrogate_pair: {
|
||||||
|
beautify = {ascii_only: true, ecma: 6}
|
||||||
|
input: {
|
||||||
|
var \u{2f800}\u{2f800}\u{2f800}\u{2f800} = "\u{100000}\u{100000}\u{100000}\u{100000}\u{100000}";
|
||||||
|
}
|
||||||
|
expect_exact: 'var \\u{2f800}\\u{2f800}\\u{2f800}\\u{2f800}="\\u{100000}\\u{100000}\\u{100000}\\u{100000}\\u{100000}";'
|
||||||
|
}
|
||||||
|
|
||||||
|
escape_non_escaped_identifier: {
|
||||||
|
beautify = {ascii_only: true, ecma: 6}
|
||||||
|
input: {
|
||||||
|
var µþ = "µþ";
|
||||||
|
}
|
||||||
|
expect_exact: 'var \\u00b5\\u00fe="\\xb5\\xfe";'
|
||||||
|
}
|
||||||
|
|
||||||
|
non_escape_2_non_escape: {
|
||||||
|
beautify = {ascii_only: false, ecma: 6}
|
||||||
|
input: {
|
||||||
|
var µþ = "µþ";
|
||||||
|
}
|
||||||
|
expect_exact: 'var µþ="µþ";'
|
||||||
|
}
|
||||||
|
|
||||||
|
non_escape_2_half_escape1: {
|
||||||
|
beautify = {ascii_only: false, ascii_identifiers: true, ecma: 6}
|
||||||
|
input: {
|
||||||
|
var µþ = "µþ";
|
||||||
|
}
|
||||||
|
expect_exact: 'var \\u00b5\\u00fe="µþ";'
|
||||||
|
}
|
||||||
|
|
||||||
|
non_escape_2_half_escape2: {
|
||||||
|
beautify = {ascii_only: true, ascii_identifiers: false, ecma: 6}
|
||||||
|
input: {
|
||||||
|
var µþ = "µþ";
|
||||||
|
}
|
||||||
|
expect_exact: 'var µþ="\\xb5\\xfe";'
|
||||||
|
}
|
||||||
166
test/compress/yield.js
Normal file
166
test/compress/yield.js
Normal file
@@ -0,0 +1,166 @@
|
|||||||
|
generators: {
|
||||||
|
input: {
|
||||||
|
function* fn() {};
|
||||||
|
}
|
||||||
|
expect_exact: "function*fn(){}"
|
||||||
|
}
|
||||||
|
|
||||||
|
generators_yield: {
|
||||||
|
input: {
|
||||||
|
function* fn() {
|
||||||
|
yield remote();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "function*fn(){yield remote()}"
|
||||||
|
}
|
||||||
|
|
||||||
|
generators_yield_assign: {
|
||||||
|
input: {
|
||||||
|
function* fn() {
|
||||||
|
var x = {};
|
||||||
|
x.prop = yield 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "function*fn(){var x={};x.prop=yield 5}"
|
||||||
|
}
|
||||||
|
|
||||||
|
generator_yield_undefined: {
|
||||||
|
input: {
|
||||||
|
function* fn() {
|
||||||
|
yield;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "function*fn(){yield}"
|
||||||
|
}
|
||||||
|
|
||||||
|
yield_optimize_expression: {
|
||||||
|
options = {
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function* f1() { yield; }
|
||||||
|
function* f2() { yield undefined; }
|
||||||
|
function* f3() { yield null; }
|
||||||
|
function* f4() { yield* undefined; }
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function* f1() { yield }
|
||||||
|
function* f2() { yield; }
|
||||||
|
function* f3() { yield null; }
|
||||||
|
function* f4() { yield* void 0; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
yield_statements: {
|
||||||
|
input: {
|
||||||
|
function* fn() {
|
||||||
|
var a = (yield 1) + (yield 2);
|
||||||
|
var b = (yield 3) === (yield 4);
|
||||||
|
var c = (yield 5) << (yield 6);
|
||||||
|
var d = yield 7;
|
||||||
|
var e = (yield 8) ? yield 9 : yield 10;
|
||||||
|
var f = -(yield 11);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "function*fn(){var a=(yield 1)+(yield 2);var b=(yield 3)===(yield 4);var c=(yield 5)<<(yield 6);var d=yield 7;var e=(yield 8)?yield 9:yield 10;var f=-(yield 11)}"
|
||||||
|
}
|
||||||
|
|
||||||
|
yield_as_identifier_in_function_in_generator: {
|
||||||
|
input: {
|
||||||
|
var g = function*() {
|
||||||
|
function h() {
|
||||||
|
yield = 1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var g = function*() {
|
||||||
|
function h() {
|
||||||
|
yield = 1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
yield_before_punctuators: {
|
||||||
|
input: {
|
||||||
|
iter = (function*() {
|
||||||
|
assignmentResult = [ x = yield ] = value;
|
||||||
|
})();
|
||||||
|
function* g1() { (yield) }
|
||||||
|
function* g2() { [yield] }
|
||||||
|
function* g3() { return {yield} } // Added return to avoid {} drop
|
||||||
|
function* g4() { yield, yield; }
|
||||||
|
function* g5() { (yield) ? yield : yield; }
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
iter = (function*() {
|
||||||
|
assignmentResult = [ x = yield ] = value;
|
||||||
|
})();
|
||||||
|
function* g1() { (yield) }
|
||||||
|
function* g2() { [yield] }
|
||||||
|
function* g3() { return {yield} }
|
||||||
|
function* g4() { yield, yield; }
|
||||||
|
function* g5() { (yield) ? yield : yield; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
yield_as_identifier_outside_strict_mode: {
|
||||||
|
input: {
|
||||||
|
import yield from "bar";
|
||||||
|
yield = 123;
|
||||||
|
while (true) {
|
||||||
|
yield:
|
||||||
|
for(;;) break yield;
|
||||||
|
|
||||||
|
foo();
|
||||||
|
}
|
||||||
|
while (true)
|
||||||
|
yield: for(;;) continue yield;
|
||||||
|
function yield(){}
|
||||||
|
function foo(...yield){}
|
||||||
|
try { new Error("") } catch (yield) {}
|
||||||
|
var yield = "foo";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
import yield from "bar";
|
||||||
|
yield = 123;
|
||||||
|
while (true) {
|
||||||
|
yield:
|
||||||
|
for(;;) break yield;
|
||||||
|
|
||||||
|
foo();
|
||||||
|
}
|
||||||
|
while (true)
|
||||||
|
yield: for(;;) continue yield;
|
||||||
|
function yield(){}
|
||||||
|
function foo(...yield){}
|
||||||
|
try { new Error("") } catch (yield) {}
|
||||||
|
var yield = "foo";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
empty_generator_as_parameter_with_side_effects: {
|
||||||
|
options = {
|
||||||
|
side_effects: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var GeneratorPrototype = Object.getPrototypeOf(
|
||||||
|
Object.getPrototypeOf(function*() {}())
|
||||||
|
);
|
||||||
|
evaluate(GeneratorPrototype);
|
||||||
|
}
|
||||||
|
expect_exact: "var GeneratorPrototype=Object.getPrototypeOf(Object.getPrototypeOf(function*(){}()));evaluate(GeneratorPrototype);"
|
||||||
|
}
|
||||||
|
|
||||||
|
empty_generator_as_parameter_without_side_effects: {
|
||||||
|
options = {
|
||||||
|
side_effects: false
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var GeneratorPrototype = Object.getPrototypeOf(
|
||||||
|
Object.getPrototypeOf(function*() {}())
|
||||||
|
);
|
||||||
|
evaluate(GeneratorPrototype);
|
||||||
|
}
|
||||||
|
expect_exact: "var GeneratorPrototype=Object.getPrototypeOf(Object.getPrototypeOf(function*(){}()));evaluate(GeneratorPrototype);"
|
||||||
|
}
|
||||||
@@ -1 +0,0 @@
|
|||||||
console.log(C.V, C.D);
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user