Compare commits
158 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
08514030f4 | ||
|
|
694ca5d045 | ||
|
|
57fb58b263 | ||
|
|
18c1c9b38a | ||
|
|
5c1ae3662d | ||
|
|
cfebeb2f63 | ||
|
|
fc78423f1d | ||
|
|
2a5277b391 | ||
|
|
d47547dc71 | ||
|
|
304db15a20 | ||
|
|
7cf72b8d66 | ||
|
|
cea685f8d9 | ||
|
|
8d4b5344f4 | ||
|
|
34a0ab6f2c | ||
|
|
bcebacbb9e | ||
|
|
018a5a750a | ||
|
|
b468103f26 | ||
|
|
66c126ffde | ||
|
|
fdee083465 | ||
|
|
5ffc17d4aa | ||
|
|
6aa750010f | ||
|
|
76df77c08c | ||
|
|
957d5537a8 | ||
|
|
88c8f4e363 | ||
|
|
ab36b9b10a | ||
|
|
28330913d8 | ||
|
|
766a4147d4 | ||
|
|
915c7e234d | ||
|
|
e54ddcbb8a | ||
|
|
9e19e63551 | ||
|
|
bce7ee5f6a | ||
|
|
b39043f3ab | ||
|
|
caf96acb08 | ||
|
|
c76749084b | ||
|
|
5843494ee2 | ||
|
|
efa21ae3e6 | ||
|
|
24d9633a35 | ||
|
|
7963b96681 | ||
|
|
8c62d854ce | ||
|
|
69931574e1 | ||
|
|
b5af8a1914 | ||
|
|
c14d09ba84 | ||
|
|
4fc39d8dad | ||
|
|
0b7c70f726 | ||
|
|
f72d3029dd | ||
|
|
1a0d6edc81 | ||
|
|
7b59b2f5b2 | ||
|
|
7bc7704edf | ||
|
|
14e712ee80 | ||
|
|
f83adcc995 | ||
|
|
df8a99439a | ||
|
|
6b91d12ec3 | ||
|
|
f37b91879f | ||
|
|
d835c72c80 | ||
|
|
c4cebb4b01 | ||
|
|
d51a00a450 | ||
|
|
fc0f168a0c | ||
|
|
a0ca595c2c | ||
|
|
1a314e9f60 | ||
|
|
6fcbd5e217 | ||
|
|
22cea023d1 | ||
|
|
70d4477e05 | ||
|
|
838f837379 | ||
|
|
82a8b6f612 | ||
|
|
69fc7ca8da | ||
|
|
0a79496e0a | ||
|
|
9e87edfc2e | ||
|
|
27211cf2d5 | ||
|
|
b5ce199711 | ||
|
|
c71ed91e63 | ||
|
|
f7545d0f1c | ||
|
|
59eecb6bf5 | ||
|
|
d83c6490ab | ||
|
|
7362f57966 | ||
|
|
eaa2c1f6af | ||
|
|
6a916523d4 | ||
|
|
ba7069d52b | ||
|
|
4dd7d0e39b | ||
|
|
90199d0a96 | ||
|
|
b82fd0ad41 | ||
|
|
183da16896 | ||
|
|
87857b0f1b | ||
|
|
e5f6a88233 | ||
|
|
8d0b00317e | ||
|
|
db49daf365 | ||
|
|
923deeff35 | ||
|
|
0b62a28b47 | ||
|
|
44116c6d2b | ||
|
|
b5bab254ce | ||
|
|
81603ecd15 | ||
|
|
e67553fa55 | ||
|
|
fcf542f262 | ||
|
|
8adfc29f91 | ||
|
|
02f47e1713 | ||
|
|
07f64d4050 | ||
|
|
6982a0554c | ||
|
|
fa3250199a | ||
|
|
06b9894c19 | ||
|
|
9f9db504d7 | ||
|
|
82ae95c334 | ||
|
|
9a5e2052c4 | ||
|
|
b1410be443 | ||
|
|
12985d86c2 | ||
|
|
49bfc6b555 | ||
|
|
d1c6bb8c7c | ||
|
|
5c169615a8 | ||
|
|
73d77f4f64 | ||
|
|
ccf0e2ef4f | ||
|
|
20ca0f5906 | ||
|
|
b29d435bb5 | ||
|
|
90585e29c2 | ||
|
|
d8fc281915 | ||
|
|
188c39e8d5 | ||
|
|
5429234138 | ||
|
|
b9f72a4a81 | ||
|
|
fc6ebd04a5 | ||
|
|
7e00a12741 | ||
|
|
10b3752b1e | ||
|
|
fe51a91395 | ||
|
|
951d87ca94 | ||
|
|
798fc21530 | ||
|
|
a75a046abb | ||
|
|
38f2b4579f | ||
|
|
56e2a369d0 | ||
|
|
0daa199fa8 | ||
|
|
73e98dcda4 | ||
|
|
36bca6934d | ||
|
|
ace5811691 | ||
|
|
ba7bad0dbd | ||
|
|
b8b2ac5230 | ||
|
|
ea2359381b | ||
|
|
52de64cf16 | ||
|
|
455790202a | ||
|
|
f40f5eb228 | ||
|
|
604caa09e7 | ||
|
|
29a71d3aae | ||
|
|
39a907bde3 | ||
|
|
70474310f3 | ||
|
|
b5f0f4f3a1 | ||
|
|
2905fd625a | ||
|
|
4facd94029 | ||
|
|
4b5993ff15 | ||
|
|
2351a672ea | ||
|
|
4a528c469c | ||
|
|
82d1ef0242 | ||
|
|
7fdd2082a6 | ||
|
|
e529f54e90 | ||
|
|
d626e9bf19 | ||
|
|
a2a9459684 | ||
|
|
a3dfeea144 | ||
|
|
d316fb139d | ||
|
|
83d8aa8b12 | ||
|
|
4f1c12b6fd | ||
|
|
d8e0e34354 | ||
|
|
0c4f315c02 | ||
|
|
0809699bdc | ||
|
|
2088e1c19d | ||
|
|
bf1d47180c |
10
.github/ISSUE_TEMPLATE.md
vendored
10
.github/ISSUE_TEMPLATE.md
vendored
@@ -1,11 +1,7 @@
|
|||||||
**Bug report or feature request?**
|
**Bug report or feature request?**
|
||||||
|
|
||||||
<!-- Note: sub-optimal but correct code is not a bug -->
|
<!-- Note: sub-optimal but correct code is not a bug -->
|
||||||
|
|
||||||
**ES5 or ES6+ input?**
|
|
||||||
|
|
||||||
<!-- Note: for ES6 see: https://github.com/mishoo/UglifyJS2/tree/harmony#harmony -->
|
|
||||||
|
|
||||||
**Uglify version (`uglifyjs -V`)**
|
**Uglify version (`uglifyjs -V`)**
|
||||||
|
|
||||||
**JavaScript input**
|
**JavaScript input**
|
||||||
@@ -24,6 +20,6 @@
|
|||||||
**JavaScript output or error produced.**
|
**JavaScript output or error produced.**
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Note: `uglify-js` only supports ES5.
|
Note: `uglify-js` only supports JavaScript.
|
||||||
Those wishing to minify ES6 should use `uglify-es`.
|
Those wishing to minify ES6+ should transpile first.
|
||||||
-->
|
-->
|
||||||
|
|||||||
42
.travis.yml
42
.travis.yml
@@ -1,14 +1,34 @@
|
|||||||
language: node_js
|
addons:
|
||||||
node_js:
|
apt:
|
||||||
- "0.10"
|
sources:
|
||||||
- "0.12"
|
- ubuntu-toolchain-r-test
|
||||||
- "4"
|
packages:
|
||||||
- "6"
|
- libstdc++-4.9-dev
|
||||||
- "8"
|
cache:
|
||||||
env:
|
directories: tmp
|
||||||
- UGLIFYJS_TEST_ALL=1
|
language: generic
|
||||||
matrix:
|
matrix:
|
||||||
fast_finish: true
|
fast_finish: true
|
||||||
sudo: false
|
sudo: false
|
||||||
cache:
|
env:
|
||||||
directories: tmp
|
global:
|
||||||
|
- UGLIFYJS_TEST_ALL=1
|
||||||
|
matrix:
|
||||||
|
- NODEJS_VER=node/0.10
|
||||||
|
- NODEJS_VER=node/0.12
|
||||||
|
- NODEJS_VER=node/4
|
||||||
|
- NODEJS_VER=node/6
|
||||||
|
- NODEJS_VER=node/8
|
||||||
|
- NODEJS_VER=node/latest
|
||||||
|
before_install:
|
||||||
|
- git clone --branch v1.4.2 --depth 1 https://github.com/jasongin/nvs.git ~/.nvs
|
||||||
|
- . ~/.nvs/nvs.sh
|
||||||
|
- nvs --version
|
||||||
|
install:
|
||||||
|
- nvs add $NODEJS_VER
|
||||||
|
- nvs use $NODEJS_VER
|
||||||
|
- node --version
|
||||||
|
- npm --version --no-update-notifier
|
||||||
|
- npm install --no-optional --no-save --no-update-notifier
|
||||||
|
script:
|
||||||
|
- npm test --no-update-notifier
|
||||||
|
|||||||
138
README.md
138
README.md
@@ -1,11 +1,13 @@
|
|||||||
uglify-es
|
UglifyJS 3
|
||||||
=========
|
==========
|
||||||
|
|
||||||
A JavaScript parser, mangler/compressor and beautifier toolkit for ES6+.
|
UglifyJS is a JavaScript parser, minifier, compressor and beautifier toolkit.
|
||||||
|
|
||||||
#### Note:
|
#### Note:
|
||||||
- **`uglify-es` is API/CLI compatible with `uglify-js@3`.**
|
- **`uglify-js@3` has a simplified [API](#api-reference) and [CLI](#command-line-usage) that is not backwards compatible with [`uglify-js@2`](https://github.com/mishoo/UglifyJS2/tree/v2.x)**.
|
||||||
- **`uglify-es` is not backwards compatible with `uglify-js@2`.**
|
- **Documentation for UglifyJS `2.x` releases can be found [here](https://github.com/mishoo/UglifyJS2/tree/v2.x)**.
|
||||||
|
- `uglify-js` only supports JavaScript (ECMAScript 5).
|
||||||
|
- To minify ECMAScript 2015 or above, transpile using tools like [Babel](https://babeljs.io/).
|
||||||
|
|
||||||
Install
|
Install
|
||||||
-------
|
-------
|
||||||
@@ -15,11 +17,11 @@ First make sure you have installed the latest version of [node.js](http://nodejs
|
|||||||
|
|
||||||
From NPM for use as a command line app:
|
From NPM for use as a command line app:
|
||||||
|
|
||||||
npm install uglify-es -g
|
npm install uglify-js -g
|
||||||
|
|
||||||
From NPM for programmatic use:
|
From NPM for programmatic use:
|
||||||
|
|
||||||
npm install uglify-es
|
npm install uglify-js
|
||||||
|
|
||||||
# Command line usage
|
# Command line usage
|
||||||
|
|
||||||
@@ -102,20 +104,15 @@ a double dash to prevent input files being used as option arguments:
|
|||||||
sequences.
|
sequences.
|
||||||
--config-file <file> Read `minify()` options from JSON file.
|
--config-file <file> Read `minify()` options from JSON file.
|
||||||
-d, --define <expr>[=value] Global definitions.
|
-d, --define <expr>[=value] Global definitions.
|
||||||
--ecma <version> Specify ECMAScript release: 5, 6, 7 or 8.
|
-e, --enclose [arg[:value]] Embed everything in a big function, with configurable
|
||||||
|
argument(s) & value(s).
|
||||||
--ie8 Support non-standard Internet Explorer 8.
|
--ie8 Support non-standard Internet Explorer 8.
|
||||||
Equivalent to setting `ie8: true` in `minify()`
|
Equivalent to setting `ie8: true` in `minify()`
|
||||||
for `compress`, `mangle` and `output` options.
|
for `compress`, `mangle` and `output` options.
|
||||||
By default UglifyJS will not try to be IE-proof.
|
By default UglifyJS will not try to be IE-proof.
|
||||||
--keep-classnames Do not mangle/drop class names.
|
|
||||||
--keep-fnames Do not mangle/drop function names. Useful for
|
--keep-fnames Do not mangle/drop function names. Useful for
|
||||||
code relying on Function.prototype.name.
|
code relying on Function.prototype.name.
|
||||||
--name-cache <file> File to hold mangled name mappings.
|
--name-cache <file> File to hold mangled name mappings.
|
||||||
--safari10 Support non-standard Safari 10/11.
|
|
||||||
Equivalent to setting `safari10: true` in `minify()`
|
|
||||||
for `mangle` and `output` options.
|
|
||||||
By default `uglify-es` will not work around
|
|
||||||
Safari 10/11 bugs.
|
|
||||||
--self Build UglifyJS as a library (implies --wrap UglifyJS)
|
--self Build UglifyJS as a library (implies --wrap UglifyJS)
|
||||||
--source-map [options] Enable source map/specify source map options:
|
--source-map [options] Enable source map/specify source map options:
|
||||||
`base` Path to compute relative paths from input files.
|
`base` Path to compute relative paths from input files.
|
||||||
@@ -123,7 +120,8 @@ a double dash to prevent input files being used as option arguments:
|
|||||||
JS that was generated from some other original
|
JS that was generated from some other original
|
||||||
code. Specify "inline" if the source map is
|
code. Specify "inline" if the source map is
|
||||||
included within the sources.
|
included within the sources.
|
||||||
`filename` Name and/or location of the output source.
|
`filename` Filename and/or location of the output source
|
||||||
|
(sets `file` attribute in source map).
|
||||||
`includeSources` Pass this flag if you want to include
|
`includeSources` Pass this flag if you want to include
|
||||||
the content of source files in the
|
the content of source files in the
|
||||||
source map as sourcesContent property.
|
source map as sourcesContent property.
|
||||||
@@ -154,7 +152,9 @@ debugging your compressed JavaScript. To get a source map, pass
|
|||||||
|
|
||||||
Additional options:
|
Additional options:
|
||||||
|
|
||||||
- `--source-map "filename='<NAME>'"` to specify the name of the source map.
|
- `--source-map "filename='<NAME>'"` to specify the name of the source map. The value of
|
||||||
|
`filename` is only used to set `file` attribute (see [the spec][sm-spec])
|
||||||
|
in source map file.
|
||||||
|
|
||||||
- `--source-map "root='<URL>'"` to pass the URL where the original files can be found.
|
- `--source-map "root='<URL>'"` to pass the URL where the original files can be found.
|
||||||
|
|
||||||
@@ -349,7 +349,7 @@ identify mistakes like writing mangled keys to storage.
|
|||||||
Assuming installation via NPM, you can load UglifyJS in your application
|
Assuming installation via NPM, you can load UglifyJS in your application
|
||||||
like this:
|
like this:
|
||||||
```javascript
|
```javascript
|
||||||
var UglifyJS = require("uglify-es");
|
var UglifyJS = require("uglify-js");
|
||||||
```
|
```
|
||||||
|
|
||||||
There is a single high level function, **`minify(code, options)`**,
|
There is a single high level function, **`minify(code, options)`**,
|
||||||
@@ -478,9 +478,6 @@ if (result.error) throw result.error;
|
|||||||
|
|
||||||
## Minify options
|
## Minify options
|
||||||
|
|
||||||
- `ecma` (default `undefined`) - pass `5`, `6`, `7` or `8` to override `parse`,
|
|
||||||
`compress` and `output` options.
|
|
||||||
|
|
||||||
- `warnings` (default `false`) — pass `true` to return compressor warnings
|
- `warnings` (default `false`) — pass `true` to return compressor warnings
|
||||||
in `result.warnings`. Use the value `"verbose"` for more detailed warnings.
|
in `result.warnings`. Use the value `"verbose"` for more detailed warnings.
|
||||||
|
|
||||||
@@ -515,17 +512,8 @@ if (result.error) throw result.error;
|
|||||||
|
|
||||||
- `ie8` (default `false`) - set to `true` to support IE8.
|
- `ie8` (default `false`) - set to `true` to support IE8.
|
||||||
|
|
||||||
- `keep_classnames` (default: `undefined`) - pass `true` to prevent discarding or mangling
|
|
||||||
of class names.
|
|
||||||
|
|
||||||
- `keep_fnames` (default: `false`) - pass `true` to prevent discarding or mangling
|
- `keep_fnames` (default: `false`) - pass `true` to prevent discarding or mangling
|
||||||
of function names. Useful for code relying on `Function.prototype.name`. If the
|
of function names. Useful for code relying on `Function.prototype.name`.
|
||||||
top level minify option `keep_classnames` is `undefined` it will be overriden with
|
|
||||||
the value of the top level minify option `keep_fnames`.
|
|
||||||
|
|
||||||
- `safari10` (default: `false`) - pass `true` to work around Safari 10/11 bugs in
|
|
||||||
loop scoping and `await`. See `safari10` options in [`mangle`](#mangle-options)
|
|
||||||
and [`output`](#output-options) for details.
|
|
||||||
|
|
||||||
## Minify options structure
|
## Minify options structure
|
||||||
|
|
||||||
@@ -550,13 +538,9 @@ if (result.error) throw result.error;
|
|||||||
sourceMap: {
|
sourceMap: {
|
||||||
// source map options
|
// source map options
|
||||||
},
|
},
|
||||||
ecma: 5, // specify one of: 5, 6, 7 or 8
|
|
||||||
keep_classnames: false,
|
|
||||||
keep_fnames: false,
|
|
||||||
ie8: false,
|
|
||||||
nameCache: null, // or specify a name cache object
|
nameCache: null, // or specify a name cache object
|
||||||
safari10: false,
|
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
|
ie8: false,
|
||||||
warnings: false,
|
warnings: false,
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -612,20 +596,14 @@ If you're using the `X-SourceMap` header instead, you can just omit `sourceMap.u
|
|||||||
|
|
||||||
- `bare_returns` (default `false`) -- support top level `return` statements
|
- `bare_returns` (default `false`) -- support top level `return` statements
|
||||||
|
|
||||||
- `ecma` (default: `8`) -- specify one of `5`, `6`, `7` or `8`. Note: this setting
|
|
||||||
is not presently enforced except for ES8 optional trailing commas in function
|
|
||||||
parameter lists and calls with `ecma` `8`.
|
|
||||||
|
|
||||||
- `html5_comments` (default `true`)
|
- `html5_comments` (default `true`)
|
||||||
|
|
||||||
- `shebang` (default `true`) -- support `#!command` as the first line
|
- `shebang` (default `true`) -- support `#!command` as the first line
|
||||||
|
|
||||||
## Compress options
|
## Compress options
|
||||||
|
|
||||||
- `arrows` (default: `true`) -- Converts `()=>{return x}` to `()=>x`. Class
|
- `arguments` (default: `true`) -- replace `arguments[index]` with function
|
||||||
and object literal methods will also be converted to arrow expressions if
|
parameter name whenever possible.
|
||||||
the resultant code is shorter: `m(){return x}` becomes `m:()=>x`.
|
|
||||||
This transform requires that the `ecma` compress option is set to `6` or greater.
|
|
||||||
|
|
||||||
- `booleans` (default: `true`) -- various optimizations for boolean context,
|
- `booleans` (default: `true`) -- various optimizations for boolean context,
|
||||||
for example `!!a ? b : c → a ? b : c`
|
for example `!!a ? b : c → a ? b : c`
|
||||||
@@ -634,17 +612,16 @@ If you're using the `X-SourceMap` header instead, you can just omit `sourceMap.u
|
|||||||
side effects permitting.
|
side effects permitting.
|
||||||
|
|
||||||
- `comparisons` (default: `true`) -- apply certain optimizations to binary nodes,
|
- `comparisons` (default: `true`) -- apply certain optimizations to binary nodes,
|
||||||
e.g. `!(a <= b) → a > b` (only when `unsafe_comps`), attempts to negate binary
|
e.g. `!(a <= b) → a > b`, attempts to negate binary nodes, e.g.
|
||||||
nodes, e.g. `a = !b && !c && !d && !e → a=!(b||c||d||e)` etc.
|
`a = !b && !c && !d && !e → a=!(b||c||d||e)` etc.
|
||||||
|
|
||||||
- `computed_props` (default: `true`) -- Transforms constant computed properties
|
|
||||||
into regular ones: `{["computed"]: 1}` is converted to `{computed: 1}`.
|
|
||||||
|
|
||||||
- `conditionals` (default: `true`) -- apply optimizations for `if`-s and conditional
|
- `conditionals` (default: `true`) -- apply optimizations for `if`-s and conditional
|
||||||
expressions
|
expressions
|
||||||
|
|
||||||
- `dead_code` (default: `true`) -- remove unreachable code
|
- `dead_code` (default: `true`) -- remove unreachable code
|
||||||
|
|
||||||
|
- `directives` (default: `true`) -- remove redundant or non-standard directives
|
||||||
|
|
||||||
- `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. If you wish to drop a specific function call
|
||||||
such as `console.info` and/or retain side effects from function arguments
|
such as `console.info` and/or retain side effects from function arguments
|
||||||
@@ -652,9 +629,6 @@ If you're using the `X-SourceMap` header instead, you can just omit `sourceMap.u
|
|||||||
|
|
||||||
- `drop_debugger` (default: `true`) -- remove `debugger;` statements
|
- `drop_debugger` (default: `true`) -- remove `debugger;` statements
|
||||||
|
|
||||||
- `ecma` (default: `5`) -- Pass `6` or greater to enable `compress` options that
|
|
||||||
will transform ES5 code into smaller ES6+ equivalent forms.
|
|
||||||
|
|
||||||
- `evaluate` (default: `true`) -- attempt to evaluate constant expressions
|
- `evaluate` (default: `true`) -- attempt to evaluate constant expressions
|
||||||
|
|
||||||
- `expression` (default: `false`) -- Pass `true` to preserve completion values
|
- `expression` (default: `false`) -- Pass `true` to preserve completion values
|
||||||
@@ -685,10 +659,6 @@ If you're using the `X-SourceMap` header instead, you can just omit `sourceMap.u
|
|||||||
|
|
||||||
- `join_vars` (default: `true`) -- join consecutive `var` statements
|
- `join_vars` (default: `true`) -- join consecutive `var` statements
|
||||||
|
|
||||||
- `keep_classnames` (default: `false`) -- Pass `true` to prevent the
|
|
||||||
compressor from discarding class names. See also: the `keep_classnames`
|
|
||||||
[mangle option](#mangle).
|
|
||||||
|
|
||||||
- `keep_fargs` (default: `true`) -- Prevents the compressor from discarding unused
|
- `keep_fargs` (default: `true`) -- Prevents the compressor from discarding unused
|
||||||
function arguments. You need this for code which relies on `Function.length`.
|
function arguments. You need this for code which relies on `Function.length`.
|
||||||
|
|
||||||
@@ -722,7 +692,8 @@ If you're using the `X-SourceMap` header instead, you can just omit `sourceMap.u
|
|||||||
pass `pure_funcs: [ 'Math.floor' ]` to let it know that this
|
pass `pure_funcs: [ 'Math.floor' ]` to let it know that this
|
||||||
function won't produce any side effect, in which case the whole
|
function won't produce any side effect, in which case the whole
|
||||||
statement would get discarded. The current implementation adds some
|
statement would get discarded. The current implementation adds some
|
||||||
overhead (compression will be slower).
|
overhead (compression will be slower). Make sure symbols under `pure_funcs`
|
||||||
|
are also under `mangle.reserved` to avoid mangling.
|
||||||
|
|
||||||
- `pure_getters` (default: `"strict"`) -- If you pass `true` for
|
- `pure_getters` (default: `"strict"`) -- If you pass `true` for
|
||||||
this, UglifyJS will assume that object property access
|
this, UglifyJS will assume that object property access
|
||||||
@@ -769,18 +740,8 @@ If you're using the `X-SourceMap` header instead, you can just omit `sourceMap.u
|
|||||||
|
|
||||||
- `unsafe` (default: `false`) -- apply "unsafe" transformations (discussion below)
|
- `unsafe` (default: `false`) -- apply "unsafe" transformations (discussion below)
|
||||||
|
|
||||||
- `unsafe_arrows` (default: `false`) -- Convert ES5 style anonymous function
|
- `unsafe_comps` (default: `false`) -- compress expressions like `a <= b` assuming
|
||||||
expressions to arrow functions if the function body does not reference `this`.
|
none of the operands can be (coerced to) `NaN`.
|
||||||
Note: it is not always safe to perform this conversion if code relies on the
|
|
||||||
the function having a `prototype`, which arrow functions lack.
|
|
||||||
This transform requires that the `ecma` compress option is set to `6` or greater.
|
|
||||||
|
|
||||||
- `unsafe_comps` (default: `false`) -- Reverse `<` and `<=` to `>` and `>=` to
|
|
||||||
allow improved compression. This might be unsafe when an at least one of two
|
|
||||||
operands is an object with computed values due the use of methods like `get`,
|
|
||||||
or `valueOf`. This could cause change in execution order after operands in the
|
|
||||||
comparison are switching. Compression only works if both `comparisons` and
|
|
||||||
`unsafe_comps` are both set to true.
|
|
||||||
|
|
||||||
- `unsafe_Function` (default: `false`) -- compress and mangle `Function(args, code)`
|
- `unsafe_Function` (default: `false`) -- compress and mangle `Function(args, code)`
|
||||||
when both `args` and `code` are string literals.
|
when both `args` and `code` are string literals.
|
||||||
@@ -788,13 +749,6 @@ If you're using the `X-SourceMap` header instead, you can just omit `sourceMap.u
|
|||||||
- `unsafe_math` (default: `false`) -- optimize numerical expressions like
|
- `unsafe_math` (default: `false`) -- optimize numerical expressions like
|
||||||
`2 * x * 3` into `6 * x`, which may give imprecise floating point results.
|
`2 * x * 3` into `6 * x`, which may give imprecise floating point results.
|
||||||
|
|
||||||
- `unsafe_methods` (default: false) -- Converts `{ m: function(){} }` to
|
|
||||||
`{ m(){} }`. `ecma` must be set to `6` or greater to enable this transform.
|
|
||||||
If `unsafe_methods` is a RegExp then key/value pairs with keys matching the
|
|
||||||
RegExp will be converted to concise methods.
|
|
||||||
Note: if enabled there is a risk of getting a "`<method name>` is not a
|
|
||||||
constructor" TypeError should any code try to `new` the former function.
|
|
||||||
|
|
||||||
- `unsafe_proto` (default: `false`) -- optimize expressions like
|
- `unsafe_proto` (default: `false`) -- optimize expressions like
|
||||||
`Array.prototype.slice.call(a)` into `[].slice.call(a)`
|
`Array.prototype.slice.call(a)` into `[].slice.call(a)`
|
||||||
|
|
||||||
@@ -816,9 +770,6 @@ If you're using the `X-SourceMap` header instead, you can just omit `sourceMap.u
|
|||||||
- `eval` (default `false`) -- Pass `true` to mangle names visible in scopes
|
- `eval` (default `false`) -- Pass `true` to mangle names visible in scopes
|
||||||
where `eval` or `with` are used.
|
where `eval` or `with` are used.
|
||||||
|
|
||||||
- `keep_classnames` (default `false`) -- Pass `true` to not mangle class names.
|
|
||||||
See also: the `keep_classnames` [compress option](#compress-options).
|
|
||||||
|
|
||||||
- `keep_fnames` (default `false`) -- Pass `true` to not mangle function names.
|
- `keep_fnames` (default `false`) -- Pass `true` to not mangle function names.
|
||||||
Useful for code relying on `Function.prototype.name`. See also: the `keep_fnames`
|
Useful for code relying on `Function.prototype.name`. See also: the `keep_fnames`
|
||||||
[compress option](#compress-options).
|
[compress option](#compress-options).
|
||||||
@@ -829,11 +780,6 @@ If you're using the `X-SourceMap` header instead, you can just omit `sourceMap.u
|
|||||||
- `toplevel` (default `false`) -- Pass `true` to mangle names declared in the
|
- `toplevel` (default `false`) -- Pass `true` to mangle names declared in the
|
||||||
top level scope.
|
top level scope.
|
||||||
|
|
||||||
- `safari10` (default `false`) -- Pass `true` to work around the Safari 10 loop
|
|
||||||
iterator [bug](https://bugs.webkit.org/show_bug.cgi?id=171041)
|
|
||||||
"Cannot declare a let variable twice".
|
|
||||||
See also: the `safari10` [output option](#output-options).
|
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
@@ -886,7 +832,7 @@ can pass additional arguments that control the code output:
|
|||||||
when you want to generate minified code, in order to specify additional
|
when you want to generate minified code, in order to specify additional
|
||||||
arguments, so you can use `-b beautify=false` to override it.
|
arguments, so you can use `-b beautify=false` to override it.
|
||||||
|
|
||||||
- `bracketize` (default `false`) -- always insert brackets in `if`, `for`,
|
- `braces` (default `false`) -- always insert braces in `if`, `for`,
|
||||||
`do`, `while` or `with` statements, even if their body is a single
|
`do`, `while` or `with` statements, even if their body is a single
|
||||||
statement.
|
statement.
|
||||||
|
|
||||||
@@ -894,19 +840,12 @@ can pass additional arguments that control the code output:
|
|||||||
comments, `"some"` to preserve some comments, a regular expression string
|
comments, `"some"` to preserve some comments, a regular expression string
|
||||||
(e.g. `/^!/`) or a function.
|
(e.g. `/^!/`) or a function.
|
||||||
|
|
||||||
- `ecma` (default `5`) -- set output printing mode. Set `ecma` to `6` or
|
|
||||||
greater to emit shorthand object properties - i.e.: `{a}` instead of `{a: a}`.
|
|
||||||
The `ecma` option will only change the output in direct control of the
|
|
||||||
beautifier. Non-compatible features in the abstract syntax tree will still
|
|
||||||
be output as is. For example: an `ecma` setting of `5` will **not** convert
|
|
||||||
ES6+ code to ES5.
|
|
||||||
|
|
||||||
- `indent_level` (default `4`)
|
- `indent_level` (default `4`)
|
||||||
|
|
||||||
- `indent_start` (default `0`) -- prefix all lines by that many spaces
|
- `indent_start` (default `0`) -- prefix all lines by that many spaces
|
||||||
|
|
||||||
- `inline_script` (default `false`) -- escape the slash in occurrences of
|
- `inline_script` (default `true`) -- escape HTML comments and the slash in
|
||||||
`</script` in strings
|
occurrences of `</script>` in strings
|
||||||
|
|
||||||
- `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.
|
||||||
@@ -918,8 +857,8 @@ can pass additional arguments that control the code output:
|
|||||||
adjust for this text. Can be used to insert a comment containing
|
adjust for this text. Can be used to insert a comment containing
|
||||||
licensing information, for example.
|
licensing information, for example.
|
||||||
|
|
||||||
- `preserve_line` (default `false`) -- pass `true` to preserve lines, but it
|
- `preserve_line` (default `false`) -- pass `true` to retain line numbering on
|
||||||
only works if `beautify` is set to `false`.
|
a best effort basis.
|
||||||
|
|
||||||
- `quote_keys` (default `false`) -- pass `true` to quote all keys in literal
|
- `quote_keys` (default `false`) -- pass `true` to quote all keys in literal
|
||||||
objects
|
objects
|
||||||
@@ -932,10 +871,6 @@ can pass additional arguments that control the code output:
|
|||||||
- `2` -- always use double quotes
|
- `2` -- always use double quotes
|
||||||
- `3` -- always use the original quotes
|
- `3` -- always use the original quotes
|
||||||
|
|
||||||
- `safari10` (default `false`) -- set this option to `true` to work around
|
|
||||||
the [Safari 10/11 await bug](https://bugs.webkit.org/show_bug.cgi?id=176685).
|
|
||||||
See also: the `safari10` [mangle option](#mangle-options).
|
|
||||||
|
|
||||||
- `semicolons` (default `true`) -- separate statements with semicolons. If
|
- `semicolons` (default `true`) -- separate statements with semicolons. If
|
||||||
you pass `false` then whenever possible we will use a newline instead of a
|
you pass `false` then whenever possible we will use a newline instead of a
|
||||||
semicolon, leading to more readable output of uglified code (size before
|
semicolon, leading to more readable output of uglified code (size before
|
||||||
@@ -1113,8 +1048,9 @@ var result = UglifyJS.minify(ast, {
|
|||||||
### Working with Uglify AST
|
### Working with Uglify AST
|
||||||
|
|
||||||
Transversal and transformation of the native AST can be performed through
|
Transversal and transformation of the native AST can be performed through
|
||||||
[`TreeWalker`](http://lisperator.net/uglifyjs/walk) and
|
[`TreeWalker`](https://github.com/mishoo/UglifyJS2/blob/master/lib/ast.js) and
|
||||||
[`TreeTransformer`](http://lisperator.net/uglifyjs/transform) respectively.
|
[`TreeTransformer`](https://github.com/mishoo/UglifyJS2/blob/master/lib/transform.js)
|
||||||
|
respectively.
|
||||||
|
|
||||||
### ESTree / SpiderMonkey AST
|
### ESTree / SpiderMonkey AST
|
||||||
|
|
||||||
|
|||||||
27
appveyor.yml
27
appveyor.yml
@@ -1,20 +1,25 @@
|
|||||||
environment:
|
environment:
|
||||||
|
UGLIFYJS_TEST_ALL: 1
|
||||||
matrix:
|
matrix:
|
||||||
- nodejs_version: "0.10"
|
- NODEJS_VER: node/0.10
|
||||||
- nodejs_version: "0.12"
|
- NODEJS_VER: node/0.12
|
||||||
- nodejs_version: "4"
|
- NODEJS_VER: node/4
|
||||||
- nodejs_version: "6"
|
- NODEJS_VER: node/6
|
||||||
- nodejs_version: "8"
|
- NODEJS_VER: node/8
|
||||||
|
- NODEJS_VER: node/latest
|
||||||
install:
|
install:
|
||||||
- ps: Install-Product node $env:nodejs_version
|
- git clone --branch v1.4.2 --depth 1 https://github.com/jasongin/nvs.git %LOCALAPPDATA%\nvs
|
||||||
- set UGLIFYJS_TEST_ALL=1
|
- set PATH=%LOCALAPPDATA%\nvs;%PATH%
|
||||||
- npm install
|
- nvs --version
|
||||||
|
- nvs add %NODEJS_VER%
|
||||||
|
- nvs use %NODEJS_VER%
|
||||||
|
- node --version
|
||||||
|
- npm --version --no-update-notifier
|
||||||
|
- npm install --no-optional --no-save --no-update-notifier
|
||||||
build: off
|
build: off
|
||||||
cache:
|
cache:
|
||||||
- tmp
|
- tmp
|
||||||
matrix:
|
matrix:
|
||||||
fast_finish: true
|
fast_finish: true
|
||||||
test_script:
|
test_script:
|
||||||
- node --version
|
- npm test --no-update-notifier
|
||||||
- npm --version
|
|
||||||
- npm test
|
|
||||||
|
|||||||
42
bin/uglifyjs
42
bin/uglifyjs
@@ -40,17 +40,15 @@ program.option("-o, --output <file>", "Output file (default STDOUT).");
|
|||||||
program.option("--comments [filter]", "Preserve copyright comments in the output.");
|
program.option("--comments [filter]", "Preserve copyright comments in the output.");
|
||||||
program.option("--config-file <file>", "Read minify() options from JSON file.");
|
program.option("--config-file <file>", "Read minify() options from JSON file.");
|
||||||
program.option("-d, --define <expr>[=value]", "Global definitions.", parse_js("define"));
|
program.option("-d, --define <expr>[=value]", "Global definitions.", parse_js("define"));
|
||||||
program.option("--ecma <version>", "Specify ECMAScript release: 5, 6, 7 or 8.");
|
program.option("-e, --enclose [arg[,...][:value[,...]]]", "Embed everything in a big function, with configurable argument(s) & value(s).");
|
||||||
program.option("--ie8", "Support non-standard Internet Explorer 8.");
|
program.option("--ie8", "Support non-standard Internet Explorer 8.");
|
||||||
program.option("--keep-classnames", "Do not mangle/drop class names.");
|
|
||||||
program.option("--keep-fnames", "Do not mangle/drop function names. Useful for code relying on Function.prototype.name.");
|
program.option("--keep-fnames", "Do not mangle/drop function names. Useful for code relying on Function.prototype.name.");
|
||||||
program.option("--name-cache <file>", "File to hold mangled name mappings.");
|
program.option("--name-cache <file>", "File to hold mangled name mappings.");
|
||||||
program.option("--rename", "Force symbol expansion.");
|
program.option("--rename", "Force symbol expansion.");
|
||||||
program.option("--no-rename", "Disable symbol expansion.");
|
program.option("--no-rename", "Disable symbol expansion.");
|
||||||
program.option("--safari10", "Support non-standard Safari 10.");
|
|
||||||
program.option("--self", "Build UglifyJS as a library (implies --wrap UglifyJS)");
|
program.option("--self", "Build UglifyJS as a library (implies --wrap UglifyJS)");
|
||||||
program.option("--source-map [options]", "Enable source map/specify source map options.", parse_source_map());
|
program.option("--source-map [options]", "Enable source map/specify source map options.", parse_js());
|
||||||
program.option("--timings", "Display operations run time on STDERR.")
|
program.option("--timings", "Display operations run time on STDERR.");
|
||||||
program.option("--toplevel", "Compress and/or mangle variables in toplevel scope.");
|
program.option("--toplevel", "Compress and/or mangle variables in toplevel scope.");
|
||||||
program.option("--verbose", "Print diagnostic messages.");
|
program.option("--verbose", "Print diagnostic messages.");
|
||||||
program.option("--warn", "Print warning messages.");
|
program.option("--warn", "Print warning messages.");
|
||||||
@@ -64,9 +62,9 @@ if (!program.output && program.sourceMap && program.sourceMap.url != "inline") {
|
|||||||
}
|
}
|
||||||
[
|
[
|
||||||
"compress",
|
"compress",
|
||||||
|
"enclose",
|
||||||
"ie8",
|
"ie8",
|
||||||
"mangle",
|
"mangle",
|
||||||
"safari10",
|
|
||||||
"sourceMap",
|
"sourceMap",
|
||||||
"toplevel",
|
"toplevel",
|
||||||
"wrap"
|
"wrap"
|
||||||
@@ -75,10 +73,6 @@ if (!program.output && program.sourceMap && program.sourceMap.url != "inline") {
|
|||||||
options[name] = program[name];
|
options[name] = program[name];
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if ("ecma" in program) {
|
|
||||||
if (program.ecma != (program.ecma | 0)) fatal("ERROR: ecma must be an integer");
|
|
||||||
options.ecma = program.ecma | 0;
|
|
||||||
}
|
|
||||||
if (program.beautify) {
|
if (program.beautify) {
|
||||||
options.output = typeof program.beautify == "object" ? program.beautify : {};
|
options.output = typeof program.beautify == "object" ? program.beautify : {};
|
||||||
if (!("beautify" in options.output)) {
|
if (!("beautify" in options.output)) {
|
||||||
@@ -96,9 +90,6 @@ if (program.define) {
|
|||||||
options.compress.global_defs[expr] = program.define[expr];
|
options.compress.global_defs[expr] = program.define[expr];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (program.keepClassnames) {
|
|
||||||
options.keep_classnames = true;
|
|
||||||
}
|
|
||||||
if (program.keepFnames) {
|
if (program.keepFnames) {
|
||||||
options.keep_fnames = true;
|
options.keep_fnames = true;
|
||||||
}
|
}
|
||||||
@@ -109,7 +100,7 @@ if (program.mangleProps) {
|
|||||||
if (typeof program.mangleProps != "object") program.mangleProps = {};
|
if (typeof program.mangleProps != "object") program.mangleProps = {};
|
||||||
if (!Array.isArray(program.mangleProps.reserved)) program.mangleProps.reserved = [];
|
if (!Array.isArray(program.mangleProps.reserved)) program.mangleProps.reserved = [];
|
||||||
require("../tools/domprops").forEach(function(name) {
|
require("../tools/domprops").forEach(function(name) {
|
||||||
UglifyJS._push_uniq(program.mangleProps.reserved, name);
|
UglifyJS.push_uniq(program.mangleProps.reserved, name);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (typeof options.mangle != "object") options.mangle = {};
|
if (typeof options.mangle != "object") options.mangle = {};
|
||||||
@@ -187,6 +178,11 @@ function run() {
|
|||||||
UglifyJS.AST_Node.warn_function = function(msg) {
|
UglifyJS.AST_Node.warn_function = function(msg) {
|
||||||
print_error("WARN: " + msg);
|
print_error("WARN: " + msg);
|
||||||
};
|
};
|
||||||
|
var content = program.sourceMap && program.sourceMap.content;
|
||||||
|
if (content && content != "inline") {
|
||||||
|
print_error("INFO: Using input source map: " + content);
|
||||||
|
options.sourceMap.content = read_file(content, content);
|
||||||
|
}
|
||||||
if (program.timings) options.timings = true;
|
if (program.timings) options.timings = true;
|
||||||
try {
|
try {
|
||||||
if (program.parse) {
|
if (program.parse) {
|
||||||
@@ -259,11 +255,6 @@ function run() {
|
|||||||
var result = {
|
var result = {
|
||||||
_class: "AST_" + value.TYPE
|
_class: "AST_" + value.TYPE
|
||||||
};
|
};
|
||||||
if (value.block_scope) {
|
|
||||||
result.variables = value.block_scope.variables;
|
|
||||||
result.functions = value.block_scope.functions;
|
|
||||||
result.enclosed = value.block_scope.enclosed;
|
|
||||||
}
|
|
||||||
value.CTOR.PROPS.forEach(function(prop) {
|
value.CTOR.PROPS.forEach(function(prop) {
|
||||||
result[prop] = value[prop];
|
result[prop] = value[prop];
|
||||||
});
|
});
|
||||||
@@ -393,19 +384,6 @@ function parse_js(flag) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function parse_source_map() {
|
|
||||||
var parse = parse_js();
|
|
||||||
return function(value, options) {
|
|
||||||
var hasContent = options && "content" in options;
|
|
||||||
var settings = parse(value, options);
|
|
||||||
if (!hasContent && settings.content && settings.content != "inline") {
|
|
||||||
print_error("INFO: Using input source map: " + settings.content);
|
|
||||||
settings.content = read_file(settings.content, settings.content);
|
|
||||||
}
|
|
||||||
return settings;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function skip_key(key) {
|
function skip_key(key) {
|
||||||
return skip_keys.indexOf(key) >= 0;
|
return skip_keys.indexOf(key) >= 0;
|
||||||
}
|
}
|
||||||
|
|||||||
538
lib/ast.js
538
lib/ast.js
@@ -44,21 +44,21 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
function DEFNODE(type, props, methods, base) {
|
function DEFNODE(type, props, methods, base) {
|
||||||
if (arguments.length < 4) base = AST_Node;
|
if (typeof base === "undefined") base = AST_Node;
|
||||||
if (!props) props = [];
|
props = props ? props.split(/\s+/) : [];
|
||||||
else props = props.split(/\s+/);
|
|
||||||
var self_props = props;
|
var self_props = props;
|
||||||
if (base && base.PROPS)
|
if (base && base.PROPS) props = props.concat(base.PROPS);
|
||||||
props = props.concat(base.PROPS);
|
var code = [
|
||||||
var code = "return function AST_" + type + "(props){ if (props) { ";
|
"return function AST_", type, "(props){",
|
||||||
for (var i = props.length; --i >= 0;) {
|
"if(props){",
|
||||||
code += "this." + props[i] + " = props." + props[i] + ";";
|
];
|
||||||
}
|
props.forEach(function(prop) {
|
||||||
|
code.push("this.", prop, "=props.", prop, ";");
|
||||||
|
});
|
||||||
var proto = base && new base;
|
var proto = base && new base;
|
||||||
if (proto && proto.initialize || (methods && methods.initialize))
|
if (proto && proto.initialize || methods && methods.initialize) code.push("this.initialize();");
|
||||||
code += "this.initialize();";
|
code.push("}}");
|
||||||
code += "}}";
|
var ctor = new Function(code.join(""))();
|
||||||
var ctor = new Function(code)();
|
|
||||||
if (proto) {
|
if (proto) {
|
||||||
ctor.prototype = proto;
|
ctor.prototype = proto;
|
||||||
ctor.BASE = base;
|
ctor.BASE = base;
|
||||||
@@ -71,11 +71,11 @@ function DEFNODE(type, props, methods, base) {
|
|||||||
if (type) {
|
if (type) {
|
||||||
ctor.prototype.TYPE = ctor.TYPE = type;
|
ctor.prototype.TYPE = ctor.TYPE = type;
|
||||||
}
|
}
|
||||||
if (methods) for (i in methods) if (HOP(methods, i)) {
|
if (methods) for (var name in methods) if (HOP(methods, name)) {
|
||||||
if (/^\$/.test(i)) {
|
if (/^\$/.test(name)) {
|
||||||
ctor[i.substr(1)] = methods[i];
|
ctor[name.substr(1)] = methods[name];
|
||||||
} else {
|
} else {
|
||||||
ctor.prototype[i] = methods[i];
|
ctor.prototype[name] = methods[name];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ctor.DEFMETHOD = function(name, method) {
|
ctor.DEFMETHOD = function(name, method) {
|
||||||
@@ -85,7 +85,7 @@ function DEFNODE(type, props, methods, base) {
|
|||||||
exports["AST_" + type] = ctor;
|
exports["AST_" + type] = ctor;
|
||||||
}
|
}
|
||||||
return ctor;
|
return ctor;
|
||||||
};
|
}
|
||||||
|
|
||||||
var AST_Token = DEFNODE("Token", "type value line col pos endline endcol endpos nlb comments_before comments_after file raw", {
|
var AST_Token = DEFNODE("Token", "type value line col pos endline endcol endpos nlb comments_before comments_after file raw", {
|
||||||
}, null);
|
}, null);
|
||||||
@@ -118,10 +118,8 @@ var AST_Node = DEFNODE("Node", "start end", {
|
|||||||
}
|
}
|
||||||
}, null);
|
}, null);
|
||||||
|
|
||||||
AST_Node.warn_function = null;
|
|
||||||
AST_Node.warn = function(txt, props) {
|
AST_Node.warn = function(txt, props) {
|
||||||
if (AST_Node.warn_function)
|
if (AST_Node.warn_function) AST_Node.warn_function(string_template(txt, props));
|
||||||
AST_Node.warn_function(string_template(txt, props));
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* -----[ statements ]----- */
|
/* -----[ statements ]----- */
|
||||||
@@ -148,7 +146,7 @@ var AST_SimpleStatement = DEFNODE("SimpleStatement", "body", {
|
|||||||
body: "[AST_Node] an expression node (should not be instanceof AST_Statement)"
|
body: "[AST_Node] an expression node (should not be instanceof AST_Statement)"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.body._walk(visitor);
|
this.body._walk(visitor);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -156,21 +154,20 @@ var AST_SimpleStatement = DEFNODE("SimpleStatement", "body", {
|
|||||||
|
|
||||||
function walk_body(node, visitor) {
|
function walk_body(node, visitor) {
|
||||||
var body = node.body;
|
var body = node.body;
|
||||||
if (body instanceof AST_Node) {
|
if (body instanceof AST_Statement) {
|
||||||
body._walk(visitor);
|
body._walk(visitor);
|
||||||
}
|
} else body.forEach(function(node) {
|
||||||
else for (var i = 0, len = body.length; i < len; i++) {
|
node._walk(visitor);
|
||||||
body[i]._walk(visitor);
|
});
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
var AST_Block = DEFNODE("Block", "body", {
|
var AST_Block = DEFNODE("Block", "body", {
|
||||||
$documentation: "A body of statements (usually bracketed)",
|
$documentation: "A body of statements (usually braced)",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
body: "[AST_Statement*] an array of statements"
|
body: "[AST_Statement*] an array of statements"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
walk_body(this, visitor);
|
walk_body(this, visitor);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -197,7 +194,7 @@ var AST_LabeledStatement = DEFNODE("LabeledStatement", "label", {
|
|||||||
label: "[AST_Label] a label definition"
|
label: "[AST_Label] a label definition"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.label._walk(visitor);
|
this.label._walk(visitor);
|
||||||
this.body._walk(visitor);
|
this.body._walk(visitor);
|
||||||
});
|
});
|
||||||
@@ -208,8 +205,7 @@ var AST_LabeledStatement = DEFNODE("LabeledStatement", "label", {
|
|||||||
var label = node.label;
|
var label = node.label;
|
||||||
var def = this.label;
|
var def = this.label;
|
||||||
node.walk(new TreeWalker(function(node) {
|
node.walk(new TreeWalker(function(node) {
|
||||||
if (node instanceof AST_LoopControl
|
if (node instanceof AST_LoopControl && node.label && node.label.thedef === def) {
|
||||||
&& node.label && node.label.thedef === def) {
|
|
||||||
node.label.thedef = label;
|
node.label.thedef = label;
|
||||||
label.references.push(node);
|
label.references.push(node);
|
||||||
}
|
}
|
||||||
@@ -233,7 +229,7 @@ var AST_DWLoop = DEFNODE("DWLoop", "condition", {
|
|||||||
var AST_Do = DEFNODE("Do", null, {
|
var AST_Do = DEFNODE("Do", null, {
|
||||||
$documentation: "A `do` statement",
|
$documentation: "A `do` statement",
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.body._walk(visitor);
|
this.body._walk(visitor);
|
||||||
this.condition._walk(visitor);
|
this.condition._walk(visitor);
|
||||||
});
|
});
|
||||||
@@ -243,7 +239,7 @@ var AST_Do = DEFNODE("Do", null, {
|
|||||||
var AST_While = DEFNODE("While", null, {
|
var AST_While = DEFNODE("While", null, {
|
||||||
$documentation: "A `while` statement",
|
$documentation: "A `while` statement",
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.condition._walk(visitor);
|
this.condition._walk(visitor);
|
||||||
this.body._walk(visitor);
|
this.body._walk(visitor);
|
||||||
});
|
});
|
||||||
@@ -258,7 +254,7 @@ var AST_For = DEFNODE("For", "init condition step", {
|
|||||||
step: "[AST_Node?] the `for` update clause, or null if empty"
|
step: "[AST_Node?] the `for` update clause, or null if empty"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
if (this.init) this.init._walk(visitor);
|
if (this.init) this.init._walk(visitor);
|
||||||
if (this.condition) this.condition._walk(visitor);
|
if (this.condition) this.condition._walk(visitor);
|
||||||
if (this.step) this.step._walk(visitor);
|
if (this.step) this.step._walk(visitor);
|
||||||
@@ -274,7 +270,7 @@ var AST_ForIn = DEFNODE("ForIn", "init object", {
|
|||||||
object: "[AST_Node] the object that we're looping through"
|
object: "[AST_Node] the object that we're looping through"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.init._walk(visitor);
|
this.init._walk(visitor);
|
||||||
this.object._walk(visitor);
|
this.object._walk(visitor);
|
||||||
this.body._walk(visitor);
|
this.body._walk(visitor);
|
||||||
@@ -282,17 +278,13 @@ var AST_ForIn = DEFNODE("ForIn", "init 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: {
|
||||||
expression: "[AST_Node] the `with` expression"
|
expression: "[AST_Node] the `with` expression"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.expression._walk(visitor);
|
this.expression._walk(visitor);
|
||||||
this.body._walk(visitor);
|
this.body._walk(visitor);
|
||||||
});
|
});
|
||||||
@@ -312,19 +304,15 @@ var AST_Scope = DEFNODE("Scope", "variables functions uses_with uses_eval parent
|
|||||||
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 = self.parent_scope;
|
|
||||||
}
|
|
||||||
return self;
|
|
||||||
},
|
|
||||||
clone: function(deep) {
|
clone: function(deep) {
|
||||||
var node = this._clone(deep);
|
var node = this._clone(deep);
|
||||||
if (this.variables) node.variables = this.variables.clone();
|
if (this.variables) node.variables = this.variables.clone();
|
||||||
if (this.functions) node.functions = this.functions.clone();
|
if (this.functions) node.functions = this.functions.clone();
|
||||||
if (this.enclosed) node.enclosed = this.enclosed.slice();
|
if (this.enclosed) node.enclosed = this.enclosed.slice();
|
||||||
return node;
|
return node;
|
||||||
|
},
|
||||||
|
pinned: function() {
|
||||||
|
return this.uses_eval || this.uses_with;
|
||||||
}
|
}
|
||||||
}, AST_Block);
|
}, AST_Block);
|
||||||
|
|
||||||
@@ -337,55 +325,45 @@ var AST_Toplevel = DEFNODE("Toplevel", "globals", {
|
|||||||
var body = this.body;
|
var body = this.body;
|
||||||
var wrapped_tl = "(function(exports){'$ORIG';})(typeof " + name + "=='undefined'?(" + name + "={}):" + name + ");";
|
var wrapped_tl = "(function(exports){'$ORIG';})(typeof " + name + "=='undefined'?(" + name + "={}):" + name + ");";
|
||||||
wrapped_tl = parse(wrapped_tl);
|
wrapped_tl = parse(wrapped_tl);
|
||||||
wrapped_tl = wrapped_tl.transform(new TreeTransformer(function before(node){
|
wrapped_tl = wrapped_tl.transform(new TreeTransformer(function(node) {
|
||||||
if (node instanceof AST_Directive && node.value == "$ORIG") {
|
if (node instanceof AST_Directive && node.value == "$ORIG") {
|
||||||
return MAP.splice(body);
|
return MAP.splice(body);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
return wrapped_tl;
|
return wrapped_tl;
|
||||||
|
},
|
||||||
|
wrap_enclose: function(args_values) {
|
||||||
|
if (typeof args_values != "string") args_values = "";
|
||||||
|
var index = args_values.indexOf(":");
|
||||||
|
if (index < 0) index = args_values.length;
|
||||||
|
var body = this.body;
|
||||||
|
return parse([
|
||||||
|
"(function(",
|
||||||
|
args_values.slice(0, index),
|
||||||
|
'){"$ORIG"})(',
|
||||||
|
args_values.slice(index + 1),
|
||||||
|
")"
|
||||||
|
].join("")).transform(new TreeTransformer(function(node) {
|
||||||
|
if (node instanceof AST_Directive && node.value == "$ORIG") {
|
||||||
|
return MAP.splice(body);
|
||||||
|
}
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
}, AST_Scope);
|
}, AST_Scope);
|
||||||
|
|
||||||
var AST_Expansion = DEFNODE("Expansion", "expression", {
|
var AST_Lambda = DEFNODE("Lambda", "name argnames uses_arguments", {
|
||||||
$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_Node] the thing to be expanded"
|
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
var self = this;
|
|
||||||
return visitor._visit(this, function(){
|
|
||||||
self.expression.walk(visitor);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var AST_Lambda = DEFNODE("Lambda", "name argnames uses_arguments is_generator async", {
|
|
||||||
$documentation: "Base class for functions",
|
$documentation: "Base class for functions",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
name: "[AST_SymbolDeclaration?] the name of this function",
|
name: "[AST_SymbolDeclaration?] the name of this function",
|
||||||
argnames: "[AST_SymbolFunarg|AST_Destructuring|AST_Expansion|AST_DefaultAssign*] array of function arguments, destructurings, or expanding arguments",
|
argnames: "[AST_SymbolFunarg*] array of function 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"
|
||||||
is_generator: "[boolean] is this a generator method",
|
|
||||||
async: "[boolean] is this method async",
|
|
||||||
},
|
|
||||||
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(argname) {
|
||||||
for (var i = 0, len = argnames.length; i < len; i++) {
|
argname._walk(visitor);
|
||||||
argnames[i]._walk(visitor);
|
});
|
||||||
}
|
|
||||||
walk_body(this, visitor);
|
walk_body(this, visitor);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -399,76 +377,10 @@ var AST_Function = DEFNODE("Function", "inlined", {
|
|||||||
$documentation: "A function expression"
|
$documentation: "A function expression"
|
||||||
}, AST_Lambda);
|
}, AST_Lambda);
|
||||||
|
|
||||||
var AST_Arrow = DEFNODE("Arrow", "inlined", {
|
|
||||||
$documentation: "An ES6 Arrow function ((a) => b)"
|
|
||||||
}, AST_Lambda);
|
|
||||||
|
|
||||||
var AST_Defun = DEFNODE("Defun", "inlined", {
|
var AST_Defun = DEFNODE("Defun", "inlined", {
|
||||||
$documentation: "A function definition"
|
$documentation: "A function definition"
|
||||||
}, AST_Lambda);
|
}, AST_Lambda);
|
||||||
|
|
||||||
/* -----[ DESTRUCTURING ]----- */
|
|
||||||
var AST_Destructuring = DEFNODE("Destructuring", "names is_array", {
|
|
||||||
$documentation: "A destructuring of several names. Used in destructuring assignment and with destructuring function argument names",
|
|
||||||
$propdoc: {
|
|
||||||
"names": "[AST_Node*] Array of properties or elements",
|
|
||||||
"is_array": "[Boolean] Whether the destructuring represents an object or array"
|
|
||||||
},
|
|
||||||
_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_Node*] One or more segments, starting with AST_TemplateSegment. AST_Node may follow AST_TemplateSegment, but each AST_Node must be followed by AST_TemplateSegment."
|
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function(){
|
|
||||||
this.segments.forEach(function(seg){
|
|
||||||
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, {
|
||||||
@@ -481,7 +393,7 @@ var AST_Exit = DEFNODE("Exit", "value", {
|
|||||||
value: "[AST_Node?] the value returned or thrown by this statement; could be null for AST_Return"
|
value: "[AST_Node?] the value returned or thrown by this statement; could be null for AST_Return"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, this.value && function(){
|
return visitor._visit(this, this.value && function() {
|
||||||
this.value._walk(visitor);
|
this.value._walk(visitor);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -501,7 +413,7 @@ var AST_LoopControl = DEFNODE("LoopControl", "label", {
|
|||||||
label: "[AST_LabelRef?] the label, or null if none",
|
label: "[AST_LabelRef?] the label, or null if none",
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, this.label && function(){
|
return visitor._visit(this, this.label && function() {
|
||||||
this.label._walk(visitor);
|
this.label._walk(visitor);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -524,7 +436,7 @@ var AST_If = DEFNODE("If", "condition alternative", {
|
|||||||
alternative: "[AST_Statement?] the `else` part, or null if not present"
|
alternative: "[AST_Statement?] the `else` part, or null if not present"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.condition._walk(visitor);
|
this.condition._walk(visitor);
|
||||||
this.body._walk(visitor);
|
this.body._walk(visitor);
|
||||||
if (this.alternative) this.alternative._walk(visitor);
|
if (this.alternative) this.alternative._walk(visitor);
|
||||||
@@ -540,7 +452,7 @@ var AST_Switch = DEFNODE("Switch", "expression", {
|
|||||||
expression: "[AST_Node] the `switch` “discriminant”"
|
expression: "[AST_Node] the `switch` “discriminant”"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.expression._walk(visitor);
|
this.expression._walk(visitor);
|
||||||
walk_body(this, visitor);
|
walk_body(this, visitor);
|
||||||
});
|
});
|
||||||
@@ -561,7 +473,7 @@ var AST_Case = DEFNODE("Case", "expression", {
|
|||||||
expression: "[AST_Node] the `case` expression"
|
expression: "[AST_Node] the `case` expression"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.expression._walk(visitor);
|
this.expression._walk(visitor);
|
||||||
walk_body(this, visitor);
|
walk_body(this, visitor);
|
||||||
});
|
});
|
||||||
@@ -577,7 +489,7 @@ var AST_Try = DEFNODE("Try", "bcatch bfinally", {
|
|||||||
bfinally: "[AST_Finally?] the finally block, or null if not present"
|
bfinally: "[AST_Finally?] the finally block, or null if not present"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
walk_body(this, visitor);
|
walk_body(this, visitor);
|
||||||
if (this.bcatch) this.bcatch._walk(visitor);
|
if (this.bcatch) this.bcatch._walk(visitor);
|
||||||
if (this.bfinally) this.bfinally._walk(visitor);
|
if (this.bfinally) this.bfinally._walk(visitor);
|
||||||
@@ -588,10 +500,10 @@ var AST_Try = DEFNODE("Try", "bcatch bfinally", {
|
|||||||
var AST_Catch = DEFNODE("Catch", "argname", {
|
var AST_Catch = DEFNODE("Catch", "argname", {
|
||||||
$documentation: "A `catch` node; only makes sense as part of a `try` statement",
|
$documentation: "A `catch` node; only makes sense as part of a `try` statement",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
argname: "[AST_SymbolCatch|AST_Destructuring|AST_Expansion|AST_DefaultAssign] symbol for the exception"
|
argname: "[AST_SymbolCatch] symbol for the exception"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.argname._walk(visitor);
|
this.argname._walk(visitor);
|
||||||
walk_body(this, visitor);
|
walk_body(this, visitor);
|
||||||
});
|
});
|
||||||
@@ -602,19 +514,18 @@ var AST_Finally = DEFNODE("Finally", null, {
|
|||||||
$documentation: "A `finally` node; only makes sense as part of a `try` statement"
|
$documentation: "A `finally` node; only makes sense as part of a `try` statement"
|
||||||
}, AST_Block);
|
}, AST_Block);
|
||||||
|
|
||||||
/* -----[ VAR/CONST ]----- */
|
/* -----[ VAR ]----- */
|
||||||
|
|
||||||
var AST_Definitions = DEFNODE("Definitions", "definitions", {
|
var AST_Definitions = DEFNODE("Definitions", "definitions", {
|
||||||
$documentation: "Base class for `var` or `const` nodes (variable declarations/initializations)",
|
$documentation: "Base class for `var` nodes (variable declarations/initializations)",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
definitions: "[AST_VarDef*] array of variable definitions"
|
definitions: "[AST_VarDef*] array of variable 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(defn) {
|
||||||
for (var i = 0, len = definitions.length; i < len; i++) {
|
defn._walk(visitor);
|
||||||
definitions[i]._walk(visitor);
|
});
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, AST_Statement);
|
}, AST_Statement);
|
||||||
@@ -623,87 +534,14 @@ 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, {
|
|
||||||
$documentation: "A `const` statement"
|
|
||||||
}, AST_Definitions);
|
|
||||||
|
|
||||||
var AST_NameMapping = DEFNODE("NameMapping", "foreign_name name", {
|
|
||||||
$documentation: "The part of the export/import statement that declare names from a module.",
|
|
||||||
$propdoc: {
|
|
||||||
foreign_name: "[AST_SymbolExportForeign|AST_SymbolImportForeign] The name being exported/imported (as specified in the module)",
|
|
||||||
name: "[AST_SymbolExport|AST_SymbolImport] The name as it is visible 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_NameMapping*] 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 exported_names module_name", {
|
|
||||||
$documentation: "An `export` statement",
|
|
||||||
$propdoc: {
|
|
||||||
exported_definition: "[AST_Defun|AST_Definitions|AST_DefClass?] An exported definition",
|
|
||||||
exported_value: "[AST_Node?] An exported value",
|
|
||||||
exported_names: "[AST_NameMapping*?] List of exported names",
|
|
||||||
module_name: "[AST_String?] Name of the file to load exports from",
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
if (this.exported_names) {
|
|
||||||
this.exported_names.forEach(function(name_export) {
|
|
||||||
name_export._walk(visitor);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (this.module_name) {
|
|
||||||
this.module_name._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_Destructuring|AST_SymbolConst|AST_SymbolLet|AST_SymbolVar] name of the variable",
|
name: "[AST_SymbolVar] 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"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.name._walk(visitor);
|
this.name._walk(visitor);
|
||||||
if (this.value) this.value._walk(visitor);
|
if (this.value) this.value._walk(visitor);
|
||||||
});
|
});
|
||||||
@@ -719,12 +557,11 @@ var AST_Call = DEFNODE("Call", "expression args", {
|
|||||||
args: "[AST_Node*] array of arguments"
|
args: "[AST_Node*] array of arguments"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
var args = this.args;
|
|
||||||
for (var i = 0, len = args.length; i < len; i++) {
|
|
||||||
args[i]._walk(visitor);
|
|
||||||
}
|
|
||||||
this.expression._walk(visitor);
|
this.expression._walk(visitor);
|
||||||
|
this.args.forEach(function(node) {
|
||||||
|
node._walk(visitor);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -739,7 +576,7 @@ var AST_Sequence = DEFNODE("Sequence", "expressions", {
|
|||||||
expressions: "[AST_Node*] array of expressions (at least two)"
|
expressions: "[AST_Node*] array of expressions (at least two)"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.expressions.forEach(function(node) {
|
this.expressions.forEach(function(node) {
|
||||||
node._walk(visitor);
|
node._walk(visitor);
|
||||||
});
|
});
|
||||||
@@ -758,7 +595,7 @@ var AST_PropAccess = DEFNODE("PropAccess", "expression property", {
|
|||||||
var AST_Dot = DEFNODE("Dot", null, {
|
var AST_Dot = DEFNODE("Dot", null, {
|
||||||
$documentation: "A dotted property access expression",
|
$documentation: "A dotted property access expression",
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.expression._walk(visitor);
|
this.expression._walk(visitor);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -767,7 +604,7 @@ var AST_Dot = DEFNODE("Dot", null, {
|
|||||||
var AST_Sub = DEFNODE("Sub", null, {
|
var AST_Sub = DEFNODE("Sub", null, {
|
||||||
$documentation: "Index-style property access, i.e. `a[\"foo\"]`",
|
$documentation: "Index-style property access, i.e. `a[\"foo\"]`",
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.expression._walk(visitor);
|
this.expression._walk(visitor);
|
||||||
this.property._walk(visitor);
|
this.property._walk(visitor);
|
||||||
});
|
});
|
||||||
@@ -781,7 +618,7 @@ var AST_Unary = DEFNODE("Unary", "operator expression", {
|
|||||||
expression: "[AST_Node] expression that this unary operator applies to"
|
expression: "[AST_Node] expression that this unary operator applies to"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.expression._walk(visitor);
|
this.expression._walk(visitor);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -803,7 +640,7 @@ var AST_Binary = DEFNODE("Binary", "operator left right", {
|
|||||||
right: "[AST_Node] right-hand side expression"
|
right: "[AST_Node] right-hand side expression"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.left._walk(visitor);
|
this.left._walk(visitor);
|
||||||
this.right._walk(visitor);
|
this.right._walk(visitor);
|
||||||
});
|
});
|
||||||
@@ -818,7 +655,7 @@ var AST_Conditional = DEFNODE("Conditional", "condition consequent alternative",
|
|||||||
alternative: "[AST_Node]"
|
alternative: "[AST_Node]"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.condition._walk(visitor);
|
this.condition._walk(visitor);
|
||||||
this.consequent._walk(visitor);
|
this.consequent._walk(visitor);
|
||||||
this.alternative._walk(visitor);
|
this.alternative._walk(visitor);
|
||||||
@@ -830,10 +667,6 @@ var AST_Assign = DEFNODE("Assign", null, {
|
|||||||
$documentation: "An assignment expression — `a = b + 5`",
|
$documentation: "An assignment expression — `a = b + 5`",
|
||||||
}, AST_Binary);
|
}, AST_Binary);
|
||||||
|
|
||||||
var AST_DefaultAssign = DEFNODE("DefaultAssign", null, {
|
|
||||||
$documentation: "A default assignment expression like in `(a = 3) => a`"
|
|
||||||
}, AST_Binary);
|
|
||||||
|
|
||||||
/* -----[ LITERALS ]----- */
|
/* -----[ LITERALS ]----- */
|
||||||
|
|
||||||
var AST_Array = DEFNODE("Array", "elements", {
|
var AST_Array = DEFNODE("Array", "elements", {
|
||||||
@@ -842,11 +675,10 @@ var AST_Array = DEFNODE("Array", "elements", {
|
|||||||
elements: "[AST_Node*] array of elements"
|
elements: "[AST_Node*] array of 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(element) {
|
||||||
for (var i = 0, len = elements.length; i < len; i++) {
|
element._walk(visitor);
|
||||||
elements[i]._walk(visitor);
|
});
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -857,11 +689,10 @@ var AST_Object = DEFNODE("Object", "properties", {
|
|||||||
properties: "[AST_ObjectProperty*] array of properties"
|
properties: "[AST_ObjectProperty*] array of 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);
|
});
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -869,13 +700,11 @@ 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|AST_Node] property name. For ObjectKeyVal this is a string. For getters, setters and computed property this is an AST_Node.",
|
key: "[string|AST_SymbolAccessor] property name. For ObjectKeyVal this is a string. For getters and setters this is an AST_SymbolAccessor.",
|
||||||
value: "[AST_Node] property value. For getters and setters this is an AST_Accessor."
|
value: "[AST_Node] property value. For getters and setters this is an AST_Accessor."
|
||||||
},
|
},
|
||||||
_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);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -888,95 +717,35 @@ var AST_ObjectKeyVal = DEFNODE("ObjectKeyVal", "quote", {
|
|||||||
}
|
}
|
||||||
}, AST_ObjectProperty);
|
}, AST_ObjectProperty);
|
||||||
|
|
||||||
var AST_ObjectSetter = DEFNODE("ObjectSetter", "quote static", {
|
var AST_ObjectSetter = DEFNODE("ObjectSetter", null, {
|
||||||
$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", "quote static", {
|
var AST_ObjectGetter = DEFNODE("ObjectGetter", null, {
|
||||||
$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_ConciseMethod = DEFNODE("ConciseMethod", "quote static is_generator async", {
|
|
||||||
$propdoc: {
|
|
||||||
quote: "[string|undefined] the original quote character, if any",
|
|
||||||
static: "[boolean] is this method static (classes only)",
|
|
||||||
is_generator: "[boolean] is this a generator method",
|
|
||||||
async: "[boolean] is this method async",
|
|
||||||
},
|
|
||||||
$documentation: "An ES6 concise method inside an object or class"
|
|
||||||
}, AST_ObjectProperty);
|
|
||||||
|
|
||||||
var AST_Class = DEFNODE("Class", "name extends properties inlined", {
|
|
||||||
$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", {
|
var AST_Symbol = DEFNODE("Symbol", "scope name thedef", {
|
||||||
$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"
|
||||||
},
|
},
|
||||||
$documentation: "Base class for all symbols"
|
$documentation: "Base class for all symbols",
|
||||||
});
|
});
|
||||||
|
|
||||||
var AST_NewTarget = DEFNODE("NewTarget", null, {
|
var AST_SymbolAccessor = DEFNODE("SymbolAccessor", null, {
|
||||||
$documentation: "A reference to new.target"
|
$documentation: "The name of a property accessor (setter/getter function)"
|
||||||
});
|
}, AST_Symbol);
|
||||||
|
|
||||||
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, function name or argument, symbol in catch)",
|
||||||
}, 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, {
|
|
||||||
$documentation: "A constant declaration"
|
|
||||||
}, 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",
|
||||||
}, AST_SymbolVar);
|
}, AST_SymbolVar);
|
||||||
@@ -985,33 +754,13 @@ 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_SymbolBlockDeclaration);
|
}, AST_SymbolDeclaration);
|
||||||
|
|
||||||
var AST_SymbolImport = DEFNODE("SymbolImport", null, {
|
|
||||||
$documentation: "Symbol referring 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)",
|
||||||
@@ -1028,14 +777,6 @@ var AST_SymbolRef = DEFNODE("SymbolRef", null, {
|
|||||||
$documentation: "Reference to some symbol (not definition/declaration)",
|
$documentation: "Reference to some symbol (not definition/declaration)",
|
||||||
}, AST_Symbol);
|
}, AST_Symbol);
|
||||||
|
|
||||||
var AST_SymbolExport = DEFNODE("SymbolExport", null, {
|
|
||||||
$documentation: "Symbol referring to a name to export",
|
|
||||||
}, AST_SymbolRef);
|
|
||||||
|
|
||||||
var AST_SymbolExportForeign = DEFNODE("SymbolExportForeign", null, {
|
|
||||||
$documentation: "A symbol exported from this module, but it is used in the other module, and its real name is irrelevant for this module's purposes",
|
|
||||||
}, AST_Symbol);
|
|
||||||
|
|
||||||
var AST_LabelRef = DEFNODE("LabelRef", null, {
|
var AST_LabelRef = DEFNODE("LabelRef", null, {
|
||||||
$documentation: "Reference to a label symbol",
|
$documentation: "Reference to a label symbol",
|
||||||
}, AST_Symbol);
|
}, AST_Symbol);
|
||||||
@@ -1044,10 +785,6 @@ 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_This);
|
|
||||||
|
|
||||||
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() {
|
||||||
@@ -1094,12 +831,12 @@ var AST_NaN = DEFNODE("NaN", null, {
|
|||||||
|
|
||||||
var AST_Undefined = DEFNODE("Undefined", null, {
|
var AST_Undefined = DEFNODE("Undefined", null, {
|
||||||
$documentation: "The `undefined` value",
|
$documentation: "The `undefined` value",
|
||||||
value: (function(){}())
|
value: function(){}()
|
||||||
}, AST_Atom);
|
}, AST_Atom);
|
||||||
|
|
||||||
var AST_Hole = DEFNODE("Hole", null, {
|
var AST_Hole = DEFNODE("Hole", null, {
|
||||||
$documentation: "A hole in an array",
|
$documentation: "A hole in an array",
|
||||||
value: (function(){}())
|
value: function(){}()
|
||||||
}, AST_Atom);
|
}, AST_Atom);
|
||||||
|
|
||||||
var AST_Infinity = DEFNODE("Infinity", null, {
|
var AST_Infinity = DEFNODE("Infinity", null, {
|
||||||
@@ -1121,42 +858,17 @@ var AST_True = DEFNODE("True", null, {
|
|||||||
value: true
|
value: true
|
||||||
}, AST_Boolean);
|
}, AST_Boolean);
|
||||||
|
|
||||||
var AST_Await = DEFNODE("Await", "expression", {
|
|
||||||
$documentation: "An `await` statement",
|
|
||||||
$propdoc: {
|
|
||||||
expression: "[AST_Node] the mandatory expression being awaited",
|
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function(){
|
|
||||||
this.expression._walk(visitor);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
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) {
|
||||||
this.visit = callback;
|
this.visit = callback;
|
||||||
this.stack = [];
|
this.stack = [];
|
||||||
this.directives = Object.create(null);
|
this.directives = Object.create(null);
|
||||||
};
|
}
|
||||||
TreeWalker.prototype = {
|
TreeWalker.prototype = {
|
||||||
_visit: function(node, descend) {
|
_visit: function(node, descend) {
|
||||||
this.push(node);
|
this.push(node);
|
||||||
var ret = this.visit(node, descend ? function(){
|
var ret = this.visit(node, descend ? function() {
|
||||||
descend.call(node);
|
descend.call(node);
|
||||||
} : noop);
|
} : noop);
|
||||||
if (!ret && descend) {
|
if (!ret && descend) {
|
||||||
@@ -1173,17 +885,11 @@ TreeWalker.prototype = {
|
|||||||
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]) {
|
||||||
this.directives[node.value] = node;
|
this.directives[node.value] = node;
|
||||||
} else if (node instanceof AST_Class) {
|
|
||||||
this.directives = Object.create(this.directives);
|
|
||||||
if (!this.directives["use strict"]) {
|
|
||||||
this.directives["use strict"] = node;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
this.stack.push(node);
|
this.stack.push(node);
|
||||||
},
|
},
|
||||||
pop: function() {
|
pop: function() {
|
||||||
var node = this.stack.pop();
|
if (this.stack.pop() instanceof AST_Lambda) {
|
||||||
if (node instanceof AST_Lambda || node instanceof AST_Class) {
|
|
||||||
this.directives = Object.getPrototypeOf(this.directives);
|
this.directives = Object.getPrototypeOf(this.directives);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1201,7 +907,7 @@ 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 && node.body) {
|
if (node instanceof AST_Scope) {
|
||||||
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;
|
||||||
@@ -1221,5 +927,25 @@ TreeWalker.prototype = {
|
|||||||
|| node instanceof AST_Break && x instanceof AST_Switch)
|
|| node instanceof AST_Break && x instanceof AST_Switch)
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
in_boolean_context: function() {
|
||||||
|
var self = this.self();
|
||||||
|
for (var i = 0, p; p = this.parent(i); i++) {
|
||||||
|
if (p instanceof AST_SimpleStatement
|
||||||
|
|| p instanceof AST_Conditional && p.condition === self
|
||||||
|
|| p instanceof AST_DWLoop && p.condition === self
|
||||||
|
|| p instanceof AST_For && p.condition === self
|
||||||
|
|| p instanceof AST_If && p.condition === self
|
||||||
|
|| p instanceof AST_UnaryPrefix && p.operator == "!" && p.expression === self) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (p instanceof AST_Binary && (p.operator == "&&" || p.operator == "||")
|
||||||
|
|| p instanceof AST_Conditional
|
||||||
|
|| p.tail_node() === self) {
|
||||||
|
self = p;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
3436
lib/compress.js
3436
lib/compress.js
File diff suppressed because it is too large
Load Diff
@@ -7,15 +7,23 @@ var to_base64 = typeof btoa == "undefined" ? function(str) {
|
|||||||
return new Buffer(str).toString("base64");
|
return new Buffer(str).toString("base64");
|
||||||
} : btoa;
|
} : btoa;
|
||||||
|
|
||||||
function read_source_map(code) {
|
function read_source_map(name, code) {
|
||||||
var match = /\n\/\/# sourceMappingURL=data:application\/json(;.*?)?;base64,(.*)/.exec(code);
|
var match = /\n\/\/# sourceMappingURL=data:application\/json(;.*?)?;base64,(.*)/.exec(code);
|
||||||
if (!match) {
|
if (!match) {
|
||||||
AST_Node.warn("inline source map not found");
|
AST_Node.warn("inline source map not found: " + name);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return to_ascii(match[2]);
|
return to_ascii(match[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function parse_source_map(content) {
|
||||||
|
try {
|
||||||
|
return JSON.parse(content);
|
||||||
|
} catch (ex) {
|
||||||
|
throw new Error("invalid input source map: " + content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function set_shorthand(name, options, keys) {
|
function set_shorthand(name, options, keys) {
|
||||||
if (options[name]) {
|
if (options[name]) {
|
||||||
keys.forEach(function(key) {
|
keys.forEach(function(key) {
|
||||||
@@ -47,16 +55,14 @@ function minify(files, options) {
|
|||||||
try {
|
try {
|
||||||
options = defaults(options, {
|
options = defaults(options, {
|
||||||
compress: {},
|
compress: {},
|
||||||
ecma: undefined,
|
enclose: false,
|
||||||
ie8: false,
|
ie8: false,
|
||||||
keep_classnames: undefined,
|
|
||||||
keep_fnames: false,
|
keep_fnames: false,
|
||||||
mangle: {},
|
mangle: {},
|
||||||
nameCache: null,
|
nameCache: null,
|
||||||
output: {},
|
output: {},
|
||||||
parse: {},
|
parse: {},
|
||||||
rename: undefined,
|
rename: undefined,
|
||||||
safari10: false,
|
|
||||||
sourceMap: false,
|
sourceMap: false,
|
||||||
timings: false,
|
timings: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
@@ -66,17 +72,11 @@ function minify(files, options) {
|
|||||||
var timings = options.timings && {
|
var timings = options.timings && {
|
||||||
start: Date.now()
|
start: Date.now()
|
||||||
};
|
};
|
||||||
if (options.keep_classnames === undefined) {
|
|
||||||
options.keep_classnames = options.keep_fnames;
|
|
||||||
}
|
|
||||||
if (options.rename === undefined) {
|
if (options.rename === undefined) {
|
||||||
options.rename = options.compress && options.mangle;
|
options.rename = options.compress && options.mangle;
|
||||||
}
|
}
|
||||||
set_shorthand("ecma", options, [ "parse", "compress", "output" ]);
|
|
||||||
set_shorthand("ie8", options, [ "compress", "mangle", "output" ]);
|
set_shorthand("ie8", options, [ "compress", "mangle", "output" ]);
|
||||||
set_shorthand("keep_classnames", options, [ "compress", "mangle" ]);
|
|
||||||
set_shorthand("keep_fnames", options, [ "compress", "mangle" ]);
|
set_shorthand("keep_fnames", options, [ "compress", "mangle" ]);
|
||||||
set_shorthand("safari10", options, [ "mangle", "output" ]);
|
|
||||||
set_shorthand("toplevel", options, [ "compress", "mangle" ]);
|
set_shorthand("toplevel", options, [ "compress", "mangle" ]);
|
||||||
set_shorthand("warnings", options, [ "compress" ]);
|
set_shorthand("warnings", options, [ "compress" ]);
|
||||||
var quoted_props;
|
var quoted_props;
|
||||||
@@ -85,11 +85,9 @@ function minify(files, options) {
|
|||||||
cache: options.nameCache && (options.nameCache.vars || {}),
|
cache: options.nameCache && (options.nameCache.vars || {}),
|
||||||
eval: false,
|
eval: false,
|
||||||
ie8: false,
|
ie8: false,
|
||||||
keep_classnames: false,
|
|
||||||
keep_fnames: false,
|
keep_fnames: false,
|
||||||
properties: false,
|
properties: false,
|
||||||
reserved: [],
|
reserved: [],
|
||||||
safari10: false,
|
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}, true);
|
}, true);
|
||||||
if (options.mangle.properties) {
|
if (options.mangle.properties) {
|
||||||
@@ -124,7 +122,7 @@ function minify(files, options) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
if (timings) timings.parse = Date.now();
|
if (timings) timings.parse = Date.now();
|
||||||
var toplevel;
|
var source_maps, toplevel;
|
||||||
if (files instanceof AST_Toplevel) {
|
if (files instanceof AST_Toplevel) {
|
||||||
toplevel = files;
|
toplevel = files;
|
||||||
} else {
|
} else {
|
||||||
@@ -133,13 +131,23 @@ function minify(files, options) {
|
|||||||
}
|
}
|
||||||
options.parse = options.parse || {};
|
options.parse = options.parse || {};
|
||||||
options.parse.toplevel = null;
|
options.parse.toplevel = null;
|
||||||
|
var source_map_content = options.sourceMap && options.sourceMap.content;
|
||||||
|
if (typeof source_map_content == "string" && source_map_content != "inline") {
|
||||||
|
source_map_content = parse_source_map(source_map_content);
|
||||||
|
}
|
||||||
|
source_maps = source_map_content && Object.create(null);
|
||||||
for (var name in files) if (HOP(files, name)) {
|
for (var name in files) if (HOP(files, name)) {
|
||||||
options.parse.filename = name;
|
options.parse.filename = name;
|
||||||
options.parse.toplevel = parse(files[name], options.parse);
|
options.parse.toplevel = parse(files[name], options.parse);
|
||||||
if (options.sourceMap && options.sourceMap.content == "inline") {
|
if (source_maps) {
|
||||||
if (Object.keys(files).length > 1)
|
if (source_map_content == "inline") {
|
||||||
throw new Error("inline source map only works with singular input");
|
var inlined_content = read_source_map(name, files[name]);
|
||||||
options.sourceMap.content = read_source_map(files[name]);
|
if (inlined_content) {
|
||||||
|
source_maps[name] = parse_source_map(inlined_content);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
source_maps[name] = source_map_content;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
toplevel = options.parse.toplevel;
|
toplevel = options.parse.toplevel;
|
||||||
@@ -150,10 +158,11 @@ function minify(files, options) {
|
|||||||
if (options.wrap) {
|
if (options.wrap) {
|
||||||
toplevel = toplevel.wrap_commonjs(options.wrap);
|
toplevel = toplevel.wrap_commonjs(options.wrap);
|
||||||
}
|
}
|
||||||
|
if (options.enclose) {
|
||||||
|
toplevel = toplevel.wrap_enclose(options.enclose);
|
||||||
|
}
|
||||||
if (timings) timings.rename = Date.now();
|
if (timings) timings.rename = Date.now();
|
||||||
// disable rename on harmony due to expand_names bug in for-of loops
|
if (options.rename) {
|
||||||
// https://github.com/mishoo/UglifyJS2/issues/2794
|
|
||||||
if (0 && options.rename) {
|
|
||||||
toplevel.figure_out_scope(options.mangle);
|
toplevel.figure_out_scope(options.mangle);
|
||||||
toplevel.expand_names(options.mangle);
|
toplevel.expand_names(options.mangle);
|
||||||
}
|
}
|
||||||
@@ -163,7 +172,6 @@ function minify(files, options) {
|
|||||||
if (options.mangle) toplevel.figure_out_scope(options.mangle);
|
if (options.mangle) toplevel.figure_out_scope(options.mangle);
|
||||||
if (timings) timings.mangle = Date.now();
|
if (timings) timings.mangle = Date.now();
|
||||||
if (options.mangle) {
|
if (options.mangle) {
|
||||||
base54.reset();
|
|
||||||
toplevel.compute_char_frequency(options.mangle);
|
toplevel.compute_char_frequency(options.mangle);
|
||||||
toplevel.mangle_names(options.mangle);
|
toplevel.mangle_names(options.mangle);
|
||||||
}
|
}
|
||||||
@@ -178,12 +186,9 @@ function minify(files, options) {
|
|||||||
}
|
}
|
||||||
if (!HOP(options.output, "code") || options.output.code) {
|
if (!HOP(options.output, "code") || options.output.code) {
|
||||||
if (options.sourceMap) {
|
if (options.sourceMap) {
|
||||||
if (typeof options.sourceMap.content == "string") {
|
|
||||||
options.sourceMap.content = JSON.parse(options.sourceMap.content);
|
|
||||||
}
|
|
||||||
options.output.source_map = SourceMap({
|
options.output.source_map = SourceMap({
|
||||||
file: options.sourceMap.filename,
|
file: options.sourceMap.filename,
|
||||||
orig: options.sourceMap.content,
|
orig: source_maps,
|
||||||
root: options.sourceMap.root
|
root: options.sourceMap.root
|
||||||
});
|
});
|
||||||
if (options.sourceMap.includeSources) {
|
if (options.sourceMap.includeSources) {
|
||||||
@@ -192,6 +197,8 @@ function minify(files, options) {
|
|||||||
} else for (var name in files) if (HOP(files, name)) {
|
} else for (var name in files) if (HOP(files, name)) {
|
||||||
options.output.source_map.get().setSourceContent(name, files[name]);
|
options.output.source_map.get().setSourceContent(name, files[name]);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
options.output.source_map.get()._sourcesContents = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
delete options.output.ast;
|
delete options.output.ast;
|
||||||
|
|||||||
@@ -43,11 +43,9 @@
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
(function(){
|
(function() {
|
||||||
|
function normalize_directives(body) {
|
||||||
var normalize_directives = function(body) {
|
|
||||||
var in_directive = true;
|
var in_directive = true;
|
||||||
|
|
||||||
for (var i = 0; i < body.length; i++) {
|
for (var i = 0; i < body.length; i++) {
|
||||||
if (in_directive && body[i] instanceof AST_Statement && body[i].body instanceof AST_String) {
|
if (in_directive && body[i] instanceof AST_Statement && body[i].body instanceof AST_String) {
|
||||||
body[i] = new AST_Directive({
|
body[i] = new AST_Directive({
|
||||||
@@ -59,9 +57,8 @@
|
|||||||
in_directive = false;
|
in_directive = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return body;
|
return body;
|
||||||
};
|
}
|
||||||
|
|
||||||
var MOZ_TO_ME = {
|
var MOZ_TO_ME = {
|
||||||
Program: function(M) {
|
Program: function(M) {
|
||||||
@@ -118,7 +115,7 @@
|
|||||||
value : from_moz(M.value)
|
value : from_moz(M.value)
|
||||||
};
|
};
|
||||||
if (M.kind == "init") return new AST_ObjectKeyVal(args);
|
if (M.kind == "init") return new AST_ObjectKeyVal(args);
|
||||||
args.key = new AST_SymbolMethod({
|
args.key = new AST_SymbolAccessor({
|
||||||
name: args.key
|
name: args.key
|
||||||
});
|
});
|
||||||
args.value = new AST_Accessor(args.value);
|
args.value = new AST_Accessor(args.value);
|
||||||
@@ -129,7 +126,7 @@
|
|||||||
return new AST_Array({
|
return new AST_Array({
|
||||||
start : my_start_token(M),
|
start : my_start_token(M),
|
||||||
end : my_end_token(M),
|
end : my_end_token(M),
|
||||||
elements : M.elements.map(function(elem){
|
elements : M.elements.map(function(elem) {
|
||||||
return elem === null ? new AST_Hole() : from_moz(elem);
|
return elem === null ? new AST_Hole() : from_moz(elem);
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
@@ -138,7 +135,7 @@
|
|||||||
return new AST_Object({
|
return new AST_Object({
|
||||||
start : my_start_token(M),
|
start : my_start_token(M),
|
||||||
end : my_end_token(M),
|
end : my_end_token(M),
|
||||||
properties : M.properties.map(function(prop){
|
properties : M.properties.map(function(prop) {
|
||||||
prop.type = "Property";
|
prop.type = "Property";
|
||||||
return from_moz(prop)
|
return from_moz(prop)
|
||||||
})
|
})
|
||||||
@@ -168,7 +165,7 @@
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
VariableDeclaration: function(M) {
|
VariableDeclaration: function(M) {
|
||||||
return new (M.kind === "const" ? AST_Const : AST_Var)({
|
return new AST_Var({
|
||||||
start : my_start_token(M),
|
start : my_start_token(M),
|
||||||
end : my_end_token(M),
|
end : my_end_token(M),
|
||||||
definitions : M.declarations.map(from_moz)
|
definitions : M.declarations.map(from_moz)
|
||||||
@@ -180,6 +177,17 @@
|
|||||||
end : my_end_token(M)
|
end : my_end_token(M)
|
||||||
};
|
};
|
||||||
if (val === null) return new AST_Null(args);
|
if (val === null) return new AST_Null(args);
|
||||||
|
var rx = M.regex;
|
||||||
|
if (rx && rx.pattern) {
|
||||||
|
// RegExpLiteral as per ESTree AST spec
|
||||||
|
args.value = new RegExp(rx.pattern, rx.flags);
|
||||||
|
args.value.raw_source = rx.pattern;
|
||||||
|
return new AST_RegExp(args);
|
||||||
|
} else if (rx) {
|
||||||
|
// support legacy RegExp
|
||||||
|
args.value = M.regex && M.raw ? M.raw : val;
|
||||||
|
return new AST_RegExp(args);
|
||||||
|
}
|
||||||
switch (typeof val) {
|
switch (typeof val) {
|
||||||
case "string":
|
case "string":
|
||||||
args.value = val;
|
args.value = val;
|
||||||
@@ -189,22 +197,12 @@
|
|||||||
return new AST_Number(args);
|
return new AST_Number(args);
|
||||||
case "boolean":
|
case "boolean":
|
||||||
return new (val ? AST_True : AST_False)(args);
|
return new (val ? AST_True : AST_False)(args);
|
||||||
default:
|
|
||||||
var rx = M.regex;
|
|
||||||
if (rx && rx.pattern) {
|
|
||||||
// RegExpLiteral as per ESTree AST spec
|
|
||||||
args.value = new RegExp(rx.pattern, rx.flags).toString();
|
|
||||||
} else {
|
|
||||||
// support legacy RegExp
|
|
||||||
args.value = M.regex && M.raw ? M.raw : val;
|
|
||||||
}
|
|
||||||
return new AST_RegExp(args);
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
Identifier: function(M) {
|
Identifier: function(M) {
|
||||||
var p = FROM_MOZ_STACK[FROM_MOZ_STACK.length - 2];
|
var p = FROM_MOZ_STACK[FROM_MOZ_STACK.length - 2];
|
||||||
return new ( p.type == "LabeledStatement" ? AST_Label
|
return new ( p.type == "LabeledStatement" ? AST_Label
|
||||||
: p.type == "VariableDeclarator" && p.id === M ? (p.kind == "const" ? AST_SymbolConst : AST_SymbolVar)
|
: p.type == "VariableDeclarator" && p.id === M ? AST_SymbolVar
|
||||||
: p.type == "FunctionExpression" ? (p.id === M ? AST_SymbolLambda : AST_SymbolFunarg)
|
: p.type == "FunctionExpression" ? (p.id === M ? AST_SymbolLambda : AST_SymbolFunarg)
|
||||||
: p.type == "FunctionDeclaration" ? (p.id === M ? AST_SymbolDefun : AST_SymbolFunarg)
|
: p.type == "FunctionDeclaration" ? (p.id === M ? AST_SymbolDefun : AST_SymbolFunarg)
|
||||||
: p.type == "CatchClause" ? AST_SymbolCatch
|
: p.type == "CatchClause" ? AST_SymbolCatch
|
||||||
@@ -324,7 +322,7 @@
|
|||||||
def_to_moz(AST_Definitions, function To_Moz_VariableDeclaration(M) {
|
def_to_moz(AST_Definitions, function To_Moz_VariableDeclaration(M) {
|
||||||
return {
|
return {
|
||||||
type: "VariableDeclaration",
|
type: "VariableDeclaration",
|
||||||
kind: M instanceof AST_Const ? "const" : "var",
|
kind: "var",
|
||||||
declarations: M.definitions.map(to_moz)
|
declarations: M.definitions.map(to_moz)
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
@@ -381,7 +379,7 @@
|
|||||||
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",
|
type: "Literal",
|
||||||
value: M.key instanceof AST_SymbolMethod ? M.key.name : M.key
|
value: M.key instanceof AST_SymbolAccessor ? M.key.name : M.key
|
||||||
};
|
};
|
||||||
var kind;
|
var kind;
|
||||||
if (M instanceof AST_ObjectKeyVal) {
|
if (M instanceof AST_ObjectKeyVal) {
|
||||||
@@ -410,14 +408,15 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
def_to_moz(AST_RegExp, function To_Moz_RegExpLiteral(M) {
|
def_to_moz(AST_RegExp, function To_Moz_RegExpLiteral(M) {
|
||||||
var value = M.value;
|
var flags = M.value.toString().match(/[gimuy]*$/)[0];
|
||||||
|
var value = "/" + M.value.raw_source + "/" + flags;
|
||||||
return {
|
return {
|
||||||
type: "Literal",
|
type: "Literal",
|
||||||
value: value,
|
value: value,
|
||||||
raw: value.toString(),
|
raw: value,
|
||||||
regex: {
|
regex: {
|
||||||
pattern: value.source,
|
pattern: M.value.raw_source,
|
||||||
flags: value.toString().match(/[gimuy]*$/)[0]
|
flags: flags
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
@@ -478,7 +477,7 @@
|
|||||||
endpos : range ? range[0] : moznode.start,
|
endpos : range ? range[0] : moznode.start,
|
||||||
raw : raw_token(moznode),
|
raw : raw_token(moznode),
|
||||||
});
|
});
|
||||||
};
|
}
|
||||||
|
|
||||||
function my_end_token(moznode) {
|
function my_end_token(moznode) {
|
||||||
var loc = moznode.loc, end = loc && loc.end;
|
var loc = moznode.loc, end = loc && loc.end;
|
||||||
@@ -493,7 +492,7 @@
|
|||||||
endpos : range ? range[1] : moznode.end,
|
endpos : range ? range[1] : moznode.end,
|
||||||
raw : raw_token(moznode),
|
raw : raw_token(moznode),
|
||||||
});
|
});
|
||||||
};
|
}
|
||||||
|
|
||||||
function map(moztype, mytype, propmap) {
|
function map(moztype, mytype, propmap) {
|
||||||
var moz_to_me = "function From_Moz_" + moztype + "(M){\n";
|
var moz_to_me = "function From_Moz_" + moztype + "(M){\n";
|
||||||
@@ -505,7 +504,7 @@
|
|||||||
me_to_moz += "return {\n" +
|
me_to_moz += "return {\n" +
|
||||||
"type: " + JSON.stringify(moztype);
|
"type: " + JSON.stringify(moztype);
|
||||||
|
|
||||||
if (propmap) propmap.split(/\s*,\s*/).forEach(function(prop){
|
if (propmap) propmap.split(/\s*,\s*/).forEach(function(prop) {
|
||||||
var m = /([a-z0-9$_]+)(=|@|>|%)([a-z0-9$_]+)/i.exec(prop);
|
var m = /([a-z0-9$_]+)(=|@|>|%)([a-z0-9$_]+)/i.exec(prop);
|
||||||
if (!m) throw new Error("Can't understand property map: " + prop);
|
if (!m) throw new Error("Can't understand property map: " + prop);
|
||||||
var moz = m[1], how = m[2], my = m[3];
|
var moz = m[1], how = m[2], my = m[3];
|
||||||
@@ -548,7 +547,7 @@
|
|||||||
);
|
);
|
||||||
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);
|
||||||
};
|
}
|
||||||
|
|
||||||
var FROM_MOZ_STACK = null;
|
var FROM_MOZ_STACK = null;
|
||||||
|
|
||||||
@@ -557,13 +556,28 @@
|
|||||||
var ret = node != null ? MOZ_TO_ME[node.type](node) : null;
|
var ret = node != null ? MOZ_TO_ME[node.type](node) : null;
|
||||||
FROM_MOZ_STACK.pop();
|
FROM_MOZ_STACK.pop();
|
||||||
return ret;
|
return ret;
|
||||||
};
|
}
|
||||||
|
|
||||||
AST_Node.from_mozilla_ast = function(node){
|
AST_Node.from_mozilla_ast = function(node) {
|
||||||
var save_stack = FROM_MOZ_STACK;
|
var save_stack = FROM_MOZ_STACK;
|
||||||
FROM_MOZ_STACK = [];
|
FROM_MOZ_STACK = [];
|
||||||
var ast = from_moz(node);
|
var ast = from_moz(node);
|
||||||
FROM_MOZ_STACK = save_stack;
|
FROM_MOZ_STACK = save_stack;
|
||||||
|
ast.walk(new TreeWalker(function(node) {
|
||||||
|
if (node instanceof AST_LabelRef) {
|
||||||
|
for (var level = 0, parent; parent = this.parent(level); level++) {
|
||||||
|
if (parent instanceof AST_Scope) break;
|
||||||
|
if (parent instanceof AST_LabeledStatement && parent.label.name == node.name) {
|
||||||
|
node.thedef = parent.label;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!node.thedef) {
|
||||||
|
var s = node.start;
|
||||||
|
js_error("Undefined label " + node.name, s.file, s.line, s.col, s.pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}));
|
||||||
return ast;
|
return ast;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -583,24 +597,24 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return moznode;
|
return moznode;
|
||||||
};
|
}
|
||||||
|
|
||||||
function def_to_moz(mytype, handler) {
|
function def_to_moz(mytype, handler) {
|
||||||
mytype.DEFMETHOD("to_mozilla_ast", function() {
|
mytype.DEFMETHOD("to_mozilla_ast", function() {
|
||||||
return set_moz_loc(this, handler(this));
|
return set_moz_loc(this, handler(this));
|
||||||
});
|
});
|
||||||
};
|
}
|
||||||
|
|
||||||
function to_moz(node) {
|
function to_moz(node) {
|
||||||
return node != null ? node.to_mozilla_ast() : null;
|
return node != null ? node.to_mozilla_ast() : null;
|
||||||
};
|
}
|
||||||
|
|
||||||
function to_moz_block(node) {
|
function to_moz_block(node) {
|
||||||
return {
|
return {
|
||||||
type: "BlockStatement",
|
type: "BlockStatement",
|
||||||
body: node.body.map(to_moz)
|
body: node.body.map(to_moz)
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
function to_moz_scope(type, node) {
|
function to_moz_scope(type, node) {
|
||||||
var body = node.body.map(to_moz);
|
var body = node.body.map(to_moz);
|
||||||
@@ -611,5 +625,5 @@
|
|||||||
type: type,
|
type: type,
|
||||||
body: body
|
body: body
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
})();
|
})();
|
||||||
|
|||||||
1008
lib/output.js
1008
lib/output.js
File diff suppressed because it is too large
Load Diff
1884
lib/parse.js
1884
lib/parse.js
File diff suppressed because one or more lines are too long
@@ -44,16 +44,6 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
function find_builtins(reserved) {
|
function find_builtins(reserved) {
|
||||||
|
|
||||||
// Compatibility fix for some standard defined globals not defined on every js environment
|
|
||||||
var new_globals = ["Symbol", "Map", "Promise", "Proxy", "Reflect", "Set", "WeakMap", "WeakSet"];
|
|
||||||
var objects = {};
|
|
||||||
var global_ref = typeof global === "object" ? global : self;
|
|
||||||
|
|
||||||
new_globals.forEach(function (new_global) {
|
|
||||||
objects[new_global] = global_ref[new_global] || new Function();
|
|
||||||
});
|
|
||||||
|
|
||||||
// NaN will be included due to Number.NaN
|
// NaN will be included due to Number.NaN
|
||||||
[
|
[
|
||||||
"null",
|
"null",
|
||||||
@@ -63,42 +53,41 @@ function find_builtins(reserved) {
|
|||||||
"-Infinity",
|
"-Infinity",
|
||||||
"undefined",
|
"undefined",
|
||||||
].forEach(add);
|
].forEach(add);
|
||||||
[ Object, Array, Function, Number,
|
[
|
||||||
String, Boolean, Error, Math,
|
Array,
|
||||||
Date, RegExp, objects.Symbol, ArrayBuffer,
|
Boolean,
|
||||||
DataView, decodeURI, decodeURIComponent,
|
Date,
|
||||||
encodeURI, encodeURIComponent, eval, EvalError,
|
Error,
|
||||||
Float32Array, Float64Array, Int8Array, Int16Array,
|
Function,
|
||||||
Int32Array, isFinite, isNaN, JSON, objects.Map, parseFloat,
|
Math,
|
||||||
parseInt, objects.Promise, objects.Proxy, RangeError, ReferenceError,
|
Number,
|
||||||
objects.Reflect, objects.Set, SyntaxError, TypeError, Uint8Array,
|
Object,
|
||||||
Uint8ClampedArray, Uint16Array, Uint32Array, URIError,
|
RegExp,
|
||||||
objects.WeakMap, objects.WeakSet
|
String,
|
||||||
].forEach(function(ctor){
|
].forEach(function(ctor) {
|
||||||
Object.getOwnPropertyNames(ctor).map(add);
|
Object.getOwnPropertyNames(ctor).map(add);
|
||||||
if (ctor.prototype) {
|
if (ctor.prototype) {
|
||||||
Object.getOwnPropertyNames(ctor.prototype).map(add);
|
Object.getOwnPropertyNames(ctor.prototype).map(add);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
function add(name) {
|
function add(name) {
|
||||||
push_uniq(reserved, name);
|
push_uniq(reserved, name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function reserve_quoted_keys(ast, reserved) {
|
function reserve_quoted_keys(ast, reserved) {
|
||||||
function add(name) {
|
|
||||||
push_uniq(reserved, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
ast.walk(new TreeWalker(function(node) {
|
ast.walk(new TreeWalker(function(node) {
|
||||||
if (node instanceof AST_ObjectKeyVal && node.quote) {
|
if (node instanceof AST_ObjectKeyVal && node.quote) {
|
||||||
add(node.key);
|
add(node.key);
|
||||||
} else if (node instanceof AST_ObjectProperty && node.quote) {
|
|
||||||
add(node.key.name);
|
|
||||||
} else if (node instanceof AST_Sub) {
|
} else if (node instanceof AST_Sub) {
|
||||||
addStrings(node.property, add);
|
addStrings(node.property, add);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
function add(name) {
|
||||||
|
push_uniq(reserved, name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function addStrings(node, add) {
|
function addStrings(node, add) {
|
||||||
@@ -147,45 +136,43 @@ function mangle_properties(ast, options) {
|
|||||||
// note debug may be enabled as an empty string, which is falsey. Also treat passing 'true'
|
// note debug may be enabled as an empty string, which is falsey. Also treat passing 'true'
|
||||||
// the same as passing an empty string.
|
// the same as passing an empty string.
|
||||||
var debug = options.debug !== false;
|
var debug = options.debug !== false;
|
||||||
var debug_name_suffix;
|
var debug_suffix;
|
||||||
if (debug) {
|
if (debug) debug_suffix = options.debug === true ? "" : options.debug;
|
||||||
debug_name_suffix = (options.debug === true ? "" : options.debug);
|
|
||||||
}
|
|
||||||
|
|
||||||
var names_to_mangle = [];
|
var names_to_mangle = [];
|
||||||
var unmangleable = [];
|
var unmangleable = [];
|
||||||
|
|
||||||
// step 1: find candidates to mangle
|
// step 1: find candidates to mangle
|
||||||
ast.walk(new TreeWalker(function(node){
|
ast.walk(new TreeWalker(function(node) {
|
||||||
if (node instanceof AST_ObjectKeyVal) {
|
if (node instanceof AST_ObjectKeyVal) {
|
||||||
add(node.key);
|
add(node.key);
|
||||||
}
|
} else if (node instanceof AST_ObjectProperty) {
|
||||||
else if (node instanceof AST_ObjectProperty) {
|
|
||||||
// setter or getter, since KeyVal is handled above
|
// setter or getter, since KeyVal is handled above
|
||||||
add(node.key.name);
|
add(node.key.name);
|
||||||
}
|
} else if (node instanceof AST_Dot) {
|
||||||
else if (node instanceof AST_Dot) {
|
|
||||||
add(node.property);
|
add(node.property);
|
||||||
}
|
} else if (node instanceof AST_Sub) {
|
||||||
else if (node instanceof AST_Sub) {
|
|
||||||
addStrings(node.property, add);
|
addStrings(node.property, add);
|
||||||
|
} else if (node instanceof AST_Call
|
||||||
|
&& node.expression.print_to_string() == "Object.defineProperty") {
|
||||||
|
addStrings(node.args[1], add);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
// step 2: transform the tree, renaming properties
|
// step 2: transform the tree, renaming properties
|
||||||
return ast.transform(new TreeTransformer(function(node){
|
return ast.transform(new TreeTransformer(function(node) {
|
||||||
if (node instanceof AST_ObjectKeyVal) {
|
if (node instanceof AST_ObjectKeyVal) {
|
||||||
node.key = mangle(node.key);
|
node.key = mangle(node.key);
|
||||||
}
|
} else if (node instanceof AST_ObjectProperty) {
|
||||||
else if (node instanceof AST_ObjectProperty) {
|
|
||||||
// setter or getter
|
// setter or getter
|
||||||
node.key.name = mangle(node.key.name);
|
node.key.name = mangle(node.key.name);
|
||||||
}
|
} else if (node instanceof AST_Dot) {
|
||||||
else if (node instanceof AST_Dot) {
|
|
||||||
node.property = mangle(node.property);
|
node.property = mangle(node.property);
|
||||||
}
|
} else if (!options.keep_quoted && node instanceof AST_Sub) {
|
||||||
else if (!options.keep_quoted && node instanceof AST_Sub) {
|
|
||||||
node.property = mangleStrings(node.property);
|
node.property = mangleStrings(node.property);
|
||||||
|
} else if (node instanceof AST_Call
|
||||||
|
&& node.expression.print_to_string() == "Object.defineProperty") {
|
||||||
|
node.args[1] = mangleStrings(node.args[1]);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
@@ -194,9 +181,7 @@ function mangle_properties(ast, options) {
|
|||||||
function can_mangle(name) {
|
function can_mangle(name) {
|
||||||
if (unmangleable.indexOf(name) >= 0) return false;
|
if (unmangleable.indexOf(name) >= 0) return false;
|
||||||
if (reserved.indexOf(name) >= 0) return false;
|
if (reserved.indexOf(name) >= 0) return false;
|
||||||
if (options.only_cache) {
|
if (options.only_cache) return cache.has(name);
|
||||||
return cache.has(name);
|
|
||||||
}
|
|
||||||
if (/^-?[0-9]+(\.[0-9]+)?(e[+-][0-9]+)?$/.test(name)) return false;
|
if (/^-?[0-9]+(\.[0-9]+)?(e[+-][0-9]+)?$/.test(name)) return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -204,57 +189,42 @@ function mangle_properties(ast, options) {
|
|||||||
function should_mangle(name) {
|
function should_mangle(name) {
|
||||||
if (regex && !regex.test(name)) return false;
|
if (regex && !regex.test(name)) return false;
|
||||||
if (reserved.indexOf(name) >= 0) return false;
|
if (reserved.indexOf(name) >= 0) return false;
|
||||||
return cache.has(name)
|
return cache.has(name) || names_to_mangle.indexOf(name) >= 0;
|
||||||
|| names_to_mangle.indexOf(name) >= 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function add(name) {
|
function add(name) {
|
||||||
if (can_mangle(name))
|
if (can_mangle(name)) push_uniq(names_to_mangle, name);
|
||||||
push_uniq(names_to_mangle, name);
|
if (!should_mangle(name)) push_uniq(unmangleable, name);
|
||||||
|
|
||||||
if (!should_mangle(name)) {
|
|
||||||
push_uniq(unmangleable, name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function mangle(name) {
|
function mangle(name) {
|
||||||
if (!should_mangle(name)) {
|
if (!should_mangle(name)) {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
var mangled = cache.get(name);
|
var mangled = cache.get(name);
|
||||||
if (!mangled) {
|
if (!mangled) {
|
||||||
if (debug) {
|
if (debug) {
|
||||||
// debug mode: use a prefix and suffix to preserve readability, e.g. o.foo -> o._$foo$NNN_.
|
// debug mode: use a prefix and suffix to preserve readability, e.g. o.foo -> o._$foo$NNN_.
|
||||||
var debug_mangled = "_$" + name + "$" + debug_name_suffix + "_";
|
var debug_mangled = "_$" + name + "$" + debug_suffix + "_";
|
||||||
|
if (can_mangle(debug_mangled)) mangled = debug_mangled;
|
||||||
if (can_mangle(debug_mangled)) {
|
|
||||||
mangled = debug_mangled;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// either debug mode is off, or it is on and we could not use the mangled name
|
// either debug mode is off, or it is on and we could not use the mangled name
|
||||||
if (!mangled) {
|
if (!mangled) do {
|
||||||
do {
|
mangled = base54(++cname);
|
||||||
mangled = base54(++cname);
|
} while (!can_mangle(mangled));
|
||||||
} while (!can_mangle(mangled));
|
|
||||||
}
|
|
||||||
|
|
||||||
cache.set(name, mangled);
|
cache.set(name, mangled);
|
||||||
}
|
}
|
||||||
return mangled;
|
return mangled;
|
||||||
}
|
}
|
||||||
|
|
||||||
function mangleStrings(node) {
|
function mangleStrings(node) {
|
||||||
return node.transform(new TreeTransformer(function(node){
|
return node.transform(new TreeTransformer(function(node) {
|
||||||
if (node instanceof AST_Sequence) {
|
if (node instanceof AST_Sequence) {
|
||||||
var last = node.expressions.length - 1;
|
var last = node.expressions.length - 1;
|
||||||
node.expressions[last] = mangleStrings(node.expressions[last]);
|
node.expressions[last] = mangleStrings(node.expressions[last]);
|
||||||
}
|
} else if (node instanceof AST_String) {
|
||||||
else if (node instanceof AST_String) {
|
|
||||||
node.value = mangle(node.value);
|
node.value = mangle(node.value);
|
||||||
}
|
} else if (node instanceof AST_Conditional) {
|
||||||
else if (node instanceof AST_Conditional) {
|
|
||||||
node.consequent = mangleStrings(node.consequent);
|
node.consequent = mangleStrings(node.consequent);
|
||||||
node.alternative = mangleStrings(node.alternative);
|
node.alternative = mangleStrings(node.alternative);
|
||||||
}
|
}
|
||||||
|
|||||||
479
lib/scope.js
479
lib/scope.js
@@ -52,11 +52,10 @@ function SymbolDef(scope, orig, init) {
|
|||||||
this.references = [];
|
this.references = [];
|
||||||
this.replaced = 0;
|
this.replaced = 0;
|
||||||
this.global = false;
|
this.global = false;
|
||||||
this.export = false;
|
|
||||||
this.mangled_name = null;
|
this.mangled_name = null;
|
||||||
this.undeclared = false;
|
this.undeclared = false;
|
||||||
this.id = SymbolDef.next_id++;
|
this.id = SymbolDef.next_id++;
|
||||||
};
|
}
|
||||||
|
|
||||||
SymbolDef.next_id = 1;
|
SymbolDef.next_id = 1;
|
||||||
|
|
||||||
@@ -64,33 +63,24 @@ SymbolDef.prototype = {
|
|||||||
unmangleable: function(options) {
|
unmangleable: function(options) {
|
||||||
if (!options) options = {};
|
if (!options) options = {};
|
||||||
|
|
||||||
return (this.global && !options.toplevel)
|
return this.global && !options.toplevel
|
||||||
|| this.export
|
|
||||||
|| this.undeclared
|
|| this.undeclared
|
||||||
|| (!options.eval && (this.scope.uses_eval || this.scope.uses_with))
|
|| !options.eval && this.scope.pinned()
|
||||||
|| (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;
|
||||||
if (this.global && cache && cache.has(this.name)) {
|
if (this.global && cache && cache.has(this.name)) {
|
||||||
this.mangled_name = cache.get(this.name);
|
this.mangled_name = cache.get(this.name);
|
||||||
}
|
} else if (!this.mangled_name && !this.unmangleable(options)) {
|
||||||
else if (!this.mangled_name && !this.unmangleable(options)) {
|
|
||||||
var s = this.scope;
|
|
||||||
var sym = this.orig[0];
|
|
||||||
if (options.ie8 && sym instanceof AST_SymbolLambda)
|
|
||||||
s = s.parent_scope;
|
|
||||||
var def;
|
var def;
|
||||||
if (def = this.redefined()) {
|
if (def = this.redefined()) {
|
||||||
this.mangled_name = def.mangled_name || def.name;
|
this.mangled_name = def.mangled_name || def.name;
|
||||||
} else
|
} else {
|
||||||
this.mangled_name = s.next_mangled(options, this);
|
this.mangled_name = next_mangled_name(this.scope, options, this);
|
||||||
|
}
|
||||||
if (this.global && cache) {
|
if (this.global && cache) {
|
||||||
cache.set(this.name, this.mangled_name);
|
cache.set(this.name, this.mangled_name);
|
||||||
}
|
}
|
||||||
@@ -101,71 +91,37 @@ 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,
|
cache: null,
|
||||||
ie8: false,
|
ie8: false,
|
||||||
safari10: false,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// pass 1: setup scope chaining and handle definitions
|
// pass 1: setup scope chaining and handle definitions
|
||||||
var self = this;
|
var self = this;
|
||||||
var scope = self.parent_scope = null;
|
var scope = self.parent_scope = null;
|
||||||
var labels = new Dictionary();
|
|
||||||
var defun = null;
|
var defun = null;
|
||||||
var in_destructuring = null;
|
var tw = new TreeWalker(function(node, descend) {
|
||||||
var for_scopes = [];
|
if (node instanceof AST_Catch) {
|
||||||
var tw = new TreeWalker(function(node, descend){
|
|
||||||
if (node.is_block_scope()) {
|
|
||||||
var save_scope = scope;
|
var save_scope = scope;
|
||||||
node.block_scope = scope = new AST_Scope(node);
|
scope = new AST_Scope(node);
|
||||||
scope.init_scope_vars(save_scope);
|
scope.init_scope_vars(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;
|
|
||||||
}
|
|
||||||
if (options.safari10) {
|
|
||||||
if (node instanceof AST_For || node instanceof AST_ForIn) {
|
|
||||||
for_scopes.push(scope);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
descend();
|
descend();
|
||||||
scope = save_scope;
|
scope = save_scope;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (node instanceof AST_Destructuring) {
|
|
||||||
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(scope);
|
||||||
var save_scope = scope;
|
var save_scope = scope;
|
||||||
var save_defun = defun;
|
var save_defun = defun;
|
||||||
var save_labels = labels;
|
|
||||||
defun = scope = node;
|
defun = scope = node;
|
||||||
labels = new Dictionary();
|
|
||||||
descend();
|
descend();
|
||||||
scope = save_scope;
|
scope = save_scope;
|
||||||
defun = save_defun;
|
defun = save_defun;
|
||||||
labels = save_labels;
|
return true;
|
||||||
return true; // don't descend again in TreeWalker
|
|
||||||
}
|
|
||||||
if (node instanceof AST_LabeledStatement) {
|
|
||||||
var l = node.label;
|
|
||||||
if (labels.has(l.name)) {
|
|
||||||
throw new Error(string_template("Label {name} defined twice", l));
|
|
||||||
}
|
|
||||||
labels.set(l.name, l);
|
|
||||||
descend();
|
|
||||||
labels.del(l.name);
|
|
||||||
return true; // no descend again
|
|
||||||
}
|
}
|
||||||
if (node instanceof AST_With) {
|
if (node instanceof AST_With) {
|
||||||
for (var s = scope; s; s = s.parent_scope)
|
for (var s = scope; s; s = s.parent_scope) s.uses_with = true;
|
||||||
s.uses_with = true;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (node instanceof AST_Symbol) {
|
if (node instanceof AST_Symbol) {
|
||||||
@@ -175,103 +131,34 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|||||||
node.thedef = node;
|
node.thedef = node;
|
||||||
node.references = [];
|
node.references = [];
|
||||||
}
|
}
|
||||||
if (node instanceof AST_SymbolLambda) {
|
if (node instanceof AST_SymbolDefun) {
|
||||||
defun.def_function(node, node.name == "arguments" ? undefined : defun);
|
// This should be defined in the parent scope, as we encounter the
|
||||||
}
|
// AST_Defun node before getting to its AST_Symbol.
|
||||||
else if (node instanceof AST_SymbolDefun) {
|
(node.scope = defun.parent_scope.resolve()).def_function(node, defun);
|
||||||
// Careful here, the scope where this should be defined is
|
} else if (node instanceof AST_SymbolLambda) {
|
||||||
// the parent scope. The reason is that we enter a new
|
var def = defun.def_function(node, node.name == "arguments" ? undefined : defun);
|
||||||
// scope when we encounter the AST_Defun node (which is
|
if (options.ie8) def.defun = defun.parent_scope.resolve();
|
||||||
// instanceof AST_Scope) but we get to the symbol a bit
|
} else if (node instanceof AST_SymbolVar) {
|
||||||
// later.
|
defun.def_variable(node, node.TYPE == "SymbolVar" ? null : undefined);
|
||||||
mark_export((node.scope = defun.parent_scope.get_defun_scope()).def_function(node, defun), 1);
|
|
||||||
}
|
|
||||||
else if (node instanceof AST_SymbolClass) {
|
|
||||||
mark_export(defun.def_variable(node, defun), 1);
|
|
||||||
}
|
|
||||||
else if (node instanceof AST_SymbolImport) {
|
|
||||||
scope.def_variable(node);
|
|
||||||
}
|
|
||||||
else if (node instanceof AST_SymbolDefClass) {
|
|
||||||
// This deals with the name of the class being available
|
|
||||||
// inside the class.
|
|
||||||
mark_export((node.scope = defun.parent_scope).def_function(node, defun), 1);
|
|
||||||
}
|
|
||||||
else if (node instanceof AST_SymbolVar
|
|
||||||
|| node instanceof AST_SymbolLet
|
|
||||||
|| node instanceof AST_SymbolConst) {
|
|
||||||
var def;
|
|
||||||
if (node instanceof AST_SymbolBlockDeclaration) {
|
|
||||||
def = scope.def_variable(node, null);
|
|
||||||
} else {
|
|
||||||
def = defun.def_variable(node, node.TYPE == "SymbolVar" ? null : undefined);
|
|
||||||
}
|
|
||||||
if (!all(def.orig, function(sym) {
|
|
||||||
if (sym === node) return true;
|
|
||||||
if (node instanceof AST_SymbolBlockDeclaration) {
|
|
||||||
return sym instanceof AST_SymbolLambda;
|
|
||||||
}
|
|
||||||
return !(sym instanceof AST_SymbolLet || sym instanceof AST_SymbolConst);
|
|
||||||
})) {
|
|
||||||
js_error(
|
|
||||||
node.name + " redeclared",
|
|
||||||
node.start.file,
|
|
||||||
node.start.line,
|
|
||||||
node.start.col,
|
|
||||||
node.start.pos
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (!(node instanceof AST_SymbolFunarg)) mark_export(def, 2);
|
|
||||||
def.destructuring = in_destructuring;
|
|
||||||
if (defun !== scope) {
|
if (defun !== scope) {
|
||||||
node.mark_enclosed(options);
|
node.mark_enclosed(options);
|
||||||
var def = scope.find_variable(node);
|
var def = scope.find_variable(node);
|
||||||
if (node.thedef !== def) {
|
if (node.thedef !== def) {
|
||||||
node.thedef = def;
|
node.thedef = def;
|
||||||
node.reference(options);
|
|
||||||
}
|
}
|
||||||
|
node.reference(options);
|
||||||
}
|
}
|
||||||
}
|
} else if (node instanceof AST_SymbolCatch) {
|
||||||
else if (node instanceof AST_SymbolCatch) {
|
|
||||||
scope.def_variable(node).defun = defun;
|
scope.def_variable(node).defun = defun;
|
||||||
}
|
}
|
||||||
else if (node instanceof AST_LabelRef) {
|
|
||||||
var sym = labels.get(node.name);
|
|
||||||
if (!sym) throw new Error(string_template("Undefined label {name} [{line},{col}]", {
|
|
||||||
name: node.name,
|
|
||||||
line: node.start.line,
|
|
||||||
col: node.start.col
|
|
||||||
}));
|
|
||||||
node.thedef = sym;
|
|
||||||
}
|
|
||||||
if (!(scope instanceof AST_Toplevel) && (node instanceof AST_Export || node instanceof AST_Import)) {
|
|
||||||
js_error(
|
|
||||||
node.TYPE + " statement may only appear at top level",
|
|
||||||
node.start.file,
|
|
||||||
node.start.line,
|
|
||||||
node.start.col,
|
|
||||||
node.start.pos
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function mark_export(def, level) {
|
|
||||||
if (in_destructuring) {
|
|
||||||
var i = 0;
|
|
||||||
do {
|
|
||||||
level++;
|
|
||||||
} while (tw.parent(i++) !== in_destructuring);
|
|
||||||
}
|
|
||||||
var node = tw.parent(level);
|
|
||||||
def.export = node instanceof AST_Export;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
self.walk(tw);
|
self.walk(tw);
|
||||||
|
|
||||||
// pass 2: find back references and eval
|
// pass 2: find back references and eval
|
||||||
self.globals = new Dictionary();
|
self.globals = new Dictionary();
|
||||||
var tw = new TreeWalker(function(node, descend){
|
var tw = new TreeWalker(function(node) {
|
||||||
if (node instanceof AST_LoopControl && node.label) {
|
if (node instanceof AST_LoopControl) {
|
||||||
node.label.thedef.references.push(node);
|
if (node.label) node.label.thedef.references.push(node);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (node instanceof AST_SymbolRef) {
|
if (node instanceof AST_SymbolRef) {
|
||||||
@@ -281,68 +168,58 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|||||||
s.uses_eval = true;
|
s.uses_eval = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var sym;
|
var sym = node.scope.find_variable(name);
|
||||||
if (tw.parent() instanceof AST_NameMapping && tw.parent(1).module_name
|
if (!sym) {
|
||||||
|| !(sym = node.scope.find_variable(name))) {
|
|
||||||
sym = self.def_global(node);
|
sym = self.def_global(node);
|
||||||
} else if (sym.scope instanceof AST_Lambda && name == "arguments") {
|
} else if (sym.scope instanceof AST_Lambda && name == "arguments") {
|
||||||
sym.scope.uses_arguments = true;
|
sym.scope.uses_arguments = true;
|
||||||
}
|
}
|
||||||
node.thedef = sym;
|
node.thedef = sym;
|
||||||
node.reference(options);
|
node.reference(options);
|
||||||
if (node.scope.is_block_scope()
|
|
||||||
&& !(sym.orig[0] instanceof AST_SymbolBlockDeclaration)) {
|
|
||||||
node.scope = node.scope.get_defun_scope();
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// ensure mangling works if catch reuses a scope variable
|
// ensure mangling works if catch reuses a scope variable
|
||||||
var def;
|
if (node instanceof AST_SymbolCatch) {
|
||||||
if (node instanceof AST_SymbolCatch && (def = node.definition().redefined())) {
|
var def = node.definition().redefined();
|
||||||
var s = node.scope;
|
if (def) for (var s = node.scope; s; s = s.parent_scope) {
|
||||||
while (s) {
|
|
||||||
push_uniq(s.enclosed, def);
|
push_uniq(s.enclosed, def);
|
||||||
if (s === def.scope) break;
|
if (s === def.scope) break;
|
||||||
s = s.parent_scope;
|
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
self.walk(tw);
|
self.walk(tw);
|
||||||
|
|
||||||
// pass 3: fix up any scoping issue with IE8
|
// pass 3: fix up any scoping issue with IE8
|
||||||
if (options.ie8) {
|
if (options.ie8) self.walk(new TreeWalker(function(node) {
|
||||||
self.walk(new TreeWalker(function(node, descend) {
|
if (node instanceof AST_SymbolCatch) {
|
||||||
if (node instanceof AST_SymbolCatch) {
|
redefine(node, node.thedef.defun);
|
||||||
var name = node.name;
|
return true;
|
||||||
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;
|
|
||||||
node.reference(options);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
// pass 4: add symbol definitions to loop scopes
|
|
||||||
// Safari/Webkit bug workaround - loop init let variable shadowing argument.
|
|
||||||
// https://github.com/mishoo/UglifyJS2/issues/1753
|
|
||||||
// https://bugs.webkit.org/show_bug.cgi?id=171041
|
|
||||||
if (options.safari10) {
|
|
||||||
for (var i = 0; i < for_scopes.length; i++) {
|
|
||||||
var scope = for_scopes[i];
|
|
||||||
scope.parent_scope.variables.each(function(def) {
|
|
||||||
push_uniq(scope.enclosed, def);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
if (node instanceof AST_SymbolLambda) {
|
||||||
|
var def = node.thedef;
|
||||||
|
if (def.orig.length == 1) {
|
||||||
|
redefine(node, node.scope.parent_scope);
|
||||||
|
node.thedef.init = def.init;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
function redefine(node, scope) {
|
||||||
|
var name = node.name;
|
||||||
|
var refs = node.thedef.references;
|
||||||
|
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;
|
||||||
|
node.reference(options);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("def_global", function(node){
|
AST_Toplevel.DEFMETHOD("def_global", function(node) {
|
||||||
var globals = this.globals, name = node.name;
|
var globals = this.globals, name = node.name;
|
||||||
if (globals.has(name)) {
|
if (globals.has(name)) {
|
||||||
return globals.get(name);
|
return globals.get(name);
|
||||||
@@ -355,7 +232,7 @@ AST_Toplevel.DEFMETHOD("def_global", function(node){
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("init_scope_vars", function(parent_scope){
|
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
|
||||||
@@ -365,15 +242,7 @@ AST_Scope.DEFMETHOD("init_scope_vars", function(parent_scope){
|
|||||||
this.cname = -1; // the current index for mangling functions/variables
|
this.cname = -1; // the current index for mangling functions/variables
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Node.DEFMETHOD("is_block_scope", return_false);
|
AST_Lambda.DEFMETHOD("init_scope_vars", function() {
|
||||||
AST_Class.DEFMETHOD("is_block_scope", return_false);
|
|
||||||
AST_Lambda.DEFMETHOD("is_block_scope", return_false);
|
|
||||||
AST_Toplevel.DEFMETHOD("is_block_scope", return_false);
|
|
||||||
AST_SwitchBranch.DEFMETHOD("is_block_scope", return_false);
|
|
||||||
AST_Block.DEFMETHOD("is_block_scope", return_true);
|
|
||||||
AST_IterationStatement.DEFMETHOD("is_block_scope", return_true);
|
|
||||||
|
|
||||||
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_SymbolFunarg({
|
this.def_variable(new AST_SymbolFunarg({
|
||||||
@@ -383,15 +252,9 @@ AST_Lambda.DEFMETHOD("init_scope_vars", function(){
|
|||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Arrow.DEFMETHOD("init_scope_vars", function(){
|
|
||||||
AST_Scope.prototype.init_scope_vars.apply(this, arguments);
|
|
||||||
this.uses_arguments = false;
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("mark_enclosed", function(options) {
|
AST_Symbol.DEFMETHOD("mark_enclosed", function(options) {
|
||||||
var def = this.definition();
|
var def = this.definition();
|
||||||
var s = this.scope;
|
for (var s = this.scope; s; s = s.parent_scope) {
|
||||||
while (s) {
|
|
||||||
push_uniq(s.enclosed, def);
|
push_uniq(s.enclosed, def);
|
||||||
if (options.keep_fnames) {
|
if (options.keep_fnames) {
|
||||||
s.functions.each(function(d) {
|
s.functions.each(function(d) {
|
||||||
@@ -399,7 +262,6 @@ AST_Symbol.DEFMETHOD("mark_enclosed", function(options) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (s === def.scope) break;
|
if (s === def.scope) break;
|
||||||
s = s.parent_scope;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -408,20 +270,20 @@ AST_Symbol.DEFMETHOD("reference", function(options) {
|
|||||||
this.mark_enclosed(options);
|
this.mark_enclosed(options);
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("find_variable", function(name){
|
AST_Scope.DEFMETHOD("find_variable", function(name) {
|
||||||
if (name instanceof AST_Symbol) name = name.name;
|
if (name instanceof AST_Symbol) name = name.name;
|
||||||
return this.variables.get(name)
|
return this.variables.get(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, init){
|
AST_Scope.DEFMETHOD("def_function", function(symbol, init) {
|
||||||
var def = this.def_variable(symbol, init);
|
var def = this.def_variable(symbol, init);
|
||||||
if (!def.init || def.init instanceof AST_Defun) def.init = init;
|
if (!def.init || def.init instanceof AST_Defun) def.init = init;
|
||||||
this.functions.set(symbol.name, def);
|
this.functions.set(symbol.name, def);
|
||||||
return def;
|
return def;
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("def_variable", function(symbol, init){
|
AST_Scope.DEFMETHOD("def_variable", function(symbol, init) {
|
||||||
var def = this.variables.get(symbol.name);
|
var def = this.variables.get(symbol.name);
|
||||||
if (def) {
|
if (def) {
|
||||||
def.orig.push(symbol);
|
def.orig.push(symbol);
|
||||||
@@ -436,58 +298,59 @@ AST_Scope.DEFMETHOD("def_variable", function(symbol, init){
|
|||||||
return symbol.thedef = def;
|
return symbol.thedef = def;
|
||||||
});
|
});
|
||||||
|
|
||||||
function next_mangled(scope, options) {
|
AST_Lambda.DEFMETHOD("resolve", return_this);
|
||||||
var ext = scope.enclosed;
|
AST_Scope.DEFMETHOD("resolve", function() {
|
||||||
out: while (true) {
|
return this.parent_scope;
|
||||||
var m = base54(++scope.cname);
|
});
|
||||||
if (!is_identifier(m)) continue; // skip over "do"
|
AST_Toplevel.DEFMETHOD("resolve", return_this);
|
||||||
|
|
||||||
// https://github.com/mishoo/UglifyJS2/issues/242 -- do not
|
function names_in_use(scope, options) {
|
||||||
// shadow a name reserved from mangling.
|
var names = scope.names_in_use;
|
||||||
if (member(m, options.reserved)) continue;
|
if (!names) {
|
||||||
|
scope.names_in_use = names = Object.create(scope.mangled_names || null);
|
||||||
// we must ensure that the mangled name does not shadow a name
|
scope.cname_holes = [];
|
||||||
// from some parent scope that is referenced in this or in
|
scope.enclosed.forEach(function(def) {
|
||||||
// inner scopes.
|
if (def.unmangleable(options)) names[def.name] = true;
|
||||||
for (var i = ext.length; --i >= 0;) {
|
});
|
||||||
var sym = ext[i];
|
|
||||||
var name = sym.mangled_name || (sym.unmangleable(options) && sym.name);
|
|
||||||
if (m == name) continue out;
|
|
||||||
}
|
|
||||||
return m;
|
|
||||||
}
|
}
|
||||||
|
return names;
|
||||||
}
|
}
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("next_mangled", function(options){
|
function next_mangled_name(scope, options, def) {
|
||||||
return next_mangled(this, options);
|
var in_use = names_in_use(scope, options);
|
||||||
});
|
var holes = scope.cname_holes;
|
||||||
|
var names = Object.create(null);
|
||||||
AST_Toplevel.DEFMETHOD("next_mangled", function(options){
|
var scopes = [ scope ];
|
||||||
|
def.references.forEach(function(sym) {
|
||||||
|
var scope = sym.scope;
|
||||||
|
do {
|
||||||
|
if (scopes.indexOf(scope) < 0) {
|
||||||
|
for (var name in names_in_use(scope, options)) {
|
||||||
|
names[name] = true;
|
||||||
|
}
|
||||||
|
scopes.push(scope);
|
||||||
|
} else break;
|
||||||
|
} while (scope = scope.parent_scope);
|
||||||
|
});
|
||||||
var name;
|
var name;
|
||||||
do {
|
for (var i = 0, len = holes.length; i < len; i++) {
|
||||||
name = next_mangled(this, options);
|
name = base54(holes[i]);
|
||||||
} while (member(name, this.mangled_names));
|
if (names[name]) continue;
|
||||||
return name;
|
holes.splice(i, 1);
|
||||||
});
|
scope.names_in_use[name] = true;
|
||||||
|
return name;
|
||||||
AST_Function.DEFMETHOD("next_mangled", function(options, def){
|
|
||||||
// #179, #326
|
|
||||||
// in Safari strict mode, something like (function x(x){...}) is a syntax error;
|
|
||||||
// a function expression's argument cannot shadow the function expression's name
|
|
||||||
|
|
||||||
var tricky_def = def.orig[0] instanceof AST_SymbolFunarg && this.name && this.name.definition();
|
|
||||||
|
|
||||||
// the function's mangled_name is null when keep_fnames is true
|
|
||||||
var tricky_name = tricky_def ? tricky_def.mangled_name || tricky_def.name : null;
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
var name = next_mangled(this, options);
|
|
||||||
if (!tricky_name || tricky_name != name)
|
|
||||||
return name;
|
|
||||||
}
|
}
|
||||||
});
|
while (true) {
|
||||||
|
name = base54(++scope.cname);
|
||||||
|
if (in_use[name] || !is_identifier(name) || options.reserved.has[name]) continue;
|
||||||
|
if (!names[name]) break;
|
||||||
|
holes.push(scope.cname);
|
||||||
|
}
|
||||||
|
scope.names_in_use[name] = true;
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("unmangleable", function(options){
|
AST_Symbol.DEFMETHOD("unmangleable", function(options) {
|
||||||
var def = this.definition();
|
var def = this.definition();
|
||||||
return !def || def.unmangleable(options);
|
return !def || def.unmangleable(options);
|
||||||
});
|
});
|
||||||
@@ -495,24 +358,22 @@ AST_Symbol.DEFMETHOD("unmangleable", function(options){
|
|||||||
// labels are always mangleable
|
// labels are always mangleable
|
||||||
AST_Label.DEFMETHOD("unmangleable", return_false);
|
AST_Label.DEFMETHOD("unmangleable", return_false);
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("unreferenced", function(){
|
AST_Symbol.DEFMETHOD("unreferenced", function() {
|
||||||
return this.definition().references.length == 0
|
return !this.definition().references.length && !this.scope.pinned();
|
||||||
&& !(this.scope.uses_eval || this.scope.uses_with);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("definition", function(){
|
AST_Symbol.DEFMETHOD("definition", function() {
|
||||||
return this.thedef;
|
return this.thedef;
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("global", function(){
|
AST_Symbol.DEFMETHOD("global", function() {
|
||||||
return this.definition().global;
|
return this.definition().global;
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("_default_mangler_options", function(options) {
|
function _default_mangler_options(options) {
|
||||||
options = defaults(options, {
|
options = defaults(options, {
|
||||||
eval : false,
|
eval : false,
|
||||||
ie8 : false,
|
ie8 : false,
|
||||||
keep_classnames: false,
|
|
||||||
keep_fnames : false,
|
keep_fnames : false,
|
||||||
reserved : [],
|
reserved : [],
|
||||||
toplevel : false,
|
toplevel : false,
|
||||||
@@ -520,63 +381,76 @@ AST_Toplevel.DEFMETHOD("_default_mangler_options", function(options) {
|
|||||||
if (!Array.isArray(options.reserved)) options.reserved = [];
|
if (!Array.isArray(options.reserved)) options.reserved = [];
|
||||||
// Never mangle arguments
|
// Never mangle arguments
|
||||||
push_uniq(options.reserved, "arguments");
|
push_uniq(options.reserved, "arguments");
|
||||||
|
options.reserved.has = makePredicate(options.reserved);
|
||||||
return options;
|
return options;
|
||||||
});
|
}
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("mangle_names", function(options){
|
AST_Toplevel.DEFMETHOD("mangle_names", function(options) {
|
||||||
options = this._default_mangler_options(options);
|
options = _default_mangler_options(options);
|
||||||
|
|
||||||
// We only need to mangle declaration nodes. Special logic wired
|
// We only need to mangle declaration nodes. Special logic wired
|
||||||
// into the code generator will display the mangled name if it's
|
// into the code generator will display the mangled name if it's
|
||||||
// present (and for AST_SymbolRef-s it'll use the mangled name of
|
// present (and for AST_SymbolRef-s it'll use the mangled name of
|
||||||
// the AST_SymbolDeclaration that it points to).
|
// the AST_SymbolDeclaration that it points to).
|
||||||
var lname = -1;
|
var lname = -1;
|
||||||
var to_mangle = [];
|
|
||||||
|
|
||||||
var mangled_names = this.mangled_names = [];
|
if (options.cache && options.cache.props) {
|
||||||
if (options.cache) {
|
var mangled_names = this.mangled_names = Object.create(null);
|
||||||
this.globals.each(collect);
|
options.cache.props.each(function(mangled_name) {
|
||||||
if (options.cache.props) {
|
mangled_names[mangled_name] = true;
|
||||||
options.cache.props.each(function(mangled_name) {
|
});
|
||||||
push_uniq(mangled_names, mangled_name);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var tw = new TreeWalker(function(node, descend){
|
var redefined = [];
|
||||||
|
var tw = new TreeWalker(function(node, descend) {
|
||||||
if (node instanceof AST_LabeledStatement) {
|
if (node instanceof AST_LabeledStatement) {
|
||||||
// lname is incremented when we get to the AST_Label
|
// lname is incremented when we get to the AST_Label
|
||||||
var save_nesting = lname;
|
var save_nesting = lname;
|
||||||
descend();
|
descend();
|
||||||
lname = save_nesting;
|
lname = save_nesting;
|
||||||
return true; // don't descend again in TreeWalker
|
return true;
|
||||||
}
|
}
|
||||||
if (node instanceof AST_Scope) {
|
if (node instanceof AST_Scope) {
|
||||||
node.variables.each(collect);
|
descend();
|
||||||
return;
|
if (options.cache && node instanceof AST_Toplevel) {
|
||||||
}
|
node.globals.each(mangle);
|
||||||
if (node.is_block_scope()) {
|
}
|
||||||
node.block_scope.variables.each(collect);
|
node.variables.each(mangle);
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
if (node instanceof AST_Label) {
|
if (node instanceof AST_Label) {
|
||||||
var name;
|
var name;
|
||||||
do name = base54(++lname); while (!is_identifier(name));
|
do {
|
||||||
|
name = base54(++lname);
|
||||||
|
} while (!is_identifier(name));
|
||||||
node.mangled_name = name;
|
node.mangled_name = name;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (!options.ie8 && node instanceof AST_SymbolCatch) {
|
if (!options.ie8 && node instanceof AST_Catch) {
|
||||||
to_mangle.push(node.definition());
|
var def = node.argname.definition();
|
||||||
return;
|
var redef = def.redefined();
|
||||||
|
if (redef) {
|
||||||
|
redefined.push(def);
|
||||||
|
reference(node.argname);
|
||||||
|
def.references.forEach(reference);
|
||||||
|
}
|
||||||
|
descend();
|
||||||
|
if (!redef) mangle(def);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function reference(sym) {
|
||||||
|
sym.thedef = redef;
|
||||||
|
sym.reference(options);
|
||||||
|
sym.thedef = def;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.walk(tw);
|
this.walk(tw);
|
||||||
to_mangle.forEach(function(def){ def.mangle(options) });
|
redefined.forEach(mangle);
|
||||||
|
|
||||||
function collect(symbol) {
|
function mangle(def) {
|
||||||
if (!member(symbol.name, options.reserved)) {
|
if (options.reserved.has[def.name]) return;
|
||||||
to_mangle.push(symbol);
|
def.mangle(options);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -606,7 +480,7 @@ AST_Toplevel.DEFMETHOD("find_colliding_names", function(options) {
|
|||||||
AST_Toplevel.DEFMETHOD("expand_names", function(options) {
|
AST_Toplevel.DEFMETHOD("expand_names", function(options) {
|
||||||
base54.reset();
|
base54.reset();
|
||||||
base54.sort();
|
base54.sort();
|
||||||
options = this._default_mangler_options(options);
|
options = _default_mangler_options(options);
|
||||||
var avoid = this.find_colliding_names(options);
|
var avoid = this.find_colliding_names(options);
|
||||||
var cname = 0;
|
var cname = 0;
|
||||||
this.globals.each(rename);
|
this.globals.each(rename);
|
||||||
@@ -626,7 +500,7 @@ AST_Toplevel.DEFMETHOD("expand_names", function(options) {
|
|||||||
function rename(def) {
|
function rename(def) {
|
||||||
if (def.global && options.cache) return;
|
if (def.global && options.cache) return;
|
||||||
if (def.unmangleable(options)) return;
|
if (def.unmangleable(options)) return;
|
||||||
if (member(def.name, options.reserved)) return;
|
if (options.reserved.has[def.name]) return;
|
||||||
var d = def.redefined();
|
var d = def.redefined();
|
||||||
def.name = d ? d.name : next_name();
|
def.name = d ? d.name : next_name();
|
||||||
def.orig.forEach(function(sym) {
|
def.orig.forEach(function(sym) {
|
||||||
@@ -643,8 +517,9 @@ AST_Sequence.DEFMETHOD("tail_node", function() {
|
|||||||
return this.expressions[this.expressions.length - 1];
|
return this.expressions[this.expressions.length - 1];
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("compute_char_frequency", function(options){
|
AST_Toplevel.DEFMETHOD("compute_char_frequency", function(options) {
|
||||||
options = this._default_mangler_options(options);
|
options = _default_mangler_options(options);
|
||||||
|
base54.reset();
|
||||||
try {
|
try {
|
||||||
AST_Node.prototype.print = function(stream, force_parens) {
|
AST_Node.prototype.print = function(stream, force_parens) {
|
||||||
this._print(stream, force_parens);
|
this._print(stream, force_parens);
|
||||||
@@ -677,17 +552,21 @@ AST_Toplevel.DEFMETHOD("compute_char_frequency", function(options){
|
|||||||
});
|
});
|
||||||
|
|
||||||
var base54 = (function() {
|
var base54 = (function() {
|
||||||
var leading = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_".split("");
|
var freq = Object.create(null);
|
||||||
var digits = "0123456789".split("");
|
function init(chars) {
|
||||||
|
var array = [];
|
||||||
|
for (var i = 0, len = chars.length; i < len; i++) {
|
||||||
|
var ch = chars[i];
|
||||||
|
array.push(ch);
|
||||||
|
freq[ch] = -1e-2 * i;
|
||||||
|
}
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
var digits = init("0123456789");
|
||||||
|
var leading = init("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_");
|
||||||
var chars, frequency;
|
var chars, frequency;
|
||||||
function reset() {
|
function reset() {
|
||||||
frequency = Object.create(null);
|
frequency = Object.create(freq);
|
||||||
leading.forEach(function(ch) {
|
|
||||||
frequency[ch] = 0;
|
|
||||||
});
|
|
||||||
digits.forEach(function(ch) {
|
|
||||||
frequency[ch] = 0;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
base54.consider = function(str, delta) {
|
base54.consider = function(str, delta) {
|
||||||
for (var i = str.length; --i >= 0;) {
|
for (var i = str.length; --i >= 0;) {
|
||||||
@@ -698,7 +577,7 @@ var base54 = (function() {
|
|||||||
return frequency[b] - frequency[a];
|
return frequency[b] - frequency[a];
|
||||||
}
|
}
|
||||||
base54.sort = function() {
|
base54.sort = function() {
|
||||||
chars = mergeSort(leading, compare).concat(mergeSort(digits, compare));
|
chars = leading.sort(compare).concat(digits.sort(compare));
|
||||||
};
|
};
|
||||||
base54.reset = reset;
|
base54.reset = reset;
|
||||||
reset();
|
reset();
|
||||||
@@ -712,6 +591,6 @@ var base54 = (function() {
|
|||||||
base = 64;
|
base = 64;
|
||||||
} while (num > 0);
|
} while (num > 0);
|
||||||
return ret;
|
return ret;
|
||||||
};
|
}
|
||||||
return base54;
|
return base54;
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -46,52 +46,59 @@
|
|||||||
// a small wrapper around fitzgen's source-map library
|
// a small wrapper around fitzgen's source-map library
|
||||||
function SourceMap(options) {
|
function SourceMap(options) {
|
||||||
options = defaults(options, {
|
options = defaults(options, {
|
||||||
file : null,
|
file: null,
|
||||||
root : null,
|
root: null,
|
||||||
orig : null,
|
orig: null,
|
||||||
|
orig_line_diff: 0,
|
||||||
orig_line_diff : 0,
|
dest_line_diff: 0,
|
||||||
dest_line_diff : 0,
|
}, true);
|
||||||
});
|
|
||||||
var generator = new MOZ_SourceMap.SourceMapGenerator({
|
var generator = new MOZ_SourceMap.SourceMapGenerator({
|
||||||
file : options.file,
|
file: options.file,
|
||||||
sourceRoot : options.root
|
sourceRoot: options.root
|
||||||
});
|
});
|
||||||
var orig_map = options.orig && new MOZ_SourceMap.SourceMapConsumer(options.orig);
|
var maps = options.orig && Object.create(null);
|
||||||
|
if (maps) for (var source in options.orig) {
|
||||||
if (orig_map && Array.isArray(options.orig.sources)) {
|
var map = new MOZ_SourceMap.SourceMapConsumer(options.orig[source]);
|
||||||
orig_map._sources.toArray().forEach(function(source) {
|
if (Array.isArray(options.orig[source].sources)) {
|
||||||
var sourceContent = orig_map.sourceContentFor(source, true);
|
map._sources.toArray().forEach(function(source) {
|
||||||
if (sourceContent) {
|
var sourceContent = map.sourceContentFor(source, true);
|
||||||
generator.setSourceContent(source, sourceContent);
|
if (sourceContent) generator.setSourceContent(source, sourceContent);
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function add(source, gen_line, gen_col, orig_line, orig_col, name) {
|
|
||||||
if (orig_map) {
|
|
||||||
var info = orig_map.originalPositionFor({
|
|
||||||
line: orig_line,
|
|
||||||
column: orig_col
|
|
||||||
});
|
});
|
||||||
if (info.source === null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
source = info.source;
|
|
||||||
orig_line = info.line;
|
|
||||||
orig_col = info.column;
|
|
||||||
name = info.name || name;
|
|
||||||
}
|
}
|
||||||
generator.addMapping({
|
maps[source] = map;
|
||||||
generated : { line: gen_line + options.dest_line_diff, column: gen_col },
|
}
|
||||||
original : { line: orig_line + options.orig_line_diff, column: orig_col },
|
|
||||||
source : source,
|
|
||||||
name : name
|
|
||||||
});
|
|
||||||
};
|
|
||||||
return {
|
return {
|
||||||
add : add,
|
add: function(source, gen_line, gen_col, orig_line, orig_col, name) {
|
||||||
get : function() { return generator },
|
var map = maps && maps[source];
|
||||||
toString : function() { return JSON.stringify(generator.toJSON()); }
|
if (map) {
|
||||||
|
var info = map.originalPositionFor({
|
||||||
|
line: orig_line,
|
||||||
|
column: orig_col
|
||||||
|
});
|
||||||
|
if (info.source === null) return;
|
||||||
|
source = info.source;
|
||||||
|
orig_line = info.line;
|
||||||
|
orig_col = info.column;
|
||||||
|
name = info.name || name;
|
||||||
|
}
|
||||||
|
generator.addMapping({
|
||||||
|
name: name,
|
||||||
|
source: source,
|
||||||
|
generated: {
|
||||||
|
line: gen_line + options.dest_line_diff,
|
||||||
|
column: gen_col
|
||||||
|
},
|
||||||
|
original: {
|
||||||
|
line: orig_line + options.orig_line_diff,
|
||||||
|
column: orig_col
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
get: function() {
|
||||||
|
return generator;
|
||||||
|
},
|
||||||
|
toString: function() {
|
||||||
|
return JSON.stringify(generator.toJSON());
|
||||||
|
}
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|||||||
188
lib/transform.js
188
lib/transform.js
@@ -43,8 +43,6 @@
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
// Tree transformer helpers.
|
|
||||||
|
|
||||||
function TreeTransformer(before, after) {
|
function TreeTransformer(before, after) {
|
||||||
TreeWalker.call(this);
|
TreeWalker.call(this);
|
||||||
this.before = before;
|
this.before = before;
|
||||||
@@ -52,218 +50,136 @@ function TreeTransformer(before, after) {
|
|||||||
}
|
}
|
||||||
TreeTransformer.prototype = new TreeWalker;
|
TreeTransformer.prototype = new TreeWalker;
|
||||||
|
|
||||||
(function(undefined){
|
(function(DEF) {
|
||||||
|
|
||||||
function _(node, descend) {
|
|
||||||
node.DEFMETHOD("transform", function(tw, in_list){
|
|
||||||
var x, y;
|
|
||||||
tw.push(this);
|
|
||||||
if (tw.before) x = tw.before(this, descend, in_list);
|
|
||||||
if (x === undefined) {
|
|
||||||
x = this;
|
|
||||||
descend(x, tw);
|
|
||||||
if (tw.after) {
|
|
||||||
y = tw.after(x, in_list);
|
|
||||||
if (y !== undefined) x = y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tw.pop();
|
|
||||||
return x;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
function do_list(list, tw) {
|
function do_list(list, tw) {
|
||||||
return MAP(list, function(node){
|
return MAP(list, function(node) {
|
||||||
return node.transform(tw, true);
|
return node.transform(tw, true);
|
||||||
});
|
});
|
||||||
};
|
}
|
||||||
|
|
||||||
_(AST_Node, noop);
|
DEF(AST_Node, noop);
|
||||||
|
DEF(AST_LabeledStatement, function(self, tw) {
|
||||||
_(AST_LabeledStatement, function(self, tw){
|
|
||||||
self.label = self.label.transform(tw);
|
self.label = self.label.transform(tw);
|
||||||
self.body = self.body.transform(tw);
|
self.body = self.body.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_SimpleStatement, function(self, tw) {
|
||||||
_(AST_SimpleStatement, function(self, tw){
|
|
||||||
self.body = self.body.transform(tw);
|
self.body = self.body.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Block, function(self, tw) {
|
||||||
_(AST_Block, function(self, tw){
|
|
||||||
self.body = do_list(self.body, tw);
|
self.body = do_list(self.body, tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Do, function(self, tw) {
|
||||||
_(AST_DWLoop, function(self, tw){
|
self.body = self.body.transform(tw);
|
||||||
|
self.condition = self.condition.transform(tw);
|
||||||
|
});
|
||||||
|
DEF(AST_While, function(self, tw) {
|
||||||
self.condition = self.condition.transform(tw);
|
self.condition = self.condition.transform(tw);
|
||||||
self.body = self.body.transform(tw);
|
self.body = self.body.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_For, function(self, tw) {
|
||||||
_(AST_For, function(self, tw){
|
|
||||||
if (self.init) self.init = self.init.transform(tw);
|
if (self.init) self.init = self.init.transform(tw);
|
||||||
if (self.condition) self.condition = self.condition.transform(tw);
|
if (self.condition) self.condition = self.condition.transform(tw);
|
||||||
if (self.step) self.step = self.step.transform(tw);
|
if (self.step) self.step = self.step.transform(tw);
|
||||||
self.body = self.body.transform(tw);
|
self.body = self.body.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_ForIn, function(self, tw) {
|
||||||
_(AST_ForIn, function(self, tw){
|
|
||||||
self.init = self.init.transform(tw);
|
self.init = self.init.transform(tw);
|
||||||
self.object = self.object.transform(tw);
|
self.object = self.object.transform(tw);
|
||||||
self.body = self.body.transform(tw);
|
self.body = self.body.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_With, function(self, tw) {
|
||||||
_(AST_With, function(self, tw){
|
|
||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
self.body = self.body.transform(tw);
|
self.body = self.body.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Exit, function(self, tw) {
|
||||||
_(AST_Exit, function(self, tw){
|
|
||||||
if (self.value) self.value = self.value.transform(tw);
|
if (self.value) self.value = self.value.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_LoopControl, function(self, tw) {
|
||||||
_(AST_LoopControl, function(self, tw){
|
|
||||||
if (self.label) self.label = self.label.transform(tw);
|
if (self.label) self.label = self.label.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_If, function(self, tw) {
|
||||||
_(AST_If, function(self, tw){
|
|
||||||
self.condition = self.condition.transform(tw);
|
self.condition = self.condition.transform(tw);
|
||||||
self.body = self.body.transform(tw);
|
self.body = self.body.transform(tw);
|
||||||
if (self.alternative) self.alternative = self.alternative.transform(tw);
|
if (self.alternative) self.alternative = self.alternative.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Switch, function(self, tw) {
|
||||||
_(AST_Switch, function(self, tw){
|
|
||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
self.body = do_list(self.body, tw);
|
self.body = do_list(self.body, tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Case, function(self, tw) {
|
||||||
_(AST_Case, function(self, tw){
|
|
||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
self.body = do_list(self.body, tw);
|
self.body = do_list(self.body, tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Try, function(self, tw) {
|
||||||
_(AST_Try, function(self, tw){
|
|
||||||
self.body = do_list(self.body, tw);
|
self.body = do_list(self.body, tw);
|
||||||
if (self.bcatch) self.bcatch = self.bcatch.transform(tw);
|
if (self.bcatch) self.bcatch = self.bcatch.transform(tw);
|
||||||
if (self.bfinally) self.bfinally = self.bfinally.transform(tw);
|
if (self.bfinally) self.bfinally = self.bfinally.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Catch, function(self, tw) {
|
||||||
_(AST_Catch, function(self, tw){
|
|
||||||
self.argname = self.argname.transform(tw);
|
self.argname = self.argname.transform(tw);
|
||||||
self.body = do_list(self.body, tw);
|
self.body = do_list(self.body, tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Definitions, function(self, tw) {
|
||||||
_(AST_Definitions, function(self, tw){
|
|
||||||
self.definitions = do_list(self.definitions, tw);
|
self.definitions = do_list(self.definitions, tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_VarDef, function(self, tw) {
|
||||||
_(AST_VarDef, function(self, tw){
|
|
||||||
self.name = self.name.transform(tw);
|
self.name = self.name.transform(tw);
|
||||||
if (self.value) self.value = self.value.transform(tw);
|
if (self.value) self.value = self.value.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Lambda, function(self, tw) {
|
||||||
_(AST_Destructuring, function(self, tw) {
|
|
||||||
self.names = do_list(self.names, 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 = do_list(self.body, tw);
|
||||||
self.body = self.body.transform(tw);
|
|
||||||
} else {
|
|
||||||
self.body = do_list(self.body, tw);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
DEF(AST_Call, function(self, tw) {
|
||||||
_(AST_Call, function(self, tw){
|
|
||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
self.args = do_list(self.args, tw);
|
self.args = do_list(self.args, tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Sequence, function(self, tw) {
|
||||||
_(AST_Sequence, function(self, tw){
|
|
||||||
self.expressions = do_list(self.expressions, tw);
|
self.expressions = do_list(self.expressions, tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Dot, function(self, tw) {
|
||||||
_(AST_Dot, function(self, tw){
|
|
||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Sub, function(self, tw) {
|
||||||
_(AST_Sub, function(self, tw){
|
|
||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
self.property = self.property.transform(tw);
|
self.property = self.property.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Unary, function(self, tw) {
|
||||||
_(AST_Yield, function(self, tw){
|
|
||||||
if (self.expression) self.expression = self.expression.transform(tw);
|
|
||||||
});
|
|
||||||
|
|
||||||
_(AST_Await, function(self, tw){
|
|
||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Binary, function(self, tw) {
|
||||||
_(AST_Unary, function(self, tw){
|
|
||||||
self.expression = self.expression.transform(tw);
|
|
||||||
});
|
|
||||||
|
|
||||||
_(AST_Binary, function(self, tw){
|
|
||||||
self.left = self.left.transform(tw);
|
self.left = self.left.transform(tw);
|
||||||
self.right = self.right.transform(tw);
|
self.right = self.right.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Conditional, function(self, tw) {
|
||||||
_(AST_Conditional, function(self, tw){
|
|
||||||
self.condition = self.condition.transform(tw);
|
self.condition = self.condition.transform(tw);
|
||||||
self.consequent = self.consequent.transform(tw);
|
self.consequent = self.consequent.transform(tw);
|
||||||
self.alternative = self.alternative.transform(tw);
|
self.alternative = self.alternative.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Array, function(self, tw) {
|
||||||
_(AST_Array, function(self, tw){
|
|
||||||
self.elements = do_list(self.elements, tw);
|
self.elements = do_list(self.elements, tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Object, function(self, tw) {
|
||||||
_(AST_Object, function(self, tw){
|
|
||||||
self.properties = do_list(self.properties, tw);
|
self.properties = do_list(self.properties, tw);
|
||||||
});
|
});
|
||||||
|
DEF(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);
|
||||||
});
|
});
|
||||||
|
})(function(node, descend) {
|
||||||
_(AST_Class, function(self, tw){
|
node.DEFMETHOD("transform", function(tw, in_list) {
|
||||||
if (self.name) self.name = self.name.transform(tw);
|
var x, y;
|
||||||
if (self.extends) self.extends = self.extends.transform(tw);
|
tw.push(this);
|
||||||
self.properties = do_list(self.properties, tw);
|
if (tw.before) x = tw.before(this, descend, in_list);
|
||||||
|
if (typeof x === "undefined") {
|
||||||
|
x = this;
|
||||||
|
descend(x, tw);
|
||||||
|
if (tw.after) {
|
||||||
|
y = tw.after(x, in_list);
|
||||||
|
if (typeof y !== "undefined") x = y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tw.pop();
|
||||||
|
return x;
|
||||||
});
|
});
|
||||||
|
});
|
||||||
_(AST_Expansion, function(self, tw){
|
|
||||||
self.expression = self.expression.transform(tw);
|
|
||||||
});
|
|
||||||
|
|
||||||
_(AST_NameMapping, function(self, tw) {
|
|
||||||
self.foreign_name = self.foreign_name.transform(tw);
|
|
||||||
self.name = self.name.transform(tw);
|
|
||||||
});
|
|
||||||
|
|
||||||
_(AST_Import, function(self, tw) {
|
|
||||||
if (self.imported_name) self.imported_name = self.imported_name.transform(tw);
|
|
||||||
if (self.imported_names) do_list(self.imported_names, tw);
|
|
||||||
self.module_name = self.module_name.transform(tw);
|
|
||||||
});
|
|
||||||
|
|
||||||
_(AST_Export, function(self, tw) {
|
|
||||||
if (self.exported_definition) self.exported_definition = self.exported_definition.transform(tw);
|
|
||||||
if (self.exported_value) self.exported_value = self.exported_value.transform(tw);
|
|
||||||
if (self.exported_names) do_list(self.exported_names, tw);
|
|
||||||
if (self.module_name) self.module_name = self.module_name.transform(tw);
|
|
||||||
});
|
|
||||||
|
|
||||||
_(AST_TemplateString, function(self, tw) {
|
|
||||||
self.segments = do_list(self.segments, tw);
|
|
||||||
});
|
|
||||||
|
|
||||||
_(AST_PrefixedTemplateString, function(self, tw) {
|
|
||||||
self.template_string = self.template_string.transform(tw);
|
|
||||||
});
|
|
||||||
|
|
||||||
})();
|
|
||||||
|
|||||||
173
lib/utils.js
173
lib/utils.js
@@ -45,27 +45,23 @@
|
|||||||
|
|
||||||
function characters(str) {
|
function characters(str) {
|
||||||
return str.split("");
|
return str.split("");
|
||||||
};
|
}
|
||||||
|
|
||||||
function member(name, array) {
|
function member(name, array) {
|
||||||
return array.indexOf(name) >= 0;
|
return array.indexOf(name) >= 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
function find_if(func, array) {
|
function find_if(func, array) {
|
||||||
for (var i = 0, n = array.length; i < n; ++i) {
|
for (var i = array.length; --i >= 0;) if (func(array[i])) return array[i];
|
||||||
if (func(array[i]))
|
}
|
||||||
return array[i];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
function repeat_string(str, i) {
|
function repeat_string(str, i) {
|
||||||
if (i <= 0) return "";
|
if (i <= 0) return "";
|
||||||
if (i == 1) return str;
|
if (i == 1) return str;
|
||||||
var d = repeat_string(str, i >> 1);
|
var d = repeat_string(str, i >> 1);
|
||||||
d += d;
|
d += d;
|
||||||
if (i & 1) d += str;
|
return i & 1 ? d + str : d;
|
||||||
return d;
|
}
|
||||||
};
|
|
||||||
|
|
||||||
function configure_error_stack(fn) {
|
function configure_error_stack(fn) {
|
||||||
Object.defineProperty(fn.prototype, "stack", {
|
Object.defineProperty(fn.prototype, "stack", {
|
||||||
@@ -84,27 +80,23 @@ function configure_error_stack(fn) {
|
|||||||
function DefaultsError(msg, defs) {
|
function DefaultsError(msg, defs) {
|
||||||
this.message = msg;
|
this.message = 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";
|
DefaultsError.prototype.name = "DefaultsError";
|
||||||
configure_error_stack(DefaultsError);
|
configure_error_stack(DefaultsError);
|
||||||
|
|
||||||
DefaultsError.croak = function(msg, defs) {
|
|
||||||
throw new DefaultsError(msg, defs);
|
|
||||||
};
|
|
||||||
|
|
||||||
function defaults(args, defs, croak) {
|
function defaults(args, defs, croak) {
|
||||||
if (args === true)
|
if (args === true) args = {};
|
||||||
args = {};
|
|
||||||
var ret = args || {};
|
var ret = args || {};
|
||||||
if (croak) for (var i in ret) if (HOP(ret, i) && !HOP(defs, i))
|
if (croak) for (var i in ret) if (HOP(ret, i) && !HOP(defs, i)) {
|
||||||
DefaultsError.croak("`" + i + "` is not a supported option", defs);
|
throw new DefaultsError("`" + i + "` is not a supported option", defs);
|
||||||
|
}
|
||||||
for (var i in defs) if (HOP(defs, i)) {
|
for (var i in defs) if (HOP(defs, i)) {
|
||||||
ret[i] = (args && HOP(args, i)) ? args[i] : defs[i];
|
ret[i] = (args && HOP(args, i)) ? args[i] : defs[i];
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
};
|
}
|
||||||
|
|
||||||
function merge(obj, ext) {
|
function merge(obj, ext) {
|
||||||
var count = 0;
|
var count = 0;
|
||||||
@@ -113,7 +105,7 @@ function merge(obj, ext) {
|
|||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
return count;
|
return count;
|
||||||
};
|
}
|
||||||
|
|
||||||
function noop() {}
|
function noop() {}
|
||||||
function return_false() { return false; }
|
function return_false() { return false; }
|
||||||
@@ -121,7 +113,7 @@ function return_true() { return true; }
|
|||||||
function return_this() { return this; }
|
function return_this() { return this; }
|
||||||
function return_null() { return null; }
|
function return_null() { return null; }
|
||||||
|
|
||||||
var MAP = (function(){
|
var MAP = (function() {
|
||||||
function MAP(a, f, backwards) {
|
function MAP(a, f, backwards) {
|
||||||
var ret = [], top = [], i;
|
var ret = [], top = [], i;
|
||||||
function doit() {
|
function doit() {
|
||||||
@@ -144,8 +136,8 @@ var MAP = (function(){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return is_last;
|
return is_last;
|
||||||
};
|
}
|
||||||
if (a instanceof Array) {
|
if (Array.isArray(a)) {
|
||||||
if (backwards) {
|
if (backwards) {
|
||||||
for (i = a.length; --i >= 0;) if (doit()) break;
|
for (i = a.length; --i >= 0;) if (doit()) break;
|
||||||
ret.reverse();
|
ret.reverse();
|
||||||
@@ -158,115 +150,52 @@ var MAP = (function(){
|
|||||||
for (i in a) if (HOP(a, i)) if (doit()) break;
|
for (i in a) if (HOP(a, i)) if (doit()) break;
|
||||||
}
|
}
|
||||||
return top.concat(ret);
|
return top.concat(ret);
|
||||||
};
|
}
|
||||||
MAP.at_top = function(val) { return new AtTop(val) };
|
MAP.at_top = function(val) { return new AtTop(val) };
|
||||||
MAP.splice = function(val) { return new Splice(val) };
|
MAP.splice = function(val) { return new Splice(val) };
|
||||||
MAP.last = function(val) { return new Last(val) };
|
MAP.last = function(val) { return new Last(val) };
|
||||||
var skip = MAP.skip = {};
|
var skip = MAP.skip = {};
|
||||||
function AtTop(val) { this.v = val };
|
function AtTop(val) { this.v = val }
|
||||||
function Splice(val) { this.v = val };
|
function Splice(val) { this.v = val }
|
||||||
function Last(val) { this.v = val };
|
function Last(val) { this.v = val }
|
||||||
return MAP;
|
return MAP;
|
||||||
})();
|
})();
|
||||||
|
|
||||||
function push_uniq(array, el) {
|
function push_uniq(array, el) {
|
||||||
if (array.indexOf(el) < 0)
|
if (array.indexOf(el) < 0) return array.push(el);
|
||||||
array.push(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 && props[p];
|
||||||
});
|
});
|
||||||
};
|
}
|
||||||
|
|
||||||
function remove(array, el) {
|
function remove(array, el) {
|
||||||
for (var i = array.length; --i >= 0;) {
|
var index = array.indexOf(el);
|
||||||
if (array[i] === el) array.splice(i, 1);
|
if (index >= 0) array.splice(index, 1);
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
function mergeSort(array, cmp) {
|
|
||||||
if (array.length < 2) return array.slice();
|
|
||||||
function merge(a, b) {
|
|
||||||
var r = [], ai = 0, bi = 0, i = 0;
|
|
||||||
while (ai < a.length && bi < b.length) {
|
|
||||||
cmp(a[ai], b[bi]) <= 0
|
|
||||||
? r[i++] = a[ai++]
|
|
||||||
: r[i++] = b[bi++];
|
|
||||||
}
|
|
||||||
if (ai < a.length) r.push.apply(r, a.slice(ai));
|
|
||||||
if (bi < b.length) r.push.apply(r, b.slice(bi));
|
|
||||||
return r;
|
|
||||||
};
|
|
||||||
function _ms(a) {
|
|
||||||
if (a.length <= 1)
|
|
||||||
return a;
|
|
||||||
var m = Math.floor(a.length / 2), left = a.slice(0, m), right = a.slice(m);
|
|
||||||
left = _ms(left);
|
|
||||||
right = _ms(right);
|
|
||||||
return merge(left, right);
|
|
||||||
};
|
|
||||||
return _ms(array);
|
|
||||||
};
|
|
||||||
|
|
||||||
// this function is taken from Acorn [1], written by Marijn Haverbeke
|
|
||||||
// [1] https://github.com/marijnh/acorn
|
|
||||||
function makePredicate(words) {
|
function makePredicate(words) {
|
||||||
if (!(words instanceof Array)) words = words.split(" ");
|
if (!Array.isArray(words)) words = words.split(" ");
|
||||||
var f = "", cats = [];
|
var map = Object.create(null);
|
||||||
out: for (var i = 0; i < words.length; ++i) {
|
words.forEach(function(word) {
|
||||||
for (var j = 0; j < cats.length; ++j)
|
map[word] = true;
|
||||||
if (cats[j][0].length == words[i].length) {
|
});
|
||||||
cats[j].push(words[i]);
|
return map;
|
||||||
continue out;
|
}
|
||||||
}
|
|
||||||
cats.push([words[i]]);
|
|
||||||
}
|
|
||||||
function quote(word) {
|
|
||||||
return JSON.stringify(word).replace(/[\u2028\u2029]/g, function(s) {
|
|
||||||
switch (s) {
|
|
||||||
case "\u2028": return "\\u2028";
|
|
||||||
case "\u2029": return "\\u2029";
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
function compareTo(arr) {
|
|
||||||
if (arr.length == 1) return f += "return str === " + quote(arr[0]) + ";";
|
|
||||||
f += "switch(str){";
|
|
||||||
for (var i = 0; i < arr.length; ++i) f += "case " + quote(arr[i]) + ":";
|
|
||||||
f += "return true}return false;";
|
|
||||||
}
|
|
||||||
// When there are more than three length categories, an outer
|
|
||||||
// switch first dispatches on the lengths, to save on comparisons.
|
|
||||||
if (cats.length > 3) {
|
|
||||||
cats.sort(function(a, b) {return b.length - a.length;});
|
|
||||||
f += "switch(str.length){";
|
|
||||||
for (var i = 0; i < cats.length; ++i) {
|
|
||||||
var cat = cats[i];
|
|
||||||
f += "case " + cat[0].length + ":";
|
|
||||||
compareTo(cat);
|
|
||||||
}
|
|
||||||
f += "}";
|
|
||||||
// Otherwise, simply generate a flat `switch` statement.
|
|
||||||
} else {
|
|
||||||
compareTo(words);
|
|
||||||
}
|
|
||||||
return new Function("str", f);
|
|
||||||
};
|
|
||||||
|
|
||||||
function all(array, predicate) {
|
function all(array, predicate) {
|
||||||
for (var i = array.length; --i >= 0;)
|
for (var i = array.length; --i >= 0;)
|
||||||
if (!predicate(array[i]))
|
if (!predicate(array[i]))
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
};
|
}
|
||||||
|
|
||||||
function Dictionary() {
|
function Dictionary() {
|
||||||
this._values = Object.create(null);
|
this._values = Object.create(null);
|
||||||
this._size = 0;
|
this._size = 0;
|
||||||
};
|
}
|
||||||
Dictionary.prototype = {
|
Dictionary.prototype = {
|
||||||
set: function(key, val) {
|
set: function(key, val) {
|
||||||
if (!this.has(key)) ++this._size;
|
if (!this.has(key)) ++this._size;
|
||||||
@@ -327,20 +256,22 @@ function HOP(obj, prop) {
|
|||||||
// a statement.
|
// a statement.
|
||||||
function first_in_statement(stack) {
|
function first_in_statement(stack) {
|
||||||
var node = stack.parent(-1);
|
var node = stack.parent(-1);
|
||||||
for (var i = 0, p; p = stack.parent(i); i++) {
|
for (var i = 0, p; p = stack.parent(i++); node = p) {
|
||||||
if (p instanceof AST_Statement && p.body === node)
|
if (p.TYPE == "Call") {
|
||||||
return true;
|
if (p.expression === node) continue;
|
||||||
if ((p instanceof AST_Sequence && p.expressions[0] === node) ||
|
} else if (p instanceof AST_Binary) {
|
||||||
(p.TYPE == "Call" && p.expression === node ) ||
|
if (p.left === node) continue;
|
||||||
(p instanceof AST_Dot && p.expression === node ) ||
|
} else if (p instanceof AST_Conditional) {
|
||||||
(p instanceof AST_Sub && p.expression === node ) ||
|
if (p.condition === node) continue;
|
||||||
(p instanceof AST_Conditional && p.condition === node ) ||
|
} else if (p instanceof AST_PropAccess) {
|
||||||
(p instanceof AST_Binary && p.left === node ) ||
|
if (p.expression === node) continue;
|
||||||
(p instanceof AST_UnaryPostfix && p.expression === node ))
|
} else if (p instanceof AST_Sequence) {
|
||||||
{
|
if (p.expressions[0] === node) continue;
|
||||||
node = p;
|
} else if (p instanceof AST_Statement) {
|
||||||
} else {
|
return p.body === node;
|
||||||
return false;
|
} else if (p instanceof AST_UnaryPostfix) {
|
||||||
|
if (p.expression === node) continue;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
48
package.json
48
package.json
@@ -1,10 +1,9 @@
|
|||||||
{
|
{
|
||||||
"name": "uglify-es",
|
"name": "uglify-js",
|
||||||
"description": "JavaScript parser, mangler/compressor and beautifier toolkit for ES6+",
|
"description": "JavaScript parser, mangler/compressor and beautifier toolkit",
|
||||||
"homepage": "https://github.com/mishoo/UglifyJS2/tree/harmony",
|
|
||||||
"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": "3.3.10",
|
"version": "3.4.8",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.8.0"
|
"node": ">=0.8.0"
|
||||||
},
|
},
|
||||||
@@ -12,7 +11,7 @@
|
|||||||
"Alex Lam <alexlamsl@gmail.com>",
|
"Alex Lam <alexlamsl@gmail.com>",
|
||||||
"Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)"
|
"Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)"
|
||||||
],
|
],
|
||||||
"repository": "https://github.com/mishoo/UglifyJS2.git#harmony",
|
"repository": "mishoo/UglifyJS2",
|
||||||
"main": "tools/node.js",
|
"main": "tools/node.js",
|
||||||
"bin": {
|
"bin": {
|
||||||
"uglifyjs": "bin/uglifyjs"
|
"uglifyjs": "bin/uglifyjs"
|
||||||
@@ -24,33 +23,38 @@
|
|||||||
"LICENSE"
|
"LICENSE"
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"commander": "~2.14.1",
|
"commander": "~2.17.1",
|
||||||
"source-map": "~0.6.1"
|
"source-map": "~0.6.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"acorn": "~5.4.1",
|
"acorn": "~5.7.1",
|
||||||
"mocha": "~3.5.1",
|
|
||||||
"semver": "~5.5.0"
|
"semver": "~5.5.0"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "node test/run-tests.js"
|
"test": "node test/run-tests.js"
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"uglify",
|
"cli",
|
||||||
"uglify-es",
|
"compress",
|
||||||
"uglify-js",
|
"compressor",
|
||||||
"minify",
|
"ecma",
|
||||||
"minifier",
|
|
||||||
"javascript",
|
|
||||||
"ecmascript",
|
"ecmascript",
|
||||||
|
"es",
|
||||||
"es5",
|
"es5",
|
||||||
"es6",
|
"javascript",
|
||||||
"es7",
|
"js",
|
||||||
"es8",
|
"jsmin",
|
||||||
"es2015",
|
"min",
|
||||||
"es2016",
|
"minification",
|
||||||
"es2017",
|
"minifier",
|
||||||
"async",
|
"minify",
|
||||||
"await"
|
"optimize",
|
||||||
|
"optimizer",
|
||||||
|
"pack",
|
||||||
|
"packer",
|
||||||
|
"parse",
|
||||||
|
"parser",
|
||||||
|
"uglifier",
|
||||||
|
"uglify"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ var remaining = 2 * urls.length;
|
|||||||
function done() {
|
function done() {
|
||||||
if (!--remaining) {
|
if (!--remaining) {
|
||||||
var failures = [];
|
var failures = [];
|
||||||
|
var sum = { input: 0, output: 0, gzip: 0 };
|
||||||
urls.forEach(function(url) {
|
urls.forEach(function(url) {
|
||||||
var info = results[url];
|
var info = results[url];
|
||||||
console.log();
|
console.log();
|
||||||
@@ -40,6 +41,9 @@ function done() {
|
|||||||
if (info.code) {
|
if (info.code) {
|
||||||
failures.push(url);
|
failures.push(url);
|
||||||
}
|
}
|
||||||
|
sum.input += info.input;
|
||||||
|
sum.output += info.output;
|
||||||
|
sum.gzip += info.gzip;
|
||||||
});
|
});
|
||||||
if (failures.length) {
|
if (failures.length) {
|
||||||
console.error("Benchmark failed:");
|
console.error("Benchmark failed:");
|
||||||
@@ -47,6 +51,13 @@ function done() {
|
|||||||
console.error(url);
|
console.error(url);
|
||||||
});
|
});
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
|
} else {
|
||||||
|
console.log();
|
||||||
|
console.log("Subtotal");
|
||||||
|
console.log();
|
||||||
|
console.log("Original:", sum.input, "bytes");
|
||||||
|
console.log("Uglified:", sum.output, "bytes");
|
||||||
|
console.log("GZipped: ", sum.gzip, "bytes");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
239
test/compress/arguments.js
Normal file
239
test/compress/arguments.js
Normal file
@@ -0,0 +1,239 @@
|
|||||||
|
replace_index: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
evaluate: true,
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var arguments = [];
|
||||||
|
console.log(arguments[0]);
|
||||||
|
(function() {
|
||||||
|
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||||
|
})("bar", 42);
|
||||||
|
(function(a, b) {
|
||||||
|
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||||
|
})("bar", 42);
|
||||||
|
(function(arguments) {
|
||||||
|
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||||
|
})("bar", 42);
|
||||||
|
(function() {
|
||||||
|
var arguments;
|
||||||
|
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||||
|
})("bar", 42);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var arguments = [];
|
||||||
|
console.log(arguments[0]);
|
||||||
|
(function() {
|
||||||
|
console.log(arguments[1], arguments[1], arguments.foo);
|
||||||
|
})("bar", 42);
|
||||||
|
(function(a, b) {
|
||||||
|
console.log(b, b, arguments.foo);
|
||||||
|
})("bar", 42);
|
||||||
|
(function(arguments) {
|
||||||
|
console.log(arguments[1], arguments[1], arguments.foo);
|
||||||
|
})("bar", 42);
|
||||||
|
(function() {
|
||||||
|
var arguments;
|
||||||
|
console.log(arguments[1], arguments[1], arguments.foo);
|
||||||
|
})("bar", 42);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"undefined",
|
||||||
|
"42 42 undefined",
|
||||||
|
"42 42 undefined",
|
||||||
|
"a a undefined",
|
||||||
|
"42 42 undefined",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
replace_index_strict: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
evaluate: true,
|
||||||
|
properties: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
(function() {
|
||||||
|
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||||
|
})("bar", 42);
|
||||||
|
(function(a, b) {
|
||||||
|
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||||
|
})("bar", 42);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
(function() {
|
||||||
|
console.log(arguments[1], arguments[1], arguments.foo);
|
||||||
|
})("bar", 42);
|
||||||
|
(function(a, b) {
|
||||||
|
console.log(b, b, arguments.foo);
|
||||||
|
})("bar", 42);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"42 42 undefined",
|
||||||
|
"42 42 undefined",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
replace_index_keep_fargs: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
evaluate: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var arguments = [];
|
||||||
|
console.log(arguments[0]);
|
||||||
|
(function() {
|
||||||
|
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||||
|
})("bar", 42);
|
||||||
|
(function(a, b) {
|
||||||
|
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||||
|
})("bar", 42);
|
||||||
|
(function(arguments) {
|
||||||
|
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||||
|
})("bar", 42);
|
||||||
|
(function() {
|
||||||
|
var arguments;
|
||||||
|
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||||
|
})("bar", 42);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var arguments = [];
|
||||||
|
console.log(arguments[0]);
|
||||||
|
(function(argument_0, argument_1) {
|
||||||
|
console.log(argument_1, argument_1, arguments.foo);
|
||||||
|
})("bar", 42);
|
||||||
|
(function(a, b) {
|
||||||
|
console.log(b, b, arguments.foo);
|
||||||
|
})("bar", 42);
|
||||||
|
(function(arguments) {
|
||||||
|
console.log(arguments[1], arguments[1], arguments.foo);
|
||||||
|
})("bar", 42);
|
||||||
|
(function() {
|
||||||
|
var arguments;
|
||||||
|
console.log(arguments[1], arguments[1], arguments.foo);
|
||||||
|
})("bar", 42);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"undefined",
|
||||||
|
"42 42 undefined",
|
||||||
|
"42 42 undefined",
|
||||||
|
"a a undefined",
|
||||||
|
"42 42 undefined",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
replace_index_keep_fargs_strict: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
evaluate: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
properties: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
(function() {
|
||||||
|
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||||
|
})("bar", 42);
|
||||||
|
(function(a, b) {
|
||||||
|
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||||
|
})("bar", 42);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
(function(argument_0, argument_1) {
|
||||||
|
console.log(argument_1, argument_1, arguments.foo);
|
||||||
|
})("bar", 42);
|
||||||
|
(function(a, b) {
|
||||||
|
console.log(b, b, arguments.foo);
|
||||||
|
})("bar", 42);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"42 42 undefined",
|
||||||
|
"42 42 undefined",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
modified: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a, b) {
|
||||||
|
var c = arguments[0];
|
||||||
|
var d = arguments[1];
|
||||||
|
var a = "foo";
|
||||||
|
b++;
|
||||||
|
arguments[0] = "moo";
|
||||||
|
arguments[1] *= 2;
|
||||||
|
console.log(a, b, c, d, arguments[0], arguments[1]);
|
||||||
|
})("bar", 42);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a, b) {
|
||||||
|
var c = a;
|
||||||
|
var d = b;
|
||||||
|
var a = "foo";
|
||||||
|
b++;
|
||||||
|
a = "moo";
|
||||||
|
b *= 2;
|
||||||
|
console.log(a, b, c, d, a, b);
|
||||||
|
})("bar", 42);
|
||||||
|
}
|
||||||
|
expect_stdout: "moo 86 bar 42 moo 86"
|
||||||
|
}
|
||||||
|
|
||||||
|
modified_strict: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
(function(a, b) {
|
||||||
|
var c = arguments[0];
|
||||||
|
var d = arguments[1];
|
||||||
|
var a = "foo";
|
||||||
|
b++;
|
||||||
|
arguments[0] = "moo";
|
||||||
|
arguments[1] *= 2;
|
||||||
|
console.log(a, b, c, d, arguments[0], arguments[1]);
|
||||||
|
})("bar", 42);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
(function(a, b) {
|
||||||
|
var c = arguments[0];
|
||||||
|
var d = arguments[1];
|
||||||
|
var a = "foo";
|
||||||
|
b++;
|
||||||
|
arguments[0] = "moo";
|
||||||
|
arguments[1] *= 2;
|
||||||
|
console.log(a, b, c, d, arguments[0], arguments[1]);
|
||||||
|
})("bar", 42);
|
||||||
|
}
|
||||||
|
expect_stdout: "foo 43 bar 42 moo 84"
|
||||||
|
}
|
||||||
|
|
||||||
|
duplicate_argname: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a, b, a) {
|
||||||
|
console.log(a, b, arguments[0], arguments[1], arguments[2]);
|
||||||
|
})("foo", 42, "bar");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a, b, a) {
|
||||||
|
console.log(a, b, arguments[0], b, a);
|
||||||
|
})("foo", 42, "bar");
|
||||||
|
}
|
||||||
|
expect_stdout: "bar 42 foo 42 bar"
|
||||||
|
}
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
// 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,,];
|
||||||
@@ -17,9 +15,9 @@ holes_and_undefined: {
|
|||||||
|
|
||||||
constant_join: {
|
constant_join: {
|
||||||
options = {
|
options = {
|
||||||
unsafe : true,
|
evaluate: true,
|
||||||
evaluate : true
|
unsafe: true,
|
||||||
};
|
}
|
||||||
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();
|
||||||
@@ -66,9 +64,9 @@ constant_join: {
|
|||||||
|
|
||||||
constant_join_2: {
|
constant_join_2: {
|
||||||
options = {
|
options = {
|
||||||
unsafe : true,
|
evaluate: true,
|
||||||
evaluate : true
|
unsafe: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = [ "foo", "bar", boo(), "baz", "x", "y" ].join("");
|
var a = [ "foo", "bar", boo(), "baz", "x", "y" ].join("");
|
||||||
var b = [ "foo", "bar", boo(), "baz", "x", "y" ].join("-");
|
var b = [ "foo", "bar", boo(), "baz", "x", "y" ].join("-");
|
||||||
@@ -93,84 +91,11 @@ constant_join_2: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
spread_with_variable_as_last_element: {
|
|
||||||
input: {
|
|
||||||
var values = [4, 5, 6];
|
|
||||||
var a = [1, 2, 3, ...values];
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var values = [4, 5, 6];
|
|
||||||
var a = [1, 2, 3, ...values];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
spread_with_variable_in_middle: {
|
|
||||||
input: {
|
|
||||||
var values = [4, 5, 6];
|
|
||||||
var a = [1, 2, 3, ...values, 7,,,];
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var values = [4, 5, 6];
|
|
||||||
var a = [1, 2, 3, ...values, 7,,,];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
spread_with_variable_at_front: {
|
|
||||||
input: {
|
|
||||||
var values = [1, 2, 3];
|
|
||||||
var a = [...values, 4, 5, 6];
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var values = [1, 2, 3];
|
|
||||||
var a = [...values, 4, 5, 6];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
spread_with_variable_at_front_after_elisions: {
|
|
||||||
input: {
|
|
||||||
var values = [1, 2, 3];
|
|
||||||
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]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
constant_join_3: {
|
constant_join_3: {
|
||||||
options = {
|
options = {
|
||||||
unsafe: true,
|
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
};
|
unsafe: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = [ null ].join();
|
var a = [ null ].join();
|
||||||
var b = [ , ].join();
|
var b = [ , ].join();
|
||||||
@@ -208,7 +133,7 @@ for_loop: {
|
|||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unsafe: true,
|
unsafe: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
function f0() {
|
function f0() {
|
||||||
var a = [1, 2, 3];
|
var a = [1, 2, 3];
|
||||||
|
|||||||
@@ -1,656 +0,0 @@
|
|||||||
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";'
|
|
||||||
}
|
|
||||||
|
|
||||||
arrow_with_regexp: {
|
|
||||||
input: {
|
|
||||||
num => /\d{11,14}/.test( num )
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
num => /\d{11,14}/.test( num )
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
arrow_unused: {
|
|
||||||
options = {
|
|
||||||
toplevel: false,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
top => dog;
|
|
||||||
let fn = a => { console.log(a * a); };
|
|
||||||
let u = (x, y) => x - y + g;
|
|
||||||
(() => { console.log("0"); })();
|
|
||||||
!function(x) {
|
|
||||||
(() => { console.log("1"); })();
|
|
||||||
let unused = x => { console.log(x); };
|
|
||||||
let baz = e => e + e;
|
|
||||||
console.log(baz(x));
|
|
||||||
}(1);
|
|
||||||
fn(3);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
let fn = a => { console.log(a * a); };
|
|
||||||
let u = (x, y) => x - y + g;
|
|
||||||
(() => { console.log("0"); })();
|
|
||||||
!function(x) {
|
|
||||||
(() => { console.log("1"); })();
|
|
||||||
let baz = e => e + e;
|
|
||||||
console.log(baz(x));
|
|
||||||
}(1);
|
|
||||||
fn(3);
|
|
||||||
}
|
|
||||||
expect_stdout: [ "0", "1", "2", "9" ]
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
arrow_unused_toplevel: {
|
|
||||||
options = {
|
|
||||||
toplevel: true,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
top => dog;
|
|
||||||
let fn = a => { console.log(a * a); };
|
|
||||||
let u = (x, y) => x - y + g;
|
|
||||||
(() => { console.log("0"); })();
|
|
||||||
!function(x) {
|
|
||||||
(() => { console.log("1"); })();
|
|
||||||
let unused = x => { console.log(x); };
|
|
||||||
let baz = e => e + e;
|
|
||||||
console.log(baz(x));
|
|
||||||
}(1);
|
|
||||||
fn(3);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
let fn = a => { console.log(a * a); };
|
|
||||||
(() => { console.log("0"); })();
|
|
||||||
!function(x) {
|
|
||||||
(() => { console.log("1"); })();
|
|
||||||
let baz = e => e + e;
|
|
||||||
console.log(baz(x));
|
|
||||||
}(1);
|
|
||||||
fn(3);
|
|
||||||
}
|
|
||||||
expect_stdout: [ "0", "1", "2", "9" ]
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
no_leading_parentheses: {
|
|
||||||
input: {
|
|
||||||
(x,y) => x(y);
|
|
||||||
async (x,y) => await x(y);
|
|
||||||
}
|
|
||||||
expect_exact: "(x,y)=>x(y);async(x,y)=>await x(y);"
|
|
||||||
}
|
|
||||||
|
|
||||||
async_identifiers: {
|
|
||||||
options = {
|
|
||||||
unsafe_arrows: true,
|
|
||||||
ecma: 6,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var async = function(x){ console.log("async", x); };
|
|
||||||
var await = function(x){ console.log("await", x); };
|
|
||||||
async(1);
|
|
||||||
await(2);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var async = x => { console.log("async", x); };
|
|
||||||
var await = x => { console.log("await", x); };
|
|
||||||
async(1);
|
|
||||||
await(2);
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"async 1",
|
|
||||||
"await 2",
|
|
||||||
]
|
|
||||||
node_version: ">=4"
|
|
||||||
}
|
|
||||||
|
|
||||||
async_function_expression: {
|
|
||||||
options = {
|
|
||||||
unsafe_arrows: true,
|
|
||||||
ecma: 6,
|
|
||||||
evaluate: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var named = async function foo() {
|
|
||||||
await bar(1 + 0) + (2 + 0);
|
|
||||||
}
|
|
||||||
var anon = async function() {
|
|
||||||
await (1 + 0) + bar(2 + 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var named = async function foo() {
|
|
||||||
await bar(1);
|
|
||||||
};
|
|
||||||
var anon = async () => {
|
|
||||||
await 1, bar(2);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_27: {
|
|
||||||
options = {
|
|
||||||
unsafe_arrows: true,
|
|
||||||
collapse_vars: true,
|
|
||||||
ecma: 6,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function(jQuery) {
|
|
||||||
var $;
|
|
||||||
$ = jQuery;
|
|
||||||
$("body").addClass("foo");
|
|
||||||
})(jQuery);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(jQuery => {
|
|
||||||
jQuery("body").addClass("foo");
|
|
||||||
})(jQuery);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2105_1: {
|
|
||||||
options = {
|
|
||||||
unsafe_arrows: true,
|
|
||||||
collapse_vars: true,
|
|
||||||
ecma: 6,
|
|
||||||
inline: true,
|
|
||||||
passes: 3,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
unsafe_methods: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
!function(factory) {
|
|
||||||
factory();
|
|
||||||
}( function() {
|
|
||||||
return function(fn) {
|
|
||||||
fn()().prop();
|
|
||||||
}( function() {
|
|
||||||
function bar() {
|
|
||||||
var quux = function() {
|
|
||||||
console.log("PASS");
|
|
||||||
}, foo = function() {
|
|
||||||
console.log;
|
|
||||||
quux();
|
|
||||||
};
|
|
||||||
return { prop: foo };
|
|
||||||
}
|
|
||||||
return bar;
|
|
||||||
} );
|
|
||||||
});
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
({
|
|
||||||
prop() {
|
|
||||||
console.log;
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
}).prop();
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
node_version: ">=4"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2105_2: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
inline: true,
|
|
||||||
passes: 2,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
((factory) => {
|
|
||||||
factory();
|
|
||||||
})( () => {
|
|
||||||
return ((fn) => {
|
|
||||||
fn()().prop();
|
|
||||||
})( () => {
|
|
||||||
let bar = () => {
|
|
||||||
var quux = () => {
|
|
||||||
console.log("PASS");
|
|
||||||
}, foo = () => {
|
|
||||||
console.log;
|
|
||||||
quux();
|
|
||||||
};
|
|
||||||
return { prop: foo };
|
|
||||||
};
|
|
||||||
return bar;
|
|
||||||
} );
|
|
||||||
});
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
({
|
|
||||||
prop: () => {
|
|
||||||
console.log;
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
}).prop();
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2136_2: {
|
|
||||||
options = {
|
|
||||||
arrows: true,
|
|
||||||
collapse_vars: true,
|
|
||||||
ecma: 6,
|
|
||||||
inline: true,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(x) {
|
|
||||||
console.log(x);
|
|
||||||
}
|
|
||||||
!function(a, ...b) {
|
|
||||||
f(b[0]);
|
|
||||||
}(1, 2, 3);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(x) {
|
|
||||||
console.log(x);
|
|
||||||
}
|
|
||||||
f([2,3][0]);
|
|
||||||
}
|
|
||||||
expect_stdout: "2"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2136_3: {
|
|
||||||
options = {
|
|
||||||
arrows: true,
|
|
||||||
collapse_vars: true,
|
|
||||||
ecma: 6,
|
|
||||||
evaluate: true,
|
|
||||||
inline: true,
|
|
||||||
passes: 3,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
unsafe: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(x) {
|
|
||||||
console.log(x);
|
|
||||||
}
|
|
||||||
!function(a, ...b) {
|
|
||||||
f(b[0]);
|
|
||||||
}(1, 2, 3);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(2);
|
|
||||||
}
|
|
||||||
expect_stdout: "2"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
call_args: {
|
|
||||||
options = {
|
|
||||||
arrows: true,
|
|
||||||
ecma: 6,
|
|
||||||
evaluate: true,
|
|
||||||
inline: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
const a = 1;
|
|
||||||
console.log(a);
|
|
||||||
+function(a) {
|
|
||||||
return a;
|
|
||||||
}(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
const a = 1;
|
|
||||||
console.log(1);
|
|
||||||
+(1, 1);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
call_args_drop_param: {
|
|
||||||
options = {
|
|
||||||
arrows: true,
|
|
||||||
ecma: 6,
|
|
||||||
evaluate: true,
|
|
||||||
inline: true,
|
|
||||||
keep_fargs: false,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
const a = 1;
|
|
||||||
console.log(a);
|
|
||||||
+function(a) {
|
|
||||||
return a;
|
|
||||||
}(a, b);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
const a = 1;
|
|
||||||
console.log(1);
|
|
||||||
+(b, 1);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_485_crashing_1530: {
|
|
||||||
options = {
|
|
||||||
arrows: true,
|
|
||||||
conditionals: true,
|
|
||||||
dead_code: true,
|
|
||||||
ecma: 6,
|
|
||||||
evaluate: true,
|
|
||||||
inline: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function(a) {
|
|
||||||
if (true) return;
|
|
||||||
var b = 42;
|
|
||||||
})(this);
|
|
||||||
}
|
|
||||||
expect: {}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2084: {
|
|
||||||
options = {
|
|
||||||
unsafe_arrows: true,
|
|
||||||
collapse_vars: true,
|
|
||||||
conditionals: true,
|
|
||||||
ecma: 6,
|
|
||||||
evaluate: true,
|
|
||||||
inline: true,
|
|
||||||
passes: 2,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var c = 0;
|
|
||||||
!function() {
|
|
||||||
!function(c) {
|
|
||||||
c = 1 + c;
|
|
||||||
var c = 0;
|
|
||||||
function f14(a_1) {
|
|
||||||
if (c = 1 + c, 0 !== 23..toString())
|
|
||||||
c = 1 + c, a_1 && (a_1[0] = 0);
|
|
||||||
}
|
|
||||||
f14();
|
|
||||||
}(-1);
|
|
||||||
}();
|
|
||||||
console.log(c);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var c = 0;
|
|
||||||
((c) => {
|
|
||||||
c = 1 + c,
|
|
||||||
c = 1 + (c = 0),
|
|
||||||
0 !== 23..toString() && (c = 1 + c);
|
|
||||||
})(-1),
|
|
||||||
console.log(c);
|
|
||||||
}
|
|
||||||
expect_stdout: "0"
|
|
||||||
node_version: ">=4"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_default_object_expression: {
|
|
||||||
options = {
|
|
||||||
arrows: true,
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export default {
|
|
||||||
foo: 1 + 2,
|
|
||||||
bar() { return 4; },
|
|
||||||
get baz() { return this.foo; },
|
|
||||||
};
|
|
||||||
}
|
|
||||||
expect_exact: "export default{foo:3,bar:()=>4,get baz(){return this.foo}};"
|
|
||||||
}
|
|
||||||
|
|
||||||
concise_methods_with_computed_property2: {
|
|
||||||
options = {
|
|
||||||
arrows: true,
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var foo = {
|
|
||||||
[[1]](v) {
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
console.log(foo[[1]]("PASS"));
|
|
||||||
}
|
|
||||||
expect_exact: 'var foo={[[1]]:v=>v};console.log(foo[[1]]("PASS"));'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
node_version: ">=4"
|
|
||||||
}
|
|
||||||
|
|
||||||
async_object_literal: {
|
|
||||||
options = {
|
|
||||||
arrows: true,
|
|
||||||
unsafe_arrows: true,
|
|
||||||
ecma: 6,
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var obj = {
|
|
||||||
async a() {
|
|
||||||
return await foo(1 + 0);
|
|
||||||
},
|
|
||||||
anon: async function() {
|
|
||||||
return await foo(2 + 0);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var obj = {
|
|
||||||
a: async () => await foo(1),
|
|
||||||
anon: async () => await foo(2)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2271: {
|
|
||||||
options = {
|
|
||||||
arrows: true,
|
|
||||||
ecma: 6,
|
|
||||||
evaluate: true,
|
|
||||||
unsafe_arrows: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var Foo = function() {};
|
|
||||||
Foo.prototype.set = function(value) {
|
|
||||||
this.value = value;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
Foo.prototype.print = function() {
|
|
||||||
console.log(this.value);
|
|
||||||
}
|
|
||||||
new Foo().set("PASS").print();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var Foo = function() {};
|
|
||||||
Foo.prototype.set = function(value) {
|
|
||||||
this.value = value;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
Foo.prototype.print = function() {
|
|
||||||
console.log(this.value);
|
|
||||||
}
|
|
||||||
new Foo().set("PASS").print();
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
concise_method_with_super: {
|
|
||||||
options = {
|
|
||||||
arrows: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = {
|
|
||||||
f: "FAIL",
|
|
||||||
g() {
|
|
||||||
return super.f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Object.setPrototypeOf(o, { f: "PASS" });
|
|
||||||
console.log(o.g());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var o = {
|
|
||||||
f: "FAIL",
|
|
||||||
g() {
|
|
||||||
return super.f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Object.setPrototypeOf(o, { f: "PASS" });
|
|
||||||
console.log(o.g());
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
node_version: ">=4"
|
|
||||||
}
|
|
||||||
@@ -1,24 +1,24 @@
|
|||||||
asm_mixed: {
|
asm_mixed: {
|
||||||
options = {
|
options = {
|
||||||
sequences : true,
|
booleans: true,
|
||||||
properties : true,
|
comparisons: true,
|
||||||
dead_code : true,
|
conditionals: true,
|
||||||
drop_debugger : true,
|
dead_code: true,
|
||||||
conditionals : true,
|
drop_debugger: true,
|
||||||
comparisons : true,
|
evaluate: true,
|
||||||
evaluate : true,
|
hoist_funs: true,
|
||||||
booleans : true,
|
hoist_vars: true,
|
||||||
loops : true,
|
if_return: true,
|
||||||
unused : true,
|
join_vars: true,
|
||||||
hoist_funs : true,
|
keep_fargs: true,
|
||||||
keep_fargs : true,
|
keep_fnames: false,
|
||||||
keep_fnames : false,
|
loops: true,
|
||||||
hoist_vars : true,
|
negate_iife: true,
|
||||||
if_return : true,
|
properties: true,
|
||||||
join_vars : true,
|
sequences: true,
|
||||||
side_effects : true,
|
side_effects: true,
|
||||||
negate_iife : true
|
unused: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
// adapted from http://asmjs.org/spec/latest/
|
// adapted from http://asmjs.org/spec/latest/
|
||||||
function asm_GeometricMean(stdlib, foreign, buffer) {
|
function asm_GeometricMean(stdlib, foreign, buffer) {
|
||||||
|
|||||||
@@ -1,323 +0,0 @@
|
|||||||
await_precedence: {
|
|
||||||
input: {
|
|
||||||
async function f1() { await x + y; }
|
|
||||||
async function f2() { await (x + y); }
|
|
||||||
}
|
|
||||||
expect_exact: "async function f1(){await x+y}async function f2(){await(x+y)}"
|
|
||||||
}
|
|
||||||
|
|
||||||
await_precedence_prop: {
|
|
||||||
input: {
|
|
||||||
async function f1(){ return (await foo()).bar; }
|
|
||||||
async function f2(){ return (await foo().bar); }
|
|
||||||
}
|
|
||||||
expect_exact: "async function f1(){return(await foo()).bar}async function f2(){return await foo().bar}"
|
|
||||||
}
|
|
||||||
|
|
||||||
await_precedence_call: {
|
|
||||||
input: {
|
|
||||||
async function f3(){ return (await foo())(); }
|
|
||||||
async function f4(){ return await (foo()()); }
|
|
||||||
}
|
|
||||||
expect_exact: "async function f3(){return(await foo())()}async function f4(){return await foo()()}"
|
|
||||||
}
|
|
||||||
|
|
||||||
async_function_declaration: {
|
|
||||||
options = {
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
async function f0() {}
|
|
||||||
async function f1() { await x + y; }
|
|
||||||
async function f2() { await (x + y); }
|
|
||||||
async function f3() { await x + await y; }
|
|
||||||
async function f4() { await (x + await y); }
|
|
||||||
async function f5() { await x; await y; }
|
|
||||||
async function f6() { await x, await y; }
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
async function f0() {}
|
|
||||||
async function f1() { await x, y; }
|
|
||||||
async function f2() { await (x + y); }
|
|
||||||
async function f3() { await x, await y; }
|
|
||||||
async function f4() { await (x + await y); }
|
|
||||||
async function f5() { await x; await y; }
|
|
||||||
async function f6() { await x, await y; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async_function_expression: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var named = async function foo() {
|
|
||||||
await bar(1 + 0) + (2 + 0);
|
|
||||||
}
|
|
||||||
var anon = async function() {
|
|
||||||
await (1 + 0) + bar(2 + 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var named = async function() {
|
|
||||||
await bar(1);
|
|
||||||
};
|
|
||||||
var anon = async function() {
|
|
||||||
await 1, bar(2);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async_class: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
class Foo {
|
|
||||||
async m1() {
|
|
||||||
return await foo(1 + 2);
|
|
||||||
}
|
|
||||||
static async m2() {
|
|
||||||
return await foo(3 + 4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
class Foo {
|
|
||||||
async m1() {
|
|
||||||
return await foo(3);
|
|
||||||
}
|
|
||||||
static async m2() {
|
|
||||||
return await foo(7);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async_object_literal: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var obj = {
|
|
||||||
async a() {
|
|
||||||
await foo(1 + 0);
|
|
||||||
},
|
|
||||||
anon: async function(){
|
|
||||||
await foo(2 + 0);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var obj = {
|
|
||||||
async a() {
|
|
||||||
await foo(1);
|
|
||||||
},
|
|
||||||
anon: async function() {
|
|
||||||
await foo(2);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async_export: {
|
|
||||||
input: {
|
|
||||||
export async function run() {};
|
|
||||||
export default async function def() {};
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
export async function run() {};
|
|
||||||
export default async function def() {};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async_inline: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
conditionals: true,
|
|
||||||
evaluate: true,
|
|
||||||
inline: true,
|
|
||||||
negate_iife: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(async function(){ return await 3; })();
|
|
||||||
(async function(x){ await console.log(x); })(4);
|
|
||||||
|
|
||||||
function echo(x) { return x; }
|
|
||||||
echo( async function(){ return await 1; }() );
|
|
||||||
echo( async function(x){ await console.log(x); }(2) );
|
|
||||||
|
|
||||||
function top() { console.log("top"); }
|
|
||||||
top();
|
|
||||||
|
|
||||||
async function async_top() { console.log("async_top"); }
|
|
||||||
async_top();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
!async function(){await 3}();
|
|
||||||
!async function(x){await console.log(4)}();
|
|
||||||
|
|
||||||
function echo(x){return x}
|
|
||||||
echo(async function(){return await 1}());
|
|
||||||
echo(async function(x){await console.log(2)}());
|
|
||||||
|
|
||||||
console.log("top");
|
|
||||||
|
|
||||||
!async function(){console.log("async_top")}();
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"4",
|
|
||||||
"2",
|
|
||||||
"top",
|
|
||||||
"async_top",
|
|
||||||
]
|
|
||||||
node_version: ">=8"
|
|
||||||
}
|
|
||||||
|
|
||||||
async_identifiers: {
|
|
||||||
input: {
|
|
||||||
var async = function(x){ console.log("async", x); };
|
|
||||||
var await = function(x){ console.log("await", x); };
|
|
||||||
async(1);
|
|
||||||
await(2);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var async = function(x){ console.log("async", x); };
|
|
||||||
var await = function(x){ console.log("await", x); };
|
|
||||||
async(1);
|
|
||||||
await(2);
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"async 1",
|
|
||||||
"await 2",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
async_shorthand_property: {
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function print(o) { console.log(o.async + " " + o.await); }
|
|
||||||
var async = "Async", await = "Await";
|
|
||||||
|
|
||||||
print({ async });
|
|
||||||
print({ await });
|
|
||||||
print({ async, await });
|
|
||||||
print({ await, async });
|
|
||||||
|
|
||||||
print({ async: async });
|
|
||||||
print({ await: await });
|
|
||||||
print({ async: async, await: await });
|
|
||||||
print({ await: await, async: async });
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function a(a) { console.log(a.async + " " + a.await); }
|
|
||||||
var n = "Async", c = "Await";
|
|
||||||
|
|
||||||
a({ async: n });
|
|
||||||
a({ await: c });
|
|
||||||
a({ async: n, await: c });
|
|
||||||
a({ await: c, async: n });
|
|
||||||
|
|
||||||
a({ async: n });
|
|
||||||
a({ await: c });
|
|
||||||
a({ async: n, await: c });
|
|
||||||
a({ await: c, async: n });
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"Async undefined",
|
|
||||||
"undefined Await",
|
|
||||||
"Async Await",
|
|
||||||
"Async Await",
|
|
||||||
"Async undefined",
|
|
||||||
"undefined Await",
|
|
||||||
"Async Await",
|
|
||||||
"Async Await",
|
|
||||||
]
|
|
||||||
node_version: ">=4"
|
|
||||||
}
|
|
||||||
|
|
||||||
async_arrow: {
|
|
||||||
input: {
|
|
||||||
let a1 = async x => await foo(x);
|
|
||||||
let a2 = async () => await bar();
|
|
||||||
let a3 = async (x) => await baz(x);
|
|
||||||
let a4 = async (x, y) => { await far(x, y); }
|
|
||||||
let a5 = async ({x = [1], y: z = 2}) => { await wow(x, z); }
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
let a1 = async x => await foo(x);
|
|
||||||
let a2 = async () => await bar();
|
|
||||||
let a3 = async (x) => await baz(x);
|
|
||||||
let a4 = async (x, y) => { await far(x, y); }
|
|
||||||
let a5 = async ({x = [1], y: z = 2}) => { await wow(x, z); }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async_arrow_wait: {
|
|
||||||
input: {
|
|
||||||
var a = async (x, y) => await x(y);
|
|
||||||
}
|
|
||||||
expect_exact: "var a=async(x,y)=>await x(y);"
|
|
||||||
}
|
|
||||||
|
|
||||||
async_arrow_iife: {
|
|
||||||
input: {
|
|
||||||
(async () => {
|
|
||||||
await fetch({});
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect_exact: "(async()=>{await fetch({})})();"
|
|
||||||
}
|
|
||||||
|
|
||||||
async_arrow_iife_negate_iife: {
|
|
||||||
options = {
|
|
||||||
negate_iife: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(async () => {
|
|
||||||
await fetch();
|
|
||||||
})();
|
|
||||||
(() => {
|
|
||||||
plain();
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect_exact: "(async()=>{await fetch()})();(()=>{plain()})();"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2344_1: {
|
|
||||||
beautify = {
|
|
||||||
safari10: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
async () => {
|
|
||||||
+await x;
|
|
||||||
await y;
|
|
||||||
return await z;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
expect_exact: "async()=>{+await x;await y;return await z};"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2344_2: {
|
|
||||||
beautify = {
|
|
||||||
safari10: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
async () => {
|
|
||||||
+await x;
|
|
||||||
await y;
|
|
||||||
return await z;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
expect_exact: "async()=>{+(await x);await y;return await z};"
|
|
||||||
}
|
|
||||||
@@ -1,191 +0,0 @@
|
|||||||
|
|
||||||
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 = 1;
|
|
||||||
class Zee {};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
{
|
|
||||||
let y;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
var y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function x(){
|
|
||||||
{
|
|
||||||
let x
|
|
||||||
}
|
|
||||||
var x;
|
|
||||||
{
|
|
||||||
const y = 1;
|
|
||||||
class Zee {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
{
|
|
||||||
let y
|
|
||||||
}
|
|
||||||
var y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
remove_unused_in_global_block: {
|
|
||||||
options = {
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
{
|
|
||||||
let x;
|
|
||||||
const y = 1;
|
|
||||||
class Zee {};
|
|
||||||
var w;
|
|
||||||
}
|
|
||||||
let ex;
|
|
||||||
const why = 2;
|
|
||||||
class Zed {};
|
|
||||||
var wut;
|
|
||||||
console.log(x, y, Zee);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var w;
|
|
||||||
let ex;
|
|
||||||
const why = 2;
|
|
||||||
class Zed {};
|
|
||||||
var wut;
|
|
||||||
console.log(x, y, Zee);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
regression_block_scope_resolves: {
|
|
||||||
mangle = { };
|
|
||||||
options = {
|
|
||||||
dead_code: false
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
(function () {
|
|
||||||
if (1) {
|
|
||||||
let x;
|
|
||||||
const y = 1;
|
|
||||||
class Zee {};
|
|
||||||
}
|
|
||||||
if (1) {
|
|
||||||
let ex;
|
|
||||||
const why = 2;
|
|
||||||
class Zi {};
|
|
||||||
}
|
|
||||||
console.log(typeof x, typeof y, typeof Zee, typeof ex, typeof why, typeof Zi);
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function () {
|
|
||||||
if (1) {
|
|
||||||
let e;
|
|
||||||
const o = 1;
|
|
||||||
class t {};
|
|
||||||
}
|
|
||||||
if (1) {
|
|
||||||
let e;
|
|
||||||
const o = 2;
|
|
||||||
class t {};
|
|
||||||
}
|
|
||||||
console.log(typeof x, typeof y, typeof Zee, typeof ex, typeof why, typeof Zi);
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect_stdout: "undefined undefined undefined undefined undefined undefined"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
fn(1);
|
|
||||||
fn(2);
|
|
||||||
fn(3);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var fn = function(e) {
|
|
||||||
switch (e) {
|
|
||||||
case 1:
|
|
||||||
let l = e + 1
|
|
||||||
let o = e + 4;
|
|
||||||
console.log(l, o);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
let n = e + 2;
|
|
||||||
console.log(n);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
let c = e + 3;
|
|
||||||
console.log(c);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
fn(1);
|
|
||||||
fn(2);
|
|
||||||
fn(3);
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"2 5",
|
|
||||||
"4",
|
|
||||||
"6",
|
|
||||||
]
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
@@ -47,143 +47,3 @@ keep_some_blocks: {
|
|||||||
} else stuff();
|
} else stuff();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1664: {
|
|
||||||
input: {
|
|
||||||
var a = 1;
|
|
||||||
function f() {
|
|
||||||
if (undefined) a = 2;
|
|
||||||
{
|
|
||||||
function undefined() {}
|
|
||||||
undefined();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 1;
|
|
||||||
function f() {
|
|
||||||
if (undefined) a = 2;
|
|
||||||
{
|
|
||||||
function undefined() {}
|
|
||||||
undefined();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: "1"
|
|
||||||
node_version: ">=6"
|
|
||||||
reminify: false // FIXME - block scoped function
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1672_for: {
|
|
||||||
input: {
|
|
||||||
switch (function() {
|
|
||||||
return xxx;
|
|
||||||
}) {
|
|
||||||
case xxx:
|
|
||||||
for (; console.log("FAIL");) {
|
|
||||||
function xxx() {}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
switch (function() {
|
|
||||||
return xxx;
|
|
||||||
}) {
|
|
||||||
case xxx:
|
|
||||||
for (; console.log("FAIL");) {
|
|
||||||
function xxx() {}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1672_for_strict: {
|
|
||||||
input: {
|
|
||||||
"use strict";
|
|
||||||
switch (function() {
|
|
||||||
return xxx;
|
|
||||||
}) {
|
|
||||||
case xxx:
|
|
||||||
for (; console.log("FAIL");) {
|
|
||||||
function xxx() {}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
"use strict";
|
|
||||||
switch (function() {
|
|
||||||
return xxx;
|
|
||||||
}) {
|
|
||||||
case xxx:
|
|
||||||
for (; console.log("FAIL");) {
|
|
||||||
function xxx() {}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1672_if: {
|
|
||||||
input: {
|
|
||||||
switch (function() {
|
|
||||||
return xxx;
|
|
||||||
}) {
|
|
||||||
case xxx:
|
|
||||||
if (console.log("FAIL")) {
|
|
||||||
function xxx() {}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
switch (function() {
|
|
||||||
return xxx;
|
|
||||||
}) {
|
|
||||||
case xxx:
|
|
||||||
if (console.log("FAIL")) function xxx() {}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1672_if_strict: {
|
|
||||||
input: {
|
|
||||||
"use strict";
|
|
||||||
switch (function() {
|
|
||||||
return xxx;
|
|
||||||
}) {
|
|
||||||
case xxx:
|
|
||||||
if (console.log("FAIL")) {
|
|
||||||
function xxx() {}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
"use strict";
|
|
||||||
switch (function() {
|
|
||||||
return xxx;
|
|
||||||
}) {
|
|
||||||
case xxx:
|
|
||||||
if (console.log("FAIL")) {
|
|
||||||
function xxx() {}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,62 +1,42 @@
|
|||||||
keep_comparisons: {
|
comparisons: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
unsafe_comps: false
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var obj1 = {
|
var obj1, obj2;
|
||||||
valueOf: function() {triggeredFirst();}
|
|
||||||
}
|
|
||||||
var obj2 = {
|
|
||||||
valueOf: function() {triggeredSecond();}
|
|
||||||
}
|
|
||||||
var result1 = obj1 <= obj2;
|
var result1 = obj1 <= obj2;
|
||||||
var result2 = obj1 < obj2;
|
var result2 = obj1 < obj2;
|
||||||
var result3 = obj1 >= obj2;
|
var result3 = obj1 >= obj2;
|
||||||
var result4 = obj1 > obj2;
|
var result4 = obj1 > obj2;
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var obj1 = {
|
var obj1, obj2;
|
||||||
valueOf: function() {triggeredFirst();}
|
|
||||||
}
|
|
||||||
var obj2 = {
|
|
||||||
valueOf: function() {triggeredSecond();}
|
|
||||||
}
|
|
||||||
var result1 = obj1 <= obj2;
|
var result1 = obj1 <= obj2;
|
||||||
var result2 = obj1 < obj2;
|
var result2 = obj1 < obj2;
|
||||||
var result3 = obj1 >= obj2;
|
var result3 = obj2 <= obj1;
|
||||||
var result4 = obj1 > obj2;
|
var result4 = obj2 < obj1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
keep_comparisons_with_unsafe_comps: {
|
unsafe_comps: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
unsafe_comps: true
|
conditionals: true,
|
||||||
|
unsafe_comps: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var obj1 = {
|
var obj1, obj2;
|
||||||
valueOf: function() {triggeredFirst();}
|
obj1 <= obj2 ? f1() : g1();
|
||||||
}
|
obj1 < obj2 ? f2() : g2();
|
||||||
var obj2 = {
|
obj1 >= obj2 ? f3() : g3();
|
||||||
valueOf: function() {triggeredSecond();}
|
obj1 > obj2 ? f4() : g4();
|
||||||
}
|
|
||||||
var result1 = obj1 <= obj2;
|
|
||||||
var result2 = obj1 < obj2;
|
|
||||||
var result3 = obj1 >= obj2;
|
|
||||||
var result4 = obj1 > obj2;
|
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var obj1 = {
|
var obj1, obj2;
|
||||||
valueOf: function() {triggeredFirst();}
|
obj2 < obj1 ? g1() : f1();
|
||||||
}
|
obj1 < obj2 ? f2() : g2();
|
||||||
var obj2 = {
|
obj1 < obj2 ? g3() : f3();
|
||||||
valueOf: function() {triggeredSecond();}
|
obj2 < obj1 ? f4() : g4();
|
||||||
}
|
|
||||||
var result1 = obj2 >= obj1;
|
|
||||||
var result2 = obj2 > obj1;
|
|
||||||
var result3 = obj1 >= obj2;
|
|
||||||
var result4 = obj1 > obj2;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -315,3 +295,31 @@ issue_2857_6: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "true"
|
expect_stdout: "true"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
is_boolean_unsafe: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(/foo/.test("bar") === [].isPrototypeOf({}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(/foo/.test("bar") == [].isPrototypeOf({}));
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
is_number_unsafe: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(Math.acos(42) !== "foo".charCodeAt(4));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(Math.acos(42) != "foo".charCodeAt(4));
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
concat_1: {
|
concat_1: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true
|
evaluate: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = "foo" + "bar" + x() + "moo" + "foo" + y() + "x" + "y" + "z" + q();
|
var a = "foo" + "bar" + x() + "moo" + "foo" + y() + "x" + "y" + "z" + q();
|
||||||
var b = "foo" + 1 + x() + 2 + "boo";
|
var b = "foo" + 1 + x() + 2 + "boo";
|
||||||
@@ -26,7 +26,7 @@ concat_1: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
concat_2: {
|
concat_2: {
|
||||||
options = {};
|
options = {}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
1 + (2 + 3),
|
1 + (2 + 3),
|
||||||
@@ -55,7 +55,7 @@ concat_2: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
concat_3: {
|
concat_3: {
|
||||||
options = {};
|
options = {}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
1 + 2 + (3 + 4 + 5),
|
1 + 2 + (3 + 4 + 5),
|
||||||
@@ -84,7 +84,7 @@ concat_3: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
concat_4: {
|
concat_4: {
|
||||||
options = {};
|
options = {}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
1 + "2" + (3 + 4 + 5),
|
1 + "2" + (3 + 4 + 5),
|
||||||
@@ -113,7 +113,7 @@ concat_4: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
concat_5: {
|
concat_5: {
|
||||||
options = {};
|
options = {}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
"1" + 2 + (3 + 4 + 5),
|
"1" + 2 + (3 + 4 + 5),
|
||||||
@@ -142,7 +142,7 @@ concat_5: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
concat_6: {
|
concat_6: {
|
||||||
options = {};
|
options = {}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
"1" + "2" + (3 + 4 + 5),
|
"1" + "2" + (3 + 4 + 5),
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
ifs_1: {
|
ifs_1: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true
|
conditionals: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
if (foo) bar();
|
if (foo) bar();
|
||||||
if (!foo); else bar();
|
if (!foo); else bar();
|
||||||
@@ -18,8 +18,8 @@ ifs_1: {
|
|||||||
|
|
||||||
ifs_2: {
|
ifs_2: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true
|
conditionals: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
if (foo) {
|
if (foo) {
|
||||||
x();
|
x();
|
||||||
@@ -47,12 +47,12 @@ ifs_2: {
|
|||||||
|
|
||||||
ifs_3_should_warn: {
|
ifs_3_should_warn: {
|
||||||
options = {
|
options = {
|
||||||
conditionals : true,
|
booleans: true,
|
||||||
dead_code : true,
|
conditionals: true,
|
||||||
evaluate : true,
|
dead_code: true,
|
||||||
booleans : true,
|
evaluate: true,
|
||||||
side_effects : true,
|
side_effects: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
var x, y;
|
var x, y;
|
||||||
if (x && !(x + "1") && y) { // 1
|
if (x && !(x + "1") && y) { // 1
|
||||||
@@ -78,8 +78,8 @@ ifs_3_should_warn: {
|
|||||||
|
|
||||||
ifs_4: {
|
ifs_4: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true
|
conditionals: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
if (foo && bar) {
|
if (foo && bar) {
|
||||||
x(foo)[10].bar.baz = something();
|
x(foo)[10].bar.baz = something();
|
||||||
@@ -95,10 +95,10 @@ ifs_4: {
|
|||||||
|
|
||||||
ifs_5: {
|
ifs_5: {
|
||||||
options = {
|
options = {
|
||||||
if_return: true,
|
|
||||||
conditionals: true,
|
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
};
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function f() {
|
function f() {
|
||||||
if (foo) return;
|
if (foo) return;
|
||||||
@@ -132,9 +132,9 @@ ifs_5: {
|
|||||||
|
|
||||||
ifs_6: {
|
ifs_6: {
|
||||||
options = {
|
options = {
|
||||||
|
comparisons: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
comparisons: true
|
}
|
||||||
};
|
|
||||||
input: {
|
input: {
|
||||||
var x, y;
|
var x, y;
|
||||||
if (!foo && !bar && !baz && !boo) {
|
if (!foo && !bar && !baz && !boo) {
|
||||||
@@ -163,8 +163,8 @@ ifs_6: {
|
|||||||
|
|
||||||
cond_1: {
|
cond_1: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true
|
conditionals: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo(do_something, some_condition) {
|
function foo(do_something, some_condition) {
|
||||||
if (some_condition) {
|
if (some_condition) {
|
||||||
@@ -189,8 +189,8 @@ cond_1: {
|
|||||||
|
|
||||||
cond_2: {
|
cond_2: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true
|
conditionals: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo(x, FooBar, some_condition) {
|
function foo(x, FooBar, some_condition) {
|
||||||
if (some_condition) {
|
if (some_condition) {
|
||||||
@@ -209,8 +209,8 @@ cond_2: {
|
|||||||
|
|
||||||
cond_3: {
|
cond_3: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true
|
conditionals: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
var FooBar;
|
var FooBar;
|
||||||
if (some_condition()) {
|
if (some_condition()) {
|
||||||
@@ -227,8 +227,8 @@ cond_3: {
|
|||||||
|
|
||||||
cond_4: {
|
cond_4: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true
|
conditionals: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
var do_something;
|
var do_something;
|
||||||
if (some_condition()) {
|
if (some_condition()) {
|
||||||
@@ -251,8 +251,8 @@ cond_4: {
|
|||||||
|
|
||||||
cond_5: {
|
cond_5: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true
|
conditionals: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
if (some_condition()) {
|
if (some_condition()) {
|
||||||
if (some_other_condition()) {
|
if (some_other_condition()) {
|
||||||
@@ -279,9 +279,9 @@ cond_5: {
|
|||||||
cond_7: {
|
cond_7: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
var x, y, z, a, b;
|
var x, y, z, a, b;
|
||||||
// compress these
|
// compress these
|
||||||
@@ -332,7 +332,7 @@ cond_7: {
|
|||||||
x = 'foo';
|
x = 'foo';
|
||||||
x = 'foo';
|
x = 'foo';
|
||||||
x = (condition(), 20);
|
x = (condition(), 20);
|
||||||
x = z ? 'fuji' : (condition(), 'fuji');
|
x = (z || condition(), 'fuji');
|
||||||
x = (condition(), 'foobar');
|
x = (condition(), 'foobar');
|
||||||
x = y ? a : b;
|
x = y ? a : b;
|
||||||
x = y ? 'foo' : 'fo';
|
x = y ? 'foo' : 'fo';
|
||||||
@@ -342,8 +342,8 @@ cond_7: {
|
|||||||
cond_7_1: {
|
cond_7_1: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate : true
|
evaluate: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
var x;
|
var x;
|
||||||
// access to global should be assumed to have side effects
|
// access to global should be assumed to have side effects
|
||||||
@@ -361,10 +361,10 @@ cond_7_1: {
|
|||||||
|
|
||||||
cond_8: {
|
cond_8: {
|
||||||
options = {
|
options = {
|
||||||
|
booleans: false,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
booleans : false
|
}
|
||||||
};
|
|
||||||
input: {
|
input: {
|
||||||
var a;
|
var a;
|
||||||
// compress these
|
// compress these
|
||||||
@@ -445,10 +445,10 @@ cond_8: {
|
|||||||
|
|
||||||
cond_8b: {
|
cond_8b: {
|
||||||
options = {
|
options = {
|
||||||
|
booleans: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
booleans : true
|
}
|
||||||
};
|
|
||||||
input: {
|
input: {
|
||||||
var a;
|
var a;
|
||||||
// compress these
|
// compress these
|
||||||
@@ -528,10 +528,10 @@ cond_8b: {
|
|||||||
|
|
||||||
cond_8c: {
|
cond_8c: {
|
||||||
options = {
|
options = {
|
||||||
|
booleans: false,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate : false,
|
evaluate: false,
|
||||||
booleans : false
|
}
|
||||||
};
|
|
||||||
input: {
|
input: {
|
||||||
var a;
|
var a;
|
||||||
// compress these
|
// compress these
|
||||||
@@ -647,9 +647,21 @@ cond_9: {
|
|||||||
|
|
||||||
ternary_boolean_consequent: {
|
ternary_boolean_consequent: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1() { return a == b ? true : x; }
|
function f1() { return a == b ? true : x; }
|
||||||
@@ -675,9 +687,21 @@ ternary_boolean_consequent: {
|
|||||||
|
|
||||||
ternary_boolean_alternative: {
|
ternary_boolean_alternative: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1() { return a == b ? x : true; }
|
function f1() { return a == b ? x : true; }
|
||||||
@@ -703,10 +727,11 @@ ternary_boolean_alternative: {
|
|||||||
|
|
||||||
trivial_boolean_ternary_expressions : {
|
trivial_boolean_ternary_expressions : {
|
||||||
options = {
|
options = {
|
||||||
|
booleans: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
booleans : true
|
side_effects: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
f('foo' in m ? true : false);
|
f('foo' in m ? true : false);
|
||||||
f('foo' in m ? false : true);
|
f('foo' in m ? false : true);
|
||||||
@@ -777,11 +802,11 @@ trivial_boolean_ternary_expressions : {
|
|||||||
|
|
||||||
issue_1154: {
|
issue_1154: {
|
||||||
options = {
|
options = {
|
||||||
|
booleans: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
booleans : true,
|
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1(x) { return x ? -1 : -1; }
|
function f1(x) { return x ? -1 : -1; }
|
||||||
function f2(x) { return x ? +2 : +2; }
|
function f2(x) { return x ? +2 : +2; }
|
||||||
@@ -817,7 +842,7 @@ issue_1154: {
|
|||||||
no_evaluate: {
|
no_evaluate: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate : false,
|
evaluate: false,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
|||||||
@@ -1,170 +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_funcs : true,
|
|
||||||
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_funcs : true,
|
|
||||||
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_funcs : true,
|
|
||||||
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_funcs : true,
|
|
||||||
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
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
dead_code_1: {
|
dead_code_1: {
|
||||||
options = {
|
options = {
|
||||||
dead_code: true
|
dead_code: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
function f() {
|
function f() {
|
||||||
a();
|
a();
|
||||||
@@ -25,8 +25,8 @@ dead_code_1: {
|
|||||||
|
|
||||||
dead_code_2_should_warn: {
|
dead_code_2_should_warn: {
|
||||||
options = {
|
options = {
|
||||||
dead_code: true
|
dead_code: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
function f() {
|
function f() {
|
||||||
g();
|
g();
|
||||||
@@ -54,65 +54,23 @@ dead_code_2_should_warn: {
|
|||||||
x = 10;
|
x = 10;
|
||||||
throw new Error("foo");
|
throw new Error("foo");
|
||||||
var x;
|
var x;
|
||||||
var g;
|
function g(){};
|
||||||
}
|
}
|
||||||
f();
|
f();
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
node_version: ">=6"
|
node_version: "<=4"
|
||||||
reminify: false // FIXME - block scoped function
|
|
||||||
}
|
|
||||||
|
|
||||||
dead_code_2_should_warn_strict: {
|
|
||||||
options = {
|
|
||||||
dead_code: true
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
"use strict";
|
|
||||||
function f() {
|
|
||||||
g();
|
|
||||||
x = 10;
|
|
||||||
throw new Error("foo");
|
|
||||||
// completely discarding the `if` would introduce some
|
|
||||||
// bugs. UglifyJS v1 doesn't deal with this issue; in v2
|
|
||||||
// we copy any declarations to the upper scope.
|
|
||||||
if (x) {
|
|
||||||
y();
|
|
||||||
var x;
|
|
||||||
function g(){};
|
|
||||||
// but nested declarations should not be kept.
|
|
||||||
(function(){
|
|
||||||
var q;
|
|
||||||
function y(){};
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
"use strict";
|
|
||||||
function f() {
|
|
||||||
g();
|
|
||||||
x = 10;
|
|
||||||
throw new Error("foo");
|
|
||||||
var x;
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
node_version: ">=4"
|
|
||||||
reminify: false // FIXME - block scoped function
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dead_code_constant_boolean_should_warn_more: {
|
dead_code_constant_boolean_should_warn_more: {
|
||||||
options = {
|
options = {
|
||||||
dead_code : true,
|
booleans: true,
|
||||||
loops : true,
|
conditionals: true,
|
||||||
booleans : true,
|
dead_code: true,
|
||||||
conditionals : true,
|
evaluate: true,
|
||||||
evaluate : true,
|
loops: true,
|
||||||
side_effects : true,
|
side_effects: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
while (!((foo && bar) || (x + "0"))) {
|
while (!((foo && bar) || (x + "0"))) {
|
||||||
console.log("unreachable");
|
console.log("unreachable");
|
||||||
@@ -128,7 +86,7 @@ dead_code_constant_boolean_should_warn_more: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var foo;
|
var foo;
|
||||||
var bar;
|
function bar() {}
|
||||||
// nothing for the while
|
// nothing for the while
|
||||||
// as for the for, it should keep:
|
// as for the for, it should keep:
|
||||||
var moo;
|
var moo;
|
||||||
@@ -136,200 +94,7 @@ dead_code_constant_boolean_should_warn_more: {
|
|||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
node_version: ">=6"
|
node_version: "<=4"
|
||||||
reminify: false // FIXME - block scoped function
|
|
||||||
}
|
|
||||||
|
|
||||||
dead_code_constant_boolean_should_warn_more_strict: {
|
|
||||||
options = {
|
|
||||||
dead_code : true,
|
|
||||||
loops : true,
|
|
||||||
booleans : true,
|
|
||||||
conditionals : true,
|
|
||||||
evaluate : true,
|
|
||||||
side_effects : true,
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
"use strict";
|
|
||||||
while (!((foo && bar) || (x + "0"))) {
|
|
||||||
console.log("unreachable");
|
|
||||||
var foo;
|
|
||||||
function bar() {}
|
|
||||||
}
|
|
||||||
for (var x = 10, y; x && (y || x) && (!typeof x); ++x) {
|
|
||||||
asdf();
|
|
||||||
foo();
|
|
||||||
var moo;
|
|
||||||
}
|
|
||||||
bar();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
"use strict";
|
|
||||||
var foo;
|
|
||||||
// nothing for the while
|
|
||||||
// as for the for, it should keep:
|
|
||||||
var moo;
|
|
||||||
var x = 10, y;
|
|
||||||
bar();
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
node_version: ">=4"
|
|
||||||
reminify: false // FIXME - block scoped function
|
|
||||||
}
|
|
||||||
|
|
||||||
dead_code_block_decls_die: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
conditionals: true,
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
side_effects: 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: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
conditionals: true,
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
loops: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
var unused;
|
|
||||||
const CONST_FOO = false;
|
|
||||||
if (CONST_FOO) {
|
|
||||||
console.log("unreachable");
|
|
||||||
var moo;
|
|
||||||
function bar() {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var unused;
|
|
||||||
const CONST_FOO = !1;
|
|
||||||
var moo;
|
|
||||||
var bar;
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
dead_code_const_annotation: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
conditionals: true,
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
loops: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
var unused;
|
|
||||||
/** @const */ var CONST_FOO_ANN = false;
|
|
||||||
if (CONST_FOO_ANN) {
|
|
||||||
console.log("unreachable");
|
|
||||||
var moo;
|
|
||||||
function bar() {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var unused;
|
|
||||||
var CONST_FOO_ANN = !1;
|
|
||||||
var moo;
|
|
||||||
var bar;
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
dead_code_const_annotation_regex: {
|
|
||||||
options = {
|
|
||||||
dead_code : true,
|
|
||||||
loops : true,
|
|
||||||
booleans : true,
|
|
||||||
conditionals : true,
|
|
||||||
evaluate : 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;
|
|
||||||
CONST_FOO_ANN && console.log('reachable');
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
dead_code_const_annotation_complex_scope: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
conditionals: true,
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
loops: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
var unused_var;
|
|
||||||
/** @const */ var test = 'test';
|
|
||||||
// @const
|
|
||||||
var CONST_FOO_ANN = false;
|
|
||||||
var unused_var_2;
|
|
||||||
if (CONST_FOO_ANN) {
|
|
||||||
console.log("unreachable");
|
|
||||||
var moo;
|
|
||||||
function bar() {}
|
|
||||||
}
|
|
||||||
if (test === 'test') {
|
|
||||||
var beef = 'good';
|
|
||||||
/** @const */ var meat = 'beef';
|
|
||||||
var pork = 'bad';
|
|
||||||
if (meat === 'pork') {
|
|
||||||
console.log('also unreachable');
|
|
||||||
} else if (pork === 'good') {
|
|
||||||
console.log('reached, not const');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var unused_var;
|
|
||||||
var test = 'test';
|
|
||||||
var CONST_FOO_ANN = !1;
|
|
||||||
var unused_var_2;
|
|
||||||
var moo;
|
|
||||||
var bar;
|
|
||||||
var beef = 'good';
|
|
||||||
var meat = 'beef';
|
|
||||||
var pork = 'bad';
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
try_catch_finally: {
|
try_catch_finally: {
|
||||||
@@ -577,70 +342,6 @@ global_fns: {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_2383_1: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
if (0) {
|
|
||||||
var {x, y} = foo();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var x, y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2383_2: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
if (0) {
|
|
||||||
var {
|
|
||||||
x = 0,
|
|
||||||
y: [ w, , { z, p: q = 7 } ] = [ 1, 2, { z: 3 } ]
|
|
||||||
} = {};
|
|
||||||
}
|
|
||||||
console.log(x, q, w, z);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var x, w, z, q;
|
|
||||||
console.log(x, q, w, z);
|
|
||||||
}
|
|
||||||
expect_stdout: "undefined undefined undefined undefined"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2383_3: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var b = 7, y = 8;
|
|
||||||
if (0) {
|
|
||||||
var a = 1, [ x, y, z ] = [ 2, 3, 4 ], b = 5;
|
|
||||||
}
|
|
||||||
console.log(a, x, y, z, b);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var b = 7, y = 8;
|
|
||||||
var a, x, y, z, b;
|
|
||||||
console.log(a, x, y, z, b);
|
|
||||||
}
|
|
||||||
expect_stdout: "undefined undefined 8 undefined 7"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
collapse_vars_assignment: {
|
collapse_vars_assignment: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
@@ -1216,3 +917,28 @@ issue_2860_2: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "1"
|
expect_stdout: "1"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_2929: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
try {
|
||||||
|
return null.p = a = 1;
|
||||||
|
} catch (e) {
|
||||||
|
return a ? "PASS" : "FAIL";
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a) {
|
||||||
|
try {
|
||||||
|
return null.p = a = 1;
|
||||||
|
} catch (e) {
|
||||||
|
return a ? "PASS" : "FAIL";
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
keep_debugger: {
|
keep_debugger: {
|
||||||
options = {
|
options = {
|
||||||
drop_debugger: false
|
drop_debugger: false,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
debugger;
|
debugger;
|
||||||
}
|
}
|
||||||
@@ -12,8 +12,8 @@ keep_debugger: {
|
|||||||
|
|
||||||
drop_debugger: {
|
drop_debugger: {
|
||||||
options = {
|
options = {
|
||||||
drop_debugger: true
|
drop_debugger: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
debugger;
|
debugger;
|
||||||
if (foo) debugger;
|
if (foo) debugger;
|
||||||
|
|||||||
@@ -1,695 +0,0 @@
|
|||||||
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: {
|
|
||||||
beautify = {
|
|
||||||
ecma: 6
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var {cc,} = foo;
|
|
||||||
}
|
|
||||||
expect_exact: "var{cc}=foo;"
|
|
||||||
}
|
|
||||||
|
|
||||||
nested_destructuring_objects: {
|
|
||||||
beautify = {
|
|
||||||
ecma: 6
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
const [{a},b] = c;
|
|
||||||
let [{d},e] = f;
|
|
||||||
var [{g},h] = i;
|
|
||||||
}
|
|
||||||
expect_exact: 'const[{a},b]=c;let[{d},e]=f;var[{g},h]=i;';
|
|
||||||
}
|
|
||||||
|
|
||||||
destructuring_constdef_in_loops: {
|
|
||||||
beautify = {
|
|
||||||
ecma: 6
|
|
||||||
}
|
|
||||||
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: {
|
|
||||||
beautify = {
|
|
||||||
ecma: 6
|
|
||||||
}
|
|
||||||
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: {
|
|
||||||
beautify = {
|
|
||||||
ecma: 6
|
|
||||||
}
|
|
||||||
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});"
|
|
||||||
}
|
|
||||||
|
|
||||||
destructuring_remove_unused_1: {
|
|
||||||
options = {
|
|
||||||
unused: true
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function a() {
|
|
||||||
var unused = "foo";
|
|
||||||
var a = [1];
|
|
||||||
var [b] = a;
|
|
||||||
f(b);
|
|
||||||
}
|
|
||||||
function b() {
|
|
||||||
var unused = "foo";
|
|
||||||
var a = {b: 1};
|
|
||||||
var {b} = a;
|
|
||||||
f(b);
|
|
||||||
}
|
|
||||||
function c() {
|
|
||||||
var unused = "foo";
|
|
||||||
var a = [[1]];
|
|
||||||
var [[b]] = a;
|
|
||||||
f(b);
|
|
||||||
}
|
|
||||||
function d() {
|
|
||||||
var unused = "foo";
|
|
||||||
var a = {b: {b:1}};
|
|
||||||
var {b:{b}} = a;
|
|
||||||
f(b);
|
|
||||||
}
|
|
||||||
function e() {
|
|
||||||
var unused = "foo";
|
|
||||||
var a = [1, 2, 3, 4, 5];
|
|
||||||
var x = [[1, 2, 3]];
|
|
||||||
var y = {h: 1};
|
|
||||||
var [b, ...c] = a;
|
|
||||||
var [...[e, f]] = x;
|
|
||||||
var [...{g: h}] = y;
|
|
||||||
f(b, c, e, f, g);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function a() {
|
|
||||||
var a = [1];
|
|
||||||
var [b] = a;
|
|
||||||
f(b);
|
|
||||||
}
|
|
||||||
function b() {
|
|
||||||
var a = {b: 1};
|
|
||||||
var {b} = a;
|
|
||||||
f(b);
|
|
||||||
}
|
|
||||||
function c() {
|
|
||||||
var a = [[1]];
|
|
||||||
var [[b]] = a;
|
|
||||||
f(b);
|
|
||||||
}
|
|
||||||
function d() {
|
|
||||||
var a = {b: {b:1}};
|
|
||||||
var {b:{b}} = a;
|
|
||||||
f(b);
|
|
||||||
}
|
|
||||||
function e() {
|
|
||||||
var a = [1, 2, 3, 4, 5];
|
|
||||||
var x = [[1, 2, 3]];
|
|
||||||
var y = {h: 1};
|
|
||||||
var [b, ...c] = a;
|
|
||||||
var [...[e, f]] = x;
|
|
||||||
var [...{g: h}] = y;
|
|
||||||
f(b, c, e, f, g);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
destructuring_remove_unused_2: {
|
|
||||||
options = {
|
|
||||||
unused: true
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function a() {
|
|
||||||
var unused = "foo";
|
|
||||||
var a = [,,1];
|
|
||||||
var [b] = a;
|
|
||||||
f(b);
|
|
||||||
}
|
|
||||||
function b() {
|
|
||||||
var unused = "foo";
|
|
||||||
var a = [{a: [1]}];
|
|
||||||
var [{b: a}] = a;
|
|
||||||
f(b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function a() {
|
|
||||||
var a = [,,1];
|
|
||||||
var [b] = a;
|
|
||||||
f(b);
|
|
||||||
}
|
|
||||||
function b() {
|
|
||||||
var a = [{a: [1]}];
|
|
||||||
var [{b: a}] = a;
|
|
||||||
f(b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
object_destructuring_may_need_parentheses: {
|
|
||||||
beautify = {
|
|
||||||
ecma: 6
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
({a, b} = {a: 1, b: 2});
|
|
||||||
}
|
|
||||||
expect_exact: "({a,b}={a:1,b:2});"
|
|
||||||
}
|
|
||||||
|
|
||||||
destructuring_with_undefined_as_default_assignment: {
|
|
||||||
options = {
|
|
||||||
evaluate: true
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
[foo = undefined] = bar;
|
|
||||||
[foo = void 0] = bar;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
[foo] = bar;
|
|
||||||
[foo] = bar;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
destructuring_dont_evaluate_with_undefined_as_default_assignment: {
|
|
||||||
options = {
|
|
||||||
evaluate: false
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
[foo = undefined] = bar;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
[foo = void 0] = bar;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
reduce_vars: {
|
|
||||||
options = {
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
{const [aa, [bb, cc]] = dd;}
|
|
||||||
{let [aa, [bb, cc]] = dd;}
|
|
||||||
var [aa, [bb, cc]] = dd;
|
|
||||||
[aa, [bb, cc]] = dd;
|
|
||||||
{const {aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}};}
|
|
||||||
{let {aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}};}
|
|
||||||
var {aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}};
|
|
||||||
({aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}});
|
|
||||||
const [{a},b] = c;
|
|
||||||
let [{d},e] = f;
|
|
||||||
var [{g},h] = i;
|
|
||||||
[{a},b] = c;
|
|
||||||
for (const [x,y] in pairs);
|
|
||||||
for (let [x,y] in pairs);
|
|
||||||
for (var [x,y] in pairs);
|
|
||||||
for ([x,y] in pairs);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
{const [aa, [bb, cc]] = dd;}
|
|
||||||
{let [aa, [bb, cc]] = dd;}
|
|
||||||
var [aa, [bb, cc]] = dd;
|
|
||||||
[aa, [bb, cc]] = dd;
|
|
||||||
{const {aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}};}
|
|
||||||
{let {aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}};}
|
|
||||||
var {aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}};
|
|
||||||
({aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}});
|
|
||||||
const [{a},b] = c;
|
|
||||||
let [{d},e] = f;
|
|
||||||
var [{g},h] = i;
|
|
||||||
[{a},b] = c;
|
|
||||||
for (const [x,y] in pairs);
|
|
||||||
for (let [x,y] in pairs);
|
|
||||||
for (var [x,y] in pairs);
|
|
||||||
for ([x,y] in pairs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unused: {
|
|
||||||
options = {
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
let { foo: [, , ...a] } = { foo: [1, 2, 3, 4], bar: 5 };
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
let { foo: [, , ...a] } = { foo: [1, 2, 3, 4], bar: 5 };
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1886: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
let [a] = [1];
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
let [a] = [1];
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
destructuring_decl_of_numeric_key: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
let { 3: x } = { [1 + 2]: 42 };
|
|
||||||
console.log(x);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
let { 3: x } = { [3]: 42 };
|
|
||||||
console.log(x);
|
|
||||||
}
|
|
||||||
expect_stdout: "42"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
destructuring_decl_of_computed_key: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
let four = 4;
|
|
||||||
let { [7 - four]: x } = { [1 + 2]: 42 };
|
|
||||||
console.log(x);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
let four = 4;
|
|
||||||
let { [7 - four]: x } = { [3]: 42 };
|
|
||||||
console.log(x);
|
|
||||||
}
|
|
||||||
expect_stdout: "42"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
destructuring_assign_of_numeric_key: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
let x;
|
|
||||||
({ 3: x } = { [1 + 2]: 42 });
|
|
||||||
console.log(x);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
let x;
|
|
||||||
({ 3: x } = { [3]: 42 });
|
|
||||||
console.log(x);
|
|
||||||
}
|
|
||||||
expect_stdout: "42"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
destructuring_assign_of_computed_key: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
let x;
|
|
||||||
let four = 4;
|
|
||||||
({ [(5 + 2) - four]: x } = { [1 + 2]: 42 });
|
|
||||||
console.log(x);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
let x;
|
|
||||||
let four = 4;
|
|
||||||
({ [7 - four]: x } = { [3]: 42 });
|
|
||||||
console.log(x);
|
|
||||||
}
|
|
||||||
expect_stdout: "42"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_destructuring_decl: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function test(opts) {
|
|
||||||
let a = opts.a || { e: 7, n: 8 };
|
|
||||||
let { t, e, n, s = 5 + 4, o, r } = a;
|
|
||||||
console.log(t, e, n, s, o, r);
|
|
||||||
}
|
|
||||||
test({a: { t: 1, e: 2, n: 3, s: 4, o: 5, r: 6 }});
|
|
||||||
test({});
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function test(t) {
|
|
||||||
let e = t.a || { e: 7, n: 8 };
|
|
||||||
let {t: n, e: o, n: s, s: l = 9, o: a, r: c} = e;
|
|
||||||
console.log(n, o, s, l, a, c);
|
|
||||||
}
|
|
||||||
test({ a: { t: 1, e: 2, n: 3, s: 4, o: 5, r: 6 } });
|
|
||||||
test({});
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"1 2 3 4 5 6",
|
|
||||||
"undefined 7 8 9 undefined undefined",
|
|
||||||
]
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_destructuring_decl_collapse_vars: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
evaluate: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function test(opts) {
|
|
||||||
let a = opts.a || { e: 7, n: 8 };
|
|
||||||
let { t, e, n, s = 5 + 4, o, r } = a;
|
|
||||||
console.log(t, e, n, s, o, r);
|
|
||||||
}
|
|
||||||
test({a: { t: 1, e: 2, n: 3, s: 4, o: 5, r: 6 }});
|
|
||||||
test({});
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function test(t) {
|
|
||||||
let e = t.a || { e: 7, n: 8 };
|
|
||||||
let {t: n, e: o, n: s, s: l = 9, o: a, r: c} = e;
|
|
||||||
console.log(n, o, s, l, a, c);
|
|
||||||
}
|
|
||||||
test({ a: { t: 1, e: 2, n: 3, s: 4, o: 5, r: 6 } });
|
|
||||||
test({});
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"1 2 3 4 5 6",
|
|
||||||
"undefined 7 8 9 undefined undefined",
|
|
||||||
]
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_destructuring_assign_toplevel_true: {
|
|
||||||
options = {
|
|
||||||
toplevel: true,
|
|
||||||
evaluate: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
ecma: 6
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function test(opts) {
|
|
||||||
let s, o, r;
|
|
||||||
let a = opts.a || { e: 7, n: 8 };
|
|
||||||
({ t, e, n, s = 5 + 4, o, r } = a);
|
|
||||||
console.log(t, e, n, s, o, r);
|
|
||||||
}
|
|
||||||
let t, e, n;
|
|
||||||
test({a: { t: 1, e: 2, n: 3, s: 4, o: 5, r: 6 }});
|
|
||||||
test({});
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function e(e) {
|
|
||||||
let l, s, a;
|
|
||||||
let c = e.a || { e: 7, n: 8 };
|
|
||||||
({t: n, e: o, n: t, s: l = 9, o: s, r: a} = c);
|
|
||||||
console.log(n, o, t, l, s, a);
|
|
||||||
}
|
|
||||||
let n, o, t;
|
|
||||||
e({ a: { t: 1, e: 2, n: 3, s: 4, o: 5, r: 6 } });
|
|
||||||
e({});
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"1 2 3 4 5 6",
|
|
||||||
"undefined 7 8 9 undefined undefined",
|
|
||||||
]
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_destructuring_assign_toplevel_false: {
|
|
||||||
options = {
|
|
||||||
toplevel: false,
|
|
||||||
evaluate: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
ecma: 6
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function test(opts) {
|
|
||||||
let s, o, r;
|
|
||||||
let a = opts.a || { e: 7, n: 8 };
|
|
||||||
({ t, e, n, s = 9, o, r } = a);
|
|
||||||
console.log(t, e, n, s, o, r);
|
|
||||||
}
|
|
||||||
let t, e, n;
|
|
||||||
test({a: { t: 1, e: 2, n: 3, s: 4, o: 5, r: 6 }});
|
|
||||||
test({});
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function test(o) {
|
|
||||||
let s, l, a;
|
|
||||||
let c = o.a || { e: 7, n: 8 };
|
|
||||||
({t, e, n, s = 9, o: l, r: a} = c);
|
|
||||||
console.log(t, e, n, s, l, a);
|
|
||||||
}
|
|
||||||
let t, e, n;
|
|
||||||
test({ a: { t: 1, e: 2, n: 3, s: 4, o: 5, r: 6 } });
|
|
||||||
test({});
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"1 2 3 4 5 6",
|
|
||||||
"undefined 7 8 9 undefined undefined",
|
|
||||||
]
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_destructuring_decl_array: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
unused: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
ecma: 6
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var [, t, e, n, s, o = 2, r = [ 1 + 2 ]] = [ 9, 8, 7, 6 ];
|
|
||||||
console.log(t, e, n, s, o, r);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var [, o, l, a, c, e = 2, g = [ 3 ]] = [ 9, 8, 7, 6 ];
|
|
||||||
console.log(o, l, a, c, e, g);
|
|
||||||
}
|
|
||||||
expect_stdout: "8 7 6 undefined 2 [ 3 ]"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
anon_func_with_destructuring_args: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
unused: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
ecma: 5,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function({foo = 1 + 0, bar = 2}, [car = 3, far = 4]) {
|
|
||||||
console.log(foo, bar, car, far);
|
|
||||||
})({bar: 5 - 0}, [, 6]);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function({foo: o = 1, bar: n = 2}, [a = 3, b = 4]) {
|
|
||||||
console.log(o, n, a, b);
|
|
||||||
})({bar: 5}, [, 6]);
|
|
||||||
}
|
|
||||||
expect_stdout: "1 5 3 6"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
arrow_func_with_destructuring_args: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
unused: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
ecma: 5,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(({foo = 1 + 0, bar = 2}, [car = 3, far = 4]) => {
|
|
||||||
console.log(foo, bar, car, far);
|
|
||||||
})({bar: 5 - 0}, [, 6]);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(({foo: o = 1, bar: a = 2}, [b = 3, l = 4]) => {
|
|
||||||
console.log(o, a, b, l);
|
|
||||||
})({bar: 5}, [, 6]);
|
|
||||||
}
|
|
||||||
expect_stdout: "1 5 3 6"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2044_ecma_5: {
|
|
||||||
beautify = {
|
|
||||||
beautify: false,
|
|
||||||
ecma: 5,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
({x : a = 1, y = 2 + b, z = 3 - c} = obj);
|
|
||||||
}
|
|
||||||
expect_exact: "({x:a=1,y:y=2+b,z:z=3-c}=obj);"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2044_ecma_6: {
|
|
||||||
beautify = {
|
|
||||||
beautify: false,
|
|
||||||
ecma: 6,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
({x : a = 1, y = 2 + b, z = 3 - c} = obj);
|
|
||||||
}
|
|
||||||
expect_exact: "({x:a=1,y=2+b,z=3-c}=obj);"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2044_ecma_5_beautify: {
|
|
||||||
beautify = {
|
|
||||||
beautify: true,
|
|
||||||
ecma: 5,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
({x : a = 1, y = 2 + b, z = 3 - c} = obj);
|
|
||||||
}
|
|
||||||
expect_exact: "({x: a = 1, y: y = 2 + b, z: z = 3 - c} = obj);"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2044_ecma_6_beautify: {
|
|
||||||
beautify = {
|
|
||||||
beautify: true,
|
|
||||||
ecma: 6,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
({x : a = 1, y = 2 + b, z = 3 - c} = obj);
|
|
||||||
}
|
|
||||||
expect_exact: "({x: a = 1, y = 2 + b, z = 3 - c} = obj);"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2140: {
|
|
||||||
options = {
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
!function() {
|
|
||||||
var t = {};
|
|
||||||
console.log(([t.a] = [42])[0]);
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
!function() {
|
|
||||||
var t = {};
|
|
||||||
console.log(([t.a] = [42])[0]);
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
expect_stdout: "42"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
class_directives_compression: {
|
|
||||||
input: {
|
|
||||||
class foo {
|
|
||||||
foo() {
|
|
||||||
"use strict";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_exact: "class foo{foo(){}}"
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
drop_console_1: {
|
drop_console_1: {
|
||||||
options = {};
|
options = {}
|
||||||
input: {
|
input: {
|
||||||
console.log('foo');
|
console.log('foo');
|
||||||
console.log.apply(console, arguments);
|
console.log.apply(console, arguments);
|
||||||
@@ -11,7 +11,9 @@ drop_console_1: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_console_2: {
|
drop_console_2: {
|
||||||
options = { drop_console: true };
|
options = {
|
||||||
|
drop_console: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log('foo');
|
console.log('foo');
|
||||||
console.log.apply(console, arguments);
|
console.log.apply(console, arguments);
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
unused_funarg_1: {
|
unused_funarg_1: {
|
||||||
options = { unused: true, keep_fargs: false };
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(a, b, c, d, e) {
|
function f(a, b, c, d, e) {
|
||||||
return a + b;
|
return a + b;
|
||||||
@@ -13,7 +16,10 @@ unused_funarg_1: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unused_funarg_2: {
|
unused_funarg_2: {
|
||||||
options = { unused: true, keep_fargs: false };
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(a, b, c, d, e) {
|
function f(a, b, c, d, e) {
|
||||||
return a + c;
|
return a + c;
|
||||||
@@ -27,7 +33,9 @@ unused_funarg_2: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unused_nested_function: {
|
unused_nested_function: {
|
||||||
options = { unused: true };
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(x, y) {
|
function f(x, y) {
|
||||||
function g() {
|
function g() {
|
||||||
@@ -44,7 +52,9 @@ unused_nested_function: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unused_circular_references_1: {
|
unused_circular_references_1: {
|
||||||
options = { unused: true };
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(x, y) {
|
function f(x, y) {
|
||||||
// circular reference
|
// circular reference
|
||||||
@@ -65,7 +75,9 @@ unused_circular_references_1: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unused_circular_references_2: {
|
unused_circular_references_2: {
|
||||||
options = { unused: true };
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(x, y) {
|
function f(x, y) {
|
||||||
var foo = 1, bar = baz, baz = foo + bar, qwe = moo();
|
var foo = 1, bar = baz, baz = foo + bar, qwe = moo();
|
||||||
@@ -81,7 +93,9 @@ unused_circular_references_2: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unused_circular_references_3: {
|
unused_circular_references_3: {
|
||||||
options = { unused: true };
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(x, y) {
|
function f(x, y) {
|
||||||
var g = function() { return h() };
|
var g = function() { return h() };
|
||||||
@@ -97,7 +111,9 @@ unused_circular_references_3: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unused_keep_setter_arg: {
|
unused_keep_setter_arg: {
|
||||||
options = { unused: true };
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = {
|
var x = {
|
||||||
_foo: null,
|
_foo: null,
|
||||||
@@ -121,7 +137,9 @@ unused_keep_setter_arg: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unused_var_in_catch: {
|
unused_var_in_catch: {
|
||||||
options = { unused: true };
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo() {
|
function foo() {
|
||||||
try {
|
try {
|
||||||
@@ -141,7 +159,9 @@ unused_var_in_catch: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
used_var_in_catch: {
|
used_var_in_catch: {
|
||||||
options = { unused: true };
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo() {
|
function foo() {
|
||||||
try {
|
try {
|
||||||
@@ -164,89 +184,12 @@ used_var_in_catch: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unused_block_decls_in_catch: {
|
|
||||||
options = { unused: true };
|
|
||||||
input: {
|
|
||||||
function foo() {
|
|
||||||
try {
|
|
||||||
foo();
|
|
||||||
} catch(ex) {
|
|
||||||
let x = 10;
|
|
||||||
const y = 10;
|
|
||||||
class Zee {};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function foo() {
|
|
||||||
try {
|
|
||||||
foo();
|
|
||||||
} catch(ex) {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
used_block_decls_in_catch: {
|
|
||||||
options = { unused: true };
|
|
||||||
input: {
|
|
||||||
function foo() {
|
|
||||||
try {
|
|
||||||
foo();
|
|
||||||
} catch(ex) {
|
|
||||||
let x = 10;
|
|
||||||
const y = 10;
|
|
||||||
class Zee {};
|
|
||||||
}
|
|
||||||
console.log(x, y, Zee);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function foo() {
|
|
||||||
try {
|
|
||||||
foo();
|
|
||||||
} catch(ex) {}
|
|
||||||
console.log(x, y, Zee);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unused_block_decls: {
|
|
||||||
options = { unused: true };
|
|
||||||
input: {
|
|
||||||
function foo() {
|
|
||||||
{
|
|
||||||
const x = 1;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
let y;
|
|
||||||
}
|
|
||||||
console.log(x, y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function foo() {
|
|
||||||
console.log(x, y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unused_keep_harmony_destructuring: {
|
|
||||||
options = { unused: true };
|
|
||||||
input: {
|
|
||||||
function foo() {
|
|
||||||
var {x, y} = foo;
|
|
||||||
var a = foo;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function foo() {
|
|
||||||
var {x, y} = foo;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
keep_fnames: {
|
keep_fnames: {
|
||||||
options = { unused: true, keep_fnames: true, unsafe: true };
|
options = {
|
||||||
|
keep_fnames: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo() {
|
function foo() {
|
||||||
return function bar(baz) {};
|
return function bar(baz) {};
|
||||||
@@ -448,7 +391,7 @@ drop_toplevel_vars_fargs: {
|
|||||||
drop_toplevel_all: {
|
drop_toplevel_all: {
|
||||||
options = {
|
options = {
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a, b = 1, c = g;
|
var a, b = 1, c = g;
|
||||||
@@ -499,7 +442,11 @@ drop_toplevel_retain: {
|
|||||||
|
|
||||||
drop_toplevel_retain_array: {
|
drop_toplevel_retain_array: {
|
||||||
options = {
|
options = {
|
||||||
top_retain: [ "f", "a", "o" ],
|
top_retain: [
|
||||||
|
"f",
|
||||||
|
"a",
|
||||||
|
"o"
|
||||||
|
],
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -557,8 +504,8 @@ drop_toplevel_retain_regex: {
|
|||||||
|
|
||||||
drop_toplevel_all_retain: {
|
drop_toplevel_all_retain: {
|
||||||
options = {
|
options = {
|
||||||
toplevel: true,
|
|
||||||
top_retain: "f,a,o",
|
top_retain: "f,a,o",
|
||||||
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -587,8 +534,8 @@ drop_toplevel_all_retain: {
|
|||||||
|
|
||||||
drop_toplevel_funcs_retain: {
|
drop_toplevel_funcs_retain: {
|
||||||
options = {
|
options = {
|
||||||
toplevel: "funcs",
|
|
||||||
top_retain: "f,a,o",
|
top_retain: "f,a,o",
|
||||||
|
toplevel: "funcs",
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -618,8 +565,8 @@ drop_toplevel_funcs_retain: {
|
|||||||
|
|
||||||
drop_toplevel_vars_retain: {
|
drop_toplevel_vars_retain: {
|
||||||
options = {
|
options = {
|
||||||
toplevel: "vars",
|
|
||||||
top_retain: "f,a,o",
|
top_retain: "f,a,o",
|
||||||
|
toplevel: "vars",
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -764,38 +711,6 @@ drop_value: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const_assign: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
const b = 2;
|
|
||||||
return 1 + b;
|
|
||||||
}
|
|
||||||
|
|
||||||
function g() {
|
|
||||||
const b = 2;
|
|
||||||
b = 3;
|
|
||||||
return 1 + b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {
|
|
||||||
return 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
function g() {
|
|
||||||
const b = 2;
|
|
||||||
b = 3;
|
|
||||||
return 1 + b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1539: {
|
issue_1539: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
@@ -934,10 +849,6 @@ issue_1709: {
|
|||||||
var x = 1;
|
var x = 1;
|
||||||
return x;
|
return x;
|
||||||
}(),
|
}(),
|
||||||
function y() {
|
|
||||||
const y = 2;
|
|
||||||
return y;
|
|
||||||
}(),
|
|
||||||
function z() {
|
function z() {
|
||||||
function z() {}
|
function z() {}
|
||||||
return z;
|
return z;
|
||||||
@@ -950,10 +861,6 @@ issue_1709: {
|
|||||||
var x = 1;
|
var x = 1;
|
||||||
return x;
|
return x;
|
||||||
}(),
|
}(),
|
||||||
function() {
|
|
||||||
const y = 2;
|
|
||||||
return y;
|
|
||||||
}(),
|
|
||||||
function() {
|
function() {
|
||||||
function z() {}
|
function z() {}
|
||||||
return z;
|
return z;
|
||||||
@@ -1237,7 +1144,6 @@ var_catch_toplevel: {
|
|||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
passes: 2,
|
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -1268,71 +1174,6 @@ var_catch_toplevel: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
reassign_const: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
const a = 1;
|
|
||||||
a = 2;
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
console.log(f());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {
|
|
||||||
const a = 1;
|
|
||||||
return a = 2, a;
|
|
||||||
}
|
|
||||||
console.log(f());
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1968: {
|
|
||||||
options = {
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(c) {
|
|
||||||
var a;
|
|
||||||
if (c) {
|
|
||||||
let b;
|
|
||||||
return (a = 2) + (b = 3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
console.log(f(1));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(c) {
|
|
||||||
if (c) {
|
|
||||||
let b;
|
|
||||||
return 2 + (b = 3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
console.log(f(1));
|
|
||||||
}
|
|
||||||
expect_stdout: "5"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2063: {
|
|
||||||
options = {
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a;
|
|
||||||
var a;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2105_1: {
|
issue_2105_1: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
@@ -1413,95 +1254,6 @@ issue_2105_2: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_2136_1: {
|
|
||||||
options = {
|
|
||||||
inline: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
!function(a, ...b) {
|
|
||||||
console.log(b);
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
!function(a, ...b) {
|
|
||||||
console.log(b);
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
expect_stdout: "[]"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2136_2: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
inline: true,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(x) {
|
|
||||||
console.log(x);
|
|
||||||
}
|
|
||||||
!function(a, ...b) {
|
|
||||||
f(b[0]);
|
|
||||||
}(1, 2, 3);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(x) {
|
|
||||||
console.log(x);
|
|
||||||
}
|
|
||||||
f([2,3][0]);
|
|
||||||
}
|
|
||||||
expect_stdout: "2"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2136_3: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
evaluate: true,
|
|
||||||
inline: true,
|
|
||||||
passes: 3,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
unsafe: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(x) {
|
|
||||||
console.log(x);
|
|
||||||
}
|
|
||||||
!function(a, ...b) {
|
|
||||||
f(b[0]);
|
|
||||||
}(1, 2, 3);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(2);
|
|
||||||
}
|
|
||||||
expect_stdout: "2"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2163: {
|
|
||||||
options = {
|
|
||||||
pure_funcs: [ "pure" ],
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var c;
|
|
||||||
/*@__PURE__*/f(...a);
|
|
||||||
pure(b, ...c);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var c;
|
|
||||||
a;
|
|
||||||
b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2226_1: {
|
issue_2226_1: {
|
||||||
options = {
|
options = {
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -1653,9 +1405,9 @@ issue_2516_1: {
|
|||||||
issue_2516_2: {
|
issue_2516_2: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
|
passes: 2,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
passes: 2,
|
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1690,104 +1442,6 @@ issue_2516_2: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_2418_1: {
|
|
||||||
options = {
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
class C {}
|
|
||||||
function F() {}
|
|
||||||
(class c {});
|
|
||||||
(function f() {});
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
class C {}
|
|
||||||
function F() {}
|
|
||||||
(class {});
|
|
||||||
(function() {});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2418_2: {
|
|
||||||
options = {
|
|
||||||
keep_classnames: false,
|
|
||||||
keep_fnames: false,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
class C {}
|
|
||||||
function F() {}
|
|
||||||
(class c {});
|
|
||||||
(function f() {});
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
class C {}
|
|
||||||
function F() {}
|
|
||||||
(class {});
|
|
||||||
(function() {});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2418_3: {
|
|
||||||
options = {
|
|
||||||
keep_classnames: false,
|
|
||||||
keep_fnames: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
class C {}
|
|
||||||
function F() {}
|
|
||||||
(class c {});
|
|
||||||
(function f() {});
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
class C {}
|
|
||||||
function F() {}
|
|
||||||
(class {});
|
|
||||||
(function f() {});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2418_4: {
|
|
||||||
options = {
|
|
||||||
keep_classnames: true,
|
|
||||||
keep_fnames: false,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
class C {}
|
|
||||||
function F() {}
|
|
||||||
(class c {});
|
|
||||||
(function f() {});
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
class C {}
|
|
||||||
function F() {}
|
|
||||||
(class c {});
|
|
||||||
(function() {});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2418_5: {
|
|
||||||
options = {
|
|
||||||
keep_classnames: true,
|
|
||||||
keep_fnames: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
class C {}
|
|
||||||
function F() {}
|
|
||||||
(class c {});
|
|
||||||
(function f() {});
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
class C {}
|
|
||||||
function F() {}
|
|
||||||
(class c {});
|
|
||||||
(function f() {});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
defun_lambda_same_name: {
|
defun_lambda_same_name: {
|
||||||
options = {
|
options = {
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
@@ -2093,3 +1747,261 @@ issue_2846: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "0"
|
expect_stdout: "0"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_805_1: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
var unused = function() {};
|
||||||
|
unused.prototype[a()] = 42;
|
||||||
|
(unused.prototype.bar = function() {
|
||||||
|
console.log("bar");
|
||||||
|
})();
|
||||||
|
return unused;
|
||||||
|
})(function() {
|
||||||
|
console.log("foo");
|
||||||
|
return "foo";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("foo"),
|
||||||
|
console.log("bar");
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_805_2: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
function unused() {}
|
||||||
|
unused.prototype[a()] = 42;
|
||||||
|
(unused.prototype.bar = function() {
|
||||||
|
console.log("bar");
|
||||||
|
})();
|
||||||
|
return unused;
|
||||||
|
})(function() {
|
||||||
|
console.log("foo");
|
||||||
|
return "foo";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("foo"),
|
||||||
|
console.log("bar");
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2995: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
var b;
|
||||||
|
a.b = b = function() {};
|
||||||
|
b.c = "PASS";
|
||||||
|
}
|
||||||
|
var o = {};
|
||||||
|
f(o);
|
||||||
|
console.log(o.b.c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
var b;
|
||||||
|
a.b = b = function() {};
|
||||||
|
b.c = "PASS";
|
||||||
|
}
|
||||||
|
var o = {};
|
||||||
|
f(o);
|
||||||
|
console.log(o.b.c);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3146_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(f) {
|
||||||
|
f("g()");
|
||||||
|
})(function(a) {
|
||||||
|
eval(a);
|
||||||
|
function g(b) {
|
||||||
|
if (!b) b = "PASS";
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(f) {
|
||||||
|
f("g()");
|
||||||
|
})(function(a) {
|
||||||
|
eval(a);
|
||||||
|
function g(b) {
|
||||||
|
if (!b) b = "PASS";
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3146_2: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(f) {
|
||||||
|
f("g()");
|
||||||
|
})(function(a) {
|
||||||
|
eval(a);
|
||||||
|
function g(b) {
|
||||||
|
if (!b) b = "PASS";
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(f) {
|
||||||
|
f("g()");
|
||||||
|
})(function(a) {
|
||||||
|
eval(a);
|
||||||
|
function g(b) {
|
||||||
|
if (!b) b = "PASS";
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3146_3: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var g = "PASS";
|
||||||
|
(function(f) {
|
||||||
|
var g = "FAIL";
|
||||||
|
f("console.log(g)", g[g]);
|
||||||
|
})(function(a) {
|
||||||
|
eval(a);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var g = "PASS";
|
||||||
|
(function(f) {
|
||||||
|
var g = "FAIL";
|
||||||
|
f("console.log(g)", g[g]);
|
||||||
|
})(function(a) {
|
||||||
|
eval(a);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3146_4: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var g = "PASS";
|
||||||
|
(function(f) {
|
||||||
|
var g = "FAIL";
|
||||||
|
f("console.log(g)", g[g]);
|
||||||
|
})(function(a) {
|
||||||
|
eval(a);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var g = "PASS";
|
||||||
|
(function(f) {
|
||||||
|
var g = "FAIL";
|
||||||
|
f("console.log(g)", g[g]);
|
||||||
|
})(function(a) {
|
||||||
|
eval(a);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3192: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
console.log(a = "foo", arguments[0]);
|
||||||
|
})("bar");
|
||||||
|
(function(a) {
|
||||||
|
"use strict";
|
||||||
|
console.log(a = "foo", arguments[0]);
|
||||||
|
})("bar");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a) {
|
||||||
|
console.log(a = "foo", arguments[0]);
|
||||||
|
})("bar");
|
||||||
|
(function(a) {
|
||||||
|
"use strict";
|
||||||
|
console.log("foo", arguments[0]);
|
||||||
|
})("bar");
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo foo",
|
||||||
|
"foo bar",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3233: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = function b() {
|
||||||
|
b.c = "PASS";
|
||||||
|
};
|
||||||
|
a();
|
||||||
|
console.log(a.c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = function b() {
|
||||||
|
b.c = "PASS";
|
||||||
|
};
|
||||||
|
a();
|
||||||
|
console.log(a.c);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
@@ -186,7 +186,9 @@ unary_prefix: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
negative_zero: {
|
negative_zero: {
|
||||||
options = { evaluate: true }
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
-"",
|
-"",
|
||||||
@@ -207,7 +209,9 @@ negative_zero: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
positive_zero: {
|
positive_zero: {
|
||||||
options = { evaluate: true }
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
+"",
|
+"",
|
||||||
@@ -227,104 +231,10 @@ positive_zero: {
|
|||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
pow: {
|
|
||||||
options = { evaluate: true }
|
|
||||||
input: {
|
|
||||||
var a = 5 ** 3;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 125;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pow_sequence: {
|
|
||||||
options = {
|
|
||||||
evaluate: true
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 2 ** 3 ** 2;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 512;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pow_mixed: {
|
|
||||||
options = {
|
|
||||||
evaluate: true
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 5 + 2 ** 3 + 5;
|
|
||||||
var b = 5 * 3 ** 2;
|
|
||||||
var c = 5 ** 3 * 2;
|
|
||||||
var d = 5 ** +3;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 18;
|
|
||||||
var b = 45;
|
|
||||||
var c = 250;
|
|
||||||
var d = 125;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pow_with_right_side_evaluating_to_unary: {
|
|
||||||
options = {
|
|
||||||
evaluate: true
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = (4 - 7) ** foo;
|
|
||||||
var b = ++bar ** 3;
|
|
||||||
var c = --baz ** 2;
|
|
||||||
}
|
|
||||||
expect_exact: "var a=(-3)**foo;var b=++bar**3;var c=--baz**2;"
|
|
||||||
}
|
|
||||||
|
|
||||||
pow_with_number_constants: {
|
|
||||||
options = {
|
|
||||||
evaluate: true
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 5 ** NaN;
|
|
||||||
/* NaN exponent results to NaN */
|
|
||||||
var b = 42 ** +0;
|
|
||||||
/* +0 exponent results to NaN */
|
|
||||||
var c = 42 ** -0;
|
|
||||||
/* -0 exponent results to NaN */
|
|
||||||
var d = NaN ** 1;
|
|
||||||
/* NaN with non-zero exponent is NaN */
|
|
||||||
var e = 2 ** Infinity;
|
|
||||||
/* abs(base) > 1 with Infinity as exponent is Infinity */
|
|
||||||
var f = 2 ** -Infinity;
|
|
||||||
/* abs(base) > 1 with -Infinity as exponent is +0 */
|
|
||||||
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);
|
|
||||||
var m = 3 ** -10; // Result will be 0.000016935087808430286, which is too long
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = NaN;
|
|
||||||
var b = 1;
|
|
||||||
var c = 1;
|
|
||||||
var d = NaN;
|
|
||||||
var e = 1/0;
|
|
||||||
var f = 0;
|
|
||||||
var g = NaN;
|
|
||||||
var h = 1/0;
|
|
||||||
var i = -1/0;
|
|
||||||
var j = .125;
|
|
||||||
var k = .125;
|
|
||||||
var l = .25;
|
|
||||||
var m = 3 ** -10;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe_constant: {
|
unsafe_constant: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
@@ -515,8 +425,8 @@ prop_function: {
|
|||||||
|
|
||||||
unsafe_integer_key: {
|
unsafe_integer_key: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
@@ -543,8 +453,8 @@ unsafe_integer_key: {
|
|||||||
|
|
||||||
unsafe_integer_key_complex: {
|
unsafe_integer_key_complex: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
@@ -571,8 +481,8 @@ unsafe_integer_key_complex: {
|
|||||||
|
|
||||||
unsafe_float_key: {
|
unsafe_float_key: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
@@ -599,8 +509,8 @@ unsafe_float_key: {
|
|||||||
|
|
||||||
unsafe_float_key_complex: {
|
unsafe_float_key_complex: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
@@ -627,8 +537,8 @@ unsafe_float_key_complex: {
|
|||||||
|
|
||||||
unsafe_array: {
|
unsafe_array: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
@@ -663,8 +573,8 @@ unsafe_array: {
|
|||||||
|
|
||||||
unsafe_string: {
|
unsafe_string: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
@@ -691,8 +601,8 @@ unsafe_string: {
|
|||||||
|
|
||||||
unsafe_array_bad_index: {
|
unsafe_array_bad_index: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
@@ -713,8 +623,8 @@ unsafe_array_bad_index: {
|
|||||||
|
|
||||||
unsafe_string_bad_index: {
|
unsafe_string_bad_index: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
@@ -767,16 +677,17 @@ call_args: {
|
|||||||
inline: true,
|
inline: true,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
const a = 1;
|
var a = 1;
|
||||||
console.log(a);
|
console.log(a);
|
||||||
+function(a) {
|
+function(a) {
|
||||||
return a;
|
return a;
|
||||||
}(a);
|
}(a);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
const a = 1;
|
var a = 1;
|
||||||
console.log(1);
|
console.log(1);
|
||||||
+(1, 1);
|
+(1, 1);
|
||||||
}
|
}
|
||||||
@@ -790,17 +701,17 @@ call_args_drop_param: {
|
|||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
const a = 1;
|
var a = 1;
|
||||||
console.log(a);
|
console.log(a);
|
||||||
+function(a) {
|
+function(a) {
|
||||||
return a;
|
return a;
|
||||||
}(a, b);
|
}(a, b);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
const a = 1;
|
|
||||||
console.log(1);
|
console.log(1);
|
||||||
+(b, 1);
|
+(b, 1);
|
||||||
}
|
}
|
||||||
@@ -838,7 +749,7 @@ in_boolean_context: {
|
|||||||
!b("foo"),
|
!b("foo"),
|
||||||
!b([1, 2]),
|
!b([1, 2]),
|
||||||
!b(/foo/),
|
!b(/foo/),
|
||||||
![1, foo()],
|
(foo(), !1),
|
||||||
(foo(), !1)
|
(foo(), !1)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -847,8 +758,8 @@ in_boolean_context: {
|
|||||||
|
|
||||||
unsafe_charAt: {
|
unsafe_charAt: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
@@ -875,8 +786,8 @@ unsafe_charAt: {
|
|||||||
|
|
||||||
unsafe_charAt_bad_index: {
|
unsafe_charAt_bad_index: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
@@ -897,8 +808,8 @@ unsafe_charAt_bad_index: {
|
|||||||
|
|
||||||
unsafe_charAt_noop: {
|
unsafe_charAt_noop: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
@@ -1288,7 +1199,7 @@ issue_2231_1: {
|
|||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Error evaluating Object.keys(void 0) [test/compress/evaluate.js:1284,20]",
|
"WARN: Error evaluating Object.keys(void 0) [test/compress/evaluate.js:1,20]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1305,7 +1216,7 @@ issue_2231_2: {
|
|||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Error evaluating Object.getOwnPropertyNames(null) [test/compress/evaluate.js:1301,20]",
|
"WARN: Error evaluating Object.getOwnPropertyNames(null) [test/compress/evaluate.js:1,20]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1443,14 +1354,14 @@ issue_2535_3: {
|
|||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Dropping side-effect-free && [test/compress/evaluate.js:1429,20]",
|
"WARN: Dropping side-effect-free && [test/compress/evaluate.js:1,20]",
|
||||||
"WARN: Dropping side-effect-free && [test/compress/evaluate.js:1430,20]",
|
"WARN: Dropping side-effect-free && [test/compress/evaluate.js:2,20]",
|
||||||
"WARN: Dropping side-effect-free && [test/compress/evaluate.js:1431,20]",
|
"WARN: Dropping side-effect-free && [test/compress/evaluate.js:3,20]",
|
||||||
"WARN: Condition left of && always false [test/compress/evaluate.js:1431,20]",
|
"WARN: Condition left of && always false [test/compress/evaluate.js:3,20]",
|
||||||
"WARN: Dropping side-effect-free || [test/compress/evaluate.js:1432,20]",
|
"WARN: Dropping side-effect-free || [test/compress/evaluate.js:4,20]",
|
||||||
"WARN: Dropping side-effect-free || [test/compress/evaluate.js:1433,20]",
|
"WARN: Dropping side-effect-free || [test/compress/evaluate.js:5,20]",
|
||||||
"WARN: Dropping side-effect-free || [test/compress/evaluate.js:1434,20]",
|
"WARN: Dropping side-effect-free || [test/compress/evaluate.js:6,20]",
|
||||||
"WARN: Condition left of || always true [test/compress/evaluate.js:1434,20]",
|
"WARN: Condition left of || always true [test/compress/evaluate.js:6,20]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1522,3 +1433,180 @@ string_case: {
|
|||||||
"199",
|
"199",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_2916_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var c = "PASS";
|
||||||
|
(function(a, b) {
|
||||||
|
(function(d) {
|
||||||
|
d[0] = 1;
|
||||||
|
})(b);
|
||||||
|
a == b && (c = "FAIL");
|
||||||
|
})("", []);
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var c = "PASS";
|
||||||
|
(function(a, b) {
|
||||||
|
(function(d) {
|
||||||
|
d[0] = 1;
|
||||||
|
})(b);
|
||||||
|
a == b && (c = "FAIL");
|
||||||
|
})("", []);
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2916_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var c = "FAIL";
|
||||||
|
(function(b) {
|
||||||
|
(function(d) {
|
||||||
|
d[0] = 1;
|
||||||
|
})(b);
|
||||||
|
+b && (c = "PASS");
|
||||||
|
})([]);
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var c = "FAIL";
|
||||||
|
(function(b) {
|
||||||
|
b[0] = 1;
|
||||||
|
+b && (c = "PASS");
|
||||||
|
})([]);
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2919: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log([ function() {} ].toString());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("function(){}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2926_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function f(a) {
|
||||||
|
console.log(f.name.length, f.length);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function f(a) {
|
||||||
|
console.log(1, 1);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "1 1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2926_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(typeof function() {}.valueOf());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("function");
|
||||||
|
}
|
||||||
|
expect_stdout: "function"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2968: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var c = "FAIL";
|
||||||
|
(function() {
|
||||||
|
(function(a, b) {
|
||||||
|
a <<= 0;
|
||||||
|
a && (a[(c = "PASS", 0 >>> (b += 1))] = 0);
|
||||||
|
})(42, -42);
|
||||||
|
})();
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var c = "FAIL";
|
||||||
|
(function() {
|
||||||
|
b = -(a = 42),
|
||||||
|
void ((a <<= 0) && (a[(c = "PASS", 0 >>> (b += 1))] = 0));
|
||||||
|
var a, b;
|
||||||
|
})();
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
truthy_conditionals: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if (a = {}) x();
|
||||||
|
(b = /foo/) && y();
|
||||||
|
(c = function() {}) || z();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
a = {}, x();
|
||||||
|
b = /foo/, y();
|
||||||
|
c = function() {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
truthy_loops: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
while ([]) x();
|
||||||
|
do {
|
||||||
|
y();
|
||||||
|
} while(a = {});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
for (;;) {
|
||||||
|
[];
|
||||||
|
x();
|
||||||
|
}
|
||||||
|
for (;;) {
|
||||||
|
y();
|
||||||
|
a = {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,71 +0,0 @@
|
|||||||
|
|
||||||
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){});"
|
|
||||||
}
|
|
||||||
|
|
||||||
avoid_spread_in_ternary: {
|
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
conditionals: true,
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function print(...x) {
|
|
||||||
console.log(...x);
|
|
||||||
}
|
|
||||||
var a = [1, 2], b = [3, 4], m = Math;
|
|
||||||
|
|
||||||
if (m)
|
|
||||||
print(a);
|
|
||||||
else
|
|
||||||
print(b);
|
|
||||||
|
|
||||||
if (m)
|
|
||||||
print(...a);
|
|
||||||
else
|
|
||||||
print(b);
|
|
||||||
|
|
||||||
if (m.no_such_property)
|
|
||||||
print(a);
|
|
||||||
else
|
|
||||||
print(...b);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function print(...x) {
|
|
||||||
console.log(...x);
|
|
||||||
}
|
|
||||||
var a = [ 1, 2 ], b = [ 3, 4 ], m = Math;
|
|
||||||
print(m ? a : b);
|
|
||||||
m ? print(...a) : print(b);
|
|
||||||
m.no_such_property ? print(a) : print(...b);
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"[ 1, 2 ]",
|
|
||||||
"1 2",
|
|
||||||
"3 4",
|
|
||||||
]
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
@@ -1,446 +0,0 @@
|
|||||||
issue_2038_1: {
|
|
||||||
options = {
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export var V = 1;
|
|
||||||
export let L = 2;
|
|
||||||
export const C = 3;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
export var V = 1;
|
|
||||||
export let L = 2;
|
|
||||||
export const C = 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2038_2: {
|
|
||||||
options = {
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
let LET = 1;
|
|
||||||
const CONST = 2;
|
|
||||||
var VAR = 3;
|
|
||||||
export { LET, CONST, VAR };
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
let t = 1;
|
|
||||||
const e = 2;
|
|
||||||
var o = 3;
|
|
||||||
export { t as LET, e as CONST, o as VAR };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2126: {
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
import { foo as bar, cat as dog } from "stuff";
|
|
||||||
console.log(bar, dog);
|
|
||||||
export { bar as qux };
|
|
||||||
export { dog };
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
import { foo as o, cat as s } from "stuff";
|
|
||||||
console.log(o, s);
|
|
||||||
export { o as qux };
|
|
||||||
export { s as dog };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
beautify: {
|
|
||||||
beautify = {
|
|
||||||
beautify: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export { A as B, C as D };
|
|
||||||
}
|
|
||||||
expect_exact: "export { A as B, C as D };"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2131: {
|
|
||||||
options = {
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function no() {
|
|
||||||
console.log(42);
|
|
||||||
}
|
|
||||||
function go() {
|
|
||||||
console.log(42);
|
|
||||||
}
|
|
||||||
var X = 1, Y = 2;
|
|
||||||
export function main() {
|
|
||||||
go(X);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function go() {
|
|
||||||
console.log(42);
|
|
||||||
}
|
|
||||||
var X = 1;
|
|
||||||
export function main() {
|
|
||||||
go(X);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2129: {
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export const { keys } = Object;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
export const { keys } = Object;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async_func: {
|
|
||||||
options = {
|
|
||||||
keep_fargs: false,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export async function Foo(x){};
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
export async function Foo(){};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2134_1: {
|
|
||||||
options = {
|
|
||||||
keep_fargs: false,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export function Foo(x){};
|
|
||||||
Foo.prototype = {};
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
export function Foo(){};
|
|
||||||
Foo.prototype = {};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2134_2: {
|
|
||||||
options = {
|
|
||||||
keep_fargs: false,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export async function Foo(x){};
|
|
||||||
Foo.prototype = {};
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
export async function Foo(){};
|
|
||||||
Foo.prototype = {};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
redirection: {
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
let foo = 1, bar = 2;
|
|
||||||
export { foo as delete };
|
|
||||||
export { bar as default };
|
|
||||||
export { foo as var } from "module.js";
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
let e = 1, o = 2;
|
|
||||||
export { e as delete };
|
|
||||||
export { o as default };
|
|
||||||
export { foo as var } from "module.js";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
keyword_invalid_1: {
|
|
||||||
input: {
|
|
||||||
export { default };
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
export { default };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
keyword_invalid_2: {
|
|
||||||
input: {
|
|
||||||
export { default as Alias };
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
export { default as Alias };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
keyword_invalid_3: {
|
|
||||||
input: {
|
|
||||||
export { default as default };
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
export { default as default };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
keyword_valid_1: {
|
|
||||||
input: {
|
|
||||||
export { default } from "module.js";
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
export { default } from "module.js";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
keyword_valid_2: {
|
|
||||||
input: {
|
|
||||||
export { default as Alias } from "module.js";
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
export { default as Alias } from "module.js";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
keyword_valid_3: {
|
|
||||||
input: {
|
|
||||||
export { default as default } from "module.js";
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
export { default as default } from "module.js";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dynamic_import: {
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
import traditional from './traditional.js';
|
|
||||||
function imp(x) {
|
|
||||||
return import(x);
|
|
||||||
}
|
|
||||||
import("module_for_side_effects.js");
|
|
||||||
let dynamic = import("some/module.js");
|
|
||||||
dynamic.foo();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
import o from "./traditional.js";
|
|
||||||
function t(o) {
|
|
||||||
return import(o);
|
|
||||||
}
|
|
||||||
import("module_for_side_effects.js");
|
|
||||||
let r = import("some/module.js");
|
|
||||||
r.foo();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
trailing_comma: {
|
|
||||||
beautify = {
|
|
||||||
beautify: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export const a = 1;
|
|
||||||
}
|
|
||||||
expect_exact: "export const a = 1;"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_default_anonymous_function: {
|
|
||||||
options = {
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export default function () {
|
|
||||||
foo();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_exact: "export default function(){foo()};"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_default_arrow: {
|
|
||||||
options = {
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export default () => foo();
|
|
||||||
}
|
|
||||||
expect_exact: "export default()=>foo();"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_default_anonymous_generator: {
|
|
||||||
options = {
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export default function * () {
|
|
||||||
yield foo();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_exact: "export default function*(){yield foo()};"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_default_anonymous_async_function: {
|
|
||||||
options = {
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export default async function() {
|
|
||||||
return await foo();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_exact: "export default async function(){return await foo()};"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_default_async_arrow_function: {
|
|
||||||
options = {
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export default async () => await foo();
|
|
||||||
}
|
|
||||||
expect_exact: "export default async()=>await foo();"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_default_named_generator: {
|
|
||||||
options = {
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export default function * gen() {
|
|
||||||
yield foo();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_exact: "export default function*gen(){yield foo()};"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_default_named_async_function: {
|
|
||||||
options = {
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export default async function bar() {
|
|
||||||
return await foo();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_exact: "export default async function bar(){return await foo()};"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_default_anonymous_class: {
|
|
||||||
options = {
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export default class {
|
|
||||||
constructor() {
|
|
||||||
foo();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
expect_exact: "export default class{constructor(){foo()}};"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_default_anonymous_function_not_call: {
|
|
||||||
options = {
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export default function(){}(foo);
|
|
||||||
}
|
|
||||||
// FIXME: should be `export default function(){};foo;`
|
|
||||||
expect_exact: "export default function(){}(foo);"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_default_anonymous_generator_not_call: {
|
|
||||||
options = {
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export default function*(){}(foo);
|
|
||||||
}
|
|
||||||
// agrees with `acorn` and `babylon 7`
|
|
||||||
expect_exact: "export default function*(){};foo;"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_default_anonymous_async_function_not_call: {
|
|
||||||
options = {
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export default async function(){}(foo);
|
|
||||||
}
|
|
||||||
// agrees with `acorn` and `babylon 7`
|
|
||||||
expect_exact: "export default async function(){};foo;"
|
|
||||||
}
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -9,20 +9,20 @@ non_ascii_function_identifier_name: {
|
|||||||
|
|
||||||
iifes_returning_constants_keep_fargs_true: {
|
iifes_returning_constants_keep_fargs_true: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs : true,
|
booleans: true,
|
||||||
side_effects : true,
|
collapse_vars: true,
|
||||||
evaluate : true,
|
comparisons: true,
|
||||||
unused : true,
|
conditionals: true,
|
||||||
dead_code : true,
|
dead_code: true,
|
||||||
conditionals : true,
|
evaluate: true,
|
||||||
comparisons : true,
|
if_return: true,
|
||||||
booleans : true,
|
inline: true,
|
||||||
if_return : true,
|
join_vars: true,
|
||||||
join_vars : true,
|
keep_fargs: true,
|
||||||
reduce_funcs : true,
|
reduce_funcs: true,
|
||||||
reduce_vars : true,
|
reduce_vars: true,
|
||||||
collapse_vars : true,
|
side_effects: true,
|
||||||
inline : true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(){ return -1.23; }());
|
(function(){ return -1.23; }());
|
||||||
@@ -46,20 +46,20 @@ iifes_returning_constants_keep_fargs_true: {
|
|||||||
|
|
||||||
iifes_returning_constants_keep_fargs_false: {
|
iifes_returning_constants_keep_fargs_false: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs : false,
|
booleans: true,
|
||||||
side_effects : true,
|
collapse_vars: true,
|
||||||
evaluate : true,
|
comparisons: true,
|
||||||
unused : true,
|
conditionals: true,
|
||||||
dead_code : true,
|
dead_code: true,
|
||||||
conditionals : true,
|
evaluate: true,
|
||||||
comparisons : true,
|
if_return: true,
|
||||||
booleans : true,
|
inline: true,
|
||||||
if_return : true,
|
join_vars: true,
|
||||||
join_vars : true,
|
keep_fargs: false,
|
||||||
reduce_funcs : true,
|
reduce_funcs: true,
|
||||||
reduce_vars : true,
|
reduce_vars: true,
|
||||||
collapse_vars : true,
|
side_effects: true,
|
||||||
inline : true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(){ return -1.23; }());
|
(function(){ return -1.23; }());
|
||||||
@@ -193,65 +193,25 @@ hoist_funs: {
|
|||||||
console.log(6, typeof f, typeof g);
|
console.log(6, typeof f, typeof g);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
|
function f() {}
|
||||||
function g() {}
|
function g() {}
|
||||||
console.log(1, typeof f, typeof g);
|
console.log(1, typeof f, typeof g);
|
||||||
if (console.log(2, typeof f, typeof g))
|
if (console.log(2, typeof f, typeof g))
|
||||||
console.log(3, typeof f, typeof g);
|
console.log(3, typeof f, typeof g);
|
||||||
else {
|
else {
|
||||||
console.log(4, typeof f, typeof g);
|
console.log(4, typeof f, typeof g);
|
||||||
function f() {}
|
|
||||||
console.log(5, typeof f, typeof g);
|
console.log(5, typeof f, typeof g);
|
||||||
}
|
}
|
||||||
console.log(6, typeof f, typeof g);
|
console.log(6, typeof f, typeof g);
|
||||||
}
|
}
|
||||||
expect_stdout: [
|
expect_stdout: [
|
||||||
"1 'undefined' 'function'",
|
"1 'function' 'function'",
|
||||||
"2 'undefined' 'function'",
|
"2 'function' 'function'",
|
||||||
"4 'function' 'function'",
|
"4 'function' 'function'",
|
||||||
"5 'function' 'function'",
|
"5 'function' 'function'",
|
||||||
"6 'function' 'function'",
|
"6 'function' 'function'",
|
||||||
]
|
]
|
||||||
node_version: ">=6"
|
node_version: "<=4"
|
||||||
}
|
|
||||||
|
|
||||||
hoist_funs_strict: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
"use strict";
|
|
||||||
console.log(1, typeof f, typeof g);
|
|
||||||
if (console.log(2, typeof f, typeof g))
|
|
||||||
console.log(3, typeof f, typeof g);
|
|
||||||
else {
|
|
||||||
console.log(4, typeof f, typeof g);
|
|
||||||
function f() {}
|
|
||||||
console.log(5, typeof f, typeof g);
|
|
||||||
}
|
|
||||||
function g() {}
|
|
||||||
console.log(6, typeof f, typeof g);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
"use strict";
|
|
||||||
function g() {}
|
|
||||||
console.log(1, typeof f, typeof g);
|
|
||||||
if (console.log(2, typeof f, typeof g))
|
|
||||||
console.log(3, typeof f, typeof g);
|
|
||||||
else {
|
|
||||||
console.log(4, typeof f, typeof g);
|
|
||||||
function f() {}
|
|
||||||
console.log(5, typeof f, typeof g);
|
|
||||||
}
|
|
||||||
console.log(6, typeof f, typeof g);
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"1 'undefined' 'function'",
|
|
||||||
"2 'undefined' 'function'",
|
|
||||||
"4 'function' 'function'",
|
|
||||||
"5 'function' 'function'",
|
|
||||||
"6 'undefined' 'function'",
|
|
||||||
]
|
|
||||||
node_version: ">=4"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_203: {
|
issue_203: {
|
||||||
@@ -276,32 +236,6 @@ issue_203: {
|
|||||||
expect_stdout: "42"
|
expect_stdout: "42"
|
||||||
}
|
}
|
||||||
|
|
||||||
no_webkit: {
|
|
||||||
beautify = {
|
|
||||||
webkit: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(function() {
|
|
||||||
1 + 1;
|
|
||||||
}.a = 1);
|
|
||||||
}
|
|
||||||
expect_exact: "console.log(function(){1+1}.a=1);"
|
|
||||||
expect_stdout: "1"
|
|
||||||
}
|
|
||||||
|
|
||||||
webkit: {
|
|
||||||
beautify = {
|
|
||||||
webkit: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(function() {
|
|
||||||
1 + 1;
|
|
||||||
}.a = 1);
|
|
||||||
}
|
|
||||||
expect_exact: "console.log((function(){1+1}).a=1);"
|
|
||||||
expect_stdout: "1"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2084: {
|
issue_2084: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
@@ -332,11 +266,12 @@ issue_2084: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var c = 0;
|
var c = 0;
|
||||||
!function(c) {
|
!function() {
|
||||||
c = 1 + c,
|
var c;
|
||||||
|
c = 1 + (c = -1),
|
||||||
c = 1 + (c = 0),
|
c = 1 + (c = 0),
|
||||||
0 !== 23..toString() && (c = 1 + c);
|
0 !== 23..toString() && (c = 1 + c);
|
||||||
}(-1),
|
}(),
|
||||||
console.log(c);
|
console.log(c);
|
||||||
}
|
}
|
||||||
expect_stdout: "0"
|
expect_stdout: "0"
|
||||||
@@ -990,20 +925,6 @@ unsafe_apply_2: {
|
|||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe_apply_expansion: {
|
|
||||||
options = {
|
|
||||||
unsafe: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log.apply(console, [1, ...[2, 3], 4]);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log.call(console, 1, ...[2, 3], 4);
|
|
||||||
}
|
|
||||||
expect_stdout: "1 2 3 4"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe_call_1: {
|
unsafe_call_1: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: true,
|
||||||
@@ -1082,25 +1003,6 @@ unsafe_call_3: {
|
|||||||
expect_stdout: "3"
|
expect_stdout: "3"
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe_call_expansion: {
|
|
||||||
options = {
|
|
||||||
unsafe: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function(...a) {
|
|
||||||
console.log(...a);
|
|
||||||
}).call(console, 1, ...[2, 3], 4);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console,
|
|
||||||
(function(...a) {
|
|
||||||
console.log(...a);
|
|
||||||
})(1, ...[2, 3], 4);
|
|
||||||
}
|
|
||||||
expect_stdout: "1 2 3 4"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2616: {
|
issue_2616: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
@@ -1124,11 +1026,9 @@ issue_2616: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var c = "FAIL";
|
var c = "FAIL";
|
||||||
(function() {
|
!function(NaN) {
|
||||||
!function(NaN) {
|
(true << NaN) - 0/0 || (c = "PASS");
|
||||||
(true << NaN) - 0/0 || (c = "PASS");
|
}([]);
|
||||||
}([]);
|
|
||||||
})();
|
|
||||||
console.log(c);
|
console.log(c);
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
@@ -1159,13 +1059,11 @@ issue_2620_1: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var c = "FAIL";
|
var c = "FAIL";
|
||||||
(function() {
|
!function(a) {
|
||||||
(function(a) {
|
if (function(a) {
|
||||||
if (function(a) {
|
a && a();
|
||||||
a && a();
|
}(), a) c = "PASS";
|
||||||
}(), a) c = "PASS";
|
}(1),
|
||||||
})(1);
|
|
||||||
})(),
|
|
||||||
console.log(c);
|
console.log(c);
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
@@ -1233,18 +1131,16 @@ issue_2620_3: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var c = "FAIL";
|
var c = "FAIL";
|
||||||
(function() {
|
!function(a, NaN) {
|
||||||
(function(a, NaN) {
|
(function() {
|
||||||
(function() {
|
switch (a) {
|
||||||
switch (a) {
|
case a:
|
||||||
case a:
|
break;
|
||||||
break;
|
case c = "PASS", NaN:
|
||||||
case c = "PASS", NaN:
|
break;
|
||||||
break;
|
}
|
||||||
}
|
})();
|
||||||
})();
|
}(NaN);
|
||||||
})(NaN);
|
|
||||||
})();
|
|
||||||
console.log(c);
|
console.log(c);
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
@@ -1253,8 +1149,8 @@ issue_2620_3: {
|
|||||||
issue_2620_4: {
|
issue_2620_4: {
|
||||||
rename = true,
|
rename = true,
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
@@ -1414,11 +1310,9 @@ issue_2630_4: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var x = 3, a = 1, b = 2;
|
var x = 3, a = 1, b = 2;
|
||||||
(function() {
|
!function() {
|
||||||
(function() {
|
while (--x >= 0 && void (b += ++a));
|
||||||
while (--x >= 0 && void (a++, b += a));
|
}();
|
||||||
})();
|
|
||||||
})();
|
|
||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
expect_stdout: "2"
|
expect_stdout: "2"
|
||||||
@@ -1457,101 +1351,6 @@ issue_2630_5: {
|
|||||||
expect_stdout: "155"
|
expect_stdout: "155"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_2647_1: {
|
|
||||||
options = {
|
|
||||||
inline: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function(n, o = "FAIL") {
|
|
||||||
console.log(n);
|
|
||||||
})("PASS");
|
|
||||||
(function(n, o = "PASS") {
|
|
||||||
console.log(o);
|
|
||||||
})("FAIL");
|
|
||||||
(function(o = "PASS") {
|
|
||||||
console.log(o);
|
|
||||||
})();
|
|
||||||
(function(n, {o = "FAIL"}) {
|
|
||||||
console.log(n);
|
|
||||||
})("PASS", {});
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log("PASS");
|
|
||||||
(function(n, o = "PASS") {
|
|
||||||
console.log(o);
|
|
||||||
})();
|
|
||||||
(function(o = "PASS") {
|
|
||||||
console.log(o);
|
|
||||||
})();
|
|
||||||
(function(n, {o = "FAIL"}) {
|
|
||||||
console.log("PASS");
|
|
||||||
})(0, {});
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"PASS",
|
|
||||||
"PASS",
|
|
||||||
"PASS",
|
|
||||||
"PASS",
|
|
||||||
]
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2647_2: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
inline: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function() {
|
|
||||||
function foo(x) {
|
|
||||||
return x.toUpperCase();
|
|
||||||
}
|
|
||||||
console.log((() => foo("pass"))());
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function() {
|
|
||||||
function foo(x) {
|
|
||||||
return x.toUpperCase();
|
|
||||||
}
|
|
||||||
console.log((() => foo("pass"))());
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
node_version: ">=4"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2647_3: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
inline: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function() {
|
|
||||||
function foo(x) {
|
|
||||||
return x.toUpperCase();
|
|
||||||
}
|
|
||||||
console.log((() => {
|
|
||||||
return foo("pass");
|
|
||||||
})());
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function() {
|
|
||||||
console.log("pass".toUpperCase());
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
node_version: ">=4"
|
|
||||||
}
|
|
||||||
|
|
||||||
recursive_inline_1: {
|
recursive_inline_1: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: true,
|
||||||
@@ -1708,7 +1507,7 @@ issue_2663_3: {
|
|||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
(function () {
|
(function() {
|
||||||
var outputs = [
|
var outputs = [
|
||||||
{ type: 0, target: null, eventName: "ngSubmit", propName: null },
|
{ type: 0, target: null, eventName: "ngSubmit", propName: null },
|
||||||
{ type: 0, target: null, eventName: "submit", propName: null },
|
{ type: 0, target: null, eventName: "submit", propName: null },
|
||||||
@@ -1725,11 +1524,11 @@ issue_2663_3: {
|
|||||||
return handlers;
|
return handlers;
|
||||||
}
|
}
|
||||||
function renderEventHandlerClosure(eventName) {
|
function renderEventHandlerClosure(eventName) {
|
||||||
return function () {
|
return function() {
|
||||||
return console.log(eventName);
|
return console.log(eventName);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
listenToElementOutputs(outputs).forEach(function (handler) {
|
listenToElementOutputs(outputs).forEach(function(handler) {
|
||||||
return handler()
|
return handler()
|
||||||
});
|
});
|
||||||
})();
|
})();
|
||||||
@@ -1809,7 +1608,7 @@ loop_init_arg: {
|
|||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = "PASS";
|
var a = "PASS";
|
||||||
for (var k in "12") (function (b) {
|
for (var k in "12") (function(b) {
|
||||||
(b >>= 1) && (a = "FAIL"), b = 2;
|
(b >>= 1) && (a = "FAIL"), b = 2;
|
||||||
})();
|
})();
|
||||||
console.log(a);
|
console.log(a);
|
||||||
@@ -2157,3 +1956,362 @@ issue_2783: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_2898: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var c = 0;
|
||||||
|
(function() {
|
||||||
|
while (f());
|
||||||
|
function f() {
|
||||||
|
var b = (c = 1 + c, void (c = 1 + c));
|
||||||
|
b && b[0];
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var c = 0;
|
||||||
|
(function() {
|
||||||
|
while (b = void 0, void ((b = void (c = 1 + (c = 1 + c))) && b[0]));
|
||||||
|
var b;
|
||||||
|
})(),
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect_stdout: "2"
|
||||||
|
}
|
||||||
|
|
||||||
|
deduplicate_parenthesis: {
|
||||||
|
input: {
|
||||||
|
({}).a = b;
|
||||||
|
(({}).a = b)();
|
||||||
|
(function() {}).a = b;
|
||||||
|
((function() {}).a = b)();
|
||||||
|
}
|
||||||
|
expect_exact: "({}).a=b;({}.a=b)();(function(){}).a=b;(function(){}.a=b)();"
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_lone_use_strict: {
|
||||||
|
options = {
|
||||||
|
directives: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f1() {
|
||||||
|
"use strict";
|
||||||
|
}
|
||||||
|
function f2() {
|
||||||
|
"use strict";
|
||||||
|
function f3() {
|
||||||
|
"use strict";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(function f4() {
|
||||||
|
"use strict";
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f1() {
|
||||||
|
}
|
||||||
|
function f2() {
|
||||||
|
"use strict";
|
||||||
|
function f3() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3166: {
|
||||||
|
options = {
|
||||||
|
directives: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"foo";
|
||||||
|
"use strict";
|
||||||
|
function f() {
|
||||||
|
"use strict";
|
||||||
|
"bar";
|
||||||
|
"use asm";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
function f() {
|
||||||
|
"use asm";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3016_1: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var b = 1;
|
||||||
|
do {
|
||||||
|
(function(a) {
|
||||||
|
return a[b];
|
||||||
|
var a;
|
||||||
|
})(3);
|
||||||
|
} while (0);
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b = 1;
|
||||||
|
do {
|
||||||
|
a = 3,
|
||||||
|
a[b];
|
||||||
|
} while(0);
|
||||||
|
var a;
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3016_2: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
inline: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var b = 1;
|
||||||
|
do {
|
||||||
|
(function(a) {
|
||||||
|
return a[b];
|
||||||
|
try {
|
||||||
|
a = 2;
|
||||||
|
} catch (a) {
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
})(3);
|
||||||
|
} while (0);
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b = 1;
|
||||||
|
do {
|
||||||
|
a = 3,
|
||||||
|
a[b];
|
||||||
|
} while(0);
|
||||||
|
var a;
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3016_2_ie8: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
ie8: true,
|
||||||
|
inline: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var b = 1;
|
||||||
|
do {
|
||||||
|
(function(a) {
|
||||||
|
return a[b];
|
||||||
|
try {
|
||||||
|
a = 2;
|
||||||
|
} catch (a) {
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
})(3);
|
||||||
|
} while (0);
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b = 1;
|
||||||
|
do {
|
||||||
|
a = 3,
|
||||||
|
a[b];
|
||||||
|
} while(0);
|
||||||
|
var a;
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3016_3: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
inline: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var b = 1;
|
||||||
|
do {
|
||||||
|
console.log(function() {
|
||||||
|
return a ? "FAIL" : a = "PASS";
|
||||||
|
try {
|
||||||
|
a = 2;
|
||||||
|
} catch (a) {
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
} while (b--);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b = 1;
|
||||||
|
do {
|
||||||
|
console.log((a = void 0, a ? "FAIL" : a = "PASS"));
|
||||||
|
} while(b--);
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS",
|
||||||
|
"PASS",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3016_3_ie8: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
ie8: true,
|
||||||
|
inline: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var b = 1;
|
||||||
|
do {
|
||||||
|
console.log(function() {
|
||||||
|
return a ? "FAIL" : a = "PASS";
|
||||||
|
try {
|
||||||
|
a = 2;
|
||||||
|
} catch (a) {
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
} while (b--);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b = 1;
|
||||||
|
do {
|
||||||
|
console.log((a = void 0, a ? "FAIL" : a = "PASS"));
|
||||||
|
} while(b--);
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS",
|
||||||
|
"PASS",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3018: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var b = 1, c = "PASS";
|
||||||
|
do {
|
||||||
|
(function() {
|
||||||
|
(function(a) {
|
||||||
|
a = 0 != (a && (c = "FAIL"));
|
||||||
|
})();
|
||||||
|
})();
|
||||||
|
} while (b--);
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b = 1, c = "PASS";
|
||||||
|
do {
|
||||||
|
a = void 0,
|
||||||
|
a = 0 != (a && (c = "FAIL"));
|
||||||
|
} while (b--);
|
||||||
|
var a;
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3054: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: 1,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
function f() {
|
||||||
|
return { a: true };
|
||||||
|
}
|
||||||
|
console.log(function(b) {
|
||||||
|
b = false;
|
||||||
|
return f();
|
||||||
|
}().a, f.call().a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
function f() {
|
||||||
|
return { a: !0 };
|
||||||
|
}
|
||||||
|
console.log(function(b) {
|
||||||
|
return { a: !(b = !1) };
|
||||||
|
}().a, f.call().a);
|
||||||
|
}
|
||||||
|
expect_stdout: "true true"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3076: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
inline: true,
|
||||||
|
sequences: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var c = "PASS";
|
||||||
|
(function(b) {
|
||||||
|
var n = 2;
|
||||||
|
while (--b + function() {
|
||||||
|
e && (c = "FAIL");
|
||||||
|
e = 5;
|
||||||
|
return 1;
|
||||||
|
try {
|
||||||
|
var a = 5;
|
||||||
|
} catch (e) {
|
||||||
|
var e;
|
||||||
|
}
|
||||||
|
}().toString() && --n > 0);
|
||||||
|
})(2);
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var c = "PASS";
|
||||||
|
(function(b) {
|
||||||
|
var n = 2;
|
||||||
|
while (--b + (e = void 0, e && (c = "FAIL"), e = 5, 1).toString() && --n > 0);
|
||||||
|
var e;
|
||||||
|
})(2),
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3125: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
return "PASS";
|
||||||
|
}.call());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ must_replace: {
|
|||||||
options = {
|
options = {
|
||||||
global_defs: {
|
global_defs: {
|
||||||
D: "foo bar",
|
D: "foo bar",
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(D);
|
console.log(D);
|
||||||
@@ -121,7 +121,7 @@ mixed: {
|
|||||||
properties: true,
|
properties: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
const FOO = { BAR: 0 };
|
var FOO = { BAR: 0 };
|
||||||
console.log(FOO.BAR);
|
console.log(FOO.BAR);
|
||||||
console.log(++CONFIG.DEBUG);
|
console.log(++CONFIG.DEBUG);
|
||||||
console.log(++CONFIG.VALUE);
|
console.log(++CONFIG.VALUE);
|
||||||
@@ -131,7 +131,7 @@ mixed: {
|
|||||||
console.log(CONFIG);
|
console.log(CONFIG);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
const FOO = { BAR: 0 };
|
var FOO = { BAR: 0 };
|
||||||
console.log("moo");
|
console.log("moo");
|
||||||
console.log(++CONFIG.DEBUG);
|
console.log(++CONFIG.DEBUG);
|
||||||
console.log(++CONFIG.VALUE);
|
console.log(++CONFIG.VALUE);
|
||||||
@@ -141,9 +141,8 @@ mixed: {
|
|||||||
console.log(CONFIG);
|
console.log(CONFIG);
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
'WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:127,22]',
|
"WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:4,22]",
|
||||||
'WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:128,22]',
|
"WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:7,8]",
|
||||||
'WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:130,8]',
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -197,3 +196,23 @@ issue_2167: {
|
|||||||
doWork();
|
doWork();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_3217: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
global_defs: {
|
||||||
|
"@o": "{fn:function(){var a=42;console.log(a)}}",
|
||||||
|
},
|
||||||
|
inline: true,
|
||||||
|
properties: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
o.fn();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(42);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,85 +0,0 @@
|
|||||||
|
|
||||||
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,8 +1,8 @@
|
|||||||
issue_2377_1: {
|
issue_2377_1: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
|
||||||
hoist_props: true,
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
@@ -33,8 +33,8 @@ issue_2377_1: {
|
|||||||
issue_2377_2: {
|
issue_2377_2: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
|
||||||
hoist_props: true,
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
@@ -64,8 +64,8 @@ issue_2377_2: {
|
|||||||
issue_2377_3: {
|
issue_2377_3: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
|
||||||
hoist_props: true,
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
passes: 4,
|
passes: 4,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
@@ -239,14 +239,14 @@ name_collision_2: {
|
|||||||
input: {
|
input: {
|
||||||
var o = {
|
var o = {
|
||||||
p: 1,
|
p: 1,
|
||||||
0: function(x) {
|
"+": function(x) {
|
||||||
return x;
|
return x;
|
||||||
},
|
},
|
||||||
1: function(x) {
|
"-": function(x) {
|
||||||
return x + 1;
|
return x + 1;
|
||||||
}
|
}
|
||||||
}, o__$0 = 2, o__$1 = 3;
|
}, o__$0 = 2, o__$1 = 3;
|
||||||
console.log(o.p === o.p, o[0](4), o[1](5), o__$0, o__$1);
|
console.log(o.p === o.p, o["+"](4), o["-"](5), o__$0, o__$1);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var o_p = 1,
|
var o_p = 1,
|
||||||
@@ -273,14 +273,14 @@ name_collision_3: {
|
|||||||
input: {
|
input: {
|
||||||
var o = {
|
var o = {
|
||||||
p: 1,
|
p: 1,
|
||||||
0: function(x) {
|
"+": function(x) {
|
||||||
return x;
|
return x;
|
||||||
},
|
},
|
||||||
1: function(x) {
|
"-": function(x) {
|
||||||
return x + 1;
|
return x + 1;
|
||||||
}
|
}
|
||||||
}, o__$0 = 2, o__$1 = 3;
|
}, o__$0 = 2, o__$1 = 3;
|
||||||
console.log(o.p === o.p, o[0](4), o[1](5));
|
console.log(o.p === o.p, o["+"](4), o["-"](5));
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var o_p = 1,
|
var o_p = 1,
|
||||||
@@ -383,124 +383,6 @@ contains_this_3: {
|
|||||||
expect_stdout: "1 1 true"
|
expect_stdout: "1 1 true"
|
||||||
}
|
}
|
||||||
|
|
||||||
hoist_class: {
|
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
evaluate: true,
|
|
||||||
hoist_props: true,
|
|
||||||
inline: true,
|
|
||||||
keep_classnames: true,
|
|
||||||
keep_fnames: true,
|
|
||||||
passes: 2,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function run(c, v) {
|
|
||||||
return new c(v).value;
|
|
||||||
}
|
|
||||||
var o = {
|
|
||||||
p: class Foo {
|
|
||||||
constructor(value) {
|
|
||||||
this.value = value * 10;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
x: 1,
|
|
||||||
y: 2,
|
|
||||||
};
|
|
||||||
console.log(o.p.name, o.p === o.p, run(o.p, o.x), run(o.p, o.y));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function run(c, v) {
|
|
||||||
return new c(v).value;
|
|
||||||
}
|
|
||||||
var o_p = class Foo {
|
|
||||||
constructor(value) {
|
|
||||||
this.value = 10 * value;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
console.log(o_p.name, true, run(o_p, 1), run(o_p, 2));
|
|
||||||
}
|
|
||||||
node_version: ">=6"
|
|
||||||
expect_stdout: "Foo true 10 20"
|
|
||||||
}
|
|
||||||
|
|
||||||
hoist_class_with_new: {
|
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
evaluate: true,
|
|
||||||
hoist_props: true,
|
|
||||||
inline: true,
|
|
||||||
keep_classnames: true,
|
|
||||||
keep_fnames: true,
|
|
||||||
passes: 2,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = {
|
|
||||||
p: class Foo {
|
|
||||||
constructor(value) {
|
|
||||||
this.value = value * 10;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
x: 1,
|
|
||||||
y: 2,
|
|
||||||
};
|
|
||||||
console.log(o.p.name, o.p === o.p, new o.p(o.x).value, new o.p(o.y).value);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var o_p = class Foo {
|
|
||||||
constructor(value) {
|
|
||||||
this.value = 10 * value;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
console.log(o_p.name, true, new o_p(1).value, new o_p(2).value);
|
|
||||||
}
|
|
||||||
node_version: ">=6"
|
|
||||||
expect_stdout: "Foo true 10 20"
|
|
||||||
}
|
|
||||||
|
|
||||||
hoist_function_with_call: {
|
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
evaluate: true,
|
|
||||||
hoist_props: true,
|
|
||||||
inline: true,
|
|
||||||
keep_fnames: true,
|
|
||||||
passes: 2,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = {
|
|
||||||
p: function Foo(value) {
|
|
||||||
return 10 * value;
|
|
||||||
},
|
|
||||||
x: 1,
|
|
||||||
y: 2
|
|
||||||
};
|
|
||||||
console.log(o.p.name, o.p === o.p, o.p(o.x), o.p(o.y));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var o = {
|
|
||||||
p: function Foo(value) {
|
|
||||||
return 10 * value;
|
|
||||||
},
|
|
||||||
x: 1,
|
|
||||||
y: 2
|
|
||||||
};
|
|
||||||
console.log(o.p.name, o.p == o.p, o.p(o.x), o.p(o.y));
|
|
||||||
}
|
|
||||||
expect_stdout: "Foo true 10 20"
|
|
||||||
}
|
|
||||||
|
|
||||||
new_this: {
|
new_this: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
@@ -530,31 +412,14 @@ new_this: {
|
|||||||
expect_stdout: "1 2"
|
expect_stdout: "1 2"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_2462: {
|
|
||||||
options = {
|
|
||||||
hoist_props: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export const Foo = {
|
|
||||||
a: 1,
|
|
||||||
b: () => 2
|
|
||||||
};
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
export const Foo = {
|
|
||||||
a: 1,
|
|
||||||
b: () => 2
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2473_1: {
|
issue_2473_1: {
|
||||||
options = {
|
options = {
|
||||||
hoist_props: false,
|
hoist_props: false,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
top_retain: [ "x", "y" ],
|
top_retain: [
|
||||||
|
"x",
|
||||||
|
"y"
|
||||||
|
],
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -573,7 +438,10 @@ issue_2473_2: {
|
|||||||
options = {
|
options = {
|
||||||
hoist_props: true,
|
hoist_props: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
top_retain: [ "x", "y" ],
|
top_retain: [
|
||||||
|
"x",
|
||||||
|
"y"
|
||||||
|
],
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -772,31 +640,6 @@ issue_2508_5: {
|
|||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_2508_6: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
hoist_props: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = {
|
|
||||||
f: x => {
|
|
||||||
console.log(x);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
o.f(o.f);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var o_f = x => {
|
|
||||||
console.log(x);
|
|
||||||
};
|
|
||||||
o_f(o_f);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2519: {
|
issue_2519: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
@@ -828,76 +671,6 @@ issue_2519: {
|
|||||||
expect_stdout: "5.5"
|
expect_stdout: "5.5"
|
||||||
}
|
}
|
||||||
|
|
||||||
toplevel_const: {
|
|
||||||
options = {
|
|
||||||
hoist_props: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
const a = {
|
|
||||||
b: 1,
|
|
||||||
c: 2
|
|
||||||
};
|
|
||||||
console.log(a.b + a.c);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
const a = {
|
|
||||||
b: 1,
|
|
||||||
c: 2
|
|
||||||
};
|
|
||||||
console.log(a.b + a.c);
|
|
||||||
}
|
|
||||||
expect_stdout: "3"
|
|
||||||
}
|
|
||||||
|
|
||||||
toplevel_let: {
|
|
||||||
options = {
|
|
||||||
hoist_props: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
let a = {
|
|
||||||
b: 1,
|
|
||||||
c: 2
|
|
||||||
};
|
|
||||||
console.log(a.b + a.c);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
let a = {
|
|
||||||
b: 1,
|
|
||||||
c: 2
|
|
||||||
};
|
|
||||||
console.log(a.b + a.c);
|
|
||||||
}
|
|
||||||
expect_stdout: "3"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
toplevel_var: {
|
|
||||||
options = {
|
|
||||||
hoist_props: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = {
|
|
||||||
b: 1,
|
|
||||||
c: 2
|
|
||||||
};
|
|
||||||
console.log(a.b + a.c);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = {
|
|
||||||
b: 1,
|
|
||||||
c: 2
|
|
||||||
};
|
|
||||||
console.log(a.b + a.c);
|
|
||||||
}
|
|
||||||
expect_stdout: "3"
|
|
||||||
}
|
|
||||||
|
|
||||||
undefined_key: {
|
undefined_key: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
@@ -919,3 +692,173 @@ undefined_key: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "3"
|
expect_stdout: "3"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_3021: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1, b = 2;
|
||||||
|
(function() {
|
||||||
|
b = a;
|
||||||
|
if (a++ + b--)
|
||||||
|
return 1;
|
||||||
|
return;
|
||||||
|
var b = {};
|
||||||
|
})();
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1, b = 2;
|
||||||
|
(function() {
|
||||||
|
b = a;
|
||||||
|
if (a++ + b--)
|
||||||
|
return 1;
|
||||||
|
return;
|
||||||
|
var b = {};
|
||||||
|
})();
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect_stdout: "2 2"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3046: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
do {
|
||||||
|
var b = {
|
||||||
|
c: a++
|
||||||
|
};
|
||||||
|
} while (b.c && a);
|
||||||
|
return a;
|
||||||
|
}(0));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a) {
|
||||||
|
do {
|
||||||
|
var b_c = a++;
|
||||||
|
} while (b_c && a);
|
||||||
|
return a;
|
||||||
|
}(0));
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3071_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
|
join_vars: true,
|
||||||
|
passes: 3,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
var obj = {};
|
||||||
|
obj.one = 1;
|
||||||
|
obj.two = 2;
|
||||||
|
console.log(obj.one);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3071_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
|
join_vars: true,
|
||||||
|
passes: 3,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
obj = {};
|
||||||
|
obj.one = 1;
|
||||||
|
obj.two = 2;
|
||||||
|
console.log(obj.one);
|
||||||
|
var obj;
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3071_2_toplevel: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
|
join_vars: true,
|
||||||
|
passes: 3,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
obj = {};
|
||||||
|
obj.one = 1;
|
||||||
|
obj.two = 2;
|
||||||
|
console.log(obj.one);
|
||||||
|
var obj;
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3071_3: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var c = 0;
|
||||||
|
(function(a, b) {
|
||||||
|
(function f(o) {
|
||||||
|
var n = 2;
|
||||||
|
while (--b + (o = {
|
||||||
|
p: c++,
|
||||||
|
}) && --n > 0);
|
||||||
|
})();
|
||||||
|
})();
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var c = 0;
|
||||||
|
(function(a, b) {
|
||||||
|
(function f(o) {
|
||||||
|
var n = 2;
|
||||||
|
while (--b + (o = {
|
||||||
|
p: c++,
|
||||||
|
}) && --n > 0);
|
||||||
|
})();
|
||||||
|
})();
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect_stdout: "2"
|
||||||
|
}
|
||||||
|
|||||||
@@ -53,12 +53,3 @@ 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;"
|
|
||||||
}
|
|
||||||
|
|||||||
863
test/compress/ie8.js
Normal file
863
test/compress/ie8.js
Normal file
@@ -0,0 +1,863 @@
|
|||||||
|
do_screw: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
ie8: false,
|
||||||
|
ascii_only: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
f("\v");
|
||||||
|
}
|
||||||
|
expect_exact: 'f("\\v");'
|
||||||
|
}
|
||||||
|
|
||||||
|
dont_screw: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
ie8: true,
|
||||||
|
ascii_only: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
f("\v");
|
||||||
|
}
|
||||||
|
expect_exact: 'f("\\x0B");'
|
||||||
|
}
|
||||||
|
|
||||||
|
do_screw_constants: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
f(undefined, Infinity);
|
||||||
|
}
|
||||||
|
expect_exact: "f(void 0,1/0);"
|
||||||
|
}
|
||||||
|
|
||||||
|
dont_screw_constants: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
f(undefined, Infinity);
|
||||||
|
}
|
||||||
|
expect_exact: "f(undefined,Infinity);"
|
||||||
|
}
|
||||||
|
|
||||||
|
do_screw_try_catch: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
good = function(e){
|
||||||
|
return function(error){
|
||||||
|
try{
|
||||||
|
e()
|
||||||
|
} catch(e) {
|
||||||
|
error(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
good = function(n){
|
||||||
|
return function(t){
|
||||||
|
try{
|
||||||
|
n()
|
||||||
|
} catch(n) {
|
||||||
|
t(n)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dont_screw_try_catch: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
bad = function(e){
|
||||||
|
return function(error){
|
||||||
|
try{
|
||||||
|
e()
|
||||||
|
} catch(e) {
|
||||||
|
error(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
bad = function(t){
|
||||||
|
return function(n){
|
||||||
|
try{
|
||||||
|
t()
|
||||||
|
} catch(t) {
|
||||||
|
n(t)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
do_screw_try_catch_undefined: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function a(b){
|
||||||
|
try {
|
||||||
|
throw 'Stuff';
|
||||||
|
} catch (undefined) {
|
||||||
|
console.log('caught: ' + undefined);
|
||||||
|
}
|
||||||
|
console.log('undefined is ' + undefined);
|
||||||
|
return b === undefined;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function a(o){
|
||||||
|
try{
|
||||||
|
throw "Stuff"
|
||||||
|
} catch (o) {
|
||||||
|
console.log("caught: "+o)
|
||||||
|
}
|
||||||
|
console.log("undefined is " + void 0);
|
||||||
|
return void 0===o
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
dont_screw_try_catch_undefined: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function a(b){
|
||||||
|
try {
|
||||||
|
throw 'Stuff';
|
||||||
|
} catch (undefined) {
|
||||||
|
console.log('caught: ' + undefined);
|
||||||
|
}
|
||||||
|
console.log('undefined is ' + undefined);
|
||||||
|
return b === undefined;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function a(n){
|
||||||
|
try{
|
||||||
|
throw "Stuff"
|
||||||
|
} catch (undefined) {
|
||||||
|
console.log("caught: " + undefined)
|
||||||
|
}
|
||||||
|
console.log("undefined is " + undefined);
|
||||||
|
return n === undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_vars: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
ie8: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
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 = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
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)}}"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1586_2: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
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_2120_1: {
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"aaaaaaaa";
|
||||||
|
var a = 1, b = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (c) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (a) {
|
||||||
|
if (c) b = "PASS";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"aaaaaaaa";
|
||||||
|
var a = 1, b = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (t) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (a) {
|
||||||
|
if (t) b = "PASS";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2120_2: {
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"aaaaaaaa";
|
||||||
|
var a = 1, b = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (c) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (a) {
|
||||||
|
if (c) b = "PASS";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"aaaaaaaa";
|
||||||
|
var a = 1, b = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (c) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (a) {
|
||||||
|
if (c) b = "PASS";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2254_1: {
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"eeeeee";
|
||||||
|
try {
|
||||||
|
console.log(f("PASS"));
|
||||||
|
} catch (e) {}
|
||||||
|
function f(s) {
|
||||||
|
try {
|
||||||
|
throw "FAIL";
|
||||||
|
} catch (e) {
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"eeeeee";
|
||||||
|
try {
|
||||||
|
console.log(f("PASS"));
|
||||||
|
} catch (e) {}
|
||||||
|
function f(t) {
|
||||||
|
try {
|
||||||
|
throw "FAIL";
|
||||||
|
} catch (e) {
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2254_2: {
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"eeeeee";
|
||||||
|
try {
|
||||||
|
console.log(f("PASS"));
|
||||||
|
} catch (e) {}
|
||||||
|
function f(s) {
|
||||||
|
try {
|
||||||
|
throw "FAIL";
|
||||||
|
} catch (e) {
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"eeeeee";
|
||||||
|
try {
|
||||||
|
console.log(f("PASS"));
|
||||||
|
} catch (e) {}
|
||||||
|
function f(t) {
|
||||||
|
try {
|
||||||
|
throw "FAIL";
|
||||||
|
} catch (e) {
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_24_1: {
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
console.log(typeof function f(){} === typeof a ? "FAIL" : "PASS");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(o) {
|
||||||
|
console.log(typeof function o(){} === typeof o ? "FAIL" : "PASS");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_24_2: {
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
console.log(typeof function f(){} === typeof a ? "FAIL" : "PASS");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(o) {
|
||||||
|
console.log(typeof function n(){} === typeof o ? "FAIL" : "PASS");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2976_1: {
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function f() {
|
||||||
|
var a;
|
||||||
|
return a === f ? "FAIL" : "PASS";
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function n() {
|
||||||
|
var o;
|
||||||
|
return o === n ? "FAIL" : "PASS";
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2976_2: {
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function f() {
|
||||||
|
var a;
|
||||||
|
return a === f ? "FAIL" : "PASS";
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function f() {
|
||||||
|
var n;
|
||||||
|
return n === f ? "FAIL" : "PASS";
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2976_3: {
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function f() {
|
||||||
|
var a;
|
||||||
|
return a === f ? "FAIL" : "PASS";
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function o() {
|
||||||
|
var n;
|
||||||
|
return n === o ? "FAIL" : "PASS";
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3035: {
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var c = "FAIL";
|
||||||
|
(function(a) {
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (b) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (a) {
|
||||||
|
b && (c = "PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var c = "FAIL";
|
||||||
|
(function(o) {
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (t) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (o) {
|
||||||
|
t && (c = "PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3035_ie8: {
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var c = "FAIL";
|
||||||
|
(function(a) {
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (b) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (a) {
|
||||||
|
b && (c = "PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var c = "FAIL";
|
||||||
|
(function(t) {
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (o) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (t) {
|
||||||
|
o && (c = "PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3197_1: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var window = {};
|
||||||
|
!function() {
|
||||||
|
function Foo() {
|
||||||
|
console.log(this instanceof Foo);
|
||||||
|
}
|
||||||
|
window.Foo = Foo;
|
||||||
|
}();
|
||||||
|
new window.Foo();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var window = {};
|
||||||
|
window.Foo = function o() {
|
||||||
|
console.log(this instanceof o);
|
||||||
|
};
|
||||||
|
new window.Foo();
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3197_1_ie8: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var window = {};
|
||||||
|
!function() {
|
||||||
|
function Foo() {
|
||||||
|
console.log(this instanceof Foo);
|
||||||
|
}
|
||||||
|
window.Foo = Foo;
|
||||||
|
}();
|
||||||
|
new window.Foo();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var window = {};
|
||||||
|
window.Foo = function Foo() {
|
||||||
|
console.log(this instanceof Foo);
|
||||||
|
};
|
||||||
|
new window.Foo();
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3197_2: {
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
var f = function f() {
|
||||||
|
console.log(this instanceof f);
|
||||||
|
};
|
||||||
|
new f(a);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(n) {
|
||||||
|
var o = function n() {
|
||||||
|
console.log(this instanceof n);
|
||||||
|
};
|
||||||
|
new o(n);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3197_2_ie8: {
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
var f = function f() {
|
||||||
|
console.log(this instanceof f);
|
||||||
|
};
|
||||||
|
new f(a);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(n) {
|
||||||
|
var o = function o() {
|
||||||
|
console.log(this instanceof o);
|
||||||
|
};
|
||||||
|
new o(n);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3206_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
ie8: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
typeofs: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
var foo = function bar() {};
|
||||||
|
var baz = function moo() {};
|
||||||
|
return "function" == typeof bar;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
return "function" == typeof bar;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "false"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3206_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
ie8: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
typeofs: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
var foo = function bar() {};
|
||||||
|
var baz = function moo() {};
|
||||||
|
return "function" == typeof bar;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
(function bar() {});
|
||||||
|
return "function" == typeof bar;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "false"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3215_1: {
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function foo() {
|
||||||
|
var bar = function bar(name) {
|
||||||
|
return "PASS";
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
"moo";
|
||||||
|
} catch (e) {
|
||||||
|
bar = function bar(name) {
|
||||||
|
return "FAIL";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return bar;
|
||||||
|
}()());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function n() {
|
||||||
|
var o = function n(o) {
|
||||||
|
return "PASS";
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
"moo";
|
||||||
|
} catch (n) {
|
||||||
|
o = function n(o) {
|
||||||
|
return "FAIL";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return o;
|
||||||
|
}()());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3215_2: {
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function foo() {
|
||||||
|
var bar = function bar(name) {
|
||||||
|
return "PASS";
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
"moo";
|
||||||
|
} catch (e) {
|
||||||
|
bar = function bar(name) {
|
||||||
|
return "FAIL";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return bar;
|
||||||
|
}()());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function foo() {
|
||||||
|
var o = function o(n) {
|
||||||
|
return "PASS";
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
"moo";
|
||||||
|
} catch (n) {
|
||||||
|
o = function o(n) {
|
||||||
|
return "FAIL";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return o;
|
||||||
|
}()());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3215_3: {
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function foo() {
|
||||||
|
var bar = function bar(name) {
|
||||||
|
return "FAIL";
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
moo;
|
||||||
|
} catch (e) {
|
||||||
|
bar = function bar(name) {
|
||||||
|
return "PASS";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return bar;
|
||||||
|
}()());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function n() {
|
||||||
|
var o = function n(o) {
|
||||||
|
return "FAIL";
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
moo;
|
||||||
|
} catch (n) {
|
||||||
|
o = function n(o) {
|
||||||
|
return "PASS";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return o;
|
||||||
|
}()());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3215_4: {
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function foo() {
|
||||||
|
var bar = function bar(name) {
|
||||||
|
return "FAIL";
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
moo;
|
||||||
|
} catch (e) {
|
||||||
|
bar = function bar(name) {
|
||||||
|
return "PASS";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return bar;
|
||||||
|
}()());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function foo() {
|
||||||
|
var o = function o(n) {
|
||||||
|
return "FAIL";
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
moo;
|
||||||
|
} catch (n) {
|
||||||
|
o = function o(n) {
|
||||||
|
return "PASS";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return o;
|
||||||
|
}()());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
@@ -1,14 +1,14 @@
|
|||||||
if_return_1: {
|
if_return_1: {
|
||||||
options = {
|
options = {
|
||||||
if_return : true,
|
booleans: true,
|
||||||
sequences : true,
|
comparisons: true,
|
||||||
conditionals : true,
|
conditionals: true,
|
||||||
comparisons : true,
|
dead_code: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
booleans : true,
|
if_return: true,
|
||||||
unused : true,
|
sequences: true,
|
||||||
side_effects : true,
|
side_effects: true,
|
||||||
dead_code : true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(x) {
|
function f(x) {
|
||||||
@@ -24,15 +24,15 @@ if_return_1: {
|
|||||||
|
|
||||||
if_return_2: {
|
if_return_2: {
|
||||||
options = {
|
options = {
|
||||||
if_return : true,
|
booleans: true,
|
||||||
sequences : true,
|
comparisons: true,
|
||||||
conditionals : true,
|
conditionals: true,
|
||||||
comparisons : true,
|
dead_code: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
booleans : true,
|
if_return: true,
|
||||||
unused : true,
|
sequences: true,
|
||||||
side_effects : true,
|
side_effects: true,
|
||||||
dead_code : true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(x, y) {
|
function f(x, y) {
|
||||||
@@ -49,15 +49,15 @@ if_return_2: {
|
|||||||
|
|
||||||
if_return_3: {
|
if_return_3: {
|
||||||
options = {
|
options = {
|
||||||
if_return : true,
|
booleans: true,
|
||||||
sequences : true,
|
comparisons: true,
|
||||||
conditionals : true,
|
conditionals: true,
|
||||||
comparisons : true,
|
dead_code: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
booleans : true,
|
if_return: true,
|
||||||
unused : true,
|
sequences: true,
|
||||||
side_effects : true,
|
side_effects: true,
|
||||||
dead_code : true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(x) {
|
function f(x) {
|
||||||
@@ -75,15 +75,15 @@ if_return_3: {
|
|||||||
|
|
||||||
if_return_4: {
|
if_return_4: {
|
||||||
options = {
|
options = {
|
||||||
if_return : true,
|
booleans: true,
|
||||||
sequences : true,
|
comparisons: true,
|
||||||
conditionals : true,
|
conditionals: true,
|
||||||
comparisons : true,
|
dead_code: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
booleans : true,
|
if_return: true,
|
||||||
unused : true,
|
sequences: true,
|
||||||
side_effects : true,
|
side_effects: true,
|
||||||
dead_code : true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(x, y) {
|
function f(x, y) {
|
||||||
@@ -100,15 +100,15 @@ if_return_4: {
|
|||||||
|
|
||||||
if_return_5: {
|
if_return_5: {
|
||||||
options = {
|
options = {
|
||||||
if_return : true,
|
booleans: true,
|
||||||
sequences : true,
|
comparisons: true,
|
||||||
conditionals : true,
|
conditionals: true,
|
||||||
comparisons : true,
|
dead_code: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
booleans : true,
|
if_return: true,
|
||||||
unused : true,
|
sequences: true,
|
||||||
side_effects : true,
|
side_effects: true,
|
||||||
dead_code : true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f() {
|
function f() {
|
||||||
@@ -126,15 +126,15 @@ if_return_5: {
|
|||||||
|
|
||||||
if_return_6: {
|
if_return_6: {
|
||||||
options = {
|
options = {
|
||||||
if_return : true,
|
booleans: true,
|
||||||
sequences : true,
|
comparisons: true,
|
||||||
conditionals : true,
|
conditionals: true,
|
||||||
comparisons : true,
|
dead_code: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
booleans : true,
|
if_return: true,
|
||||||
unused : true,
|
sequences: true,
|
||||||
side_effects : true,
|
side_effects: true,
|
||||||
dead_code : true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(x) {
|
function f(x) {
|
||||||
@@ -150,15 +150,15 @@ if_return_6: {
|
|||||||
|
|
||||||
if_return_7: {
|
if_return_7: {
|
||||||
options = {
|
options = {
|
||||||
if_return : true,
|
booleans: true,
|
||||||
sequences : true,
|
comparisons: true,
|
||||||
conditionals : true,
|
conditionals: true,
|
||||||
comparisons : true,
|
dead_code: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
booleans : true,
|
if_return: true,
|
||||||
unused : true,
|
sequences: true,
|
||||||
side_effects : true,
|
side_effects: true,
|
||||||
dead_code : true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(x) {
|
function f(x) {
|
||||||
@@ -176,10 +176,10 @@ if_return_7: {
|
|||||||
|
|
||||||
if_return_8: {
|
if_return_8: {
|
||||||
options = {
|
options = {
|
||||||
if_return: true,
|
conditionals: true,
|
||||||
sequences: true,
|
if_return: true,
|
||||||
conditionals: true,
|
sequences: true,
|
||||||
side_effects : true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(e) {
|
function f(e) {
|
||||||
@@ -220,15 +220,15 @@ if_return_8: {
|
|||||||
|
|
||||||
issue_1089: {
|
issue_1089: {
|
||||||
options = {
|
options = {
|
||||||
if_return : true,
|
booleans: true,
|
||||||
sequences : true,
|
comparisons: true,
|
||||||
conditionals : true,
|
conditionals: true,
|
||||||
comparisons : true,
|
dead_code: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
booleans : true,
|
if_return: true,
|
||||||
unused : true,
|
sequences: true,
|
||||||
side_effects : true,
|
side_effects: true,
|
||||||
dead_code : true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function x() {
|
function x() {
|
||||||
@@ -243,7 +243,7 @@ issue_1089: {
|
|||||||
expect: {
|
expect: {
|
||||||
function x() {
|
function x() {
|
||||||
var f = document.getElementById("fname");
|
var f = document.getElementById("fname");
|
||||||
if (f.files[0].size > 12345)
|
if (12345 < f.files[0].size)
|
||||||
return alert("alert"), f.focus(), !1;
|
return alert("alert"), f.focus(), !1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -251,9 +251,9 @@ issue_1089: {
|
|||||||
|
|
||||||
issue_1437: {
|
issue_1437: {
|
||||||
options = {
|
options = {
|
||||||
if_return : true,
|
conditionals: false,
|
||||||
sequences : true,
|
if_return: true,
|
||||||
conditionals : false
|
sequences: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function x() {
|
function x() {
|
||||||
@@ -281,9 +281,9 @@ issue_1437: {
|
|||||||
|
|
||||||
issue_1437_conditionals: {
|
issue_1437_conditionals: {
|
||||||
options = {
|
options = {
|
||||||
conditionals : true,
|
conditionals: true,
|
||||||
if_return : true,
|
if_return: true,
|
||||||
sequences : true
|
sequences: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function x() {
|
function x() {
|
||||||
@@ -327,64 +327,6 @@ issue_512: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1317: {
|
|
||||||
options = {
|
|
||||||
if_return: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
!function(a) {
|
|
||||||
if (a) return;
|
|
||||||
let b = 1;
|
|
||||||
function g() {
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
console.log(g());
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
!function(a) {
|
|
||||||
if (a) return;
|
|
||||||
let b = 1;
|
|
||||||
function g() {
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
console.log(g());
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
expect_stdout: "1"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1317_strict: {
|
|
||||||
options = {
|
|
||||||
if_return: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
"use strict";
|
|
||||||
!function(a) {
|
|
||||||
if (a) return;
|
|
||||||
let b = 1;
|
|
||||||
function g() {
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
console.log(g());
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
"use strict";
|
|
||||||
!function(a) {
|
|
||||||
if (a) return;
|
|
||||||
let b = 1;
|
|
||||||
function g() {
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
console.log(g());
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
expect_stdout: "1"
|
|
||||||
node_version: ">=4"
|
|
||||||
}
|
|
||||||
|
|
||||||
if_var_return: {
|
if_var_return: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
@@ -455,38 +397,150 @@ if_if_return_return: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_2747: {
|
if_body_return_1: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
|
||||||
if_return: true,
|
if_return: true,
|
||||||
sequences: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
"use strict";
|
var c = "PASS";
|
||||||
function f(baz) {
|
function f(a, b) {
|
||||||
if (baz === 0) {
|
if (a) {
|
||||||
return null;
|
if (b) throw new Error(c);
|
||||||
|
return 42;
|
||||||
}
|
}
|
||||||
let r;
|
return true;
|
||||||
if (baz > 2) {
|
}
|
||||||
r = 4;
|
console.log(f(0, 0));
|
||||||
} else {
|
console.log(f(0, 1));
|
||||||
r = 5;
|
console.log(f(1, 0));
|
||||||
}
|
try {
|
||||||
return r;
|
f(1, 1);
|
||||||
|
console.log("FAIL");
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e.message);
|
||||||
}
|
}
|
||||||
console.log(f(0), f(1), f(3));
|
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
"use strict";
|
var c = "PASS";
|
||||||
function f(baz) {
|
function f(a, b) {
|
||||||
if (0 === baz) return null;
|
if (a) {
|
||||||
let r;
|
if (b) throw new Error(c);
|
||||||
return r = baz > 2 ? 4 : 5, r;
|
return 42;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
console.log(f(0, 0));
|
||||||
|
console.log(f(0, 1));
|
||||||
|
console.log(f(1, 0));
|
||||||
|
try {
|
||||||
|
f(1, 1);
|
||||||
|
console.log("FAIL");
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e.message);
|
||||||
}
|
}
|
||||||
console.log(f(0), f(1), f(3));
|
|
||||||
}
|
}
|
||||||
expect_stdout: "null 5 4"
|
expect_stdout: [
|
||||||
node_version: ">=4"
|
"true",
|
||||||
|
"true",
|
||||||
|
"42",
|
||||||
|
"PASS",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
if_body_return_2: {
|
||||||
|
options = {
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var c = "PASS";
|
||||||
|
function f(a, b) {
|
||||||
|
if (0 + a) {
|
||||||
|
if (b) throw new Error(c);
|
||||||
|
return 42;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
console.log(f(0, 0));
|
||||||
|
console.log(f(0, 1));
|
||||||
|
console.log(f(1, 0));
|
||||||
|
try {
|
||||||
|
f(1, 1);
|
||||||
|
console.log("FAIL");
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var c = "PASS";
|
||||||
|
function f(a, b) {
|
||||||
|
if (0 + a) {
|
||||||
|
if (b) throw new Error(c);
|
||||||
|
return 42;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
console.log(f(0, 0));
|
||||||
|
console.log(f(0, 1));
|
||||||
|
console.log(f(1, 0));
|
||||||
|
try {
|
||||||
|
f(1, 1);
|
||||||
|
console.log("FAIL");
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"true",
|
||||||
|
"true",
|
||||||
|
"42",
|
||||||
|
"PASS",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
if_body_return_3: {
|
||||||
|
options = {
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var c = "PASS";
|
||||||
|
function f(a, b) {
|
||||||
|
if (1 == a) {
|
||||||
|
if (b) throw new Error(c);
|
||||||
|
return 42;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
console.log(f(0, 0));
|
||||||
|
console.log(f(0, 1));
|
||||||
|
console.log(f(1, 0));
|
||||||
|
try {
|
||||||
|
f(1, 1);
|
||||||
|
console.log("FAIL");
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var c = "PASS";
|
||||||
|
function f(a, b) {
|
||||||
|
if (1 != a) return true;
|
||||||
|
if (b) throw new Error(c);
|
||||||
|
return 42;
|
||||||
|
}
|
||||||
|
console.log(f(0, 0));
|
||||||
|
console.log(f(0, 1));
|
||||||
|
console.log(f(1, 0));
|
||||||
|
try {
|
||||||
|
f(1, 1);
|
||||||
|
console.log("FAIL");
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"true",
|
||||||
|
"true",
|
||||||
|
"42",
|
||||||
|
"PASS",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
parenthesis_strings_in_parenthesis: {
|
|
||||||
input: {
|
|
||||||
var foo = ('(');
|
|
||||||
a(')');
|
|
||||||
|
|
||||||
}
|
|
||||||
expect_exact: 'var foo="(";a(")");'
|
|
||||||
}
|
|
||||||
@@ -1,8 +1,17 @@
|
|||||||
non_hoisted_function_after_return: {
|
non_hoisted_function_after_return: {
|
||||||
options = {
|
options = {
|
||||||
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
booleans: true,
|
||||||
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
comparisons: true,
|
||||||
if_return: true, join_vars: true, side_effects: true
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: false,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo(x) {
|
function foo(x) {
|
||||||
@@ -27,19 +36,30 @@ non_hoisted_function_after_return: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
'WARN: Dropping unreachable code [test/compress/issue-1034.js:11,16]',
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:4,16]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:14,16]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:7,16]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:17,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:10,12]",
|
||||||
"WARN: Dropping unused function UnusedFunction [test/compress/issue-1034.js:18,21]"
|
"WARN: Dropping unused function UnusedFunction [test/compress/issue-1034.js:11,21]"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
non_hoisted_function_after_return_2a: {
|
non_hoisted_function_after_return_2a: {
|
||||||
options = {
|
options = {
|
||||||
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
booleans: true,
|
||||||
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
collapse_vars: false,
|
||||||
if_return: true, join_vars: true, side_effects: true,
|
comparisons: true,
|
||||||
collapse_vars: false, passes: 2, warnings: "verbose"
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: false,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
passes: 2,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
warnings: "verbose",
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo(x) {
|
function foo(x) {
|
||||||
@@ -65,28 +85,37 @@ non_hoisted_function_after_return_2a: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:48,16]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:4,16]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:48,16]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:4,16]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:51,16]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:7,16]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:51,16]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:7,16]",
|
||||||
"WARN: Dropping unused variable a [test/compress/issue-1034.js:48,20]",
|
"WARN: Dropping unused variable a [test/compress/issue-1034.js:4,20]",
|
||||||
"WARN: Dropping unused function nope [test/compress/issue-1034.js:55,21]",
|
"WARN: Dropping unused function nope [test/compress/issue-1034.js:11,21]",
|
||||||
"WARN: pass 0: last_count: Infinity, count: 37",
|
"WARN: pass 0: last_count: Infinity, count: 37",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:53,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:9,12]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:53,12]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:9,12]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:56,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:12,12]",
|
||||||
"WARN: Dropping unused variable b [test/compress/issue-1034.js:51,20]",
|
"WARN: Dropping unused variable b [test/compress/issue-1034.js:7,20]",
|
||||||
"WARN: Dropping unused variable c [test/compress/issue-1034.js:53,16]",
|
"WARN: Dropping unused variable c [test/compress/issue-1034.js:9,16]",
|
||||||
"WARN: pass 1: last_count: 37, count: 18",
|
"WARN: pass 1: last_count: 37, count: 18",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
non_hoisted_function_after_return_2b: {
|
non_hoisted_function_after_return_2b: {
|
||||||
options = {
|
options = {
|
||||||
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
booleans: true,
|
||||||
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
collapse_vars: false,
|
||||||
if_return: true, join_vars: true, side_effects: true,
|
comparisons: true,
|
||||||
collapse_vars: false
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: false,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo(x) {
|
function foo(x) {
|
||||||
@@ -110,20 +139,28 @@ non_hoisted_function_after_return_2b: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
// duplicate warnings no longer emitted
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:6,16]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:97,16]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:6,16]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:97,16]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:8,12]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:99,12]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:8,12]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:99,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:12,12]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:103,12]",
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
non_hoisted_function_after_return_strict: {
|
non_hoisted_function_after_return_strict: {
|
||||||
options = {
|
options = {
|
||||||
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
booleans: true,
|
||||||
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
comparisons: true,
|
||||||
if_return: true, join_vars: true, side_effects: true
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: false,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -153,19 +190,30 @@ non_hoisted_function_after_return_strict: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "8 7"
|
expect_stdout: "8 7"
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:133,16]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:5,16]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:136,16]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:8,16]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:139,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:11,12]",
|
||||||
"WARN: Dropping unused function UnusedFunction [test/compress/issue-1034.js:140,21]",
|
"WARN: Dropping unused function UnusedFunction [test/compress/issue-1034.js:12,21]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
non_hoisted_function_after_return_2a_strict: {
|
non_hoisted_function_after_return_2a_strict: {
|
||||||
options = {
|
options = {
|
||||||
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
booleans: true,
|
||||||
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
collapse_vars: false,
|
||||||
if_return: true, join_vars: true, side_effects: true,
|
comparisons: true,
|
||||||
collapse_vars: false, passes: 2, warnings: "verbose"
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: false,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
passes: 2,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
warnings: "verbose",
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -196,28 +244,37 @@ non_hoisted_function_after_return_2a_strict: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "5 6"
|
expect_stdout: "5 6"
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:175,16]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:5,16]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:175,16]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:5,16]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:178,16]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:8,16]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:178,16]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:8,16]",
|
||||||
"WARN: Dropping unused variable a [test/compress/issue-1034.js:175,20]",
|
"WARN: Dropping unused variable a [test/compress/issue-1034.js:5,20]",
|
||||||
"WARN: Dropping unused function nope [test/compress/issue-1034.js:182,21]",
|
"WARN: Dropping unused function nope [test/compress/issue-1034.js:12,21]",
|
||||||
"WARN: pass 0: last_count: Infinity, count: 48",
|
"WARN: pass 0: last_count: Infinity, count: 48",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:180,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:10,12]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:180,12]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:10,12]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:183,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:13,12]",
|
||||||
"WARN: Dropping unused variable b [test/compress/issue-1034.js:178,20]",
|
"WARN: Dropping unused variable b [test/compress/issue-1034.js:8,20]",
|
||||||
"WARN: Dropping unused variable c [test/compress/issue-1034.js:180,16]",
|
"WARN: Dropping unused variable c [test/compress/issue-1034.js:10,16]",
|
||||||
"WARN: pass 1: last_count: 48, count: 29",
|
"WARN: pass 1: last_count: 48, count: 29",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
non_hoisted_function_after_return_2b_strict: {
|
non_hoisted_function_after_return_2b_strict: {
|
||||||
options = {
|
options = {
|
||||||
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
booleans: true,
|
||||||
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
collapse_vars: false,
|
||||||
if_return: true, join_vars: true, side_effects: true,
|
comparisons: true,
|
||||||
collapse_vars: false
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: false,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -246,11 +303,10 @@ non_hoisted_function_after_return_2b_strict: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "5 6"
|
expect_stdout: "5 6"
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
// duplicate warnings no longer emitted
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:7,16]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:229,16]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:7,16]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:229,16]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:9,12]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:231,12]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:9,12]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:231,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:13,12]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:235,12]",
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,22 +1,9 @@
|
|||||||
const_declaration: {
|
|
||||||
options = {
|
|
||||||
evaluate: true
|
|
||||||
};
|
|
||||||
|
|
||||||
input: {
|
|
||||||
const goog = goog || {};
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
const goog = goog || {};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const_pragma: {
|
const_pragma: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
};
|
}
|
||||||
|
|
||||||
input: {
|
input: {
|
||||||
/** @const */ var goog = goog || {};
|
/** @const */ var goog = goog || {};
|
||||||
@@ -32,7 +19,7 @@ not_const: {
|
|||||||
evaluate: true,
|
evaluate: true,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
};
|
}
|
||||||
|
|
||||||
input: {
|
input: {
|
||||||
var goog = goog || {};
|
var goog = goog || {};
|
||||||
|
|||||||
@@ -1,30 +0,0 @@
|
|||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
issue_1044: {
|
|
||||||
options = { evaluate: true, conditionals: true };
|
|
||||||
input: {
|
|
||||||
const mixed = Base ? class extends Base {} : class {}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
const mixed = Base ? class extends Base {} : class {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -134,8 +134,9 @@ defun_hoist_funs: {
|
|||||||
expect: {
|
expect: {
|
||||||
function e() {
|
function e() {
|
||||||
function f() {}
|
function f() {}
|
||||||
|
function g() {}
|
||||||
function h() {}
|
function h() {}
|
||||||
if (window) function g() {}
|
if (window);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
with_in_global_scope: {
|
with_in_global_scope: {
|
||||||
options = {
|
options = {
|
||||||
unused: true
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var o = 42;
|
var o = 42;
|
||||||
@@ -18,7 +18,7 @@ with_in_global_scope: {
|
|||||||
}
|
}
|
||||||
with_in_function_scope: {
|
with_in_function_scope: {
|
||||||
options = {
|
options = {
|
||||||
unused: true
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo() {
|
function foo() {
|
||||||
@@ -40,7 +40,7 @@ with_in_function_scope: {
|
|||||||
}
|
}
|
||||||
compress_with_with_in_other_scope: {
|
compress_with_with_in_other_scope: {
|
||||||
options = {
|
options = {
|
||||||
unused: true
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo() {
|
function foo() {
|
||||||
@@ -69,7 +69,7 @@ compress_with_with_in_other_scope: {
|
|||||||
}
|
}
|
||||||
with_using_existing_variable_outside_scope: {
|
with_using_existing_variable_outside_scope: {
|
||||||
options = {
|
options = {
|
||||||
unused: true
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f() {
|
function f() {
|
||||||
@@ -99,7 +99,7 @@ with_using_existing_variable_outside_scope: {
|
|||||||
}
|
}
|
||||||
check_drop_unused_in_peer_function: {
|
check_drop_unused_in_peer_function: {
|
||||||
options = {
|
options = {
|
||||||
unused: true
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function outer() {
|
function outer() {
|
||||||
@@ -148,7 +148,7 @@ check_drop_unused_in_peer_function: {
|
|||||||
|
|
||||||
Infinity_not_in_with_scope: {
|
Infinity_not_in_with_scope: {
|
||||||
options = {
|
options = {
|
||||||
unused: true
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var o = { Infinity: 'oInfinity' };
|
var o = { Infinity: 'oInfinity' };
|
||||||
@@ -164,7 +164,7 @@ Infinity_not_in_with_scope: {
|
|||||||
|
|
||||||
Infinity_in_with_scope: {
|
Infinity_in_with_scope: {
|
||||||
options = {
|
options = {
|
||||||
unused: true
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var o = { Infinity: 'oInfinity' };
|
var o = { Infinity: 'oInfinity' };
|
||||||
@@ -180,19 +180,19 @@ Infinity_in_with_scope: {
|
|||||||
|
|
||||||
assorted_Infinity_NaN_undefined_in_with_scope: {
|
assorted_Infinity_NaN_undefined_in_with_scope: {
|
||||||
options = {
|
options = {
|
||||||
unused: true,
|
booleans: true,
|
||||||
evaluate: true,
|
comparisons: true,
|
||||||
dead_code: true,
|
conditionals: true,
|
||||||
conditionals: true,
|
dead_code: true,
|
||||||
comparisons: true,
|
evaluate: true,
|
||||||
booleans: true,
|
hoist_funs: true,
|
||||||
hoist_funs: true,
|
if_return: true,
|
||||||
keep_fargs: true,
|
join_vars: true,
|
||||||
if_return: true,
|
keep_fargs: true,
|
||||||
join_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
sequences: false,
|
|
||||||
keep_infinity: false,
|
keep_infinity: false,
|
||||||
|
sequences: false,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var f = console.log;
|
var f = console.log;
|
||||||
@@ -242,19 +242,19 @@ assorted_Infinity_NaN_undefined_in_with_scope: {
|
|||||||
|
|
||||||
assorted_Infinity_NaN_undefined_in_with_scope_keep_infinity: {
|
assorted_Infinity_NaN_undefined_in_with_scope_keep_infinity: {
|
||||||
options = {
|
options = {
|
||||||
unused: true,
|
booleans: true,
|
||||||
evaluate: true,
|
comparisons: true,
|
||||||
dead_code: true,
|
conditionals: true,
|
||||||
conditionals: true,
|
dead_code: true,
|
||||||
comparisons: true,
|
evaluate: true,
|
||||||
booleans: true,
|
hoist_funs: true,
|
||||||
hoist_funs: true,
|
if_return: true,
|
||||||
keep_fargs: true,
|
join_vars: true,
|
||||||
if_return: true,
|
keep_fargs: true,
|
||||||
join_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
sequences: false,
|
|
||||||
keep_infinity: true,
|
keep_infinity: true,
|
||||||
|
sequences: false,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var f = console.log;
|
var f = console.log;
|
||||||
|
|||||||
@@ -1,11 +1,15 @@
|
|||||||
keep_name_of_getter: {
|
keep_name_of_getter: {
|
||||||
options = { unused: true };
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: { a = { get foo () {} } }
|
input: { a = { get foo () {} } }
|
||||||
expect: { a = { get foo () {} } }
|
expect: { a = { get foo () {} } }
|
||||||
}
|
}
|
||||||
|
|
||||||
keep_name_of_setter: {
|
keep_name_of_setter: {
|
||||||
options = { unused: true };
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: { a = { set foo () {} } }
|
input: { a = { set foo () {} } }
|
||||||
expect: { a = { set foo () {} } }
|
expect: { a = { set foo () {} } }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
mangle_keep_fnames_false: {
|
mangle_keep_fnames_false: {
|
||||||
options = {
|
options = {
|
||||||
keep_fnames : true,
|
keep_fargs: true,
|
||||||
keep_fargs : true,
|
keep_fnames: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
keep_fnames : false,
|
keep_fnames : false,
|
||||||
@@ -26,8 +26,8 @@ mangle_keep_fnames_false: {
|
|||||||
|
|
||||||
mangle_keep_fnames_true: {
|
mangle_keep_fnames_true: {
|
||||||
options = {
|
options = {
|
||||||
keep_fnames : true,
|
keep_fargs: true,
|
||||||
keep_fargs : true,
|
keep_fnames: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
keep_fnames : true,
|
keep_fnames : true,
|
||||||
|
|||||||
@@ -1,76 +0,0 @@
|
|||||||
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,
|
|
||||||
collapse_vars : 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,
|
|
||||||
collapse_vars : 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,14 +1,14 @@
|
|||||||
pure_function_calls: {
|
pure_function_calls: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
booleans: true,
|
||||||
conditionals : true,
|
comparisons: true,
|
||||||
comparisons : true,
|
conditionals: true,
|
||||||
side_effects : true,
|
evaluate: true,
|
||||||
booleans : true,
|
if_return: true,
|
||||||
unused : true,
|
join_vars: true,
|
||||||
if_return : true,
|
negate_iife: true,
|
||||||
join_vars : true,
|
side_effects: true,
|
||||||
negate_iife : true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
// pure top-level IIFE will be dropped
|
// pure top-level IIFE will be dropped
|
||||||
@@ -48,28 +48,28 @@ pure_function_calls: {
|
|||||||
a.b(), f.g();
|
a.b(), f.g();
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:16,8]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:3,8]",
|
||||||
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:16,8]",
|
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:3,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:29,37]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:16,37]",
|
||||||
"WARN: Dropping unused variable iife2 [test/compress/issue-1261.js:29,16]",
|
"WARN: Dropping unused variable iife2 [test/compress/issue-1261.js:16,16]",
|
||||||
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:27,8]",
|
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:14,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:37,8]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:24,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:38,31]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:25,31]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
pure_function_calls_toplevel: {
|
pure_function_calls_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
booleans: true,
|
||||||
conditionals : true,
|
comparisons: true,
|
||||||
comparisons : true,
|
conditionals: true,
|
||||||
side_effects : true,
|
evaluate: true,
|
||||||
booleans : true,
|
if_return: true,
|
||||||
unused : true,
|
join_vars: true,
|
||||||
if_return : true,
|
negate_iife: true,
|
||||||
join_vars : true,
|
side_effects: true,
|
||||||
negate_iife : true,
|
toplevel: true,
|
||||||
toplevel : true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
// pure top-level IIFE will be dropped
|
// pure top-level IIFE will be dropped
|
||||||
@@ -110,17 +110,17 @@ pure_function_calls_toplevel: {
|
|||||||
a.b(), f.g();
|
a.b(), f.g();
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:77,8]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:3,8]",
|
||||||
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:77,8]",
|
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:3,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:90,37]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:16,37]",
|
||||||
"WARN: Dropping unused variable iife2 [test/compress/issue-1261.js:90,16]",
|
"WARN: Dropping unused variable iife2 [test/compress/issue-1261.js:16,16]",
|
||||||
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:88,8]",
|
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:14,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:105,8]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:31,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:106,31]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:32,31]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:82,33]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:8,33]",
|
||||||
"WARN: Dropping unused variable iife1 [test/compress/issue-1261.js:82,12]",
|
"WARN: Dropping unused variable iife1 [test/compress/issue-1261.js:8,12]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:98,45]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:24,45]",
|
||||||
"WARN: Dropping unused variable MyClass [test/compress/issue-1261.js:98,12]",
|
"WARN: Dropping unused variable MyClass [test/compress/issue-1261.js:24,12]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,29 +155,29 @@ should_warn: {
|
|||||||
baz();
|
baz();
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:135,61]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:1,61]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:135,23]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:1,23]",
|
||||||
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:135,23]",
|
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:1,23]",
|
||||||
"WARN: Boolean || always true [test/compress/issue-1261.js:136,23]",
|
"WARN: Boolean || always true [test/compress/issue-1261.js:2,23]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:136,23]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:2,23]",
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:136,23]",
|
"WARN: Condition always true [test/compress/issue-1261.js:2,23]",
|
||||||
"WARN: Condition left of || always true [test/compress/issue-1261.js:137,8]",
|
"WARN: Condition left of || always true [test/compress/issue-1261.js:3,8]",
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:137,8]",
|
"WARN: Condition always true [test/compress/issue-1261.js:3,8]",
|
||||||
"WARN: Boolean && always false [test/compress/issue-1261.js:138,23]",
|
"WARN: Boolean && always false [test/compress/issue-1261.js:4,23]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:138,23]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:4,23]",
|
||||||
"WARN: Condition always false [test/compress/issue-1261.js:138,23]",
|
"WARN: Condition always false [test/compress/issue-1261.js:4,23]",
|
||||||
"WARN: Condition left of && always false [test/compress/issue-1261.js:139,8]",
|
"WARN: Condition left of && always false [test/compress/issue-1261.js:5,8]",
|
||||||
"WARN: Condition always false [test/compress/issue-1261.js:139,8]",
|
"WARN: Condition always false [test/compress/issue-1261.js:5,8]",
|
||||||
"WARN: + in boolean context always true [test/compress/issue-1261.js:140,23]",
|
"WARN: + in boolean context always true [test/compress/issue-1261.js:6,23]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:140,23]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:6,23]",
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:140,23]",
|
"WARN: Condition always true [test/compress/issue-1261.js:6,23]",
|
||||||
"WARN: + in boolean context always true [test/compress/issue-1261.js:141,8]",
|
"WARN: + in boolean context always true [test/compress/issue-1261.js:7,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:141,31]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:7,31]",
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:141,8]",
|
"WARN: Condition always true [test/compress/issue-1261.js:7,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:142,23]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:8,23]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:143,24]",
|
"WARN: Condition always true [test/compress/issue-1261.js:9,8]",
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:143,8]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:9,24]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:144,31]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:10,31]",
|
||||||
"WARN: Condition always false [test/compress/issue-1261.js:144,8]",
|
"WARN: Condition always false [test/compress/issue-1261.js:10,8]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
string_plus_optimization: {
|
string_plus_optimization: {
|
||||||
options = {
|
options = {
|
||||||
side_effects : true,
|
booleans: true,
|
||||||
evaluate : true,
|
comparisons: true,
|
||||||
conditionals : true,
|
conditionals: true,
|
||||||
comparisons : true,
|
dead_code: true,
|
||||||
dead_code : true,
|
evaluate: true,
|
||||||
booleans : true,
|
hoist_funs: true,
|
||||||
unused : true,
|
if_return: true,
|
||||||
if_return : true,
|
join_vars: true,
|
||||||
join_vars : true,
|
side_effects: true,
|
||||||
hoist_funs : true,
|
unused: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo(anything) {
|
function foo(anything) {
|
||||||
function throwing_function() {
|
function throwing_function() {
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
tranformation_sort_order_equal: {
|
tranformation_sort_order_equal: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
};
|
}
|
||||||
|
|
||||||
input: { (a = parseInt('100')) == a }
|
input: { (a = parseInt('100')) == a }
|
||||||
expect: { (a = parseInt('100')) == a }
|
expect: { (a = parseInt('100')) == a }
|
||||||
@@ -24,7 +24,7 @@ tranformation_sort_order_equal: {
|
|||||||
tranformation_sort_order_unequal: {
|
tranformation_sort_order_unequal: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
};
|
}
|
||||||
|
|
||||||
input: { (a = parseInt('100')) != a }
|
input: { (a = parseInt('100')) != a }
|
||||||
expect: { (a = parseInt('100')) != a }
|
expect: { (a = parseInt('100')) != a }
|
||||||
@@ -33,7 +33,7 @@ tranformation_sort_order_unequal: {
|
|||||||
tranformation_sort_order_lesser_or_equal: {
|
tranformation_sort_order_lesser_or_equal: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
};
|
}
|
||||||
|
|
||||||
input: { (a = parseInt('100')) <= a }
|
input: { (a = parseInt('100')) <= a }
|
||||||
expect: { (a = parseInt('100')) <= a }
|
expect: { (a = parseInt('100')) <= a }
|
||||||
@@ -41,7 +41,7 @@ tranformation_sort_order_lesser_or_equal: {
|
|||||||
tranformation_sort_order_greater_or_equal: {
|
tranformation_sort_order_greater_or_equal: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
};
|
}
|
||||||
|
|
||||||
input: { (a = parseInt('100')) >= a }
|
input: { (a = parseInt('100')) >= a }
|
||||||
expect: { (a = parseInt('100')) >= a }
|
expect: { (a = parseInt('100')) >= a }
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
level_zero: {
|
level_zero: {
|
||||||
options = {
|
options = {
|
||||||
keep_fnames: true
|
keep_fnames: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
keep_fnames: true
|
keep_fnames: true
|
||||||
@@ -29,7 +29,7 @@ level_zero: {
|
|||||||
|
|
||||||
level_one: {
|
level_one: {
|
||||||
options = {
|
options = {
|
||||||
keep_fnames: true
|
keep_fnames: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
keep_fnames: true
|
keep_fnames: true
|
||||||
@@ -58,7 +58,7 @@ level_one: {
|
|||||||
|
|
||||||
level_two: {
|
level_two: {
|
||||||
options = {
|
options = {
|
||||||
keep_fnames: true
|
keep_fnames: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
keep_fnames: true
|
keep_fnames: true
|
||||||
@@ -97,7 +97,7 @@ level_two: {
|
|||||||
|
|
||||||
level_three: {
|
level_three: {
|
||||||
options = {
|
options = {
|
||||||
keep_fnames: true
|
keep_fnames: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
keep_fnames: true
|
keep_fnames: true
|
||||||
|
|||||||
@@ -22,17 +22,17 @@ else_with_empty_statement: {
|
|||||||
|
|
||||||
conditional_false_stray_else_in_loop: {
|
conditional_false_stray_else_in_loop: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
booleans: true,
|
||||||
comparisons : true,
|
comparisons: true,
|
||||||
booleans : true,
|
conditionals: false,
|
||||||
unused : true,
|
dead_code: true,
|
||||||
loops : true,
|
evaluate: true,
|
||||||
side_effects : true,
|
hoist_vars: true,
|
||||||
dead_code : true,
|
if_return: true,
|
||||||
hoist_vars : true,
|
join_vars: true,
|
||||||
join_vars : true,
|
loops: true,
|
||||||
if_return : true,
|
side_effects: true,
|
||||||
conditionals : false,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
for (var i = 1; i <= 4; ++i) {
|
for (var i = 1; i <= 4; ++i) {
|
||||||
|
|||||||
@@ -1,459 +0,0 @@
|
|||||||
same_variable_in_multiple_for_loop: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
dead_code: true,
|
|
||||||
conditionals: true,
|
|
||||||
comparisons: true,
|
|
||||||
evaluate: true,
|
|
||||||
booleans: true,
|
|
||||||
loops: true,
|
|
||||||
unused: true,
|
|
||||||
keep_fargs: true,
|
|
||||||
if_return: true,
|
|
||||||
join_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
collapse_vars: true,
|
|
||||||
}
|
|
||||||
mangle = {}
|
|
||||||
input: {
|
|
||||||
for (let i = 0; i < 3; i++) {
|
|
||||||
let a = 100;
|
|
||||||
console.log(i, a);
|
|
||||||
for (let i = 0; i < 2; i++) {
|
|
||||||
console.log(i, a);
|
|
||||||
let c = 2;
|
|
||||||
console.log(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
for (let o = 0; o < 3; o++) {
|
|
||||||
let l = 100;
|
|
||||||
console.log(o, l);
|
|
||||||
for (let o = 0; o < 2; o++) {
|
|
||||||
console.log(o, l);
|
|
||||||
let e = 2;
|
|
||||||
console.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
same_variable_in_multiple_forOf: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
dead_code: true,
|
|
||||||
conditionals: true,
|
|
||||||
comparisons: true,
|
|
||||||
evaluate: true,
|
|
||||||
booleans: true,
|
|
||||||
loops: true,
|
|
||||||
unused: true,
|
|
||||||
keep_fargs: true,
|
|
||||||
if_return: true,
|
|
||||||
join_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
collapse_vars: true,
|
|
||||||
}
|
|
||||||
mangle = {}
|
|
||||||
input: {
|
|
||||||
var test = [ "a", "b", "c" ];
|
|
||||||
for (let tmp of test) {
|
|
||||||
console.log(tmp);
|
|
||||||
let dd;
|
|
||||||
dd = [ "e", "f", "g" ];
|
|
||||||
for (let tmp of dd) {
|
|
||||||
console.log(tmp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var test = [ "a", "b", "c" ];
|
|
||||||
for (let o of test) {
|
|
||||||
console.log(o);
|
|
||||||
let e;
|
|
||||||
e = [ "e", "f", "g" ];
|
|
||||||
for (let o of e)
|
|
||||||
console.log(o);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
same_variable_in_multiple_forIn: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
dead_code: true,
|
|
||||||
conditionals: true,
|
|
||||||
comparisons: true,
|
|
||||||
evaluate: true,
|
|
||||||
booleans: true,
|
|
||||||
loops: true,
|
|
||||||
unused: false,
|
|
||||||
keep_fargs: true,
|
|
||||||
if_return: true,
|
|
||||||
join_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
collapse_vars: true,
|
|
||||||
}
|
|
||||||
mangle = {}
|
|
||||||
input: {
|
|
||||||
var test = [ "a", "b", "c" ];
|
|
||||||
for (let tmp in test) {
|
|
||||||
console.log(tmp);
|
|
||||||
let dd;
|
|
||||||
dd = [ "e", "f", "g" ];
|
|
||||||
for (let tmp in test) {
|
|
||||||
console.log(tmp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var test = [ "a", "b", "c" ];
|
|
||||||
for (let e in test) {
|
|
||||||
console.log(e);
|
|
||||||
let t;
|
|
||||||
t = [ "e", "f", "g" ];
|
|
||||||
for (let e in test)
|
|
||||||
console.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
different_variable_in_multiple_for_loop: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
dead_code: true,
|
|
||||||
conditionals: true,
|
|
||||||
comparisons: true,
|
|
||||||
evaluate: true,
|
|
||||||
booleans: true,
|
|
||||||
loops: true,
|
|
||||||
unused: true,
|
|
||||||
keep_fargs: true,
|
|
||||||
if_return: true,
|
|
||||||
join_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
collapse_vars: true,
|
|
||||||
}
|
|
||||||
mangle = {}
|
|
||||||
input: {
|
|
||||||
for (let i = 0; i < 3; i++) {
|
|
||||||
let a = 100;
|
|
||||||
console.log(i, a);
|
|
||||||
for (let j = 0; j < 2; j++) {
|
|
||||||
console.log(j, a);
|
|
||||||
let c = 2;
|
|
||||||
console.log(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
for (let o = 0; o < 3; o++) {
|
|
||||||
let l = 100;
|
|
||||||
console.log(o, l);
|
|
||||||
for (let o = 0; o < 2; o++) {
|
|
||||||
console.log(o, l);
|
|
||||||
let e = 2;
|
|
||||||
console.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
different_variable_in_multiple_forOf: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
dead_code: true,
|
|
||||||
conditionals: true,
|
|
||||||
comparisons: true,
|
|
||||||
evaluate: true,
|
|
||||||
booleans: true,
|
|
||||||
loops: true,
|
|
||||||
unused: true,
|
|
||||||
keep_fargs: true,
|
|
||||||
if_return: true,
|
|
||||||
join_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
collapse_vars: true,
|
|
||||||
}
|
|
||||||
mangle = {}
|
|
||||||
input: {
|
|
||||||
var test = [ "a", "b", "c" ];
|
|
||||||
for (let tmp of test) {
|
|
||||||
console.log(tmp);
|
|
||||||
let dd;
|
|
||||||
dd = [ "e", "f", "g" ];
|
|
||||||
for (let t of dd) {
|
|
||||||
console.log(t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var test = [ "a", "b", "c" ];
|
|
||||||
for (let o of test) {
|
|
||||||
console.log(o);
|
|
||||||
let e;
|
|
||||||
e = [ "e", "f", "g" ];
|
|
||||||
for (let o of e)
|
|
||||||
console.log(o);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
different_variable_in_multiple_forIn: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
dead_code: true,
|
|
||||||
conditionals: true,
|
|
||||||
comparisons: true,
|
|
||||||
evaluate: true,
|
|
||||||
booleans: true,
|
|
||||||
loops: true,
|
|
||||||
unused: false,
|
|
||||||
keep_fargs: true,
|
|
||||||
if_return: true,
|
|
||||||
join_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
collapse_vars: true,
|
|
||||||
}
|
|
||||||
mangle = {}
|
|
||||||
input: {
|
|
||||||
var test = [ "a", "b", "c" ];
|
|
||||||
for (let tmp in test) {
|
|
||||||
console.log(tmp);
|
|
||||||
let dd;
|
|
||||||
dd = [ "e", "f", "g" ];
|
|
||||||
for (let t in test) {
|
|
||||||
console.log(t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var test = [ "a", "b", "c" ];
|
|
||||||
for (let e in test) {
|
|
||||||
console.log(e);
|
|
||||||
let t;
|
|
||||||
t = [ "e", "f", "g" ];
|
|
||||||
for (let e in test)
|
|
||||||
console.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
same_variable_in_multiple_forOf_sequences_let: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
dead_code: true,
|
|
||||||
conditionals: true,
|
|
||||||
comparisons: true,
|
|
||||||
evaluate: true,
|
|
||||||
booleans: true,
|
|
||||||
loops: true,
|
|
||||||
unused: true,
|
|
||||||
keep_fargs: true,
|
|
||||||
if_return: true,
|
|
||||||
join_vars: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
collapse_vars: true,
|
|
||||||
}
|
|
||||||
mangle = {}
|
|
||||||
input: {
|
|
||||||
var test = [ "a", "b", "c" ];
|
|
||||||
for (let tmp of test) {
|
|
||||||
console.log(tmp);
|
|
||||||
let dd;
|
|
||||||
dd = [ "e", "f", "g" ];
|
|
||||||
for (let tmp of dd) {
|
|
||||||
console.log(tmp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var test = [ "a", "b", "c" ];
|
|
||||||
for (let o of test) {
|
|
||||||
let e;
|
|
||||||
console.log(o), e = [ "e", "f", "g" ];
|
|
||||||
for (let o of e)
|
|
||||||
console.log(o);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
same_variable_in_multiple_forOf_sequences_const: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
dead_code: true,
|
|
||||||
conditionals: true,
|
|
||||||
comparisons: true,
|
|
||||||
evaluate: true,
|
|
||||||
booleans: true,
|
|
||||||
loops: true,
|
|
||||||
unused: true,
|
|
||||||
keep_fargs: true,
|
|
||||||
if_return: true,
|
|
||||||
join_vars: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
collapse_vars: true,
|
|
||||||
}
|
|
||||||
mangle = {}
|
|
||||||
input: {
|
|
||||||
var test = [ "a", "b", "c" ];
|
|
||||||
for (const tmp of test) {
|
|
||||||
console.log(tmp);
|
|
||||||
let dd;
|
|
||||||
dd = [ "e", "f", "g" ];
|
|
||||||
for (const tmp of dd) {
|
|
||||||
console.log(tmp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var test = [ "a", "b", "c" ];
|
|
||||||
for (const o of test) {
|
|
||||||
let t;
|
|
||||||
console.log(o), t = [ "e", "f", "g" ];
|
|
||||||
for (const o of t)
|
|
||||||
console.log(o);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
same_variable_in_multiple_forIn_sequences_let: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
dead_code: true,
|
|
||||||
conditionals: true,
|
|
||||||
comparisons: true,
|
|
||||||
evaluate: true,
|
|
||||||
booleans: true,
|
|
||||||
loops: true,
|
|
||||||
unused: false,
|
|
||||||
keep_fargs: true,
|
|
||||||
if_return: true,
|
|
||||||
join_vars: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
collapse_vars: true,
|
|
||||||
}
|
|
||||||
mangle = {}
|
|
||||||
input: {
|
|
||||||
var test = [ "a", "b", "c" ];
|
|
||||||
for (let tmp in test) {
|
|
||||||
console.log(tmp);
|
|
||||||
let dd;
|
|
||||||
dd = [ "e", "f", "g" ];
|
|
||||||
for (let tmp in test) {
|
|
||||||
console.log(tmp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var test = [ "a", "b", "c" ];
|
|
||||||
for (let e in test) {
|
|
||||||
let t;
|
|
||||||
console.log(e), t = [ "e", "f", "g" ];
|
|
||||||
for (let e in test)
|
|
||||||
console.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
same_variable_in_multiple_forIn_sequences_const: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
dead_code: true,
|
|
||||||
conditionals: true,
|
|
||||||
comparisons: true,
|
|
||||||
evaluate: true,
|
|
||||||
booleans: true,
|
|
||||||
loops: true,
|
|
||||||
unused: false,
|
|
||||||
keep_fargs: true,
|
|
||||||
if_return: true,
|
|
||||||
join_vars: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
collapse_vars: true,
|
|
||||||
}
|
|
||||||
mangle = {}
|
|
||||||
input: {
|
|
||||||
var test = [ "a", "b", "c" ];
|
|
||||||
for (const tmp in test) {
|
|
||||||
console.log(tmp);
|
|
||||||
let dd;
|
|
||||||
dd = [ "e", "f", "g" ];
|
|
||||||
for (const tmp in test) {
|
|
||||||
console.log(tmp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var test = [ "a", "b", "c" ];
|
|
||||||
for (const o in test) {
|
|
||||||
let t;
|
|
||||||
console.log(o), t = [ "e", "f", "g" ];
|
|
||||||
for (const o in test)
|
|
||||||
console.log(o);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
more_variable_in_multiple_for: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
dead_code: true,
|
|
||||||
conditionals: true,
|
|
||||||
comparisons: true,
|
|
||||||
evaluate: true,
|
|
||||||
booleans: true,
|
|
||||||
loops: true,
|
|
||||||
unused: false,
|
|
||||||
keep_fargs: true,
|
|
||||||
if_return: true,
|
|
||||||
join_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
collapse_vars: true,
|
|
||||||
}
|
|
||||||
mangle = {}
|
|
||||||
input: {
|
|
||||||
for (let a = 9, i = 0; i < 20; i += a) {
|
|
||||||
let b = a++ + i;
|
|
||||||
console.log(a, b, i);
|
|
||||||
for (let k = b, m = b*b, i = 0; i < 10; i++) {
|
|
||||||
console.log(a, b, m, k, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
for (let o = 9, l = 0; l < 20; l += o) {
|
|
||||||
let e = o++ + l;
|
|
||||||
console.log(o, e, l);
|
|
||||||
for (let l = e, t = e * e, c = 0; c < 10; c++)
|
|
||||||
console.log(o, e, t, l, c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
@@ -85,15 +85,3 @@ unsafe_undefined: {
|
|||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
runtime_error: {
|
|
||||||
input: {
|
|
||||||
const a = 1;
|
|
||||||
console.log(a++);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
const a = 1;
|
|
||||||
console.log(a++);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ mangle_catch_toplevel: {
|
|||||||
}
|
}
|
||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
expect_exact: 'var o="FAIL";try{throw 1}catch(c){o="PASS"}console.log(o);'
|
expect_exact: 'var c="FAIL";try{throw 1}catch(o){c="PASS"}console.log(c);'
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -148,7 +148,7 @@ mangle_catch_var_toplevel: {
|
|||||||
}
|
}
|
||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
expect_exact: 'var o="FAIL";try{throw 1}catch(r){var o="PASS"}console.log(o);'
|
expect_exact: 'var r="FAIL";try{throw 1}catch(o){var r="PASS"}console.log(r);'
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -345,3 +345,95 @@ mangle_catch_redef_2_ie8_toplevel: {
|
|||||||
expect_exact: 'try{throw"FAIL1"}catch(o){var o="FAIL2"}console.log(o);'
|
expect_exact: 'try{throw"FAIL1"}catch(o){var o="FAIL2"}console.log(o);'
|
||||||
expect_stdout: "undefined"
|
expect_stdout: "undefined"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_3: {
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = "PASS";
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (o) {
|
||||||
|
(function() {
|
||||||
|
function f() {
|
||||||
|
o = "FAIL";
|
||||||
|
}
|
||||||
|
f(), f();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
expect_exact: 'var o="PASS";try{throw 0}catch(o){(function(){function c(){o="FAIL"}c(),c()})()}console.log(o);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_3_toplevel: {
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = "PASS";
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (o) {
|
||||||
|
(function() {
|
||||||
|
function f() {
|
||||||
|
o = "FAIL";
|
||||||
|
}
|
||||||
|
f(), f();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
expect_exact: 'var c="PASS";try{throw 0}catch(c){(function(){function o(){c="FAIL"}o(),o()})()}console.log(c);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_ie8_3: {
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = "PASS";
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (o) {
|
||||||
|
(function() {
|
||||||
|
function f() {
|
||||||
|
o = "FAIL";
|
||||||
|
}
|
||||||
|
f(), f();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
expect_exact: 'var o="PASS";try{throw 0}catch(o){(function(){function c(){o="FAIL"}c(),c()})()}console.log(o);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_3_ie8_toplevel: {
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = "PASS";
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (o) {
|
||||||
|
(function() {
|
||||||
|
function f() {
|
||||||
|
o = "FAIL";
|
||||||
|
}
|
||||||
|
f(), f();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
expect_exact: 'var c="PASS";try{throw 0}catch(c){(function(){function o(){c="FAIL"}o(),o()})()}console.log(c);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ function_iife_catch: {
|
|||||||
}
|
}
|
||||||
f();
|
f();
|
||||||
}
|
}
|
||||||
expect_exact: "function f(o){!function(){try{throw 0}catch(c){var o=1;console.log(c,o)}}()}f();"
|
expect_exact: "function f(o){!function(){try{throw 0}catch(o){var c=1;console.log(o,c)}}()}f();"
|
||||||
expect_stdout: "0 1"
|
expect_stdout: "0 1"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,7 +36,7 @@ function_iife_catch_ie8: {
|
|||||||
}
|
}
|
||||||
f();
|
f();
|
||||||
}
|
}
|
||||||
expect_exact: "function f(o){!function(){try{throw 0}catch(o){var c=1;console.log(o,c)}}()}f();"
|
expect_exact: "function f(c){!function(){try{throw 0}catch(c){var o=1;console.log(c,o)}}()}f();"
|
||||||
expect_stdout: "0 1"
|
expect_stdout: "0 1"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,7 +61,7 @@ function_catch_catch: {
|
|||||||
}
|
}
|
||||||
f();
|
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_exact: "var o=0;function f(){try{throw 1}catch(o){try{throw 2}catch(c){var c=3;console.log(c)}}console.log(c)}f();"
|
||||||
expect_stdout: [
|
expect_stdout: [
|
||||||
"3",
|
"3",
|
||||||
"undefined",
|
"undefined",
|
||||||
|
|||||||
@@ -107,3 +107,139 @@ numeric_literal: {
|
|||||||
"8 7 8",
|
"8 7 8",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
identifier: {
|
||||||
|
mangle = {
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
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 = {
|
||||||
|
e: 1,
|
||||||
|
t: 2,
|
||||||
|
n: 3,
|
||||||
|
a: 4,
|
||||||
|
i: 5,
|
||||||
|
o: 6,
|
||||||
|
r: 7,
|
||||||
|
l: 8,
|
||||||
|
s: 9,
|
||||||
|
c: 10,
|
||||||
|
f: 11,
|
||||||
|
u: 12,
|
||||||
|
d: 13,
|
||||||
|
h: 14,
|
||||||
|
p: 15,
|
||||||
|
b: 16,
|
||||||
|
v: 17,
|
||||||
|
w: 18,
|
||||||
|
y: 19,
|
||||||
|
g: 20,
|
||||||
|
m: 21,
|
||||||
|
k: 22,
|
||||||
|
x: 23,
|
||||||
|
j: 24,
|
||||||
|
z: 25,
|
||||||
|
q: 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,
|
||||||
|
ee: 57,
|
||||||
|
te: 58,
|
||||||
|
ne: 59,
|
||||||
|
ae: 60,
|
||||||
|
ie: 61,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -125,8 +125,8 @@ label_do: {
|
|||||||
|
|
||||||
label_while: {
|
label_while: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
loops: true,
|
loops: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
|||||||
@@ -1,283 +0,0 @@
|
|||||||
export_func_1: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export function f(){};
|
|
||||||
}
|
|
||||||
expect_exact: "export function f(){};"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_func_2: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
side_effects: false,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export function f(){}(1);
|
|
||||||
}
|
|
||||||
expect_exact: "export function f(){};1;"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_func_3: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export function f(){}(1);
|
|
||||||
}
|
|
||||||
expect_exact: "export function f(){};"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_default_func_1: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export default function f(){};
|
|
||||||
}
|
|
||||||
expect_exact: "export default function f(){};"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_default_func_2: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
side_effects: false,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export default function f(){}(1);
|
|
||||||
}
|
|
||||||
expect_exact: "export default function f(){};1;"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_default_func_3: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export default function f(){}(1);
|
|
||||||
}
|
|
||||||
expect_exact: "export default function f(){};"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_class_1: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export class C {};
|
|
||||||
}
|
|
||||||
expect_exact: "export class C{};"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_class_2: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
side_effects: false,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export class C {}(1);
|
|
||||||
}
|
|
||||||
expect_exact: "export class C{};1;"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_class_3: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export class C {}(1);
|
|
||||||
}
|
|
||||||
expect_exact: "export class C{};"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_default_class_1: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export default class C {};
|
|
||||||
}
|
|
||||||
expect_exact: "export default class C{};"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_default_class_2: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
side_effects: false,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export default class C {}(1);
|
|
||||||
}
|
|
||||||
expect_exact: "export default class C{};1;"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_default_class_3: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export default class C {}(1);
|
|
||||||
}
|
|
||||||
expect_exact: "export default class C{};"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_mangle_1: {
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export function foo(one, two) {
|
|
||||||
return one - two;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
expect_exact: "export function foo(o,n){return o-n};"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_mangle_2: {
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export default function foo(one, two) {
|
|
||||||
return one - two;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
expect_exact: "export default function foo(o,t){return o-t};"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_mangle_3: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export class C {
|
|
||||||
go(one, two) {
|
|
||||||
var z = one;
|
|
||||||
return one - two + z;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
expect_exact: "export class C{go(r,e){return r-e+r}};"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_mangle_4: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export default class C {
|
|
||||||
go(one, two) {
|
|
||||||
var z = one;
|
|
||||||
return one - two + z;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
expect_exact: "export default class C{go(e,r){return e-r+e}};"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_mangle_5: {
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export default {
|
|
||||||
prop: function(one, two) {
|
|
||||||
return one - two;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
expect_exact: "export default{prop:function(r,t){return r-t}};"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_mangle_6: {
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var baz = 2;
|
|
||||||
export let foo = 1, bar = baz;
|
|
||||||
}
|
|
||||||
expect_exact: "var o=2;export let foo=1,bar=o;"
|
|
||||||
}
|
|
||||||
|
|
||||||
export_toplevel_1: {
|
|
||||||
options = {
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(){}
|
|
||||||
export function g(){};
|
|
||||||
export default function h(){};
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
export function g(){};
|
|
||||||
export default function h(){};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export_toplevel_2: {
|
|
||||||
options = {
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
class A {}
|
|
||||||
export class B {};
|
|
||||||
export default class C {};
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
export class B {};
|
|
||||||
export default class C {};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export_default_func_ref: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export default function f(){};
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect_exact: "export default function f(){};f();"
|
|
||||||
}
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
|
|
||||||
compress_new_function: {
|
|
||||||
options = {
|
|
||||||
unsafe: true,
|
|
||||||
unsafe_Function: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
new Function("aa, bb", 'return aa;');
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
Function("n,r", "return n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
compress_new_function_with_destruct: {
|
|
||||||
options = {
|
|
||||||
unsafe: true,
|
|
||||||
unsafe_Function: true,
|
|
||||||
ecma: 6
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
ecma: 6
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
new Function("aa, [bb]", 'return aa;');
|
|
||||||
new Function("aa, {bb}", 'return aa;');
|
|
||||||
new Function("[[aa]], [{bb}]", 'return aa;');
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
Function("n,[r]", "return n");
|
|
||||||
Function("n,{bb:b}", "return n");
|
|
||||||
Function("[[n]],[{bb:b}]", "return n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
compress_new_function_with_destruct_arrows: {
|
|
||||||
options = {
|
|
||||||
arrows: true,
|
|
||||||
unsafe_arrows: true,
|
|
||||||
unsafe: true,
|
|
||||||
unsafe_Function: true,
|
|
||||||
ecma: 6,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
ecma: 6
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
new Function("aa, [bb]", 'return aa;');
|
|
||||||
new Function("aa, {bb}", 'return aa;');
|
|
||||||
new Function("[[aa]], [{bb}]", 'return aa;');
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
Function("n,[a]", "return n");
|
|
||||||
Function("b,{bb:n}", "return b");
|
|
||||||
Function("[[b]],[{bb:n}]", "return b");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
do_not_update_lhs: {
|
do_not_update_lhs: {
|
||||||
options = {
|
options = {
|
||||||
global_defs: { DEBUG: 0 }
|
global_defs: {
|
||||||
|
DEBUG: 0,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
DEBUG++;
|
DEBUG++;
|
||||||
@@ -16,7 +18,9 @@ do_not_update_lhs: {
|
|||||||
|
|
||||||
do_update_rhs: {
|
do_update_rhs: {
|
||||||
options = {
|
options = {
|
||||||
global_defs: { DEBUG: 0 }
|
global_defs: {
|
||||||
|
DEBUG: 0,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
MY_DEBUG = DEBUG;
|
MY_DEBUG = DEBUG;
|
||||||
@@ -35,10 +39,10 @@ mixed: {
|
|||||||
DEBUG: 0,
|
DEBUG: 0,
|
||||||
ENV: 1,
|
ENV: 1,
|
||||||
FOO: 2,
|
FOO: 2,
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
const ENV = 3;
|
var ENV = 3;
|
||||||
var FOO = 4;
|
var FOO = 4;
|
||||||
f(ENV * 10);
|
f(ENV * 10);
|
||||||
--FOO;
|
--FOO;
|
||||||
@@ -49,7 +53,7 @@ mixed: {
|
|||||||
x = DEBUG;
|
x = DEBUG;
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
const ENV = 3;
|
var ENV = 3;
|
||||||
var FOO = 4;
|
var FOO = 4;
|
||||||
f(10);
|
f(10);
|
||||||
--FOO;
|
--FOO;
|
||||||
@@ -60,11 +64,11 @@ mixed: {
|
|||||||
x = 0;
|
x = 0;
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
'WARN: global_defs ENV redefined [test/compress/issue-208.js:41,14]',
|
"WARN: global_defs ENV redefined [test/compress/issue-208.js:1,12]",
|
||||||
'WARN: global_defs FOO redefined [test/compress/issue-208.js:42,12]',
|
"WARN: global_defs FOO redefined [test/compress/issue-208.js:2,12]",
|
||||||
'WARN: global_defs FOO redefined [test/compress/issue-208.js:44,10]',
|
"WARN: global_defs FOO redefined [test/compress/issue-208.js:4,10]",
|
||||||
'WARN: global_defs DEBUG redefined [test/compress/issue-208.js:45,8]',
|
"WARN: global_defs DEBUG redefined [test/compress/issue-208.js:5,8]",
|
||||||
'WARN: global_defs DEBUG redefined [test/compress/issue-208.js:46,8]',
|
"WARN: global_defs DEBUG redefined [test/compress/issue-208.js:6,8]",
|
||||||
'WARN: global_defs DEBUG redefined [test/compress/issue-208.js:47,8]',
|
"WARN: global_defs DEBUG redefined [test/compress/issue-208.js:7,8]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
return_with_no_value_in_if_body: {
|
return_with_no_value_in_if_body: {
|
||||||
options = { conditionals: true };
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo(bar) {
|
function foo(bar) {
|
||||||
if (bar) {
|
if (bar) {
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
issue_267: {
|
issue_267: {
|
||||||
options = { comparisons: true };
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
x = a % b / b * c * 2;
|
x = a % b / b * c * 2;
|
||||||
x = a % b * 2
|
x = a % b * 2
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
issue_269_1: {
|
issue_269_1: {
|
||||||
options = {unsafe: true};
|
options = {
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
f(
|
f(
|
||||||
String(x),
|
String(x),
|
||||||
@@ -20,7 +22,9 @@ issue_269_1: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
issue_269_dangers: {
|
issue_269_dangers: {
|
||||||
options = {unsafe: true};
|
options = {
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
f(
|
f(
|
||||||
String(x, x),
|
String(x, x),
|
||||||
@@ -34,7 +38,9 @@ issue_269_dangers: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
issue_269_in_scope: {
|
issue_269_in_scope: {
|
||||||
options = {unsafe: true};
|
options = {
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
var String, Number, Boolean;
|
var String, Number, Boolean;
|
||||||
f(
|
f(
|
||||||
@@ -50,7 +56,9 @@ issue_269_in_scope: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
strings_concat: {
|
strings_concat: {
|
||||||
options = {unsafe: true};
|
options = {
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
f(
|
f(
|
||||||
String(x + 'str'),
|
String(x + 'str'),
|
||||||
@@ -67,9 +75,9 @@ strings_concat: {
|
|||||||
|
|
||||||
regexp: {
|
regexp: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
unsafe: true,
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
RegExp("foo");
|
RegExp("foo");
|
||||||
RegExp("bar", "ig");
|
RegExp("bar", "ig");
|
||||||
@@ -85,6 +93,6 @@ regexp: {
|
|||||||
RegExp("should", "fail");
|
RegExp("should", "fail");
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
'WARN: Error converting RegExp("should","fail") [test/compress/issue-269.js:78,2]',
|
'WARN: Error converting RegExp("should","fail") [test/compress/issue-269.js:5,2]',
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ warn: {
|
|||||||
}().length);
|
}().length);
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Function.protoype.caller not supported [test/compress/issue-2719.js:17,19]",
|
"WARN: Function.protoype.caller not supported [test/compress/issue-2719.js:5,19]",
|
||||||
"WARN: Function.protoype.arguments not supported [test/compress/issue-2719.js:17,19]",
|
"WARN: Function.protoype.arguments not supported [test/compress/issue-2719.js:5,19]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -186,7 +186,7 @@ negate_iife_5_off: {
|
|||||||
inline: true,
|
inline: true,
|
||||||
negate_iife: false,
|
negate_iife: false,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
if ((function(){ return t })()) {
|
if ((function(){ return t })()) {
|
||||||
foo(true);
|
foo(true);
|
||||||
@@ -245,7 +245,7 @@ negate_iife_issue_1073: {
|
|||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
new (function(a) {
|
new (function(a) {
|
||||||
return function Foo() {
|
return function Foo() {
|
||||||
@@ -273,7 +273,7 @@ issue_1288_side_effects: {
|
|||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
if (w) ;
|
if (w) ;
|
||||||
else {
|
else {
|
||||||
@@ -399,7 +399,7 @@ wrap_iife_in_expression: {
|
|||||||
wrap_iife: true,
|
wrap_iife: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
foo = (function () {
|
foo = (function() {
|
||||||
return bar();
|
return bar();
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
|
|||||||
21
test/compress/issue-2989.js
Normal file
21
test/compress/issue-2989.js
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
inline_script_off: {
|
||||||
|
beautify = {
|
||||||
|
inline_script: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log("</sCrIpT>");
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log("</sCrIpT>");'
|
||||||
|
expect_stdout: "</sCrIpT>"
|
||||||
|
}
|
||||||
|
|
||||||
|
inline_script_on: {
|
||||||
|
beautify = {
|
||||||
|
inline_script: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log("</sCrIpT>");
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log("<\\/sCrIpT>");'
|
||||||
|
expect_stdout: "</sCrIpT>"
|
||||||
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
issue_44_valid_ast_1: {
|
issue_44_valid_ast_1: {
|
||||||
options = { unused: true };
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function a(b) {
|
function a(b) {
|
||||||
for (var i = 0, e = b.qoo(); ; i++) {}
|
for (var i = 0, e = b.qoo(); ; i++) {}
|
||||||
@@ -14,7 +16,9 @@ issue_44_valid_ast_1: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
issue_44_valid_ast_2: {
|
issue_44_valid_ast_2: {
|
||||||
options = { unused: true };
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function a(b) {
|
function a(b) {
|
||||||
if (foo) for (var i = 0, e = b.qoo(); ; i++) {}
|
if (foo) for (var i = 0, e = b.qoo(); ; i++) {}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
keep_continue: {
|
keep_continue: {
|
||||||
options = {
|
options = {
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true
|
evaluate: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
while (a) {
|
while (a) {
|
||||||
if (b) {
|
if (b) {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
NaN_and_Infinity_must_have_parens: {
|
NaN_and_Infinity_must_have_parens: {
|
||||||
options = {};
|
options = {}
|
||||||
input: {
|
input: {
|
||||||
Infinity.toString();
|
Infinity.toString();
|
||||||
NaN.toString();
|
NaN.toString();
|
||||||
@@ -11,7 +11,7 @@ NaN_and_Infinity_must_have_parens: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
NaN_and_Infinity_should_not_be_replaced_when_they_are_redefined: {
|
NaN_and_Infinity_should_not_be_replaced_when_they_are_redefined: {
|
||||||
options = {};
|
options = {}
|
||||||
input: {
|
input: {
|
||||||
var Infinity, NaN;
|
var Infinity, NaN;
|
||||||
Infinity.toString();
|
Infinity.toString();
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
issue_611: {
|
issue_611: {
|
||||||
options = {
|
options = {
|
||||||
sequences: true,
|
sequences: true,
|
||||||
side_effects: true
|
side_effects: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
define(function() {
|
define(function() {
|
||||||
function fn() {}
|
function fn() {}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
wrongly_optimized: {
|
wrongly_optimized: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
|
||||||
booleans: true,
|
booleans: true,
|
||||||
evaluate: true
|
conditionals: true,
|
||||||
};
|
evaluate: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function func() {
|
function func() {
|
||||||
foo();
|
foo();
|
||||||
|
|||||||
@@ -28,12 +28,12 @@ cond_5: {
|
|||||||
|
|
||||||
dead_code_const_annotation_regex: {
|
dead_code_const_annotation_regex: {
|
||||||
options = {
|
options = {
|
||||||
booleans : true,
|
booleans: true,
|
||||||
conditionals : true,
|
conditionals: true,
|
||||||
dead_code : true,
|
dead_code: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
expression : true,
|
expression: true,
|
||||||
loops : true,
|
loops: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var unused;
|
var unused;
|
||||||
@@ -82,8 +82,8 @@ drop_value: {
|
|||||||
|
|
||||||
wrongly_optimized: {
|
wrongly_optimized: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
|
||||||
booleans: true,
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
expression: true,
|
expression: true,
|
||||||
}
|
}
|
||||||
@@ -195,7 +195,7 @@ negate_iife_5_off: {
|
|||||||
expression: true,
|
expression: true,
|
||||||
negate_iife: false,
|
negate_iife: false,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
if ((function(){ return t })()) {
|
if ((function(){ return t })()) {
|
||||||
foo(true);
|
foo(true);
|
||||||
@@ -248,7 +248,9 @@ issue_1254_negate_iife_nested: {
|
|||||||
conditional: {
|
conditional: {
|
||||||
options = {
|
options = {
|
||||||
expression: true,
|
expression: true,
|
||||||
pure_funcs: [ "pure" ],
|
pure_funcs: [
|
||||||
|
"pure"
|
||||||
|
],
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
negate_booleans_1: {
|
negate_booleans_1: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true
|
comparisons: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = !a || !b || !c || !d || !e || !f;
|
var a = !a || !b || !c || !d || !e || !f;
|
||||||
}
|
}
|
||||||
@@ -12,8 +12,8 @@ negate_booleans_1: {
|
|||||||
|
|
||||||
negate_booleans_2: {
|
negate_booleans_2: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true
|
comparisons: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
var match = !x && // should not touch this one
|
var match = !x && // should not touch this one
|
||||||
(!z || c) &&
|
(!z || c) &&
|
||||||
|
|||||||
@@ -1,11 +1,31 @@
|
|||||||
remove_redundant_sequence_items: {
|
remove_sequence: {
|
||||||
options = { side_effects: true };
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
(0, 1, eval)();
|
(0, 1, eval)();
|
||||||
(0, 1, logThis)();
|
(0, 1, logThis)();
|
||||||
(0, 1, _decorators.logThis)();
|
(0, 1, _decorators.logThis)();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
|
eval();
|
||||||
|
logThis();
|
||||||
|
(0, _decorators.logThis)();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_redundant_sequence_items: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
(0, 1, eval)();
|
||||||
|
(0, 1, logThis)();
|
||||||
|
(0, 1, _decorators.logThis)();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
(0, eval)();
|
(0, eval)();
|
||||||
logThis();
|
logThis();
|
||||||
(0, _decorators.logThis)();
|
(0, _decorators.logThis)();
|
||||||
@@ -13,13 +33,17 @@ remove_redundant_sequence_items: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dont_remove_this_binding_sequence: {
|
dont_remove_this_binding_sequence: {
|
||||||
options = { side_effects: true };
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
|
"use strict";
|
||||||
(0, eval)();
|
(0, eval)();
|
||||||
(0, logThis)();
|
(0, logThis)();
|
||||||
(0, _decorators.logThis)();
|
(0, _decorators.logThis)();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
|
"use strict";
|
||||||
(0, eval)();
|
(0, eval)();
|
||||||
logThis();
|
logThis();
|
||||||
(0, _decorators.logThis)();
|
(0, _decorators.logThis)();
|
||||||
|
|||||||
@@ -2,25 +2,25 @@ dont_mangle_arguments: {
|
|||||||
mangle = {
|
mangle = {
|
||||||
};
|
};
|
||||||
options = {
|
options = {
|
||||||
sequences : true,
|
booleans: true,
|
||||||
properties : true,
|
comparisons: true,
|
||||||
dead_code : true,
|
conditionals: true,
|
||||||
drop_debugger : true,
|
dead_code: true,
|
||||||
conditionals : true,
|
drop_debugger: true,
|
||||||
comparisons : true,
|
evaluate: true,
|
||||||
evaluate : true,
|
hoist_funs: true,
|
||||||
booleans : true,
|
hoist_vars: true,
|
||||||
loops : true,
|
if_return: true,
|
||||||
unused : true,
|
join_vars: true,
|
||||||
hoist_funs : true,
|
keep_fargs: true,
|
||||||
keep_fargs : true,
|
keep_fnames: false,
|
||||||
keep_fnames : false,
|
loops: true,
|
||||||
hoist_vars : true,
|
negate_iife: false,
|
||||||
if_return : true,
|
properties: true,
|
||||||
join_vars : true,
|
sequences: true,
|
||||||
side_effects : true,
|
side_effects: true,
|
||||||
negate_iife : false
|
unused: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(){
|
(function(){
|
||||||
var arguments = arguments, not_arguments = 9;
|
var arguments = arguments, not_arguments = 9;
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
keep_var_for_in: {
|
keep_var_for_in: {
|
||||||
options = {
|
options = {
|
||||||
hoist_vars: true,
|
hoist_vars: true,
|
||||||
unused: true
|
unused: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(obj){
|
(function(obj){
|
||||||
var foo = 5;
|
var foo = 5;
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
template_strings: {
|
|
||||||
input: {
|
|
||||||
foo(
|
|
||||||
`<span>${contents}</span>`,
|
|
||||||
`<a href="${url}">${text}</a>`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect_exact: "foo(`<span>${contents}</span>`,`<a href=\"${url}\">${text}</a>`);"
|
|
||||||
}
|
|
||||||
@@ -3,8 +3,9 @@ this_binding_conditionals: {
|
|||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
|
"use strict";
|
||||||
(1 && a)();
|
(1 && a)();
|
||||||
(0 || a)();
|
(0 || a)();
|
||||||
(0 || 1 && a)();
|
(0 || 1 && a)();
|
||||||
@@ -26,6 +27,7 @@ this_binding_conditionals: {
|
|||||||
(1 ? eval : 0)();
|
(1 ? eval : 0)();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
|
"use strict";
|
||||||
a();
|
a();
|
||||||
a();
|
a();
|
||||||
a();
|
a();
|
||||||
@@ -53,13 +55,15 @@ this_binding_collapse_vars: {
|
|||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
|
"use strict";
|
||||||
var c = a; c();
|
var c = a; c();
|
||||||
var d = a.b; d();
|
var d = a.b; d();
|
||||||
var e = eval; e();
|
var e = eval; e();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
|
"use strict";
|
||||||
a();
|
a();
|
||||||
(0, a.b)();
|
(0, a.b)();
|
||||||
(0, eval)();
|
(0, eval)();
|
||||||
@@ -68,32 +72,89 @@ this_binding_collapse_vars: {
|
|||||||
|
|
||||||
this_binding_side_effects: {
|
this_binding_side_effects: {
|
||||||
options = {
|
options = {
|
||||||
side_effects : true
|
side_effects: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
(function (foo) {
|
(function(foo) {
|
||||||
(0, foo)();
|
(0, foo)();
|
||||||
(0, foo.bar)();
|
(0, foo.bar)();
|
||||||
(0, eval)('console.log(foo);');
|
(0, eval)("console.log(foo);");
|
||||||
}());
|
}());
|
||||||
(function (foo) {
|
(function(foo) {
|
||||||
|
"use strict";
|
||||||
|
(0, foo)();
|
||||||
|
(0, foo.bar)();
|
||||||
|
(0, eval)("console.log(foo);");
|
||||||
|
}());
|
||||||
|
(function(foo) {
|
||||||
var eval = console;
|
var eval = console;
|
||||||
(0, foo)();
|
(0, foo)();
|
||||||
(0, foo.bar)();
|
(0, foo.bar)();
|
||||||
(0, eval)('console.log(foo);');
|
(0, eval)("console.log(foo);");
|
||||||
}());
|
}());
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
(function (foo) {
|
(function(foo) {
|
||||||
foo();
|
foo();
|
||||||
(0, foo.bar)();
|
(0, foo.bar)();
|
||||||
(0, eval)('console.log(foo);');
|
eval("console.log(foo);");
|
||||||
}());
|
}());
|
||||||
(function (foo) {
|
(function(foo) {
|
||||||
|
"use strict";
|
||||||
|
foo();
|
||||||
|
(0, foo.bar)();
|
||||||
|
(0, eval)("console.log(foo);");
|
||||||
|
}());
|
||||||
|
(function(foo) {
|
||||||
var eval = console;
|
var eval = console;
|
||||||
foo();
|
foo();
|
||||||
(0, foo.bar)();
|
(0, foo.bar)();
|
||||||
(0, eval)('console.log(foo);');
|
eval("console.log(foo);");
|
||||||
}());
|
}());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this_binding_sequences: {
|
||||||
|
options = {
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(typeof function() {
|
||||||
|
return eval("this");
|
||||||
|
}());
|
||||||
|
console.log(typeof function() {
|
||||||
|
"use strict";
|
||||||
|
return eval("this");
|
||||||
|
}());
|
||||||
|
console.log(typeof function() {
|
||||||
|
return (0, eval)("this");
|
||||||
|
}());
|
||||||
|
console.log(typeof function() {
|
||||||
|
"use strict";
|
||||||
|
return (0, eval)("this");
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(typeof function() {
|
||||||
|
return eval("this");
|
||||||
|
}()),
|
||||||
|
console.log(typeof function() {
|
||||||
|
"use strict";
|
||||||
|
return eval("this");
|
||||||
|
}()),
|
||||||
|
console.log(typeof function() {
|
||||||
|
return eval("this");
|
||||||
|
}()),
|
||||||
|
console.log(typeof function() {
|
||||||
|
"use strict";
|
||||||
|
return (0, eval)("this");
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"object",
|
||||||
|
"undefined",
|
||||||
|
"object",
|
||||||
|
"object",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,9 +1,21 @@
|
|||||||
eval_collapse_vars: {
|
eval_collapse_vars: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:false, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
comparisons: true,
|
||||||
};
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
sequences: false,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1() {
|
function f1() {
|
||||||
var e = 7;
|
var e = 7;
|
||||||
@@ -46,7 +58,10 @@ eval_collapse_vars: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
eval_unused: {
|
eval_unused: {
|
||||||
options = { unused: true, keep_fargs: false };
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1(a, eval, c, d, e) {
|
function f1(a, eval, c, d, e) {
|
||||||
return a('c') + eval;
|
return a('c') + eval;
|
||||||
|
|||||||
@@ -1,8 +1,19 @@
|
|||||||
issue979_reported: {
|
issue979_reported: {
|
||||||
options = {
|
options = {
|
||||||
sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
comparisons: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1() {
|
function f1() {
|
||||||
@@ -30,9 +41,20 @@ issue979_reported: {
|
|||||||
|
|
||||||
issue979_test_negated_is_best: {
|
issue979_test_negated_is_best: {
|
||||||
options = {
|
options = {
|
||||||
sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
comparisons: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f3() {
|
function f3() {
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
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';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,9 @@
|
|||||||
labels_1: {
|
labels_1: {
|
||||||
options = { if_return: true, conditionals: true, dead_code: true };
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
out: {
|
out: {
|
||||||
if (foo) break out;
|
if (foo) break out;
|
||||||
@@ -13,7 +17,11 @@ labels_1: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
labels_2: {
|
labels_2: {
|
||||||
options = { if_return: true, conditionals: true, dead_code: true };
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
out: {
|
out: {
|
||||||
if (foo) print("stuff");
|
if (foo) print("stuff");
|
||||||
@@ -30,7 +38,11 @@ labels_2: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
labels_3: {
|
labels_3: {
|
||||||
options = { if_return: true, conditionals: true, dead_code: true };
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
for (var i = 0; i < 5; ++i) {
|
for (var i = 0; i < 5; ++i) {
|
||||||
if (i < 3) continue;
|
if (i < 3) continue;
|
||||||
@@ -45,7 +57,11 @@ labels_3: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
labels_4: {
|
labels_4: {
|
||||||
options = { if_return: true, conditionals: true, dead_code: true };
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
out: for (var i = 0; i < 5; ++i) {
|
out: for (var i = 0; i < 5; ++i) {
|
||||||
if (i < 3) continue out;
|
if (i < 3) continue out;
|
||||||
@@ -60,7 +76,11 @@ labels_4: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
labels_5: {
|
labels_5: {
|
||||||
options = { if_return: true, conditionals: true, dead_code: true };
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
// should keep the break-s in the following
|
// should keep the break-s in the following
|
||||||
input: {
|
input: {
|
||||||
while (foo) {
|
while (foo) {
|
||||||
@@ -92,7 +112,11 @@ labels_6: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
labels_7: {
|
labels_7: {
|
||||||
options = { if_return: true, conditionals: true, dead_code: true };
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
while (foo) {
|
while (foo) {
|
||||||
x();
|
x();
|
||||||
@@ -109,7 +133,11 @@ labels_7: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
labels_8: {
|
labels_8: {
|
||||||
options = { if_return: true, conditionals: true, dead_code: true };
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
while (foo) {
|
while (foo) {
|
||||||
x();
|
x();
|
||||||
@@ -127,7 +155,11 @@ labels_8: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
labels_9: {
|
labels_9: {
|
||||||
options = { if_return: true, conditionals: true, dead_code: true };
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
out: while (foo) {
|
out: while (foo) {
|
||||||
x();
|
x();
|
||||||
@@ -146,7 +178,11 @@ labels_9: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
labels_10: {
|
labels_10: {
|
||||||
options = { if_return: true, conditionals: true, dead_code: true };
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
out: while (foo) {
|
out: while (foo) {
|
||||||
x();
|
x();
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
while_becomes_for: {
|
while_becomes_for: {
|
||||||
options = { loops: true };
|
options = {
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
while (foo()) bar();
|
while (foo()) bar();
|
||||||
}
|
}
|
||||||
@@ -9,7 +11,9 @@ while_becomes_for: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_if_break_1: {
|
drop_if_break_1: {
|
||||||
options = { loops: true };
|
options = {
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
for (;;)
|
for (;;)
|
||||||
if (foo()) break;
|
if (foo()) break;
|
||||||
@@ -20,7 +24,9 @@ drop_if_break_1: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_if_break_2: {
|
drop_if_break_2: {
|
||||||
options = { loops: true };
|
options = {
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
for (;bar();)
|
for (;bar();)
|
||||||
if (foo()) break;
|
if (foo()) break;
|
||||||
@@ -31,7 +37,9 @@ drop_if_break_2: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_if_break_3: {
|
drop_if_break_3: {
|
||||||
options = { loops: true };
|
options = {
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
for (;bar();) {
|
for (;bar();) {
|
||||||
if (foo()) break;
|
if (foo()) break;
|
||||||
@@ -48,7 +56,10 @@ drop_if_break_3: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_if_break_4: {
|
drop_if_break_4: {
|
||||||
options = { loops: true, sequences: true };
|
options = {
|
||||||
|
loops: true,
|
||||||
|
sequences: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
for (;bar();) {
|
for (;bar();) {
|
||||||
x();
|
x();
|
||||||
@@ -64,7 +75,9 @@ drop_if_break_4: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_if_else_break_1: {
|
drop_if_else_break_1: {
|
||||||
options = { loops: true };
|
options = {
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
for (;;) if (foo()) bar(); else break;
|
for (;;) if (foo()) bar(); else break;
|
||||||
}
|
}
|
||||||
@@ -74,7 +87,9 @@ drop_if_else_break_1: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_if_else_break_2: {
|
drop_if_else_break_2: {
|
||||||
options = { loops: true };
|
options = {
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
for (;bar();) {
|
for (;bar();) {
|
||||||
if (foo()) baz();
|
if (foo()) baz();
|
||||||
@@ -87,7 +102,9 @@ drop_if_else_break_2: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_if_else_break_3: {
|
drop_if_else_break_3: {
|
||||||
options = { loops: true };
|
options = {
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
for (;bar();) {
|
for (;bar();) {
|
||||||
if (foo()) baz();
|
if (foo()) baz();
|
||||||
@@ -106,7 +123,10 @@ drop_if_else_break_3: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_if_else_break_4: {
|
drop_if_else_break_4: {
|
||||||
options = { loops: true, sequences: true };
|
options = {
|
||||||
|
loops: true,
|
||||||
|
sequences: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
for (;bar();) {
|
for (;bar();) {
|
||||||
x();
|
x();
|
||||||
@@ -123,7 +143,9 @@ drop_if_else_break_4: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
parse_do_while_with_semicolon: {
|
parse_do_while_with_semicolon: {
|
||||||
options = { loops: false };
|
options = {
|
||||||
|
loops: false,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
do {
|
do {
|
||||||
x();
|
x();
|
||||||
@@ -135,7 +157,9 @@ parse_do_while_with_semicolon: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
parse_do_while_without_semicolon: {
|
parse_do_while_without_semicolon: {
|
||||||
options = { loops: false };
|
options = {
|
||||||
|
loops: false,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
do {
|
do {
|
||||||
x();
|
x();
|
||||||
@@ -146,50 +170,6 @@ parse_do_while_without_semicolon: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
keep_collapse_const_in_own_block_scope: {
|
|
||||||
options = {
|
|
||||||
join_vars: true,
|
|
||||||
loops: true
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var i=2;
|
|
||||||
const c=5;
|
|
||||||
while(i--)
|
|
||||||
console.log(i);
|
|
||||||
console.log(c);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var i=2;
|
|
||||||
const c=5;
|
|
||||||
for(;i--;)
|
|
||||||
console.log(i);
|
|
||||||
console.log(c);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
keep_collapse_const_in_own_block_scope_2: {
|
|
||||||
options = {
|
|
||||||
join_vars: true,
|
|
||||||
loops: true
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
const c=5;
|
|
||||||
var i=2; // Moves to loop, while it did not in previous test
|
|
||||||
while(i--)
|
|
||||||
console.log(i);
|
|
||||||
console.log(c);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
const c=5;
|
|
||||||
for(var i=2;i--;)
|
|
||||||
console.log(i);
|
|
||||||
console.log(c);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
evaluate: {
|
evaluate: {
|
||||||
options = {
|
options = {
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
@@ -197,7 +177,7 @@ evaluate: {
|
|||||||
loops: true,
|
loops: true,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
while (true) {
|
while (true) {
|
||||||
a();
|
a();
|
||||||
@@ -338,10 +318,10 @@ issue_186_beautify_ie8: {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_186_bracketize: {
|
issue_186_braces: {
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: false,
|
beautify: false,
|
||||||
bracketize: true,
|
braces: true,
|
||||||
ie8: false,
|
ie8: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -358,10 +338,10 @@ issue_186_bracketize: {
|
|||||||
expect_exact: '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: {
|
issue_186_braces_ie8: {
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: false,
|
beautify: false,
|
||||||
bracketize: true,
|
braces: true,
|
||||||
ie8: true,
|
ie8: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -378,10 +358,10 @@ issue_186_bracketize_ie8: {
|
|||||||
expect_exact: '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: {
|
issue_186_beautify_braces: {
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
bracketize: true,
|
braces: true,
|
||||||
ie8: false,
|
ie8: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -410,10 +390,10 @@ issue_186_beautify_bracketize: {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_186_beautify_bracketize_ie8: {
|
issue_186_beautify_braces_ie8: {
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
bracketize: true,
|
braces: true,
|
||||||
ie8: true,
|
ie8: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -501,7 +481,7 @@ init_side_effects: {
|
|||||||
options = {
|
options = {
|
||||||
loops: true,
|
loops: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
for (function() {}(), i = 0; i < 5; i++) console.log(i);
|
for (function() {}(), i = 0; i < 5; i++) console.log(i);
|
||||||
for (function() {}(); i < 10; i++) console.log(i);
|
for (function() {}(); i < 10; i++) console.log(i);
|
||||||
@@ -650,68 +630,19 @@ issue_2740_5: {
|
|||||||
expect_stdout: "0 undefined"
|
expect_stdout: "0 undefined"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_2740_6: {
|
issue_2904: {
|
||||||
options = {
|
options = {
|
||||||
dead_code: true,
|
join_vars: true,
|
||||||
loops: true,
|
loops: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
const a = 9, b = 0;
|
var a = 1;
|
||||||
for (const a = 1; a < 3; ++b) break;
|
do {
|
||||||
console.log(a, b);
|
console.log(a);
|
||||||
|
} while (--a);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
const a = 9, b = 0;
|
for (var a = 1; console.log(a), --a;);
|
||||||
{
|
|
||||||
const a = 1;
|
|
||||||
a < 3;
|
|
||||||
}
|
|
||||||
console.log(a, b);
|
|
||||||
}
|
}
|
||||||
expect_stdout: "9 0"
|
expect_stdout: "1"
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2740_7: {
|
|
||||||
options = {
|
|
||||||
dead_code: true,
|
|
||||||
loops: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
let a = 9, b = 0;
|
|
||||||
for (const a = 1; a < 3; ++b) break;
|
|
||||||
console.log(a, b);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
let a = 9, b = 0;
|
|
||||||
{
|
|
||||||
const a = 1;
|
|
||||||
a < 3;
|
|
||||||
}
|
|
||||||
console.log(a, b);
|
|
||||||
}
|
|
||||||
expect_stdout: "9 0"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2740_8: {
|
|
||||||
options = {
|
|
||||||
dead_code: true,
|
|
||||||
loops: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 9, b = 0;
|
|
||||||
for (const a = 1; a < 3; ++b) break;
|
|
||||||
console.log(a, b);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 9, b = 0;
|
|
||||||
{
|
|
||||||
const a = 1;
|
|
||||||
a < 3;
|
|
||||||
}
|
|
||||||
console.log(a, b);
|
|
||||||
}
|
|
||||||
expect_stdout: "9 0"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,14 +8,14 @@ too_short: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_exact: [
|
expect_exact: [
|
||||||
'function f(a){',
|
"function f(",
|
||||||
'return{',
|
"a){return{",
|
||||||
'c:42,',
|
"c:42,d:a(",
|
||||||
'd:a(),',
|
'),e:"foo"}',
|
||||||
'e:"foo"}}',
|
"}",
|
||||||
]
|
]
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Output exceeds 10 characters"
|
"WARN: Output exceeds 10 characters",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -29,11 +29,25 @@ just_enough: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_exact: [
|
expect_exact: [
|
||||||
'function f(a){',
|
"function f(a){",
|
||||||
'return{c:42,',
|
"return{c:42,",
|
||||||
'd:a(),e:"foo"}',
|
'd:a(),e:"foo"}',
|
||||||
'}',
|
"}",
|
||||||
]
|
|
||||||
expect_warnings: [
|
|
||||||
]
|
]
|
||||||
|
expect_warnings: []
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_304: {
|
||||||
|
beautify = {
|
||||||
|
max_line_len: 10,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0, b = 0, c = 0, d = 0, e = 0;
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"var a=0,",
|
||||||
|
"b=0,c=0,",
|
||||||
|
"d=0,e=0;",
|
||||||
|
]
|
||||||
|
expect_warnings: []
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
negate_iife_1: {
|
negate_iife_1: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: true
|
negate_iife: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(){ stuff() })();
|
(function(){ stuff() })();
|
||||||
}
|
}
|
||||||
@@ -13,7 +13,7 @@ negate_iife_1: {
|
|||||||
negate_iife_1_off: {
|
negate_iife_1_off: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: false,
|
negate_iife: false,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(){ stuff() })();
|
(function(){ stuff() })();
|
||||||
}
|
}
|
||||||
@@ -24,7 +24,7 @@ negate_iife_2: {
|
|||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: true,
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(){ return {} })().x = 10;
|
(function(){ return {} })().x = 10;
|
||||||
}
|
}
|
||||||
@@ -45,9 +45,9 @@ negate_iife_2_side_effects: {
|
|||||||
|
|
||||||
negate_iife_3: {
|
negate_iife_3: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
conditionals: true
|
}
|
||||||
};
|
|
||||||
input: {
|
input: {
|
||||||
(function(){ return t })() ? console.log(true) : console.log(false);
|
(function(){ return t })() ? console.log(true) : console.log(false);
|
||||||
}
|
}
|
||||||
@@ -67,7 +67,7 @@ negate_iife_3_evaluate: {
|
|||||||
(function(){ return true })() ? console.log(true) : console.log(false);
|
(function(){ return true })() ? console.log(true) : console.log(false);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(true);
|
true, console.log(true);
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
@@ -88,9 +88,9 @@ negate_iife_3_side_effects: {
|
|||||||
|
|
||||||
negate_iife_3_off: {
|
negate_iife_3_off: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: false,
|
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
};
|
negate_iife: false,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(){ return t })() ? console.log(true) : console.log(false);
|
(function(){ return t })() ? console.log(true) : console.log(false);
|
||||||
}
|
}
|
||||||
@@ -110,17 +110,17 @@ negate_iife_3_off_evaluate: {
|
|||||||
(function(){ return true })() ? console.log(true) : console.log(false);
|
(function(){ return true })() ? console.log(true) : console.log(false);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(true);
|
true, console.log(true);
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
negate_iife_4: {
|
negate_iife_4: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: true,
|
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
sequences: true
|
negate_iife: true,
|
||||||
};
|
sequences: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(){ return t })() ? console.log(true) : console.log(false);
|
(function(){ return t })() ? console.log(true) : console.log(false);
|
||||||
(function(){
|
(function(){
|
||||||
@@ -136,11 +136,11 @@ negate_iife_4: {
|
|||||||
|
|
||||||
sequence_off: {
|
sequence_off: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: false,
|
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
sequences: true,
|
negate_iife: false,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
};
|
sequences: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function f() {
|
function f() {
|
||||||
(function(){ return t })() ? console.log(true) : console.log(false);
|
(function(){ return t })() ? console.log(true) : console.log(false);
|
||||||
@@ -171,10 +171,10 @@ sequence_off: {
|
|||||||
|
|
||||||
negate_iife_5: {
|
negate_iife_5: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
conditionals: true,
|
}
|
||||||
};
|
|
||||||
input: {
|
input: {
|
||||||
if ((function(){ return t })()) {
|
if ((function(){ return t })()) {
|
||||||
foo(true);
|
foo(true);
|
||||||
@@ -194,10 +194,10 @@ negate_iife_5: {
|
|||||||
|
|
||||||
negate_iife_5_off: {
|
negate_iife_5_off: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
negate_iife: false,
|
negate_iife: false,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
conditionals: true,
|
}
|
||||||
};
|
|
||||||
input: {
|
input: {
|
||||||
if ((function(){ return t })()) {
|
if ((function(){ return t })()) {
|
||||||
foo(true);
|
foo(true);
|
||||||
@@ -217,10 +217,10 @@ negate_iife_5_off: {
|
|||||||
|
|
||||||
negate_iife_nested: {
|
negate_iife_nested: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
conditionals: true,
|
}
|
||||||
};
|
|
||||||
input: {
|
input: {
|
||||||
function Foo(f) {
|
function Foo(f) {
|
||||||
this.f = f;
|
this.f = f;
|
||||||
@@ -250,10 +250,10 @@ negate_iife_nested: {
|
|||||||
|
|
||||||
negate_iife_nested_off: {
|
negate_iife_nested_off: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
negate_iife: false,
|
negate_iife: false,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
conditionals: true,
|
}
|
||||||
};
|
|
||||||
input: {
|
input: {
|
||||||
function Foo(f) {
|
function Foo(f) {
|
||||||
this.f = f;
|
this.f = f;
|
||||||
@@ -283,10 +283,10 @@ negate_iife_nested_off: {
|
|||||||
|
|
||||||
negate_iife_issue_1073: {
|
negate_iife_issue_1073: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
conditionals: true,
|
}
|
||||||
};
|
|
||||||
input: {
|
input: {
|
||||||
new (function(a) {
|
new (function(a) {
|
||||||
return function Foo() {
|
return function Foo() {
|
||||||
@@ -356,7 +356,7 @@ issue_1288: {
|
|||||||
conditionals: true,
|
conditionals: true,
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
side_effects: false,
|
side_effects: false,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
if (w) ;
|
if (w) ;
|
||||||
else {
|
else {
|
||||||
|
|||||||
@@ -36,7 +36,9 @@ new_statements_3: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
new_with_rewritten_true_value: {
|
new_with_rewritten_true_value: {
|
||||||
options = { booleans: true }
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
new true;
|
new true;
|
||||||
}
|
}
|
||||||
@@ -83,22 +85,6 @@ new_with_unary_prefix: {
|
|||||||
expect_exact: 'var bar=(+new Date).toString(32);';
|
expect_exact: 'var bar=(+new Date).toString(32);';
|
||||||
}
|
}
|
||||||
|
|
||||||
new_with_assignement_expression: {
|
|
||||||
options = {
|
|
||||||
evaluate: true
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a;
|
|
||||||
new x(a = 5 * 2, b = [1, 2, 3], c = {a: "a", b: "b", cd: "c" + "d"});
|
|
||||||
new y([a, b] = [3, 4]);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a;
|
|
||||||
new x(a = 10, b = [1, 2, 3], c = {a: "a", b: "b", cd: "cd"});
|
|
||||||
new y([a, b] = [3, 4]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dot_parenthesis_1: {
|
dot_parenthesis_1: {
|
||||||
input: {
|
input: {
|
||||||
console.log(new (Math.random().constructor) instanceof Number);
|
console.log(new (Math.random().constructor) instanceof Number);
|
||||||
|
|||||||
@@ -1,21 +1,49 @@
|
|||||||
hex_numbers_in_parentheses_for_prototype_functions: {
|
hex_numbers_in_parentheses_for_prototype_functions: {
|
||||||
input: {
|
beautify = {
|
||||||
(-2);
|
beautify: true,
|
||||||
(-2).toFixed(0);
|
|
||||||
|
|
||||||
(2);
|
|
||||||
(2).toFixed(0);
|
|
||||||
|
|
||||||
(0.2);
|
|
||||||
(0.2).toFixed(0);
|
|
||||||
|
|
||||||
(0.00000002);
|
|
||||||
(0.00000002).toFixed(0);
|
|
||||||
|
|
||||||
(1000000000000000128);
|
|
||||||
(1000000000000000128).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);"
|
input: {
|
||||||
|
function f() {
|
||||||
|
(-2);
|
||||||
|
(-2).toFixed(0);
|
||||||
|
|
||||||
|
(2);
|
||||||
|
(2).toFixed(0);
|
||||||
|
|
||||||
|
(0.2);
|
||||||
|
(0.2).toFixed(0);
|
||||||
|
|
||||||
|
(2.34e20);
|
||||||
|
(2.34e20).toFixed(0);
|
||||||
|
|
||||||
|
(0.00000002);
|
||||||
|
(0.00000002).toFixed(0);
|
||||||
|
|
||||||
|
(1000000000000000128);
|
||||||
|
(1000000000000000128).toFixed(0);
|
||||||
|
|
||||||
|
(-1000000000000000128);
|
||||||
|
(-1000000000000000128).toFixed(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"function f() {",
|
||||||
|
" -2;",
|
||||||
|
" (-2).toFixed(0);",
|
||||||
|
" 2;",
|
||||||
|
" 2..toFixed(0);",
|
||||||
|
" .2;",
|
||||||
|
" .2.toFixed(0);",
|
||||||
|
" 234e18;",
|
||||||
|
" 234e18.toFixed(0);",
|
||||||
|
" 2e-8;",
|
||||||
|
" 2e-8.toFixed(0);",
|
||||||
|
" 0xde0b6b3a7640080;",
|
||||||
|
" (0xde0b6b3a7640080).toFixed(0);",
|
||||||
|
" -0xde0b6b3a7640080;",
|
||||||
|
" (-0xde0b6b3a7640080).toFixed(0);",
|
||||||
|
"}",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
comparisons: {
|
comparisons: {
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user