Compare commits
31 Commits
harmony-v3
...
v2.8.27
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
75e2748b16 | ||
|
|
a7c987ad2b | ||
|
|
957c54bc87 | ||
|
|
4cbf5a7821 | ||
|
|
93d4224072 | ||
|
|
6cd580dc23 | ||
|
|
ecb63ad8bc | ||
|
|
1ca43bcca1 | ||
|
|
3ee1464aa4 | ||
|
|
24967b8be8 | ||
|
|
a8c67ea353 | ||
|
|
d0b0aecfc5 | ||
|
|
9f5a6029a3 | ||
|
|
4027a0c962 | ||
|
|
87f8a484e6 | ||
|
|
c736834aa4 | ||
|
|
9a98513981 | ||
|
|
f631d6437a | ||
|
|
aa7e8783f8 | ||
|
|
13e5e33448 | ||
|
|
487ae8e3be | ||
|
|
5dfda6e212 | ||
|
|
d08c772eb3 | ||
|
|
90ed54401b | ||
|
|
d8106b6c63 | ||
|
|
dda4eb96e1 | ||
|
|
7305ba0296 | ||
|
|
2c21dc5e8e | ||
|
|
d0faa471db | ||
|
|
6ad823d1e8 | ||
|
|
43ad4e9775 |
34
.github/ISSUE_TEMPLATE.md
vendored
34
.github/ISSUE_TEMPLATE.md
vendored
@@ -1,29 +1,9 @@
|
|||||||
**Bug report or feature request?**
|
- Bug report or feature request? <!-- Note: sub-optimal but correct code is not a bug -->
|
||||||
|
- `uglify-js` version (`uglifyjs -V`)
|
||||||
<!-- Note: sub-optimal but correct code is not a bug -->
|
- JavaScript input - ideally as small as possible.
|
||||||
|
- The `uglifyjs` CLI command executed or `minify()` options used.
|
||||||
**ES5 or ES6+ input?**
|
- An example of JavaScript output produced and/or the error or warning.
|
||||||
|
|
||||||
<!-- Note: for ES6 see: https://github.com/mishoo/UglifyJS2/tree/harmony#harmony -->
|
|
||||||
|
|
||||||
**Uglify version (`uglifyjs -V`)**
|
|
||||||
|
|
||||||
**JavaScript input**
|
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
A complete parsable JS program exhibiting the issue with
|
Note: the release version of uglify-js only supports ES5. Those wishing
|
||||||
UglifyJS alone - without third party tools or libraries.
|
to minify ES6 should use the experimental harmony branch.
|
||||||
Ideally the input should be as small as possible.
|
|
||||||
Post a link to a gist if necessary.
|
|
||||||
|
|
||||||
Issues without a reproducible test case will be closed.
|
|
||||||
-->
|
|
||||||
|
|
||||||
**The `uglifyjs` CLI command executed or `minify()` options used.**
|
|
||||||
|
|
||||||
**JavaScript output or error produced.**
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Note: `uglify-js` only supports ES5.
|
|
||||||
Those wishing to minify ES6 should use `uglify-es`.
|
|
||||||
-->
|
-->
|
||||||
|
|||||||
@@ -4,11 +4,8 @@ node_js:
|
|||||||
- "0.12"
|
- "0.12"
|
||||||
- "4"
|
- "4"
|
||||||
- "6"
|
- "6"
|
||||||
- "8"
|
|
||||||
env:
|
env:
|
||||||
- UGLIFYJS_TEST_ALL=1
|
- UGLIFYJS_TEST_ALL=1
|
||||||
matrix:
|
matrix:
|
||||||
fast_finish: true
|
fast_finish: true
|
||||||
sudo: false
|
sudo: false
|
||||||
cache:
|
|
||||||
directories: tmp
|
|
||||||
|
|||||||
77
bin/extract-props.js
Executable file
77
bin/extract-props.js
Executable file
@@ -0,0 +1,77 @@
|
|||||||
|
#! /usr/bin/env node
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var U2 = require("../tools/node");
|
||||||
|
var fs = require("fs");
|
||||||
|
var yargs = require("yargs");
|
||||||
|
var ARGS = yargs
|
||||||
|
.describe("o", "Output file")
|
||||||
|
.argv;
|
||||||
|
var files = ARGS._.slice();
|
||||||
|
var output = {
|
||||||
|
vars: {},
|
||||||
|
props: {}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (ARGS.o) try {
|
||||||
|
output = JSON.parse(fs.readFileSync(ARGS.o, "utf8"));
|
||||||
|
} catch(ex) {}
|
||||||
|
|
||||||
|
files.forEach(getProps);
|
||||||
|
|
||||||
|
if (ARGS.o) {
|
||||||
|
fs.writeFileSync(ARGS.o, JSON.stringify(output, null, 2), "utf8");
|
||||||
|
} else {
|
||||||
|
console.log("%s", JSON.stringify(output, null, 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
function getProps(filename) {
|
||||||
|
var code = fs.readFileSync(filename, "utf8");
|
||||||
|
var ast = U2.parse(code);
|
||||||
|
|
||||||
|
ast.walk(new U2.TreeWalker(function(node){
|
||||||
|
if (node instanceof U2.AST_ObjectKeyVal) {
|
||||||
|
add(node.key);
|
||||||
|
}
|
||||||
|
else if (node instanceof U2.AST_ObjectProperty) {
|
||||||
|
add(node.key.name);
|
||||||
|
}
|
||||||
|
else if (node instanceof U2.AST_Dot) {
|
||||||
|
add(node.property);
|
||||||
|
}
|
||||||
|
else if (node instanceof U2.AST_Sub) {
|
||||||
|
addStrings(node.property);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
function addStrings(node) {
|
||||||
|
var out = {};
|
||||||
|
try {
|
||||||
|
(function walk(node){
|
||||||
|
node.walk(new U2.TreeWalker(function(node){
|
||||||
|
if (node instanceof U2.AST_Seq) {
|
||||||
|
walk(node.cdr);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (node instanceof U2.AST_String) {
|
||||||
|
add(node.value);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (node instanceof U2.AST_Conditional) {
|
||||||
|
walk(node.consequent);
|
||||||
|
walk(node.alternative);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
throw out;
|
||||||
|
}));
|
||||||
|
})(node);
|
||||||
|
} catch(ex) {
|
||||||
|
if (ex !== out) throw ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function add(name) {
|
||||||
|
output.props[name] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
990
bin/uglifyjs
990
bin/uglifyjs
File diff suppressed because it is too large
Load Diff
503
lib/ast.js
503
lib/ast.js
@@ -87,7 +87,7 @@ function DEFNODE(type, props, methods, base) {
|
|||||||
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 file raw", {
|
||||||
}, null);
|
}, null);
|
||||||
|
|
||||||
var AST_Node = DEFNODE("Node", "start end", {
|
var AST_Node = DEFNODE("Node", "start end", {
|
||||||
@@ -134,10 +134,11 @@ var AST_Debugger = DEFNODE("Debugger", null, {
|
|||||||
$documentation: "Represents a debugger statement",
|
$documentation: "Represents a debugger statement",
|
||||||
}, AST_Statement);
|
}, AST_Statement);
|
||||||
|
|
||||||
var AST_Directive = DEFNODE("Directive", "value quote", {
|
var AST_Directive = DEFNODE("Directive", "value scope quote", {
|
||||||
$documentation: "Represents a directive, like \"use strict\";",
|
$documentation: "Represents a directive, like \"use strict\";",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
value: "[string] The value of this directive as a plain string (it's not an AST_String!)",
|
value: "[string] The value of this directive as a plain string (it's not an AST_String!)",
|
||||||
|
scope: "[AST_Scope/S] The scope that this directive affects",
|
||||||
quote: "[string] the original quote character"
|
quote: "[string] the original quote character"
|
||||||
},
|
},
|
||||||
}, AST_Statement);
|
}, AST_Statement);
|
||||||
@@ -156,7 +157,7 @@ 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 for (var i = 0, len = body.length; i < len; i++) {
|
else for (var i = 0, len = body.length; i < len; i++) {
|
||||||
@@ -181,13 +182,21 @@ var AST_BlockStatement = DEFNODE("BlockStatement", null, {
|
|||||||
}, AST_Block);
|
}, AST_Block);
|
||||||
|
|
||||||
var AST_EmptyStatement = DEFNODE("EmptyStatement", null, {
|
var AST_EmptyStatement = DEFNODE("EmptyStatement", null, {
|
||||||
$documentation: "The empty statement (empty block or simply a semicolon)"
|
$documentation: "The empty statement (empty block or simply a semicolon)",
|
||||||
|
_walk: function(visitor) {
|
||||||
|
return visitor._visit(this);
|
||||||
|
}
|
||||||
}, AST_Statement);
|
}, AST_Statement);
|
||||||
|
|
||||||
var AST_StatementWithBody = DEFNODE("StatementWithBody", "body", {
|
var AST_StatementWithBody = DEFNODE("StatementWithBody", "body", {
|
||||||
$documentation: "Base class for all statements that contain one nested body: `For`, `ForIn`, `Do`, `While`, `With`",
|
$documentation: "Base class for all statements that contain one nested body: `For`, `ForIn`, `Do`, `While`, `With`",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
body: "[AST_Statement] the body; this should always be present, even if it's an AST_EmptyStatement"
|
body: "[AST_Statement] the body; this should always be present, even if it's an AST_EmptyStatement"
|
||||||
|
},
|
||||||
|
_walk: function(visitor) {
|
||||||
|
return visitor._visit(this, function(){
|
||||||
|
this.body._walk(visitor);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}, AST_Statement);
|
}, AST_Statement);
|
||||||
|
|
||||||
@@ -283,10 +292,6 @@ var AST_ForIn = DEFNODE("ForIn", "init name object", {
|
|||||||
}
|
}
|
||||||
}, AST_IterationStatement);
|
}, AST_IterationStatement);
|
||||||
|
|
||||||
var AST_ForOf = DEFNODE("ForOf", null, {
|
|
||||||
$documentation: "A `for ... of` statement",
|
|
||||||
}, AST_ForIn);
|
|
||||||
|
|
||||||
var AST_With = DEFNODE("With", "expression", {
|
var AST_With = DEFNODE("With", "expression", {
|
||||||
$documentation: "A `with` statement",
|
$documentation: "A `with` statement",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
@@ -302,9 +307,10 @@ var AST_With = DEFNODE("With", "expression", {
|
|||||||
|
|
||||||
/* -----[ scope and functions ]----- */
|
/* -----[ scope and functions ]----- */
|
||||||
|
|
||||||
var AST_Scope = DEFNODE("Scope", "variables functions uses_with uses_eval parent_scope enclosed cname", {
|
var AST_Scope = DEFNODE("Scope", "directives variables functions uses_with uses_eval parent_scope enclosed cname", {
|
||||||
$documentation: "Base class for all statements introducing a lexical scope",
|
$documentation: "Base class for all statements introducing a lexical scope",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
|
directives: "[string*/S] an array of directives declared in this scope",
|
||||||
variables: "[Object/S] a map of name -> SymbolDef for all variables/functions defined in this scope",
|
variables: "[Object/S] a map of name -> SymbolDef for all variables/functions defined in this scope",
|
||||||
functions: "[Object/S] like `variables`, but only lists function declarations",
|
functions: "[Object/S] like `variables`, but only lists function declarations",
|
||||||
uses_with: "[boolean/S] tells whether this scope uses the `with` statement",
|
uses_with: "[boolean/S] tells whether this scope uses the `with` statement",
|
||||||
@@ -313,13 +319,6 @@ 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;
|
|
||||||
}
|
|
||||||
}, AST_Block);
|
}, AST_Block);
|
||||||
|
|
||||||
var AST_Toplevel = DEFNODE("Toplevel", "globals", {
|
var AST_Toplevel = DEFNODE("Toplevel", "globals", {
|
||||||
@@ -327,51 +326,74 @@ var AST_Toplevel = DEFNODE("Toplevel", "globals", {
|
|||||||
$propdoc: {
|
$propdoc: {
|
||||||
globals: "[Object/S] a map of name -> SymbolDef for all undeclared names",
|
globals: "[Object/S] a map of name -> SymbolDef for all undeclared names",
|
||||||
},
|
},
|
||||||
wrap_commonjs: function(name) {
|
wrap_enclose: function(arg_parameter_pairs) {
|
||||||
var body = this.body;
|
var self = this;
|
||||||
var wrapped_tl = "(function(exports){'$ORIG';})(typeof " + name + "=='undefined'?(" + name + "={}):" + name + ");";
|
var args = [];
|
||||||
|
var parameters = [];
|
||||||
|
|
||||||
|
arg_parameter_pairs.forEach(function(pair) {
|
||||||
|
var splitAt = pair.lastIndexOf(":");
|
||||||
|
|
||||||
|
args.push(pair.substr(0, splitAt));
|
||||||
|
parameters.push(pair.substr(splitAt + 1));
|
||||||
|
});
|
||||||
|
|
||||||
|
var wrapped_tl = "(function(" + parameters.join(",") + "){ '$ORIG'; })(" + args.join(",") + ")";
|
||||||
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 before(node){
|
||||||
if (node instanceof AST_Directive && node.value == "$ORIG") {
|
if (node instanceof AST_Directive && node.value == "$ORIG") {
|
||||||
return MAP.splice(body);
|
return MAP.splice(self.body);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
return wrapped_tl;
|
||||||
|
},
|
||||||
|
wrap_commonjs: function(name, export_all) {
|
||||||
|
var self = this;
|
||||||
|
var to_export = [];
|
||||||
|
if (export_all) {
|
||||||
|
self.figure_out_scope();
|
||||||
|
self.walk(new TreeWalker(function(node){
|
||||||
|
if (node instanceof AST_SymbolDeclaration && node.definition().global) {
|
||||||
|
if (!find_if(function(n){ return n.name == node.name }, to_export))
|
||||||
|
to_export.push(node);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
var wrapped_tl = "(function(exports, global){ '$ORIG'; '$EXPORTS'; global['" + name + "'] = exports; }({}, (function(){return this}())))";
|
||||||
|
wrapped_tl = parse(wrapped_tl);
|
||||||
|
wrapped_tl = wrapped_tl.transform(new TreeTransformer(function before(node){
|
||||||
|
if (node instanceof AST_Directive) {
|
||||||
|
switch (node.value) {
|
||||||
|
case "$ORIG":
|
||||||
|
return MAP.splice(self.body);
|
||||||
|
case "$EXPORTS":
|
||||||
|
var body = [];
|
||||||
|
to_export.forEach(function(sym){
|
||||||
|
body.push(new AST_SimpleStatement({
|
||||||
|
body: new AST_Assign({
|
||||||
|
left: new AST_Sub({
|
||||||
|
expression: new AST_SymbolRef({ name: "exports" }),
|
||||||
|
property: new AST_String({ value: sym.name }),
|
||||||
|
}),
|
||||||
|
operator: "=",
|
||||||
|
right: new AST_SymbolRef(sym),
|
||||||
|
}),
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
return MAP.splice(body);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
return wrapped_tl;
|
return wrapped_tl;
|
||||||
}
|
}
|
||||||
}, 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(){
|
||||||
@@ -389,80 +411,14 @@ var AST_Accessor = DEFNODE("Accessor", null, {
|
|||||||
$documentation: "A setter/getter function. The `name` property is always null."
|
$documentation: "A setter/getter function. The `name` property is always null."
|
||||||
}, AST_Lambda);
|
}, AST_Lambda);
|
||||||
|
|
||||||
var AST_Function = DEFNODE("Function", "inlined", {
|
var AST_Function = DEFNODE("Function", null, {
|
||||||
$documentation: "A function expression"
|
$documentation: "A function expression"
|
||||||
}, AST_Lambda);
|
}, AST_Lambda);
|
||||||
|
|
||||||
var AST_Arrow = DEFNODE("Arrow", "inlined", {
|
var AST_Defun = DEFNODE("Defun", null, {
|
||||||
$documentation: "An ES6 Arrow function ((a) => b)"
|
|
||||||
}, AST_Lambda);
|
|
||||||
|
|
||||||
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, {
|
||||||
@@ -582,7 +538,7 @@ 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(){
|
||||||
@@ -617,83 +573,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, {
|
var AST_Const = DEFNODE("Const", null, {
|
||||||
$documentation: "A `const` statement"
|
$documentation: "A `const` statement"
|
||||||
}, AST_Definitions);
|
}, 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|AST_SymbolConst] 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) {
|
||||||
@@ -714,11 +601,11 @@ var AST_Call = DEFNODE("Call", "expression args", {
|
|||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function(){
|
||||||
|
this.expression._walk(visitor);
|
||||||
var args = this.args;
|
var args = this.args;
|
||||||
for (var i = 0, len = args.length; i < len; i++) {
|
for (var i = 0, len = args.length; i < len; i++) {
|
||||||
args[i]._walk(visitor);
|
args[i]._walk(visitor);
|
||||||
}
|
}
|
||||||
this.expression._walk(visitor);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -727,16 +614,68 @@ var AST_New = DEFNODE("New", null, {
|
|||||||
$documentation: "An object instantiation. Derives from a function call since it has exactly the same properties"
|
$documentation: "An object instantiation. Derives from a function call since it has exactly the same properties"
|
||||||
}, AST_Call);
|
}, AST_Call);
|
||||||
|
|
||||||
var AST_Sequence = DEFNODE("Sequence", "expressions", {
|
var AST_Seq = DEFNODE("Seq", "car cdr", {
|
||||||
$documentation: "A sequence expression (comma-separated expressions)",
|
$documentation: "A sequence expression (two comma-separated expressions)",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
expressions: "[AST_Node*] array of expressions (at least two)"
|
car: "[AST_Node] first element in sequence",
|
||||||
|
cdr: "[AST_Node] second element in sequence"
|
||||||
|
},
|
||||||
|
$cons: function(x, y) {
|
||||||
|
var seq = new AST_Seq(x);
|
||||||
|
seq.car = x;
|
||||||
|
seq.cdr = y;
|
||||||
|
return seq;
|
||||||
|
},
|
||||||
|
$from_array: function(array) {
|
||||||
|
if (array.length == 0) return null;
|
||||||
|
if (array.length == 1) return array[0].clone();
|
||||||
|
var list = null;
|
||||||
|
for (var i = array.length; --i >= 0;) {
|
||||||
|
list = AST_Seq.cons(array[i], list);
|
||||||
|
}
|
||||||
|
var p = list;
|
||||||
|
while (p) {
|
||||||
|
if (p.cdr && !p.cdr.cdr) {
|
||||||
|
p.cdr = p.cdr.car;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
p = p.cdr;
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
},
|
||||||
|
to_array: function() {
|
||||||
|
var p = this, a = [];
|
||||||
|
while (p) {
|
||||||
|
a.push(p.car);
|
||||||
|
if (p.cdr && !(p.cdr instanceof AST_Seq)) {
|
||||||
|
a.push(p.cdr);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
p = p.cdr;
|
||||||
|
}
|
||||||
|
return a;
|
||||||
|
},
|
||||||
|
add: function(node) {
|
||||||
|
var p = this;
|
||||||
|
while (p) {
|
||||||
|
if (!(p.cdr instanceof AST_Seq)) {
|
||||||
|
var cell = AST_Seq.cons(p.cdr, node);
|
||||||
|
return p.cdr = cell;
|
||||||
|
}
|
||||||
|
p = p.cdr;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
len: function() {
|
||||||
|
if (this.cdr instanceof AST_Seq) {
|
||||||
|
return this.cdr.len() + 1;
|
||||||
|
} else {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function(){
|
||||||
this.expressions.forEach(function(node) {
|
this.car._walk(visitor);
|
||||||
node._walk(visitor);
|
if (this.cdr) this.cdr._walk(visitor);
|
||||||
});
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -789,7 +728,7 @@ var AST_UnaryPostfix = DEFNODE("UnaryPostfix", null, {
|
|||||||
$documentation: "Unary postfix expression, i.e. `i++`"
|
$documentation: "Unary postfix expression, i.e. `i++`"
|
||||||
}, AST_Unary);
|
}, AST_Unary);
|
||||||
|
|
||||||
var AST_Binary = DEFNODE("Binary", "operator left right", {
|
var AST_Binary = DEFNODE("Binary", "left operator right", {
|
||||||
$documentation: "Binary expression, i.e. `a + b`",
|
$documentation: "Binary expression, i.e. `a + b`",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
left: "[AST_Node] left-hand side expression",
|
left: "[AST_Node] left-hand side expression",
|
||||||
@@ -824,10 +763,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", {
|
||||||
@@ -863,13 +798,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] the property name converted to a string for ObjectKeyVal. For setters, getters and computed property this is an arbitrary AST_Node",
|
key: "[string] the property name converted to a string for ObjectKeyVal. For setters and getters this is an AST_SymbolAccessor.",
|
||||||
value: "[AST_Node] property value. For setters and getters this is an AST_Accessor."
|
value: "[AST_Node] property value. For setters and getters this is an AST_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);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -882,74 +815,26 @@ 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/const, function name or argument, symbol in catch)",
|
||||||
@@ -959,17 +844,9 @@ var AST_SymbolVar = DEFNODE("SymbolVar", null, {
|
|||||||
$documentation: "Symbol defining a variable",
|
$documentation: "Symbol defining a variable",
|
||||||
}, AST_SymbolDeclaration);
|
}, AST_SymbolDeclaration);
|
||||||
|
|
||||||
var AST_SymbolBlockDeclaration = DEFNODE("SymbolBlockDeclaration", null, {
|
|
||||||
$documentation: "Base class for block-scoped declaration symbols"
|
|
||||||
}, AST_SymbolDeclaration);
|
|
||||||
|
|
||||||
var AST_SymbolConst = DEFNODE("SymbolConst", null, {
|
var AST_SymbolConst = DEFNODE("SymbolConst", null, {
|
||||||
$documentation: "A constant declaration"
|
$documentation: "A constant declaration"
|
||||||
}, AST_SymbolBlockDeclaration);
|
}, AST_SymbolDeclaration);
|
||||||
|
|
||||||
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",
|
||||||
@@ -979,33 +856,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)",
|
||||||
@@ -1022,14 +879,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);
|
||||||
@@ -1038,10 +887,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() {
|
||||||
@@ -1115,31 +960,6 @@ 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) {
|
||||||
@@ -1156,28 +976,23 @@ TreeWalker.prototype = {
|
|||||||
if (!ret && descend) {
|
if (!ret && descend) {
|
||||||
descend.call(node);
|
descend.call(node);
|
||||||
}
|
}
|
||||||
this.pop();
|
this.pop(node);
|
||||||
return ret;
|
return ret;
|
||||||
},
|
},
|
||||||
parent: function(n) {
|
parent: function(n) {
|
||||||
return this.stack[this.stack.length - 2 - (n || 0)];
|
return this.stack[this.stack.length - 2 - (n || 0)];
|
||||||
},
|
},
|
||||||
push: function(node) {
|
push: function (node) {
|
||||||
if (node instanceof AST_Lambda) {
|
if (node instanceof AST_Lambda) {
|
||||||
this.directives = Object.create(this.directives);
|
this.directives = Object.create(this.directives);
|
||||||
} else if (node instanceof AST_Directive && !this.directives[node.value]) {
|
} else if (node instanceof AST_Directive && !this.directives[node.value]) {
|
||||||
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(node) {
|
||||||
var node = this.stack.pop();
|
this.stack.pop();
|
||||||
if (node instanceof AST_Lambda || node instanceof AST_Class) {
|
if (node instanceof AST_Lambda) {
|
||||||
this.directives = Object.getPrototypeOf(this.directives);
|
this.directives = Object.getPrototypeOf(this.directives);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1195,7 +1010,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;
|
||||||
@@ -1203,6 +1018,24 @@ TreeWalker.prototype = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
in_boolean_context: function() {
|
||||||
|
var stack = this.stack;
|
||||||
|
var i = stack.length, self = stack[--i];
|
||||||
|
while (i > 0) {
|
||||||
|
var p = stack[--i];
|
||||||
|
if ((p instanceof AST_If && p.condition === self) ||
|
||||||
|
(p instanceof AST_Conditional && p.condition === self) ||
|
||||||
|
(p instanceof AST_DWLoop && p.condition === self) ||
|
||||||
|
(p instanceof AST_For && p.condition === self) ||
|
||||||
|
(p instanceof AST_UnaryPrefix && p.operator == "!" && p.expression === self))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!(p instanceof AST_Binary && (p.operator == "&&" || p.operator == "||")))
|
||||||
|
return false;
|
||||||
|
self = p;
|
||||||
|
}
|
||||||
|
},
|
||||||
loopcontrol_target: function(node) {
|
loopcontrol_target: function(node) {
|
||||||
var stack = this.stack;
|
var stack = this.stack;
|
||||||
if (node.label) for (var i = stack.length; --i >= 0;) {
|
if (node.label) for (var i = stack.length; --i >= 0;) {
|
||||||
|
|||||||
4928
lib/compress.js
4928
lib/compress.js
File diff suppressed because it is too large
Load Diff
239
lib/minify.js
239
lib/minify.js
@@ -1,239 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
|
|
||||||
var to_ascii = typeof atob == "undefined" ? function(b64) {
|
|
||||||
return new Buffer(b64, "base64").toString();
|
|
||||||
} : atob;
|
|
||||||
var to_base64 = typeof btoa == "undefined" ? function(str) {
|
|
||||||
return new Buffer(str).toString("base64");
|
|
||||||
} : btoa;
|
|
||||||
|
|
||||||
function read_source_map(code) {
|
|
||||||
var match = /\n\/\/# sourceMappingURL=data:application\/json(;.*?)?;base64,(.*)/.exec(code);
|
|
||||||
if (!match) {
|
|
||||||
AST_Node.warn("inline source map not found");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return to_ascii(match[2]);
|
|
||||||
}
|
|
||||||
|
|
||||||
function set_shorthand(name, options, keys) {
|
|
||||||
if (options[name]) {
|
|
||||||
keys.forEach(function(key) {
|
|
||||||
if (options[key]) {
|
|
||||||
if (typeof options[key] != "object") options[key] = {};
|
|
||||||
if (!(name in options[key])) options[key][name] = options[name];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function init_cache(cache) {
|
|
||||||
if (!cache) return;
|
|
||||||
if (!("cname" in cache)) cache.cname = -1;
|
|
||||||
if (!("props" in cache)) {
|
|
||||||
cache.props = new Dictionary();
|
|
||||||
} else if (!(cache.props instanceof Dictionary)) {
|
|
||||||
cache.props = Dictionary.fromObject(cache.props);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function to_json(cache) {
|
|
||||||
return {
|
|
||||||
cname: cache.cname,
|
|
||||||
props: cache.props.toObject()
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function minify(files, options) {
|
|
||||||
var warn_function = AST_Node.warn_function;
|
|
||||||
try {
|
|
||||||
options = defaults(options, {
|
|
||||||
compress: {},
|
|
||||||
ecma: undefined,
|
|
||||||
ie8: false,
|
|
||||||
keep_classnames: undefined,
|
|
||||||
keep_fnames: false,
|
|
||||||
mangle: {},
|
|
||||||
nameCache: null,
|
|
||||||
output: {},
|
|
||||||
parse: {},
|
|
||||||
rename: undefined,
|
|
||||||
safari10: false,
|
|
||||||
sourceMap: false,
|
|
||||||
timings: false,
|
|
||||||
toplevel: false,
|
|
||||||
warnings: false,
|
|
||||||
wrap: false,
|
|
||||||
}, true);
|
|
||||||
var timings = options.timings && {
|
|
||||||
start: Date.now()
|
|
||||||
};
|
|
||||||
if (options.keep_classnames === undefined) {
|
|
||||||
options.keep_classnames = options.keep_fnames;
|
|
||||||
}
|
|
||||||
if (options.rename === undefined) {
|
|
||||||
options.rename = options.compress && options.mangle;
|
|
||||||
}
|
|
||||||
set_shorthand("ecma", options, [ "parse", "compress", "output" ]);
|
|
||||||
set_shorthand("ie8", options, [ "compress", "mangle", "output" ]);
|
|
||||||
set_shorthand("keep_classnames", options, [ "compress", "mangle" ]);
|
|
||||||
set_shorthand("keep_fnames", options, [ "compress", "mangle" ]);
|
|
||||||
set_shorthand("safari10", options, [ "mangle", "output" ]);
|
|
||||||
set_shorthand("toplevel", options, [ "compress", "mangle" ]);
|
|
||||||
set_shorthand("warnings", options, [ "compress" ]);
|
|
||||||
var quoted_props;
|
|
||||||
if (options.mangle) {
|
|
||||||
options.mangle = defaults(options.mangle, {
|
|
||||||
cache: options.nameCache && (options.nameCache.vars || {}),
|
|
||||||
eval: false,
|
|
||||||
ie8: false,
|
|
||||||
keep_classnames: false,
|
|
||||||
keep_fnames: false,
|
|
||||||
properties: false,
|
|
||||||
reserved: [],
|
|
||||||
safari10: false,
|
|
||||||
toplevel: false,
|
|
||||||
}, true);
|
|
||||||
if (options.mangle.properties) {
|
|
||||||
if (typeof options.mangle.properties != "object") {
|
|
||||||
options.mangle.properties = {};
|
|
||||||
}
|
|
||||||
if (options.mangle.properties.keep_quoted) {
|
|
||||||
quoted_props = options.mangle.properties.reserved;
|
|
||||||
if (!Array.isArray(quoted_props)) quoted_props = [];
|
|
||||||
options.mangle.properties.reserved = quoted_props;
|
|
||||||
}
|
|
||||||
if (options.nameCache && !("cache" in options.mangle.properties)) {
|
|
||||||
options.mangle.properties.cache = options.nameCache.props || {};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
init_cache(options.mangle.cache);
|
|
||||||
init_cache(options.mangle.properties.cache);
|
|
||||||
}
|
|
||||||
if (options.sourceMap) {
|
|
||||||
options.sourceMap = defaults(options.sourceMap, {
|
|
||||||
content: null,
|
|
||||||
filename: null,
|
|
||||||
includeSources: false,
|
|
||||||
root: null,
|
|
||||||
url: null,
|
|
||||||
}, true);
|
|
||||||
}
|
|
||||||
var warnings = [];
|
|
||||||
if (options.warnings && !AST_Node.warn_function) {
|
|
||||||
AST_Node.warn_function = function(warning) {
|
|
||||||
warnings.push(warning);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
if (timings) timings.parse = Date.now();
|
|
||||||
var toplevel;
|
|
||||||
if (files instanceof AST_Toplevel) {
|
|
||||||
toplevel = files;
|
|
||||||
} else {
|
|
||||||
if (typeof files == "string") {
|
|
||||||
files = [ files ];
|
|
||||||
}
|
|
||||||
options.parse = options.parse || {};
|
|
||||||
options.parse.toplevel = null;
|
|
||||||
for (var name in files) if (HOP(files, name)) {
|
|
||||||
options.parse.filename = name;
|
|
||||||
options.parse.toplevel = parse(files[name], options.parse);
|
|
||||||
if (options.sourceMap && options.sourceMap.content == "inline") {
|
|
||||||
if (Object.keys(files).length > 1)
|
|
||||||
throw new Error("inline source map only works with singular input");
|
|
||||||
options.sourceMap.content = read_source_map(files[name]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
toplevel = options.parse.toplevel;
|
|
||||||
}
|
|
||||||
if (quoted_props) {
|
|
||||||
reserve_quoted_keys(toplevel, quoted_props);
|
|
||||||
}
|
|
||||||
if (options.wrap) {
|
|
||||||
toplevel = toplevel.wrap_commonjs(options.wrap);
|
|
||||||
}
|
|
||||||
if (timings) timings.rename = Date.now();
|
|
||||||
if (options.rename) {
|
|
||||||
toplevel.figure_out_scope(options.mangle);
|
|
||||||
toplevel.expand_names(options.mangle);
|
|
||||||
}
|
|
||||||
if (timings) timings.compress = Date.now();
|
|
||||||
if (options.compress) toplevel = new Compressor(options.compress).compress(toplevel);
|
|
||||||
if (timings) timings.scope = Date.now();
|
|
||||||
if (options.mangle) toplevel.figure_out_scope(options.mangle);
|
|
||||||
if (timings) timings.mangle = Date.now();
|
|
||||||
if (options.mangle) {
|
|
||||||
base54.reset();
|
|
||||||
toplevel.compute_char_frequency(options.mangle);
|
|
||||||
toplevel.mangle_names(options.mangle);
|
|
||||||
}
|
|
||||||
if (timings) timings.properties = Date.now();
|
|
||||||
if (options.mangle && options.mangle.properties) {
|
|
||||||
toplevel = mangle_properties(toplevel, options.mangle.properties);
|
|
||||||
}
|
|
||||||
if (timings) timings.output = Date.now();
|
|
||||||
var result = {};
|
|
||||||
if (options.output.ast) {
|
|
||||||
result.ast = toplevel;
|
|
||||||
}
|
|
||||||
if (!HOP(options.output, "code") || options.output.code) {
|
|
||||||
if (options.sourceMap) {
|
|
||||||
if (typeof options.sourceMap.content == "string") {
|
|
||||||
options.sourceMap.content = JSON.parse(options.sourceMap.content);
|
|
||||||
}
|
|
||||||
options.output.source_map = SourceMap({
|
|
||||||
file: options.sourceMap.filename,
|
|
||||||
orig: options.sourceMap.content,
|
|
||||||
root: options.sourceMap.root
|
|
||||||
});
|
|
||||||
if (options.sourceMap.includeSources) {
|
|
||||||
if (files instanceof AST_Toplevel) {
|
|
||||||
throw new Error("original source content unavailable");
|
|
||||||
} else for (var name in files) if (HOP(files, name)) {
|
|
||||||
options.output.source_map.get().setSourceContent(name, files[name]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
delete options.output.ast;
|
|
||||||
delete options.output.code;
|
|
||||||
var stream = OutputStream(options.output);
|
|
||||||
toplevel.print(stream);
|
|
||||||
result.code = stream.get();
|
|
||||||
if (options.sourceMap) {
|
|
||||||
result.map = options.output.source_map.toString();
|
|
||||||
if (options.sourceMap.url == "inline") {
|
|
||||||
result.code += "\n//# sourceMappingURL=data:application/json;charset=utf-8;base64," + to_base64(result.map);
|
|
||||||
} else if (options.sourceMap.url) {
|
|
||||||
result.code += "\n//# sourceMappingURL=" + options.sourceMap.url;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (options.nameCache && options.mangle) {
|
|
||||||
if (options.mangle.cache) options.nameCache.vars = to_json(options.mangle.cache);
|
|
||||||
if (options.mangle.properties && options.mangle.properties.cache) {
|
|
||||||
options.nameCache.props = to_json(options.mangle.properties.cache);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (timings) {
|
|
||||||
timings.end = Date.now();
|
|
||||||
result.timings = {
|
|
||||||
parse: 1e-3 * (timings.rename - timings.parse),
|
|
||||||
rename: 1e-3 * (timings.compress - timings.rename),
|
|
||||||
compress: 1e-3 * (timings.scope - timings.compress),
|
|
||||||
scope: 1e-3 * (timings.mangle - timings.scope),
|
|
||||||
mangle: 1e-3 * (timings.properties - timings.mangle),
|
|
||||||
properties: 1e-3 * (timings.output - timings.properties),
|
|
||||||
output: 1e-3 * (timings.end - timings.output),
|
|
||||||
total: 1e-3 * (timings.end - timings.start)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (warnings.length) {
|
|
||||||
result.warnings = warnings;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
} catch (ex) {
|
|
||||||
return { error: ex };
|
|
||||||
} finally {
|
|
||||||
AST_Node.warn_function = warn_function;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -118,7 +118,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);
|
||||||
@@ -145,11 +145,7 @@
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
SequenceExpression: function(M) {
|
SequenceExpression: function(M) {
|
||||||
return new AST_Sequence({
|
return AST_Seq.from_array(M.expressions.map(from_moz));
|
||||||
start : my_start_token(M),
|
|
||||||
end : my_end_token(M),
|
|
||||||
expressions: M.expressions.map(from_moz)
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
MemberExpression: function(M) {
|
MemberExpression: function(M) {
|
||||||
return new (M.computed ? AST_Sub : AST_Dot)({
|
return new (M.computed ? AST_Sub : AST_Dot)({
|
||||||
@@ -329,10 +325,10 @@
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
def_to_moz(AST_Sequence, function To_Moz_SequenceExpression(M) {
|
def_to_moz(AST_Seq, function To_Moz_SequenceExpression(M) {
|
||||||
return {
|
return {
|
||||||
type: "SequenceExpression",
|
type: "SequenceExpression",
|
||||||
expressions: M.expressions.map(to_moz)
|
expressions: M.to_array().map(to_moz)
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -381,7 +377,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) {
|
||||||
|
|||||||
952
lib/output.js
952
lib/output.js
File diff suppressed because it is too large
Load Diff
1773
lib/parse.js
1773
lib/parse.js
File diff suppressed because one or more lines are too long
@@ -43,37 +43,19 @@
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
function find_builtins(reserved) {
|
function find_builtins() {
|
||||||
|
|
||||||
// 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
|
||||||
[
|
var a = [
|
||||||
"null",
|
"null",
|
||||||
"true",
|
"true",
|
||||||
"false",
|
"false",
|
||||||
"Infinity",
|
"Infinity",
|
||||||
"-Infinity",
|
"-Infinity",
|
||||||
"undefined",
|
"undefined",
|
||||||
].forEach(add);
|
];
|
||||||
[ Object, Array, Function, Number,
|
[ Object, Array, Function, Number,
|
||||||
String, Boolean, Error, Math,
|
String, Boolean, Error, Math,
|
||||||
Date, RegExp, objects.Symbol, ArrayBuffer,
|
Date, RegExp
|
||||||
DataView, decodeURI, decodeURIComponent,
|
|
||||||
encodeURI, encodeURIComponent, eval, EvalError,
|
|
||||||
Float32Array, Float64Array, Int8Array, Int16Array,
|
|
||||||
Int32Array, isFinite, isNaN, JSON, objects.Map, parseFloat,
|
|
||||||
parseInt, objects.Promise, objects.Proxy, RangeError, ReferenceError,
|
|
||||||
objects.Reflect, objects.Set, SyntaxError, TypeError, Uint8Array,
|
|
||||||
Uint8ClampedArray, Uint16Array, Uint32Array, URIError,
|
|
||||||
objects.WeakMap, objects.WeakSet
|
|
||||||
].forEach(function(ctor){
|
].forEach(function(ctor){
|
||||||
Object.getOwnPropertyNames(ctor).map(add);
|
Object.getOwnPropertyNames(ctor).map(add);
|
||||||
if (ctor.prototype) {
|
if (ctor.prototype) {
|
||||||
@@ -81,54 +63,24 @@ function find_builtins(reserved) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
function add(name) {
|
function add(name) {
|
||||||
push_uniq(reserved, name);
|
push_uniq(a, name);
|
||||||
}
|
}
|
||||||
}
|
return a;
|
||||||
|
|
||||||
function reserve_quoted_keys(ast, reserved) {
|
|
||||||
function add(name) {
|
|
||||||
push_uniq(reserved, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
ast.walk(new TreeWalker(function(node) {
|
|
||||||
if (node instanceof AST_ObjectKeyVal && node.quote) {
|
|
||||||
add(node.key);
|
|
||||||
} else if (node instanceof AST_ObjectProperty && node.quote) {
|
|
||||||
add(node.key.name);
|
|
||||||
} else if (node instanceof AST_Sub) {
|
|
||||||
addStrings(node.property, add);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
function addStrings(node, add) {
|
|
||||||
node.walk(new TreeWalker(function(node) {
|
|
||||||
if (node instanceof AST_Sequence) {
|
|
||||||
addStrings(node.tail_node(), add);
|
|
||||||
} else if (node instanceof AST_String) {
|
|
||||||
add(node.value);
|
|
||||||
} else if (node instanceof AST_Conditional) {
|
|
||||||
addStrings(node.consequent, add);
|
|
||||||
addStrings(node.alternative, add);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function mangle_properties(ast, options) {
|
function mangle_properties(ast, options) {
|
||||||
options = defaults(options, {
|
options = defaults(options, {
|
||||||
builtins: false,
|
|
||||||
cache: null,
|
cache: null,
|
||||||
debug: false,
|
debug: false,
|
||||||
keep_quoted: false,
|
ignore_quoted: false,
|
||||||
only_cache: false,
|
only_cache: false,
|
||||||
regex: null,
|
regex: null,
|
||||||
reserved: null,
|
reserved: null,
|
||||||
}, true);
|
});
|
||||||
|
|
||||||
var reserved = options.reserved;
|
var reserved = options.reserved;
|
||||||
if (!Array.isArray(reserved)) reserved = [];
|
if (reserved == null)
|
||||||
if (!options.builtins) find_builtins(reserved);
|
reserved = find_builtins();
|
||||||
|
|
||||||
var cache = options.cache;
|
var cache = options.cache;
|
||||||
if (cache == null) {
|
if (cache == null) {
|
||||||
@@ -139,11 +91,12 @@ function mangle_properties(ast, options) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var regex = options.regex;
|
var regex = options.regex;
|
||||||
|
var ignore_quoted = options.ignore_quoted;
|
||||||
|
|
||||||
// note debug is either false (disabled), or a string of the debug suffix to use (enabled).
|
// note debug is either false (disabled), or a string of the debug suffix to use (enabled).
|
||||||
// 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_name_suffix;
|
||||||
if (debug) {
|
if (debug) {
|
||||||
debug_name_suffix = (options.debug === true ? "" : options.debug);
|
debug_name_suffix = (options.debug === true ? "" : options.debug);
|
||||||
@@ -151,11 +104,12 @@ function mangle_properties(ast, options) {
|
|||||||
|
|
||||||
var names_to_mangle = [];
|
var names_to_mangle = [];
|
||||||
var unmangleable = [];
|
var unmangleable = [];
|
||||||
|
var ignored = {};
|
||||||
|
|
||||||
// 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, ignore_quoted && node.quote);
|
||||||
}
|
}
|
||||||
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
|
||||||
@@ -165,14 +119,15 @@ function mangle_properties(ast, options) {
|
|||||||
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, ignore_quoted);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
// 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);
|
if (!(ignore_quoted && node.quote))
|
||||||
|
node.key = mangle(node.key);
|
||||||
}
|
}
|
||||||
else if (node instanceof AST_ObjectProperty) {
|
else if (node instanceof AST_ObjectProperty) {
|
||||||
// setter or getter
|
// setter or getter
|
||||||
@@ -181,9 +136,22 @@ function mangle_properties(ast, options) {
|
|||||||
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 (node instanceof AST_Sub) {
|
||||||
node.property = mangleStrings(node.property);
|
if (!ignore_quoted)
|
||||||
|
node.property = mangleStrings(node.property);
|
||||||
}
|
}
|
||||||
|
// else if (node instanceof AST_String) {
|
||||||
|
// if (should_mangle(node.value)) {
|
||||||
|
// AST_Node.warn(
|
||||||
|
// "Found \"{prop}\" property candidate for mangling in an arbitrary string [{file}:{line},{col}]", {
|
||||||
|
// file : node.start.file,
|
||||||
|
// line : node.start.line,
|
||||||
|
// col : node.start.col,
|
||||||
|
// prop : node.value
|
||||||
|
// }
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
// }
|
||||||
}));
|
}));
|
||||||
|
|
||||||
// only function declarations after this line
|
// only function declarations after this line
|
||||||
@@ -199,13 +167,19 @@ function mangle_properties(ast, options) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function should_mangle(name) {
|
function should_mangle(name) {
|
||||||
|
if (ignore_quoted && name in ignored) return false;
|
||||||
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.props.has(name)
|
return cache.props.has(name)
|
||||||
|| names_to_mangle.indexOf(name) >= 0;
|
|| names_to_mangle.indexOf(name) >= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
function add(name) {
|
function add(name, ignore) {
|
||||||
|
if (ignore) {
|
||||||
|
ignored[name] = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (can_mangle(name))
|
if (can_mangle(name))
|
||||||
push_uniq(names_to_mangle, name);
|
push_uniq(names_to_mangle, name);
|
||||||
|
|
||||||
@@ -225,16 +199,19 @@ function mangle_properties(ast, options) {
|
|||||||
// 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_name_suffix + "_";
|
||||||
|
|
||||||
if (can_mangle(debug_mangled)) {
|
if (can_mangle(debug_mangled) && !(ignore_quoted && debug_mangled in ignored)) {
|
||||||
mangled = 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) {
|
||||||
|
// note can_mangle() does not check if the name collides with the 'ignored' set
|
||||||
|
// (filled with quoted properties when ignore_quoted set). Make sure we add this
|
||||||
|
// check so we don't collide with a quoted name.
|
||||||
do {
|
do {
|
||||||
mangled = base54(++cache.cname);
|
mangled = base54(++cache.cname);
|
||||||
} while (!can_mangle(mangled));
|
} while (!can_mangle(mangled) || (ignore_quoted && mangled in ignored));
|
||||||
}
|
}
|
||||||
|
|
||||||
cache.props.set(name, mangled);
|
cache.props.set(name, mangled);
|
||||||
@@ -242,11 +219,36 @@ function mangle_properties(ast, options) {
|
|||||||
return mangled;
|
return mangled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function addStrings(node, ignore) {
|
||||||
|
var out = {};
|
||||||
|
try {
|
||||||
|
(function walk(node){
|
||||||
|
node.walk(new TreeWalker(function(node){
|
||||||
|
if (node instanceof AST_Seq) {
|
||||||
|
walk(node.cdr);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (node instanceof AST_String) {
|
||||||
|
add(node.value, ignore);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (node instanceof AST_Conditional) {
|
||||||
|
walk(node.consequent);
|
||||||
|
walk(node.alternative);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
throw out;
|
||||||
|
}));
|
||||||
|
})(node);
|
||||||
|
} catch(ex) {
|
||||||
|
if (ex !== out) throw ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
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_Seq) {
|
||||||
var last = node.expressions.length - 1;
|
node.cdr = mangleStrings(node.cdr);
|
||||||
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);
|
||||||
@@ -258,4 +260,5 @@ function mangle_properties(ast, options) {
|
|||||||
return node;
|
return node;
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
506
lib/scope.js
506
lib/scope.js
@@ -43,17 +43,15 @@
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
function SymbolDef(scope, orig) {
|
function SymbolDef(scope, index, orig) {
|
||||||
this.name = orig.name;
|
this.name = orig.name;
|
||||||
this.orig = [ orig ];
|
this.orig = [ orig ];
|
||||||
this.eliminated = 0;
|
|
||||||
this.scope = scope;
|
this.scope = scope;
|
||||||
this.references = [];
|
this.references = [];
|
||||||
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.index = index;
|
||||||
this.id = SymbolDef.next_id++;
|
this.id = SymbolDef.next_id++;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -64,16 +62,11 @@ SymbolDef.prototype = {
|
|||||||
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.uses_eval || this.scope.uses_with))
|
||||||
|| (options.keep_fnames
|
|| (options.keep_fnames
|
||||||
&& (this.orig[0] instanceof AST_SymbolLambda
|
&& (this.orig[0] instanceof AST_SymbolLambda
|
||||||
|| this.orig[0] instanceof AST_SymbolDefun))
|
|| this.orig[0] instanceof AST_SymbolDefun));
|
||||||
|| this.orig[0] instanceof AST_SymbolMethod
|
|
||||||
|| (options.keep_classnames
|
|
||||||
&& (this.orig[0] instanceof AST_SymbolClass
|
|
||||||
|| this.orig[0] instanceof AST_SymbolDefClass));
|
|
||||||
},
|
},
|
||||||
mangle: function(options) {
|
mangle: function(options) {
|
||||||
var cache = options.cache && options.cache.props;
|
var cache = options.cache && options.cache.props;
|
||||||
@@ -83,10 +76,10 @@ SymbolDef.prototype = {
|
|||||||
else if (!this.mangled_name && !this.unmangleable(options)) {
|
else if (!this.mangled_name && !this.unmangleable(options)) {
|
||||||
var s = this.scope;
|
var s = this.scope;
|
||||||
var sym = this.orig[0];
|
var sym = this.orig[0];
|
||||||
if (options.ie8 && sym instanceof AST_SymbolLambda)
|
if (!options.screw_ie8 && sym instanceof AST_SymbolLambda)
|
||||||
s = s.parent_scope;
|
s = s.parent_scope;
|
||||||
var def;
|
var def;
|
||||||
if (def = this.redefined()) {
|
if (this.defun && (def = this.defun.variables.get(this.name))) {
|
||||||
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 = s.next_mangled(options, this);
|
||||||
@@ -94,17 +87,13 @@ SymbolDef.prototype = {
|
|||||||
cache.set(this.name, this.mangled_name);
|
cache.set(this.name, this.mangled_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
|
||||||
redefined: function() {
|
|
||||||
return this.defun && this.defun.variables.get(this.name);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
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,
|
screw_ie8: true,
|
||||||
safari10: false,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// pass 1: setup scope chaining and handle definitions
|
// pass 1: setup scope chaining and handle definitions
|
||||||
@@ -112,33 +101,15 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|||||||
var scope = self.parent_scope = null;
|
var scope = self.parent_scope = null;
|
||||||
var labels = new Dictionary();
|
var labels = new Dictionary();
|
||||||
var defun = null;
|
var defun = null;
|
||||||
var in_destructuring = null;
|
|
||||||
var for_scopes = [];
|
|
||||||
var tw = new TreeWalker(function(node, descend){
|
var tw = new TreeWalker(function(node, descend){
|
||||||
if (node.is_block_scope()) {
|
if (node instanceof AST_Catch) {
|
||||||
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;
|
||||||
@@ -183,40 +154,11 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|||||||
// scope when we encounter the AST_Defun node (which is
|
// scope when we encounter the AST_Defun node (which is
|
||||||
// instanceof AST_Scope) but we get to the symbol a bit
|
// instanceof AST_Scope) but we get to the symbol a bit
|
||||||
// later.
|
// later.
|
||||||
mark_export((node.scope = defun.parent_scope.get_defun_scope()).def_function(node), 1);
|
(node.scope = defun.parent_scope).def_function(node);
|
||||||
}
|
|
||||||
else if (node instanceof AST_SymbolClass) {
|
|
||||||
mark_export(defun.def_variable(node), 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), 1);
|
|
||||||
}
|
}
|
||||||
else if (node instanceof AST_SymbolVar
|
else if (node instanceof AST_SymbolVar
|
||||||
|| node instanceof AST_SymbolLet
|
|
||||||
|| node instanceof AST_SymbolConst) {
|
|| node instanceof AST_SymbolConst) {
|
||||||
var def = ((node instanceof AST_SymbolBlockDeclaration) ? scope : defun).def_variable(node);
|
defun.def_variable(node);
|
||||||
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);
|
||||||
@@ -238,32 +180,20 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|||||||
}));
|
}));
|
||||||
node.thedef = sym;
|
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();
|
var func = null;
|
||||||
|
var globals = self.globals = new Dictionary();
|
||||||
var tw = new TreeWalker(function(node, descend){
|
var tw = new TreeWalker(function(node, descend){
|
||||||
|
if (node instanceof AST_Lambda) {
|
||||||
|
var prev_func = func;
|
||||||
|
func = node;
|
||||||
|
descend();
|
||||||
|
func = prev_func;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (node instanceof AST_LoopControl && node.label) {
|
if (node instanceof AST_LoopControl && node.label) {
|
||||||
node.label.thedef.references.push(node);
|
node.label.thedef.references.push(node);
|
||||||
return true;
|
return true;
|
||||||
@@ -275,32 +205,22 @@ 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 (node.scope instanceof AST_Lambda && name == "arguments") {
|
||||||
|| !(sym = node.scope.find_variable(name))) {
|
node.scope.uses_arguments = true;
|
||||||
|
}
|
||||||
|
if (!sym) {
|
||||||
sym = self.def_global(node);
|
sym = self.def_global(node);
|
||||||
} else if (sym.scope instanceof AST_Lambda && name == "arguments") {
|
|
||||||
sym.scope.uses_arguments = true;
|
|
||||||
}
|
}
|
||||||
node.thedef = sym;
|
node.thedef = sym;
|
||||||
node.reference(options);
|
node.reference(options);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// ensure mangling works if catch reuses a scope variable
|
|
||||||
var def;
|
|
||||||
if (node instanceof AST_SymbolCatch && (def = node.definition().redefined())) {
|
|
||||||
var s = node.scope;
|
|
||||||
while (s) {
|
|
||||||
push_uniq(s.enclosed, def);
|
|
||||||
if (s === def.scope) break;
|
|
||||||
s = s.parent_scope;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
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.screw_ie8) {
|
||||||
self.walk(new TreeWalker(function(node, descend) {
|
self.walk(new TreeWalker(function(node, descend) {
|
||||||
if (node instanceof AST_SymbolCatch) {
|
if (node instanceof AST_SymbolCatch) {
|
||||||
var name = node.name;
|
var name = node.name;
|
||||||
@@ -312,25 +232,11 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|||||||
ref.reference(options);
|
ref.reference(options);
|
||||||
});
|
});
|
||||||
node.thedef = def;
|
node.thedef = def;
|
||||||
node.reference(options);
|
|
||||||
return true;
|
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 (options.cache) {
|
if (options.cache) {
|
||||||
this.cname = options.cache.cname;
|
this.cname = options.cache.cname;
|
||||||
}
|
}
|
||||||
@@ -341,7 +247,7 @@ AST_Toplevel.DEFMETHOD("def_global", function(node){
|
|||||||
if (globals.has(name)) {
|
if (globals.has(name)) {
|
||||||
return globals.get(name);
|
return globals.get(name);
|
||||||
} else {
|
} else {
|
||||||
var g = new SymbolDef(this, node);
|
var g = new SymbolDef(this, globals.size(), node);
|
||||||
g.undeclared = true;
|
g.undeclared = true;
|
||||||
g.global = true;
|
g.global = true;
|
||||||
globals.set(name, g);
|
globals.set(name, g);
|
||||||
@@ -359,18 +265,10 @@ 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_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_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_SymbolVar({
|
||||||
name: "arguments",
|
name: "arguments",
|
||||||
start: this.start,
|
start: this.start,
|
||||||
end: this.end
|
end: this.end
|
||||||
@@ -404,15 +302,13 @@ AST_Scope.DEFMETHOD("find_variable", function(name){
|
|||||||
});
|
});
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("def_function", function(symbol){
|
AST_Scope.DEFMETHOD("def_function", function(symbol){
|
||||||
var def = this.def_variable(symbol);
|
this.functions.set(symbol.name, this.def_variable(symbol));
|
||||||
this.functions.set(symbol.name, def);
|
|
||||||
return def;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("def_variable", function(symbol){
|
AST_Scope.DEFMETHOD("def_variable", function(symbol){
|
||||||
var def;
|
var def;
|
||||||
if (!this.variables.has(symbol.name)) {
|
if (!this.variables.has(symbol.name)) {
|
||||||
def = new SymbolDef(this, symbol);
|
def = new SymbolDef(this, this.variables.size(), symbol);
|
||||||
this.variables.set(symbol.name, def);
|
this.variables.set(symbol.name, def);
|
||||||
def.global = !this.parent_scope;
|
def.global = !this.parent_scope;
|
||||||
} else {
|
} else {
|
||||||
@@ -429,8 +325,8 @@ AST_Scope.DEFMETHOD("next_mangled", function(options){
|
|||||||
if (!is_identifier(m)) continue; // skip over "do"
|
if (!is_identifier(m)) continue; // skip over "do"
|
||||||
|
|
||||||
// https://github.com/mishoo/UglifyJS2/issues/242 -- do not
|
// https://github.com/mishoo/UglifyJS2/issues/242 -- do not
|
||||||
// shadow a name reserved from mangling.
|
// shadow a name excepted from mangling.
|
||||||
if (member(m, options.reserved)) continue;
|
if (options.except.indexOf(m) >= 0) continue;
|
||||||
|
|
||||||
// we must ensure that the mangled name does not shadow a name
|
// we must ensure that the mangled name does not shadow a name
|
||||||
// from some parent scope that is referenced in this or in
|
// from some parent scope that is referenced in this or in
|
||||||
@@ -462,18 +358,31 @@ AST_Function.DEFMETHOD("next_mangled", function(options, def){
|
|||||||
});
|
});
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("unmangleable", function(options){
|
AST_Symbol.DEFMETHOD("unmangleable", function(options){
|
||||||
var def = this.definition();
|
return this.definition().unmangleable(options);
|
||||||
return !def || def.unmangleable(options);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// labels are always mangleable
|
// labels are always mangleable
|
||||||
AST_Label.DEFMETHOD("unmangleable", return_false);
|
AST_Label.DEFMETHOD("unmangleable", function(){
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("unreferenced", function(){
|
AST_Symbol.DEFMETHOD("unreferenced", function(){
|
||||||
return this.definition().references.length == 0
|
return this.definition().references.length == 0
|
||||||
&& !(this.scope.uses_eval || this.scope.uses_with);
|
&& !(this.scope.uses_eval || this.scope.uses_with);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
AST_Symbol.DEFMETHOD("undeclared", function(){
|
||||||
|
return this.definition().undeclared;
|
||||||
|
});
|
||||||
|
|
||||||
|
AST_LabelRef.DEFMETHOD("undeclared", function(){
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
AST_Label.DEFMETHOD("undeclared", function(){
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("definition", function(){
|
AST_Symbol.DEFMETHOD("definition", function(){
|
||||||
return this.thedef;
|
return this.thedef;
|
||||||
});
|
});
|
||||||
@@ -482,24 +391,23 @@ AST_Symbol.DEFMETHOD("global", function(){
|
|||||||
return this.definition().global;
|
return this.definition().global;
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("_default_mangler_options", function(options) {
|
AST_Toplevel.DEFMETHOD("_default_mangler_options", function(options){
|
||||||
options = defaults(options, {
|
return defaults(options, {
|
||||||
eval : false,
|
eval : false,
|
||||||
ie8 : false,
|
except : [],
|
||||||
keep_classnames: false,
|
|
||||||
keep_fnames : false,
|
keep_fnames : false,
|
||||||
reserved : [],
|
screw_ie8 : true,
|
||||||
|
sort : false, // Ignored. Flag retained for backwards compatibility.
|
||||||
toplevel : false,
|
toplevel : false,
|
||||||
});
|
});
|
||||||
if (!Array.isArray(options.reserved)) options.reserved = [];
|
|
||||||
// Never mangle arguments
|
|
||||||
push_uniq(options.reserved, "arguments");
|
|
||||||
return options;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("mangle_names", function(options){
|
AST_Toplevel.DEFMETHOD("mangle_names", function(options){
|
||||||
options = this._default_mangler_options(options);
|
options = this._default_mangler_options(options);
|
||||||
|
|
||||||
|
// Never mangle arguments
|
||||||
|
options.except.push('arguments');
|
||||||
|
|
||||||
// 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
|
||||||
@@ -508,7 +416,11 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options){
|
|||||||
var to_mangle = [];
|
var to_mangle = [];
|
||||||
|
|
||||||
if (options.cache) {
|
if (options.cache) {
|
||||||
this.globals.each(collect);
|
this.globals.each(function(symbol){
|
||||||
|
if (options.except.indexOf(symbol.name) < 0) {
|
||||||
|
to_mangle.push(symbol);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
var tw = new TreeWalker(function(node, descend){
|
var tw = new TreeWalker(function(node, descend){
|
||||||
@@ -520,7 +432,13 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options){
|
|||||||
return true; // don't descend again in TreeWalker
|
return true; // don't descend again in TreeWalker
|
||||||
}
|
}
|
||||||
if (node instanceof AST_Scope) {
|
if (node instanceof AST_Scope) {
|
||||||
node.variables.each(collect);
|
var p = tw.parent(), a = [];
|
||||||
|
node.variables.each(function(symbol){
|
||||||
|
if (options.except.indexOf(symbol.name) < 0) {
|
||||||
|
a.push(symbol);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
to_mangle.push.apply(to_mangle, a);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (node instanceof AST_Label) {
|
if (node instanceof AST_Label) {
|
||||||
@@ -529,162 +447,120 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options){
|
|||||||
node.mangled_name = name;
|
node.mangled_name = name;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
var mangle_with_block_scope =
|
if (options.screw_ie8 && node instanceof AST_SymbolCatch) {
|
||||||
(!options.ie8 && node instanceof AST_SymbolCatch) ||
|
|
||||||
node instanceof AST_SymbolBlockDeclaration;
|
|
||||||
if (mangle_with_block_scope && options.reserved.indexOf(node.name) < 0) {
|
|
||||||
to_mangle.push(node.definition());
|
to_mangle.push(node.definition());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.walk(tw);
|
this.walk(tw);
|
||||||
to_mangle.forEach(function(def){
|
to_mangle.forEach(function(def){ def.mangle(options) });
|
||||||
def.mangle(options);
|
|
||||||
});
|
|
||||||
|
|
||||||
if (options.cache) {
|
if (options.cache) {
|
||||||
options.cache.cname = this.cname;
|
options.cache.cname = this.cname;
|
||||||
}
|
}
|
||||||
|
|
||||||
function collect(symbol) {
|
|
||||||
if (!member(symbol.name, options.reserved)) {
|
|
||||||
to_mangle.push(symbol);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("find_unique_prefix", function(options) {
|
|
||||||
var letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_";
|
|
||||||
var cache = options.cache && options.cache.props;
|
|
||||||
var prefixes = Object.create(null);
|
|
||||||
options.reserved.forEach(add_prefix);
|
|
||||||
this.globals.each(add_def);
|
|
||||||
this.walk(new TreeWalker(function(node) {
|
|
||||||
if (node instanceof AST_Scope) node.variables.each(add_def);
|
|
||||||
if (node instanceof AST_SymbolCatch) add_def(node.definition());
|
|
||||||
}));
|
|
||||||
var prefix, i = 0;
|
|
||||||
do {
|
|
||||||
prefix = create_name(i++);
|
|
||||||
} while (prefixes[prefix]);
|
|
||||||
return prefix;
|
|
||||||
|
|
||||||
function add_prefix(name) {
|
|
||||||
if (/[0-9]$/.test(name)) {
|
|
||||||
prefixes[name.replace(/[0-9]+$/, "")] = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function add_def(def) {
|
|
||||||
var name = def.name;
|
|
||||||
if (def.global && cache && cache.has(name)) name = cache.get(name);
|
|
||||||
else if (!def.unmangleable(options)) return;
|
|
||||||
add_prefix(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
function create_name(num) {
|
|
||||||
var name = "";
|
|
||||||
do {
|
|
||||||
name += letters[num % letters.length];
|
|
||||||
num = Math.floor(num / letters.length);
|
|
||||||
} while (num);
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("expand_names", function(options) {
|
|
||||||
options = this._default_mangler_options(options);
|
|
||||||
var prefix = this.find_unique_prefix(options);
|
|
||||||
this.globals.each(rename);
|
|
||||||
this.walk(new TreeWalker(function(node) {
|
|
||||||
if (node instanceof AST_Scope) node.variables.each(rename);
|
|
||||||
if (node instanceof AST_SymbolCatch) rename(node.definition());
|
|
||||||
}));
|
|
||||||
|
|
||||||
function rename(def) {
|
|
||||||
if (def.global || def.unmangleable(options)) return;
|
|
||||||
if (member(def.name, options.reserved)) return;
|
|
||||||
var d = def.redefined();
|
|
||||||
def.name = d ? d.name : prefix + def.id;
|
|
||||||
def.orig.forEach(function(sym) {
|
|
||||||
sym.name = def.name;
|
|
||||||
});
|
|
||||||
def.references.forEach(function(sym) {
|
|
||||||
sym.name = def.name;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Node.DEFMETHOD("tail_node", return_this);
|
|
||||||
AST_Sequence.DEFMETHOD("tail_node", function() {
|
|
||||||
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 = this._default_mangler_options(options);
|
||||||
try {
|
var tw = new TreeWalker(function(node){
|
||||||
AST_Node.prototype.print = function(stream, force_parens) {
|
if (node instanceof AST_Constant)
|
||||||
this._print(stream, force_parens);
|
base54.consider(node.print_to_string());
|
||||||
if (this instanceof AST_Symbol && !this.unmangleable(options)) {
|
else if (node instanceof AST_Return)
|
||||||
base54.consider(this.name, -1);
|
base54.consider("return");
|
||||||
} else if (options.properties) {
|
else if (node instanceof AST_Throw)
|
||||||
if (this instanceof AST_Dot) {
|
base54.consider("throw");
|
||||||
base54.consider(this.property, -1);
|
else if (node instanceof AST_Continue)
|
||||||
} else if (this instanceof AST_Sub) {
|
base54.consider("continue");
|
||||||
skip_string(this.property);
|
else if (node instanceof AST_Break)
|
||||||
}
|
base54.consider("break");
|
||||||
}
|
else if (node instanceof AST_Debugger)
|
||||||
};
|
base54.consider("debugger");
|
||||||
base54.consider(this.print_to_string(), 1);
|
else if (node instanceof AST_Directive)
|
||||||
} finally {
|
base54.consider(node.value);
|
||||||
AST_Node.prototype.print = AST_Node.prototype._print;
|
else if (node instanceof AST_While)
|
||||||
}
|
base54.consider("while");
|
||||||
base54.sort();
|
else if (node instanceof AST_Do)
|
||||||
|
base54.consider("do while");
|
||||||
function skip_string(node) {
|
else if (node instanceof AST_If) {
|
||||||
if (node instanceof AST_String) {
|
base54.consider("if");
|
||||||
base54.consider(node.value, -1);
|
if (node.alternative) base54.consider("else");
|
||||||
} else if (node instanceof AST_Conditional) {
|
|
||||||
skip_string(node.consequent);
|
|
||||||
skip_string(node.alternative);
|
|
||||||
} else if (node instanceof AST_Sequence) {
|
|
||||||
skip_string(node.tail_node());
|
|
||||||
}
|
}
|
||||||
}
|
else if (node instanceof AST_Var)
|
||||||
|
base54.consider("var");
|
||||||
|
else if (node instanceof AST_Const)
|
||||||
|
base54.consider("const");
|
||||||
|
else if (node instanceof AST_Lambda)
|
||||||
|
base54.consider("function");
|
||||||
|
else if (node instanceof AST_For)
|
||||||
|
base54.consider("for");
|
||||||
|
else if (node instanceof AST_ForIn)
|
||||||
|
base54.consider("for in");
|
||||||
|
else if (node instanceof AST_Switch)
|
||||||
|
base54.consider("switch");
|
||||||
|
else if (node instanceof AST_Case)
|
||||||
|
base54.consider("case");
|
||||||
|
else if (node instanceof AST_Default)
|
||||||
|
base54.consider("default");
|
||||||
|
else if (node instanceof AST_With)
|
||||||
|
base54.consider("with");
|
||||||
|
else if (node instanceof AST_ObjectSetter)
|
||||||
|
base54.consider("set" + node.key);
|
||||||
|
else if (node instanceof AST_ObjectGetter)
|
||||||
|
base54.consider("get" + node.key);
|
||||||
|
else if (node instanceof AST_ObjectKeyVal)
|
||||||
|
base54.consider(node.key);
|
||||||
|
else if (node instanceof AST_New)
|
||||||
|
base54.consider("new");
|
||||||
|
else if (node instanceof AST_This)
|
||||||
|
base54.consider("this");
|
||||||
|
else if (node instanceof AST_Try)
|
||||||
|
base54.consider("try");
|
||||||
|
else if (node instanceof AST_Catch)
|
||||||
|
base54.consider("catch");
|
||||||
|
else if (node instanceof AST_Finally)
|
||||||
|
base54.consider("finally");
|
||||||
|
else if (node instanceof AST_Symbol && node.unmangleable(options))
|
||||||
|
base54.consider(node.name);
|
||||||
|
else if (node instanceof AST_Unary || node instanceof AST_Binary)
|
||||||
|
base54.consider(node.operator);
|
||||||
|
else if (node instanceof AST_Dot)
|
||||||
|
base54.consider(node.property);
|
||||||
|
});
|
||||||
|
this.walk(tw);
|
||||||
|
base54.sort();
|
||||||
});
|
});
|
||||||
|
|
||||||
var base54 = (function() {
|
var base54 = (function() {
|
||||||
var leading = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_".split("");
|
var string = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_0123456789";
|
||||||
var digits = "0123456789".split("");
|
|
||||||
var chars, frequency;
|
var chars, frequency;
|
||||||
function reset() {
|
function reset() {
|
||||||
frequency = Object.create(null);
|
frequency = Object.create(null);
|
||||||
leading.forEach(function(ch) {
|
chars = string.split("").map(function(ch){ return ch.charCodeAt(0) });
|
||||||
frequency[ch] = 0;
|
chars.forEach(function(ch){ frequency[ch] = 0 });
|
||||||
});
|
|
||||||
digits.forEach(function(ch) {
|
|
||||||
frequency[ch] = 0;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
base54.consider = function(str, delta) {
|
base54.consider = function(str){
|
||||||
for (var i = str.length; --i >= 0;) {
|
for (var i = str.length; --i >= 0;) {
|
||||||
frequency[str[i]] += delta;
|
var code = str.charCodeAt(i);
|
||||||
|
if (code in frequency) ++frequency[code];
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
function compare(a, b) {
|
|
||||||
return frequency[b] - frequency[a];
|
|
||||||
}
|
|
||||||
base54.sort = function() {
|
base54.sort = function() {
|
||||||
chars = mergeSort(leading, compare).concat(mergeSort(digits, compare));
|
chars = mergeSort(chars, function(a, b){
|
||||||
|
if (is_digit(a) && !is_digit(b)) return 1;
|
||||||
|
if (is_digit(b) && !is_digit(a)) return -1;
|
||||||
|
return frequency[b] - frequency[a];
|
||||||
|
});
|
||||||
};
|
};
|
||||||
base54.reset = reset;
|
base54.reset = reset;
|
||||||
reset();
|
reset();
|
||||||
|
base54.get = function(){ return chars };
|
||||||
|
base54.freq = function(){ return frequency };
|
||||||
function base54(num) {
|
function base54(num) {
|
||||||
var ret = "", base = 54;
|
var ret = "", base = 54;
|
||||||
num++;
|
num++;
|
||||||
do {
|
do {
|
||||||
num--;
|
num--;
|
||||||
ret += chars[num % base];
|
ret += String.fromCharCode(chars[num % base]);
|
||||||
num = Math.floor(num / base);
|
num = Math.floor(num / base);
|
||||||
base = 64;
|
base = 64;
|
||||||
} while (num > 0);
|
} while (num > 0);
|
||||||
@@ -692,3 +568,89 @@ var base54 = (function() {
|
|||||||
};
|
};
|
||||||
return base54;
|
return base54;
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
AST_Toplevel.DEFMETHOD("scope_warnings", function(options){
|
||||||
|
options = defaults(options, {
|
||||||
|
assign_to_global : true,
|
||||||
|
eval : true,
|
||||||
|
func_arguments : true,
|
||||||
|
nested_defuns : true,
|
||||||
|
undeclared : false, // this makes a lot of noise
|
||||||
|
unreferenced : true,
|
||||||
|
});
|
||||||
|
var tw = new TreeWalker(function(node){
|
||||||
|
if (options.undeclared
|
||||||
|
&& node instanceof AST_SymbolRef
|
||||||
|
&& node.undeclared())
|
||||||
|
{
|
||||||
|
// XXX: this also warns about JS standard names,
|
||||||
|
// i.e. Object, Array, parseInt etc. Should add a list of
|
||||||
|
// exceptions.
|
||||||
|
AST_Node.warn("Undeclared symbol: {name} [{file}:{line},{col}]", {
|
||||||
|
name: node.name,
|
||||||
|
file: node.start.file,
|
||||||
|
line: node.start.line,
|
||||||
|
col: node.start.col
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (options.assign_to_global)
|
||||||
|
{
|
||||||
|
var sym = null;
|
||||||
|
if (node instanceof AST_Assign && node.left instanceof AST_SymbolRef)
|
||||||
|
sym = node.left;
|
||||||
|
else if (node instanceof AST_ForIn && node.init instanceof AST_SymbolRef)
|
||||||
|
sym = node.init;
|
||||||
|
if (sym
|
||||||
|
&& (sym.undeclared()
|
||||||
|
|| (sym.global() && sym.scope !== sym.definition().scope))) {
|
||||||
|
AST_Node.warn("{msg}: {name} [{file}:{line},{col}]", {
|
||||||
|
msg: sym.undeclared() ? "Accidental global?" : "Assignment to global",
|
||||||
|
name: sym.name,
|
||||||
|
file: sym.start.file,
|
||||||
|
line: sym.start.line,
|
||||||
|
col: sym.start.col
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (options.eval
|
||||||
|
&& node instanceof AST_SymbolRef
|
||||||
|
&& node.undeclared()
|
||||||
|
&& node.name == "eval") {
|
||||||
|
AST_Node.warn("Eval is used [{file}:{line},{col}]", node.start);
|
||||||
|
}
|
||||||
|
if (options.unreferenced
|
||||||
|
&& (node instanceof AST_SymbolDeclaration || node instanceof AST_Label)
|
||||||
|
&& !(node instanceof AST_SymbolCatch)
|
||||||
|
&& node.unreferenced()) {
|
||||||
|
AST_Node.warn("{type} {name} is declared but not referenced [{file}:{line},{col}]", {
|
||||||
|
type: node instanceof AST_Label ? "Label" : "Symbol",
|
||||||
|
name: node.name,
|
||||||
|
file: node.start.file,
|
||||||
|
line: node.start.line,
|
||||||
|
col: node.start.col
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (options.func_arguments
|
||||||
|
&& node instanceof AST_Lambda
|
||||||
|
&& node.uses_arguments) {
|
||||||
|
AST_Node.warn("arguments used in function {name} [{file}:{line},{col}]", {
|
||||||
|
name: node.name ? node.name.name : "anonymous",
|
||||||
|
file: node.start.file,
|
||||||
|
line: node.start.line,
|
||||||
|
col: node.start.col
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (options.nested_defuns
|
||||||
|
&& node instanceof AST_Defun
|
||||||
|
&& !(tw.parent() instanceof AST_Scope)) {
|
||||||
|
AST_Node.warn("Function {name} declared in nested statement \"{type}\" [{file}:{line},{col}]", {
|
||||||
|
name: node.name.name,
|
||||||
|
type: tw.parent().TYPE,
|
||||||
|
file: node.start.file,
|
||||||
|
line: node.start.line,
|
||||||
|
col: node.start.col
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.walk(tw);
|
||||||
|
});
|
||||||
|
|||||||
@@ -60,14 +60,17 @@ TreeTransformer.prototype = new TreeWalker;
|
|||||||
tw.push(this);
|
tw.push(this);
|
||||||
if (tw.before) x = tw.before(this, descend, in_list);
|
if (tw.before) x = tw.before(this, descend, in_list);
|
||||||
if (x === undefined) {
|
if (x === undefined) {
|
||||||
x = this;
|
if (!tw.after) {
|
||||||
descend(x, tw);
|
x = this;
|
||||||
if (tw.after) {
|
descend(x, tw);
|
||||||
|
} else {
|
||||||
|
tw.stack[tw.stack.length - 1] = x = this;
|
||||||
|
descend(x, tw);
|
||||||
y = tw.after(x, in_list);
|
y = tw.after(x, in_list);
|
||||||
if (y !== undefined) x = y;
|
if (y !== undefined) x = y;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tw.pop();
|
tw.pop(this);
|
||||||
return x;
|
return x;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -160,18 +163,10 @@ TreeTransformer.prototype = new TreeWalker;
|
|||||||
if (self.value) self.value = self.value.transform(tw);
|
if (self.value) self.value = self.value.transform(tw);
|
||||||
});
|
});
|
||||||
|
|
||||||
_(AST_Destructuring, function(self, tw) {
|
|
||||||
self.names = do_list(self.names, tw);
|
|
||||||
});
|
|
||||||
|
|
||||||
_(AST_Lambda, function(self, tw){
|
_(AST_Lambda, function(self, tw){
|
||||||
if (self.name) self.name = self.name.transform(tw);
|
if (self.name) self.name = self.name.transform(tw);
|
||||||
self.argnames = do_list(self.argnames, tw);
|
self.argnames = do_list(self.argnames, tw);
|
||||||
if (self.body instanceof AST_Node) {
|
self.body = do_list(self.body, tw);
|
||||||
self.body = self.body.transform(tw);
|
|
||||||
} else {
|
|
||||||
self.body = do_list(self.body, tw);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
_(AST_Call, function(self, tw){
|
_(AST_Call, function(self, tw){
|
||||||
@@ -179,8 +174,9 @@ TreeTransformer.prototype = new TreeWalker;
|
|||||||
self.args = do_list(self.args, tw);
|
self.args = do_list(self.args, tw);
|
||||||
});
|
});
|
||||||
|
|
||||||
_(AST_Sequence, function(self, tw){
|
_(AST_Seq, function(self, tw){
|
||||||
self.expressions = do_list(self.expressions, tw);
|
self.car = self.car.transform(tw);
|
||||||
|
self.cdr = self.cdr.transform(tw);
|
||||||
});
|
});
|
||||||
|
|
||||||
_(AST_Dot, function(self, tw){
|
_(AST_Dot, function(self, tw){
|
||||||
@@ -192,14 +188,6 @@ TreeTransformer.prototype = new TreeWalker;
|
|||||||
self.property = self.property.transform(tw);
|
self.property = self.property.transform(tw);
|
||||||
});
|
});
|
||||||
|
|
||||||
_(AST_Yield, function(self, tw){
|
|
||||||
if (self.expression) self.expression = self.expression.transform(tw);
|
|
||||||
});
|
|
||||||
|
|
||||||
_(AST_Await, function(self, tw){
|
|
||||||
self.expression = self.expression.transform(tw);
|
|
||||||
});
|
|
||||||
|
|
||||||
_(AST_Unary, function(self, tw){
|
_(AST_Unary, function(self, tw){
|
||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
});
|
});
|
||||||
@@ -224,46 +212,7 @@ TreeTransformer.prototype = new TreeWalker;
|
|||||||
});
|
});
|
||||||
|
|
||||||
_(AST_ObjectProperty, function(self, tw){
|
_(AST_ObjectProperty, function(self, tw){
|
||||||
if (self.key instanceof AST_Node) {
|
|
||||||
self.key = self.key.transform(tw);
|
|
||||||
}
|
|
||||||
self.value = self.value.transform(tw);
|
self.value = self.value.transform(tw);
|
||||||
});
|
});
|
||||||
|
|
||||||
_(AST_Class, function(self, tw){
|
|
||||||
if (self.name) self.name = self.name.transform(tw);
|
|
||||||
if (self.extends) self.extends = self.extends.transform(tw);
|
|
||||||
self.properties = do_list(self.properties, tw);
|
|
||||||
});
|
|
||||||
|
|
||||||
_(AST_Expansion, function(self, tw){
|
|
||||||
self.expression = self.expression.transform(tw);
|
|
||||||
});
|
|
||||||
|
|
||||||
_(AST_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);
|
|
||||||
});
|
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|||||||
27
lib/utils.js
27
lib/utils.js
@@ -43,6 +43,17 @@
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
function array_to_hash(a) {
|
||||||
|
var ret = Object.create(null);
|
||||||
|
for (var i = 0; i < a.length; ++i)
|
||||||
|
ret[a[i]] = true;
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
|
||||||
|
function slice(a, start) {
|
||||||
|
return Array.prototype.slice.call(a, start || 0);
|
||||||
|
};
|
||||||
|
|
||||||
function characters(str) {
|
function characters(str) {
|
||||||
return str.split("");
|
return str.split("");
|
||||||
};
|
};
|
||||||
@@ -210,6 +221,18 @@ function mergeSort(array, cmp) {
|
|||||||
return _ms(array);
|
return _ms(array);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function set_difference(a, b) {
|
||||||
|
return a.filter(function(el){
|
||||||
|
return b.indexOf(el) < 0;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
function set_intersection(a, b) {
|
||||||
|
return a.filter(function(el){
|
||||||
|
return b.indexOf(el) >= 0;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
// this function is taken from Acorn [1], written by Marijn Haverbeke
|
// this function is taken from Acorn [1], written by Marijn Haverbeke
|
||||||
// [1] https://github.com/marijnh/acorn
|
// [1] https://github.com/marijnh/acorn
|
||||||
function makePredicate(words) {
|
function makePredicate(words) {
|
||||||
@@ -323,8 +346,8 @@ function first_in_statement(stack) {
|
|||||||
for (var i = 0, p; p = stack.parent(i); i++) {
|
for (var i = 0, p; p = stack.parent(i); i++) {
|
||||||
if (p instanceof AST_Statement && p.body === node)
|
if (p instanceof AST_Statement && p.body === node)
|
||||||
return true;
|
return true;
|
||||||
if ((p instanceof AST_Sequence && p.expressions[0] === node) ||
|
if ((p instanceof AST_Seq && p.car === node ) ||
|
||||||
(p.TYPE == "Call" && p.expression === node ) ||
|
(p instanceof AST_Call && p.expression === node && !(p instanceof AST_New) ) ||
|
||||||
(p instanceof AST_Dot && p.expression === node ) ||
|
(p instanceof AST_Dot && p.expression === node ) ||
|
||||||
(p instanceof AST_Sub && p.expression === node ) ||
|
(p instanceof AST_Sub && p.expression === node ) ||
|
||||||
(p instanceof AST_Conditional && p.condition === node ) ||
|
(p instanceof AST_Conditional && p.condition === node ) ||
|
||||||
|
|||||||
49
package.json
49
package.json
@@ -1,17 +1,20 @@
|
|||||||
{
|
{
|
||||||
"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",
|
"homepage": "http://lisperator.net/uglifyjs",
|
||||||
"author": "Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)",
|
"author": "Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)",
|
||||||
"license": "BSD-2-Clause",
|
"license": "BSD-2-Clause",
|
||||||
"version": "3.3.1",
|
"version": "2.8.27",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.8.0"
|
"node": ">=0.8.0"
|
||||||
},
|
},
|
||||||
"maintainers": [
|
"maintainers": [
|
||||||
"Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)"
|
"Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)"
|
||||||
],
|
],
|
||||||
"repository": "git+https://github.com/mishoo/UglifyJS2.git#harmony",
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/mishoo/UglifyJS2.git"
|
||||||
|
},
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/mishoo/UglifyJS2/issues"
|
"url": "https://github.com/mishoo/UglifyJS2/issues"
|
||||||
},
|
},
|
||||||
@@ -26,33 +29,23 @@
|
|||||||
"LICENSE"
|
"LICENSE"
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"commander": "~2.12.1",
|
"source-map": "~0.5.1",
|
||||||
"source-map": "~0.6.1"
|
"yargs": "~3.10.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"acorn": "~5.2.1",
|
"acorn": "~5.0.3",
|
||||||
"mocha": "~3.5.1",
|
"mocha": "~2.3.4"
|
||||||
"semver": "~5.4.1"
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"uglify-to-browserify": "~1.0.0"
|
||||||
|
},
|
||||||
|
"browserify": {
|
||||||
|
"transform": [
|
||||||
|
"uglify-to-browserify"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "node test/run-tests.js"
|
"test": "node test/run-tests.js"
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": ["uglify", "uglify-js", "minify", "minifier"]
|
||||||
"uglify",
|
|
||||||
"uglify-es",
|
|
||||||
"uglify-js",
|
|
||||||
"minify",
|
|
||||||
"minifier",
|
|
||||||
"javascript",
|
|
||||||
"ecmascript",
|
|
||||||
"es5",
|
|
||||||
"es6",
|
|
||||||
"es7",
|
|
||||||
"es8",
|
|
||||||
"es2015",
|
|
||||||
"es2016",
|
|
||||||
"es2017",
|
|
||||||
"async",
|
|
||||||
"await"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,14 +4,12 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var createHash = require("crypto").createHash;
|
var createHash = require("crypto").createHash;
|
||||||
var fetch = require("./fetch");
|
|
||||||
var fork = require("child_process").fork;
|
var fork = require("child_process").fork;
|
||||||
var zlib = require("zlib");
|
|
||||||
var args = process.argv.slice(2);
|
var args = process.argv.slice(2);
|
||||||
if (!args.length) {
|
if (!args.length) {
|
||||||
args.push("-mc");
|
args.push("-mc", "warnings=false");
|
||||||
}
|
}
|
||||||
args.push("--timings");
|
args.push("--stats");
|
||||||
var urls = [
|
var urls = [
|
||||||
"https://code.jquery.com/jquery-3.2.1.js",
|
"https://code.jquery.com/jquery-3.2.1.js",
|
||||||
"https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.4/angular.js",
|
"https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.4/angular.js",
|
||||||
@@ -21,7 +19,6 @@ var urls = [
|
|||||||
"http://builds.emberjs.com/tags/v2.11.0/ember.prod.js",
|
"http://builds.emberjs.com/tags/v2.11.0/ember.prod.js",
|
||||||
"https://cdn.jsdelivr.net/lodash/4.17.4/lodash.js",
|
"https://cdn.jsdelivr.net/lodash/4.17.4/lodash.js",
|
||||||
"https://cdnjs.cloudflare.com/ajax/libs/d3/4.5.0/d3.js",
|
"https://cdnjs.cloudflare.com/ajax/libs/d3/4.5.0/d3.js",
|
||||||
"https://raw.githubusercontent.com/kangax/html-minifier/v3.5.7/dist/htmlminifier.js",
|
|
||||||
];
|
];
|
||||||
var results = {};
|
var results = {};
|
||||||
var remaining = 2 * urls.length;
|
var remaining = 2 * urls.length;
|
||||||
@@ -33,9 +30,13 @@ function done() {
|
|||||||
console.log();
|
console.log();
|
||||||
console.log(url);
|
console.log(url);
|
||||||
console.log(info.log);
|
console.log(info.log);
|
||||||
|
var elapsed = 0;
|
||||||
|
info.log.replace(/: ([0-9]+\.[0-9]{3})s/g, function(match, time) {
|
||||||
|
elapsed += parseFloat(time);
|
||||||
|
});
|
||||||
|
console.log("Run-time:", elapsed.toFixed(3), "s");
|
||||||
console.log("Original:", info.input, "bytes");
|
console.log("Original:", info.input, "bytes");
|
||||||
console.log("Uglified:", info.output, "bytes");
|
console.log("Uglified:", info.output, "bytes");
|
||||||
console.log("GZipped: ", info.gzip, "bytes");
|
|
||||||
console.log("SHA1 sum:", info.sha1);
|
console.log("SHA1 sum:", info.sha1);
|
||||||
if (info.code) {
|
if (info.code) {
|
||||||
failures.push(url);
|
failures.push(url);
|
||||||
@@ -54,21 +55,15 @@ urls.forEach(function(url) {
|
|||||||
results[url] = {
|
results[url] = {
|
||||||
input: 0,
|
input: 0,
|
||||||
output: 0,
|
output: 0,
|
||||||
gzip: 0,
|
|
||||||
log: ""
|
log: ""
|
||||||
};
|
};
|
||||||
fetch(url, function(err, res) {
|
require(url.slice(0, url.indexOf(":"))).get(url, function(res) {
|
||||||
if (err) throw err;
|
|
||||||
var uglifyjs = fork("bin/uglifyjs", args, { silent: true });
|
var uglifyjs = fork("bin/uglifyjs", args, { silent: true });
|
||||||
res.on("data", function(data) {
|
res.on("data", function(data) {
|
||||||
results[url].input += data.length;
|
results[url].input += data.length;
|
||||||
}).pipe(uglifyjs.stdin);
|
}).pipe(uglifyjs.stdin);
|
||||||
uglifyjs.stdout.on("data", function(data) {
|
uglifyjs.stdout.on("data", function(data) {
|
||||||
results[url].output += data.length;
|
results[url].output += data.length;
|
||||||
}).pipe(zlib.createGzip({
|
|
||||||
level: zlib.Z_BEST_COMPRESSION
|
|
||||||
})).on("data", function(data) {
|
|
||||||
results[url].gzip += data.length;
|
|
||||||
}).pipe(createHash("sha1")).on("data", function(data) {
|
}).pipe(createHash("sha1")).on("data", function(data) {
|
||||||
results[url].sha1 = data.toString("hex");
|
results[url].sha1 = data.toString("hex");
|
||||||
done();
|
done();
|
||||||
|
|||||||
67
test/compress/angular-inject.js
vendored
Normal file
67
test/compress/angular-inject.js
vendored
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
ng_inject_defun: {
|
||||||
|
options = {
|
||||||
|
angular: true
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
/*@ngInject*/
|
||||||
|
function Controller(dependency) {
|
||||||
|
return dependency;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function Controller(dependency) {
|
||||||
|
return dependency;
|
||||||
|
}
|
||||||
|
Controller.$inject=['dependency']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ng_inject_assignment: {
|
||||||
|
options = {
|
||||||
|
angular: true
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
/*@ngInject*/
|
||||||
|
var Controller = function(dependency) {
|
||||||
|
return dependency;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var Controller = function(dependency) {
|
||||||
|
return dependency;
|
||||||
|
}
|
||||||
|
Controller.$inject=['dependency']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ng_inject_inline: {
|
||||||
|
options = {
|
||||||
|
angular: true
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
angular.module('a').
|
||||||
|
factory('b',
|
||||||
|
/*@ngInject*/
|
||||||
|
function(dependency) {
|
||||||
|
return dependency;
|
||||||
|
}).
|
||||||
|
directive('c',
|
||||||
|
/*@ngInject*/
|
||||||
|
function(anotherDependency) {
|
||||||
|
return anotherDependency;
|
||||||
|
})
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
angular.module('a').
|
||||||
|
factory('b',[
|
||||||
|
'dependency',
|
||||||
|
function(dependency) {
|
||||||
|
return dependency;
|
||||||
|
}]).
|
||||||
|
directive('c',[
|
||||||
|
'anotherDependency',
|
||||||
|
function(anotherDependency) {
|
||||||
|
return anotherDependency;
|
||||||
|
}])
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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,,];
|
||||||
@@ -93,79 +91,6 @@ 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,
|
unsafe: true,
|
||||||
@@ -203,114 +128,50 @@ constant_join_3: {
|
|||||||
|
|
||||||
for_loop: {
|
for_loop: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
unsafe : true,
|
||||||
reduce_funcs: true,
|
unused : true,
|
||||||
reduce_vars: true,
|
evaluate : true,
|
||||||
unsafe: true,
|
reduce_vars : true
|
||||||
unused: true,
|
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
function f0() {
|
function f0() {
|
||||||
var a = [1, 2, 3];
|
var a = [1, 2, 3];
|
||||||
var b = 0;
|
for (var i = 0; i < a.length; i++) {
|
||||||
for (var i = 0; i < a.length; i++)
|
console.log(a[i]);
|
||||||
b += a[i];
|
}
|
||||||
return b;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function f1() {
|
function f1() {
|
||||||
var a = [1, 2, 3];
|
var a = [1, 2, 3];
|
||||||
var b = 0;
|
for (var i = 0, len = a.length; i < len; i++) {
|
||||||
for (var i = 0, len = a.length; i < len; i++)
|
console.log(a[i]);
|
||||||
b += a[i];
|
}
|
||||||
return b;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function f2() {
|
function f2() {
|
||||||
var a = [1, 2, 3];
|
var a = [1, 2, 3];
|
||||||
for (var i = 0; i < a.length; i++)
|
for (var i = 0; i < a.length; i++) {
|
||||||
a[i]++;
|
a[i]++;
|
||||||
return a[2];
|
}
|
||||||
}
|
}
|
||||||
console.log(f0(), f1(), f2());
|
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f0() {
|
function f0() {
|
||||||
var a = [1, 2, 3];
|
var a = [1, 2, 3];
|
||||||
var b = 0;
|
|
||||||
for (var i = 0; i < 3; i++)
|
for (var i = 0; i < 3; i++)
|
||||||
b += a[i];
|
console.log(a[i]);
|
||||||
return b;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function f1() {
|
function f1() {
|
||||||
var a = [1, 2, 3];
|
var a = [1, 2, 3];
|
||||||
var b = 0;
|
|
||||||
for (var i = 0; i < 3; i++)
|
for (var i = 0; i < 3; i++)
|
||||||
b += a[i];
|
console.log(a[i]);
|
||||||
return b;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function f2() {
|
function f2() {
|
||||||
var a = [1, 2, 3];
|
var a = [1, 2, 3];
|
||||||
for (var i = 0; i < a.length; i++)
|
for (var i = 0; i < a.length; i++)
|
||||||
a[i]++;
|
a[i]++;
|
||||||
return a[2];
|
|
||||||
}
|
}
|
||||||
console.log(f0(), f1(), f2());
|
|
||||||
}
|
}
|
||||||
expect_stdout: "6 6 4"
|
|
||||||
}
|
|
||||||
|
|
||||||
index: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unsafe: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = [ 1, 2 ];
|
|
||||||
console.log(a[0], a[1]);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(1, 2);
|
|
||||||
}
|
|
||||||
expect_stdout: "1 2"
|
|
||||||
}
|
|
||||||
|
|
||||||
length: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unsafe: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = [ 1, 2 ];
|
|
||||||
console.log(a.length);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(2);
|
|
||||||
}
|
|
||||||
expect_stdout: "2"
|
|
||||||
}
|
|
||||||
|
|
||||||
index_length: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unsafe: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = [ 1, 2 ];
|
|
||||||
console.log(a[0], a.length);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(1, 2);
|
|
||||||
}
|
|
||||||
expect_stdout: "1 2"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"
|
|
||||||
}
|
|
||||||
@@ -2,7 +2,7 @@ ascii_only_true: {
|
|||||||
options = {}
|
options = {}
|
||||||
beautify = {
|
beautify = {
|
||||||
ascii_only : true,
|
ascii_only : true,
|
||||||
ie8 : false,
|
screw_ie8 : true,
|
||||||
beautify : false,
|
beautify : false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -13,14 +13,14 @@ ascii_only_true: {
|
|||||||
"\x20\x21\x22\x23 ... \x7d\x7e\x7f\x80\x81 ... \xfe\xff\u0fff\uffff";
|
"\x20\x21\x22\x23 ... \x7d\x7e\x7f\x80\x81 ... \xfe\xff\u0fff\uffff";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_exact: 'function f(){return"\\x000\\x001\\x007\\x008\\0"+"\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\b\\t\\n\\v\\f\\r\\x0e\\x0f"+"\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f"+\' !"# ... }~\\x7f\\x80\\x81 ... \\xfe\\xff\\u0fff\\uffff\'}'
|
expect_exact: 'function f(){return"\\x000\\x001\\x007\\08\\0"+"\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\b\\t\\n\\v\\f\\r\\x0e\\x0f"+"\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f"+\' !"# ... }~\\x7f\\x80\\x81 ... \\xfe\\xff\\u0fff\\uffff\'}'
|
||||||
}
|
}
|
||||||
|
|
||||||
ascii_only_false: {
|
ascii_only_false: {
|
||||||
options = {}
|
options = {}
|
||||||
beautify = {
|
beautify = {
|
||||||
ascii_only : false,
|
ascii_only : false,
|
||||||
ie8 : false,
|
screw_ie8 : true,
|
||||||
beautify : false,
|
beautify : false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -31,5 +31,6 @@ ascii_only_false: {
|
|||||||
"\x20\x21\x22\x23 ... \x7d\x7e\x7f\x80\x81 ... \xfe\xff\u0fff\uffff";
|
"\x20\x21\x22\x23 ... \x7d\x7e\x7f\x80\x81 ... \xfe\xff\u0fff\uffff";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_exact: 'function f(){return"\\x000\\x001\\x007\\x008\\0"+"\\0\x01\x02\x03\x04\x05\x06\x07\\b\\t\\n\\v\\f\\r\x0e\x0f"+"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"+\' !"# ... }~\x7f\x80\x81 ... \xfe\xff\u0fff\uffff\'}'
|
expect_exact: 'function f(){return"\\x000\\x001\\x007\\08\\0"+"\\0\x01\x02\x03\x04\x05\x06\x07\\b\\t\\n\\v\\f\\r\x0e\x0f"+"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"+\' !"# ... }~\x7f\x80\x81 ... \xfe\xff\u0fff\uffff\'}'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ asm_mixed: {
|
|||||||
hoist_vars : true,
|
hoist_vars : true,
|
||||||
if_return : true,
|
if_return : true,
|
||||||
join_vars : true,
|
join_vars : true,
|
||||||
|
cascade : true,
|
||||||
side_effects : true,
|
side_effects : true,
|
||||||
negate_iife : true
|
negate_iife : true
|
||||||
};
|
};
|
||||||
@@ -103,65 +104,3 @@ asm_mixed: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
asm_toplevel: {
|
|
||||||
options = {}
|
|
||||||
input: {
|
|
||||||
"use asm";
|
|
||||||
0.0;
|
|
||||||
function f() {
|
|
||||||
0.0;
|
|
||||||
(function(){
|
|
||||||
0.0;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
0.0;
|
|
||||||
}
|
|
||||||
expect_exact: '"use asm";0.0;function f(){0.0;(function(){0.0})}0.0;'
|
|
||||||
}
|
|
||||||
|
|
||||||
asm_function_expression: {
|
|
||||||
options = {}
|
|
||||||
input: {
|
|
||||||
0.0;
|
|
||||||
var a = function() {
|
|
||||||
"use asm";
|
|
||||||
0.0;
|
|
||||||
}
|
|
||||||
function f() {
|
|
||||||
0.0;
|
|
||||||
return function(){
|
|
||||||
"use asm";
|
|
||||||
0.0;
|
|
||||||
}
|
|
||||||
0.0;
|
|
||||||
}
|
|
||||||
0.0;
|
|
||||||
}
|
|
||||||
expect_exact: '0;var a=function(){"use asm";0.0};function f(){0;return function(){"use asm";0.0};0}0;'
|
|
||||||
}
|
|
||||||
|
|
||||||
asm_nested_functions: {
|
|
||||||
options = {}
|
|
||||||
input: {
|
|
||||||
0.0;
|
|
||||||
function a() {
|
|
||||||
"use asm";
|
|
||||||
0.0;
|
|
||||||
}
|
|
||||||
0.0;
|
|
||||||
function b() {
|
|
||||||
0.0;
|
|
||||||
function c(){
|
|
||||||
"use asm";
|
|
||||||
0.0;
|
|
||||||
}
|
|
||||||
0.0;
|
|
||||||
function d(){
|
|
||||||
0.0;
|
|
||||||
}
|
|
||||||
0.0;
|
|
||||||
}
|
|
||||||
0.0;
|
|
||||||
}
|
|
||||||
expect_exact: '0;function a(){"use asm";0.0}0;function b(){0;function c(){"use asm";0.0}0;function d(){0}0}0;'
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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;
|
|
||||||
class Zee {};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
{
|
|
||||||
let y;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
var y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function x(){
|
|
||||||
{
|
|
||||||
let x
|
|
||||||
}
|
|
||||||
var x;
|
|
||||||
{
|
|
||||||
const y;
|
|
||||||
class Zee {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
{
|
|
||||||
let y
|
|
||||||
}
|
|
||||||
var y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
remove_unused_in_global_block: {
|
|
||||||
options = {
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
{
|
|
||||||
let x;
|
|
||||||
const y;
|
|
||||||
class Zee {};
|
|
||||||
var w;
|
|
||||||
}
|
|
||||||
let ex;
|
|
||||||
const why;
|
|
||||||
class Zed {};
|
|
||||||
var wut;
|
|
||||||
console.log(x, y, Zee);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var w;
|
|
||||||
let ex;
|
|
||||||
const why;
|
|
||||||
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,142 +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"
|
|
||||||
}
|
|
||||||
|
|
||||||
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
@@ -74,41 +74,3 @@ dont_change_in_or_instanceof_expressions: {
|
|||||||
null instanceof null;
|
null instanceof null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self_comparison_1: {
|
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
a === a;
|
|
||||||
a !== b;
|
|
||||||
b.c === a.c;
|
|
||||||
b.c !== b.c;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
a == a;
|
|
||||||
a !== b;
|
|
||||||
b.c === a.c;
|
|
||||||
b.c != b.c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
self_comparison_2: {
|
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {}
|
|
||||||
var o = {};
|
|
||||||
console.log(f != f, o === o);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {}
|
|
||||||
var o = {};
|
|
||||||
console.log(false, true);
|
|
||||||
}
|
|
||||||
expect_stdout: "false true"
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ concat_1: {
|
|||||||
var c = 1 + x() + 2 + "boo";
|
var c = 1 + x() + 2 + "boo";
|
||||||
var d = 1 + x() + 2 + 3 + "boo";
|
var d = 1 + x() + 2 + 3 + "boo";
|
||||||
var e = 1 + x() + 2 + "X3boo";
|
var e = 1 + x() + 2 + "X3boo";
|
||||||
var f = "\x00360\x008\0";
|
var f = "\x00360\08\0";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -166,24 +166,22 @@ cond_1: {
|
|||||||
conditionals: true
|
conditionals: true
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
function foo(do_something, some_condition) {
|
var do_something; // if undeclared it's assumed to have side-effects
|
||||||
if (some_condition) {
|
if (some_condition()) {
|
||||||
do_something(x);
|
do_something(x);
|
||||||
} else {
|
} else {
|
||||||
do_something(y);
|
do_something(y);
|
||||||
}
|
}
|
||||||
if (some_condition) {
|
if (some_condition()) {
|
||||||
side_effects(x);
|
side_effects(x);
|
||||||
} else {
|
} else {
|
||||||
side_effects(y);
|
side_effects(y);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function foo(do_something, some_condition) {
|
var do_something;
|
||||||
do_something(some_condition ? x : y);
|
do_something(some_condition() ? x : y);
|
||||||
some_condition ? side_effects(x) : side_effects(y);
|
some_condition() ? side_effects(x) : side_effects(y);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -192,18 +190,16 @@ cond_2: {
|
|||||||
conditionals: true
|
conditionals: true
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
function foo(x, FooBar, some_condition) {
|
var x, FooBar;
|
||||||
if (some_condition) {
|
if (some_condition()) {
|
||||||
x = new FooBar(1);
|
x = new FooBar(1);
|
||||||
} else {
|
} else {
|
||||||
x = new FooBar(2);
|
x = new FooBar(2);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function foo(x, FooBar, some_condition) {
|
var x, FooBar;
|
||||||
x = new FooBar(some_condition ? 1 : 2);
|
x = new FooBar(some_condition() ? 1 : 2);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -609,47 +605,11 @@ cond_8c: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cond_9: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(x, y) {
|
|
||||||
g() ? x(1) : x(2);
|
|
||||||
x ? (y || x)() : (y || x)();
|
|
||||||
x ? y(a, b) : y(d, b, c);
|
|
||||||
x ? y(a, b, c) : y(a, b, c);
|
|
||||||
x ? y(a, b, c) : y(a, b, f);
|
|
||||||
x ? y(a, b, c) : y(a, e, c);
|
|
||||||
x ? y(a, b, c) : y(a, e, f);
|
|
||||||
x ? y(a, b, c) : y(d, b, c);
|
|
||||||
x ? y(a, b, c) : y(d, b, f);
|
|
||||||
x ? y(a, b, c) : y(d, e, c);
|
|
||||||
x ? y(a, b, c) : y(d, e, f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(x, y) {
|
|
||||||
g() ? x(1) : x(2);
|
|
||||||
x, (y || x)();
|
|
||||||
x ? y(a, b) : y(d, b, c);
|
|
||||||
x, y(a, b, c);
|
|
||||||
y(a, b, x ? c : f);
|
|
||||||
y(a, x ? b : e, c);
|
|
||||||
x ? y(a, b, c) : y(a, e, f);
|
|
||||||
y(x ? a : d, b, c);
|
|
||||||
x ? y(a, b, c) : y(d, b, f);
|
|
||||||
x ? y(a, b, c) : y(d, e, c);
|
|
||||||
x ? y(a, b, c) : y(d, e, f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ternary_boolean_consequent: {
|
ternary_boolean_consequent: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1() { return a == b ? true : x; }
|
function f1() { return a == b ? true : x; }
|
||||||
@@ -677,7 +637,7 @@ ternary_boolean_alternative: {
|
|||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1() { return a == b ? x : true; }
|
function f1() { return a == b ? x : true; }
|
||||||
@@ -1019,12 +979,12 @@ delete_conditional_1: {
|
|||||||
console.log(delete (1 ? 0 / 0 : x));
|
console.log(delete (1 ? 0 / 0 : x));
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(!0);
|
console.log((void 0, !0));
|
||||||
console.log(!0);
|
console.log((void 0, !0));
|
||||||
console.log(!0);
|
console.log((1 / 0, !0));
|
||||||
console.log(!0);
|
console.log((1 / 0, !0));
|
||||||
console.log(!0);
|
console.log((NaN, !0));
|
||||||
console.log(!0);
|
console.log((NaN, !0));
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
@@ -1046,160 +1006,12 @@ delete_conditional_2: {
|
|||||||
console.log(delete (0 ? x : 0 / 0));
|
console.log(delete (0 ? x : 0 / 0));
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(!0);
|
console.log((void 0, !0));
|
||||||
console.log(!0);
|
console.log((void 0, !0));
|
||||||
console.log(!0);
|
console.log((Infinity, !0));
|
||||||
console.log(!0);
|
console.log((1 / 0, !0));
|
||||||
console.log(!0);
|
console.log((NaN, !0));
|
||||||
console.log(!0);
|
console.log((NaN, !0));
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_2535_1: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
conditionals: true,
|
|
||||||
evaluate: true,
|
|
||||||
passes: 2,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
if (true || x()) y();
|
|
||||||
if (true && x()) y();
|
|
||||||
if (x() || true) y();
|
|
||||||
if (x() && true) y();
|
|
||||||
if (false || x()) y();
|
|
||||||
if (false && x()) y();
|
|
||||||
if (x() || false) y();
|
|
||||||
if (x() && false) y();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
y();
|
|
||||||
x() && y();
|
|
||||||
(x(), 1) && y();
|
|
||||||
x() && y();
|
|
||||||
x() && y();
|
|
||||||
x() && y();
|
|
||||||
(x(), 0) && y();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2535_2: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
conditionals: true,
|
|
||||||
evaluate: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function x() {}
|
|
||||||
function y() {
|
|
||||||
return "foo";
|
|
||||||
}
|
|
||||||
console.log((x() || true) || y());
|
|
||||||
console.log((y() || true) || x());
|
|
||||||
console.log((x() || true) && y());
|
|
||||||
console.log((y() || true) && x());
|
|
||||||
console.log((x() && true) || y());
|
|
||||||
console.log((y() && true) || x());
|
|
||||||
console.log((x() && true) && y());
|
|
||||||
console.log((y() && true) && x());
|
|
||||||
console.log((x() || false) || y());
|
|
||||||
console.log((y() || false) || x());
|
|
||||||
console.log((x() || false) && y());
|
|
||||||
console.log((y() || false) && x());
|
|
||||||
console.log((x() && false) || y());
|
|
||||||
console.log((y() && false) || x());
|
|
||||||
console.log((x() && false) && y());
|
|
||||||
console.log((y() && false) && x());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function x() {}
|
|
||||||
function y() {
|
|
||||||
return "foo";
|
|
||||||
}
|
|
||||||
console.log(x() || !0);
|
|
||||||
console.log(y() || !0);
|
|
||||||
console.log((x(), y()));
|
|
||||||
console.log((y(), x()));
|
|
||||||
console.log(!!x() || y());
|
|
||||||
console.log(!!y() || x());
|
|
||||||
console.log(x() && y());
|
|
||||||
console.log(y() && x());
|
|
||||||
console.log(x() || y());
|
|
||||||
console.log(y() || x());
|
|
||||||
console.log(!!x() && y());
|
|
||||||
console.log(!!y() && x());
|
|
||||||
console.log((x(), y()));
|
|
||||||
console.log((y(), x()));
|
|
||||||
console.log(x() && !1);
|
|
||||||
console.log(y() && !1);
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"true",
|
|
||||||
"foo",
|
|
||||||
"foo",
|
|
||||||
"undefined",
|
|
||||||
"foo",
|
|
||||||
"true",
|
|
||||||
"undefined",
|
|
||||||
"undefined",
|
|
||||||
"foo",
|
|
||||||
"foo",
|
|
||||||
"false",
|
|
||||||
"undefined",
|
|
||||||
"foo",
|
|
||||||
"undefined",
|
|
||||||
"undefined",
|
|
||||||
"false",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2560: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
inline: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function log(x) {
|
|
||||||
console.log(x);
|
|
||||||
}
|
|
||||||
function foo() {
|
|
||||||
return log;
|
|
||||||
}
|
|
||||||
function bar() {
|
|
||||||
if (x !== (x = foo())) {
|
|
||||||
x(1);
|
|
||||||
} else {
|
|
||||||
x(2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var x = function() {
|
|
||||||
console.log("init");
|
|
||||||
};
|
|
||||||
bar();
|
|
||||||
bar();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function log(x) {
|
|
||||||
console.log(x);
|
|
||||||
}
|
|
||||||
function bar() {
|
|
||||||
x !== (x = log) ? x(1) : x(2);
|
|
||||||
}
|
|
||||||
var x = function() {
|
|
||||||
console.log("init");
|
|
||||||
};
|
|
||||||
bar();
|
|
||||||
bar();
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"1",
|
|
||||||
"2",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ issue_1191: {
|
|||||||
join_vars : true,
|
join_vars : true,
|
||||||
sequences : false,
|
sequences : false,
|
||||||
collapse_vars : false,
|
collapse_vars : false,
|
||||||
reduce_funcs : true,
|
|
||||||
reduce_vars : true,
|
reduce_vars : true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -45,7 +44,6 @@ issue_1194: {
|
|||||||
join_vars : true,
|
join_vars : true,
|
||||||
sequences : false,
|
sequences : false,
|
||||||
collapse_vars : false,
|
collapse_vars : false,
|
||||||
reduce_funcs : true,
|
|
||||||
reduce_vars : true,
|
reduce_vars : true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -74,7 +72,6 @@ issue_1396: {
|
|||||||
join_vars : true,
|
join_vars : true,
|
||||||
sequences : false,
|
sequences : false,
|
||||||
collapse_vars : false,
|
collapse_vars : false,
|
||||||
reduce_funcs : true,
|
|
||||||
reduce_vars : true,
|
reduce_vars : true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -146,7 +143,6 @@ regexp_literal_not_const: {
|
|||||||
join_vars : true,
|
join_vars : true,
|
||||||
sequences : false,
|
sequences : false,
|
||||||
collapse_vars : false,
|
collapse_vars : false,
|
||||||
reduce_funcs : true,
|
|
||||||
reduce_vars : true,
|
reduce_vars : true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ dead_code_2_should_warn: {
|
|||||||
function f() {
|
function f() {
|
||||||
g();
|
g();
|
||||||
x = 10;
|
x = 10;
|
||||||
throw new Error("foo");
|
throw "foo";
|
||||||
// completely discarding the `if` would introduce some
|
// completely discarding the `if` would introduce some
|
||||||
// bugs. UglifyJS v1 doesn't deal with this issue; in v2
|
// bugs. UglifyJS v1 doesn't deal with this issue; in v2
|
||||||
// we copy any declarations to the upper scope.
|
// we copy any declarations to the upper scope.
|
||||||
@@ -46,60 +46,16 @@ dead_code_2_should_warn: {
|
|||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
f();
|
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f() {
|
function f() {
|
||||||
g();
|
g();
|
||||||
x = 10;
|
x = 10;
|
||||||
throw new Error("foo");
|
throw "foo";
|
||||||
var x;
|
var x;
|
||||||
var g;
|
function g(){};
|
||||||
}
|
}
|
||||||
f();
|
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
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"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dead_code_constant_boolean_should_warn_more: {
|
dead_code_constant_boolean_should_warn_more: {
|
||||||
@@ -122,90 +78,26 @@ dead_code_constant_boolean_should_warn_more: {
|
|||||||
foo();
|
foo();
|
||||||
var moo;
|
var moo;
|
||||||
}
|
}
|
||||||
bar();
|
|
||||||
}
|
}
|
||||||
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 x = 10, y;
|
var x = 10, y;
|
||||||
bar();
|
var moo;
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
node_version: ">=6"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dead_code_constant_boolean_should_warn_more_strict: {
|
dead_code_const_declaration: {
|
||||||
options = {
|
options = {
|
||||||
dead_code : true,
|
dead_code : true,
|
||||||
loops : true,
|
loops : true,
|
||||||
booleans : true,
|
booleans : true,
|
||||||
conditionals : true,
|
conditionals : true,
|
||||||
evaluate : true,
|
evaluate : true,
|
||||||
side_effects : true,
|
reduce_vars : 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"
|
|
||||||
}
|
|
||||||
|
|
||||||
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: {
|
input: {
|
||||||
var unused;
|
var unused;
|
||||||
@@ -220,22 +112,20 @@ dead_code_const_declaration: {
|
|||||||
var unused;
|
var unused;
|
||||||
const CONST_FOO = !1;
|
const CONST_FOO = !1;
|
||||||
var moo;
|
var moo;
|
||||||
var bar;
|
function bar() {}
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
dead_code_const_annotation: {
|
dead_code_const_annotation: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
dead_code : true,
|
||||||
conditionals: true,
|
loops : true,
|
||||||
dead_code: true,
|
booleans : true,
|
||||||
evaluate: true,
|
conditionals : true,
|
||||||
loops: true,
|
evaluate : true,
|
||||||
reduce_funcs: true,
|
reduce_vars : true,
|
||||||
reduce_vars: true,
|
toplevel : true,
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
var unused;
|
var unused;
|
||||||
@@ -250,7 +140,7 @@ dead_code_const_annotation: {
|
|||||||
var unused;
|
var unused;
|
||||||
var CONST_FOO_ANN = !1;
|
var CONST_FOO_ANN = !1;
|
||||||
var moo;
|
var moo;
|
||||||
var bar;
|
function bar() {}
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
@@ -281,16 +171,13 @@ dead_code_const_annotation_regex: {
|
|||||||
|
|
||||||
dead_code_const_annotation_complex_scope: {
|
dead_code_const_annotation_complex_scope: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
dead_code : true,
|
||||||
conditionals: true,
|
loops : true,
|
||||||
dead_code: true,
|
booleans : true,
|
||||||
evaluate: true,
|
conditionals : true,
|
||||||
loops: true,
|
evaluate : true,
|
||||||
reduce_funcs: true,
|
reduce_vars : true,
|
||||||
reduce_vars: true,
|
toplevel : true,
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
var unused_var;
|
var unused_var;
|
||||||
@@ -320,7 +207,7 @@ dead_code_const_annotation_complex_scope: {
|
|||||||
var CONST_FOO_ANN = !1;
|
var CONST_FOO_ANN = !1;
|
||||||
var unused_var_2;
|
var unused_var_2;
|
||||||
var moo;
|
var moo;
|
||||||
var bar;
|
function bar() {}
|
||||||
var beef = 'good';
|
var beef = 'good';
|
||||||
var meat = 'beef';
|
var meat = 'beef';
|
||||||
var pork = 'bad';
|
var pork = 'bad';
|
||||||
@@ -333,8 +220,6 @@ try_catch_finally: {
|
|||||||
conditionals: true,
|
conditionals: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
passes: 2,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = 1;
|
var a = 1;
|
||||||
@@ -387,663 +272,3 @@ accessor: {
|
|||||||
}
|
}
|
||||||
expect: {}
|
expect: {}
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_2233_1: {
|
|
||||||
options = {
|
|
||||||
pure_getters: "strict",
|
|
||||||
side_effects: true,
|
|
||||||
unsafe: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
Array.isArray;
|
|
||||||
Boolean;
|
|
||||||
console.log;
|
|
||||||
Date;
|
|
||||||
decodeURI;
|
|
||||||
decodeURIComponent;
|
|
||||||
encodeURI;
|
|
||||||
encodeURIComponent;
|
|
||||||
Error.name;
|
|
||||||
escape;
|
|
||||||
eval;
|
|
||||||
EvalError;
|
|
||||||
Function.length;
|
|
||||||
isFinite;
|
|
||||||
isNaN;
|
|
||||||
JSON;
|
|
||||||
Math.random;
|
|
||||||
Number.isNaN;
|
|
||||||
parseFloat;
|
|
||||||
parseInt;
|
|
||||||
RegExp;
|
|
||||||
Object.defineProperty;
|
|
||||||
String.fromCharCode;
|
|
||||||
RangeError;
|
|
||||||
ReferenceError;
|
|
||||||
SyntaxError;
|
|
||||||
TypeError;
|
|
||||||
unescape;
|
|
||||||
URIError;
|
|
||||||
}
|
|
||||||
expect: {}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
global_timeout_and_interval_symbols: {
|
|
||||||
options = {
|
|
||||||
pure_getters: "strict",
|
|
||||||
side_effects: true,
|
|
||||||
unsafe: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
// These global symbols do not exist in the test sandbox
|
|
||||||
// and must be tested separately.
|
|
||||||
clearInterval;
|
|
||||||
clearTimeout;
|
|
||||||
setInterval;
|
|
||||||
setTimeout;
|
|
||||||
}
|
|
||||||
expect: {}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2233_2: {
|
|
||||||
options = {
|
|
||||||
pure_getters: "strict",
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
unsafe: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var RegExp;
|
|
||||||
Array.isArray;
|
|
||||||
RegExp;
|
|
||||||
UndeclaredGlobal;
|
|
||||||
function foo() {
|
|
||||||
var Number;
|
|
||||||
AnotherUndeclaredGlobal;
|
|
||||||
Math.sin;
|
|
||||||
Number.isNaN;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var RegExp;
|
|
||||||
UndeclaredGlobal;
|
|
||||||
function foo() {
|
|
||||||
var Number;
|
|
||||||
AnotherUndeclaredGlobal;
|
|
||||||
Number.isNaN;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2233_3: {
|
|
||||||
options = {
|
|
||||||
pure_getters: "strict",
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
unsafe: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var RegExp;
|
|
||||||
Array.isArray;
|
|
||||||
RegExp;
|
|
||||||
UndeclaredGlobal;
|
|
||||||
function foo() {
|
|
||||||
var Number;
|
|
||||||
AnotherUndeclaredGlobal;
|
|
||||||
Math.sin;
|
|
||||||
Number.isNaN;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
UndeclaredGlobal;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
global_fns: {
|
|
||||||
options = {
|
|
||||||
side_effects: true,
|
|
||||||
unsafe: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
Boolean(1, 2);
|
|
||||||
decodeURI(1, 2);
|
|
||||||
decodeURIComponent(1, 2);
|
|
||||||
Date(1, 2);
|
|
||||||
encodeURI(1, 2);
|
|
||||||
encodeURIComponent(1, 2);
|
|
||||||
Error(1, 2);
|
|
||||||
escape(1, 2);
|
|
||||||
EvalError(1, 2);
|
|
||||||
isFinite(1, 2);
|
|
||||||
isNaN(1, 2);
|
|
||||||
Number(1, 2);
|
|
||||||
Object(1, 2);
|
|
||||||
parseFloat(1, 2);
|
|
||||||
parseInt(1, 2);
|
|
||||||
RangeError(1, 2);
|
|
||||||
ReferenceError(1, 2);
|
|
||||||
String(1, 2);
|
|
||||||
SyntaxError(1, 2);
|
|
||||||
TypeError(1, 2);
|
|
||||||
unescape(1, 2);
|
|
||||||
URIError(1, 2);
|
|
||||||
try {
|
|
||||||
Function(1, 2);
|
|
||||||
} catch (e) {
|
|
||||||
console.log(e.name);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
RegExp(1, 2);
|
|
||||||
} catch (e) {
|
|
||||||
console.log(e.name);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
Array(NaN);
|
|
||||||
} catch (e) {
|
|
||||||
console.log(e.name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
try {
|
|
||||||
Function(1, 2);
|
|
||||||
} catch (e) {
|
|
||||||
console.log(e.name);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
RegExp(1, 2);
|
|
||||||
} catch (e) {
|
|
||||||
console.log(e.name);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
Array(NaN);
|
|
||||||
} catch (e) {
|
|
||||||
console.log(e.name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"SyntaxError",
|
|
||||||
"SyntaxError",
|
|
||||||
"RangeError",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
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: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
dead_code: true,
|
|
||||||
passes: 2,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f0(c) {
|
|
||||||
var a = 3 / c;
|
|
||||||
return a = a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f0(c) {
|
|
||||||
return 3 / c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
collapse_vars_lvalues_drop_assign: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
dead_code: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f0(x) { var i = ++x; return x += i; }
|
|
||||||
function f1(x) { var a = (x -= 3); return x += a; }
|
|
||||||
function f2(x) { var z = x, a = ++z; return z += a; }
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f0(x) { var i = ++x; return x + i; }
|
|
||||||
function f1(x) { var a = (x -= 3); return x + a; }
|
|
||||||
function f2(x) { var z = x, a = ++z; return z + a; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
collapse_vars_misc1: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
dead_code: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f10(x) { var a = 5, b = 3; return a += b; }
|
|
||||||
function f11(x) { var a = 5, b = 3; return a += --b; }
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f10(x) { return 5 + 3; }
|
|
||||||
function f11(x) { var b = 3; return 5 + --b; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return_assignment: {
|
|
||||||
options = {
|
|
||||||
dead_code: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f1(a, b, c) {
|
|
||||||
return a = x(), b = y(), b = a && (c >>= 5);
|
|
||||||
}
|
|
||||||
function f2() {
|
|
||||||
return e = x();
|
|
||||||
}
|
|
||||||
function f3(e) {
|
|
||||||
return e = x();
|
|
||||||
}
|
|
||||||
function f4() {
|
|
||||||
var e;
|
|
||||||
return e = x();
|
|
||||||
}
|
|
||||||
function f5(a) {
|
|
||||||
try {
|
|
||||||
return a = x();
|
|
||||||
} catch (b) {
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function f6(a) {
|
|
||||||
try {
|
|
||||||
return a = x();
|
|
||||||
} finally {
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function y() {
|
|
||||||
console.log("y");
|
|
||||||
}
|
|
||||||
function test(inc) {
|
|
||||||
var counter = 0;
|
|
||||||
x = function() {
|
|
||||||
counter += inc;
|
|
||||||
if (inc < 0) throw counter;
|
|
||||||
return counter;
|
|
||||||
};
|
|
||||||
[ f1, f2, f3, f4, f5, f6 ].forEach(function(f, i) {
|
|
||||||
e = null;
|
|
||||||
try {
|
|
||||||
i += 1;
|
|
||||||
console.log("result " + f(10 * i, 100 * i, 1000 * i));
|
|
||||||
} catch (x) {
|
|
||||||
console.log("caught " + x);
|
|
||||||
}
|
|
||||||
if (null !== e) console.log("e: " + e);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
var x, e;
|
|
||||||
test(1);
|
|
||||||
test(-1);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f1(a, b, c) {
|
|
||||||
return a = x(), y(), a && (c >> 5);
|
|
||||||
}
|
|
||||||
function f2() {
|
|
||||||
return e = x();
|
|
||||||
}
|
|
||||||
function f3(e) {
|
|
||||||
return x();
|
|
||||||
}
|
|
||||||
function f4() {
|
|
||||||
return x();
|
|
||||||
}
|
|
||||||
function f5(a) {
|
|
||||||
try {
|
|
||||||
return x();
|
|
||||||
} catch (b) {
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function f6(a) {
|
|
||||||
try {
|
|
||||||
return a = x();
|
|
||||||
} finally {
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function y() {
|
|
||||||
console.log("y");
|
|
||||||
}
|
|
||||||
function test(inc) {
|
|
||||||
var counter = 0;
|
|
||||||
x = function() {
|
|
||||||
counter += inc;
|
|
||||||
if (inc < 0) throw counter;
|
|
||||||
return counter;
|
|
||||||
};
|
|
||||||
[ f1, f2, f3, f4, f5, f6 ].forEach(function(f, i) {
|
|
||||||
e = null;
|
|
||||||
try {
|
|
||||||
i += 1;
|
|
||||||
console.log("result " + f(10 * i, 100 * i, 1000 * i));
|
|
||||||
} catch (x) {
|
|
||||||
console.log("caught " + x);
|
|
||||||
}
|
|
||||||
if (null !== e) console.log("e: " + e);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
var x, e;
|
|
||||||
test(1);
|
|
||||||
test(-1);
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"y",
|
|
||||||
"result 31",
|
|
||||||
"result 2",
|
|
||||||
"e: 2",
|
|
||||||
"result 3",
|
|
||||||
"result 4",
|
|
||||||
"result 5",
|
|
||||||
"6",
|
|
||||||
"result 6",
|
|
||||||
"caught -1",
|
|
||||||
"caught -2",
|
|
||||||
"caught -3",
|
|
||||||
"caught -4",
|
|
||||||
"50",
|
|
||||||
"result undefined",
|
|
||||||
"60",
|
|
||||||
"caught -6",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
throw_assignment: {
|
|
||||||
options = {
|
|
||||||
dead_code: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f1() {
|
|
||||||
throw a = x();
|
|
||||||
}
|
|
||||||
function f2(a) {
|
|
||||||
throw a = x();
|
|
||||||
}
|
|
||||||
function f3() {
|
|
||||||
var a;
|
|
||||||
throw a = x();
|
|
||||||
}
|
|
||||||
function f4() {
|
|
||||||
try {
|
|
||||||
throw a = x();
|
|
||||||
} catch (b) {
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function f5(a) {
|
|
||||||
try {
|
|
||||||
throw a = x();
|
|
||||||
} catch (b) {
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function f6() {
|
|
||||||
var a;
|
|
||||||
try {
|
|
||||||
throw a = x();
|
|
||||||
} catch (b) {
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function f7() {
|
|
||||||
try {
|
|
||||||
throw a = x();
|
|
||||||
} finally {
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function f8(a) {
|
|
||||||
try {
|
|
||||||
throw a = x();
|
|
||||||
} finally {
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function f9() {
|
|
||||||
var a;
|
|
||||||
try {
|
|
||||||
throw a = x();
|
|
||||||
} finally {
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function test(inc) {
|
|
||||||
var counter = 0;
|
|
||||||
x = function() {
|
|
||||||
counter += inc;
|
|
||||||
if (inc < 0) throw counter;
|
|
||||||
return counter;
|
|
||||||
};
|
|
||||||
[ f1, f2, f3, f4, f5, f6, f7, f8, f9 ].forEach(function(f, i) {
|
|
||||||
a = null;
|
|
||||||
try {
|
|
||||||
f(10 * (1 + i));
|
|
||||||
} catch (x) {
|
|
||||||
console.log("caught " + x);
|
|
||||||
}
|
|
||||||
if (null !== a) console.log("a: " + a);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
var x, a;
|
|
||||||
test(1);
|
|
||||||
test(-1);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f1() {
|
|
||||||
throw a = x();
|
|
||||||
}
|
|
||||||
function f2(a) {
|
|
||||||
throw x();
|
|
||||||
}
|
|
||||||
function f3() {
|
|
||||||
throw x();
|
|
||||||
}
|
|
||||||
function f4() {
|
|
||||||
try {
|
|
||||||
throw a = x();
|
|
||||||
} catch (b) {
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function f5(a) {
|
|
||||||
try {
|
|
||||||
throw a = x();
|
|
||||||
} catch (b) {
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function f6() {
|
|
||||||
var a;
|
|
||||||
try {
|
|
||||||
throw a = x();
|
|
||||||
} catch (b) {
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function f7() {
|
|
||||||
try {
|
|
||||||
throw a = x();
|
|
||||||
} finally {
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function f8(a) {
|
|
||||||
try {
|
|
||||||
throw a = x();
|
|
||||||
} finally {
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function f9() {
|
|
||||||
var a;
|
|
||||||
try {
|
|
||||||
throw a = x();
|
|
||||||
} finally {
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function test(inc) {
|
|
||||||
var counter = 0;
|
|
||||||
x = function() {
|
|
||||||
counter += inc;
|
|
||||||
if (inc < 0) throw counter;
|
|
||||||
return counter;
|
|
||||||
};
|
|
||||||
[ f1, f2, f3, f4, f5, f6, f7, f8, f9 ].forEach(function(f, i) {
|
|
||||||
a = null;
|
|
||||||
try {
|
|
||||||
f(10 * (1 + i));
|
|
||||||
} catch (x) {
|
|
||||||
console.log("caught " + x);
|
|
||||||
}
|
|
||||||
if (null !== a) console.log("a: " + a);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
var x, a;
|
|
||||||
test(1);
|
|
||||||
test(-1);
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"caught 1",
|
|
||||||
"a: 1",
|
|
||||||
"caught 2",
|
|
||||||
"caught 3",
|
|
||||||
"4",
|
|
||||||
"a: 4",
|
|
||||||
"5",
|
|
||||||
"6",
|
|
||||||
"7",
|
|
||||||
"caught 7",
|
|
||||||
"a: 7",
|
|
||||||
"8",
|
|
||||||
"caught 8",
|
|
||||||
"9",
|
|
||||||
"caught 9",
|
|
||||||
"caught -1",
|
|
||||||
"caught -2",
|
|
||||||
"caught -3",
|
|
||||||
"null",
|
|
||||||
"50",
|
|
||||||
"undefined",
|
|
||||||
"null",
|
|
||||||
"caught -7",
|
|
||||||
"80",
|
|
||||||
"caught -8",
|
|
||||||
"undefined",
|
|
||||||
"caught -9",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2597: {
|
|
||||||
options = {
|
|
||||||
dead_code: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(b) {
|
|
||||||
try {
|
|
||||||
try {
|
|
||||||
throw "foo";
|
|
||||||
} catch (e) {
|
|
||||||
return b = true;
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
b && (a = "PASS");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var a = "FAIL";
|
|
||||||
f();
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(b) {
|
|
||||||
try {
|
|
||||||
try {
|
|
||||||
throw "foo";
|
|
||||||
} catch (e) {
|
|
||||||
return b = true;
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
b && (a = "PASS");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var a = "FAIL";
|
|
||||||
f();
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,662 +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_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(){}}"
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,6 @@
|
|||||||
and: {
|
and: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true
|
||||||
side_effects: true,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a;
|
var a;
|
||||||
@@ -77,8 +76,7 @@ and: {
|
|||||||
|
|
||||||
or: {
|
or: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true
|
||||||
side_effects: true,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a;
|
var a;
|
||||||
@@ -160,8 +158,7 @@ or: {
|
|||||||
|
|
||||||
unary_prefix: {
|
unary_prefix: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true
|
||||||
side_effects: true,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
a = !0 && b;
|
a = !0 && b;
|
||||||
@@ -227,100 +224,6 @@ 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,
|
||||||
@@ -347,27 +250,22 @@ unsafe_constant: {
|
|||||||
|
|
||||||
unsafe_object: {
|
unsafe_object: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate : true,
|
||||||
reduce_funcs: true,
|
unsafe : true
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unsafe: true,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var o = { a: 1 };
|
|
||||||
console.log(
|
console.log(
|
||||||
o + 1,
|
({a:1}) + 1,
|
||||||
o.a + 1,
|
({a:1}).a + 1,
|
||||||
o.b + 1,
|
({a:1}).b + 1,
|
||||||
o.a.b + 1
|
({a:1}).a.b + 1
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var o = { a: 1 };
|
|
||||||
console.log(
|
console.log(
|
||||||
o + 1,
|
({a:1}) + 1,
|
||||||
2,
|
2,
|
||||||
o.b + 1,
|
({a:1}).b + 1,
|
||||||
1..b + 1
|
1..b + 1
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -376,27 +274,22 @@ unsafe_object: {
|
|||||||
|
|
||||||
unsafe_object_nested: {
|
unsafe_object_nested: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate : true,
|
||||||
reduce_funcs: true,
|
unsafe : true
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unsafe: true,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var o = { a: { b: 1 } };
|
|
||||||
console.log(
|
console.log(
|
||||||
o + 1,
|
({a:{b:1}}) + 1,
|
||||||
o.a + 1,
|
({a:{b:1}}).a + 1,
|
||||||
o.b + 1,
|
({a:{b:1}}).b + 1,
|
||||||
o.a.b + 1
|
({a:{b:1}}).a.b + 1
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var o = { a: { b: 1 } };
|
|
||||||
console.log(
|
console.log(
|
||||||
o + 1,
|
({a:{b:1}}) + 1,
|
||||||
o.a + 1,
|
({a:{b:1}}).a + 1,
|
||||||
o.b + 1,
|
({a:{b:1}}).b + 1,
|
||||||
2
|
2
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -405,26 +298,21 @@ unsafe_object_nested: {
|
|||||||
|
|
||||||
unsafe_object_complex: {
|
unsafe_object_complex: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate : true,
|
||||||
reduce_funcs: true,
|
unsafe : true
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unsafe: true,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var o = { a: { b: 1 }, b: 1 };
|
|
||||||
console.log(
|
console.log(
|
||||||
o + 1,
|
({a:{b:1},b:1}) + 1,
|
||||||
o.a + 1,
|
({a:{b:1},b:1}).a + 1,
|
||||||
o.b + 1,
|
({a:{b:1},b:1}).b + 1,
|
||||||
o.a.b + 1
|
({a:{b:1},b:1}).a.b + 1
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var o = { a: { b: 1 }, b: 1 };
|
|
||||||
console.log(
|
console.log(
|
||||||
o + 1,
|
({a:{b:1},b:1}) + 1,
|
||||||
o.a + 1,
|
({a:{b:1},b:1}).a + 1,
|
||||||
2,
|
2,
|
||||||
2
|
2
|
||||||
);
|
);
|
||||||
@@ -434,27 +322,22 @@ unsafe_object_complex: {
|
|||||||
|
|
||||||
unsafe_object_repeated: {
|
unsafe_object_repeated: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate : true,
|
||||||
reduce_funcs: true,
|
unsafe : true
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unsafe: true,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var o = { a: { b: 1 }, a: 1 };
|
|
||||||
console.log(
|
console.log(
|
||||||
o + 1,
|
({a:{b:1},a:1}) + 1,
|
||||||
o.a + 1,
|
({a:{b:1},a:1}).a + 1,
|
||||||
o.b + 1,
|
({a:{b:1},a:1}).b + 1,
|
||||||
o.a.b + 1
|
({a:{b:1},a:1}).a.b + 1
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var o = { a: { b: 1 }, a: 1 };
|
|
||||||
console.log(
|
console.log(
|
||||||
o + 1,
|
({a:{b:1},a:1}) + 1,
|
||||||
2,
|
2,
|
||||||
o.b + 1,
|
({a:{b:1},a:1}).b + 1,
|
||||||
1..b + 1
|
1..b + 1
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -464,7 +347,6 @@ unsafe_object_repeated: {
|
|||||||
unsafe_object_accessor: {
|
unsafe_object_accessor: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unsafe: true,
|
unsafe: true,
|
||||||
}
|
}
|
||||||
@@ -488,11 +370,10 @@ unsafe_object_accessor: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
prop_function: {
|
unsafe_function: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate : true,
|
||||||
properties: true,
|
unsafe : true
|
||||||
side_effects: true,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
@@ -505,9 +386,9 @@ prop_function: {
|
|||||||
expect: {
|
expect: {
|
||||||
console.log(
|
console.log(
|
||||||
({a:{b:1},b:function(){}}) + 1,
|
({a:{b:1},b:function(){}}) + 1,
|
||||||
({b:1}) + 1,
|
({a:{b:1},b:function(){}}).a + 1,
|
||||||
function(){} + 1,
|
({a:{b:1},b:function(){}}).b + 1,
|
||||||
2
|
({a:{b:1},b:function(){}}).a.b + 1
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
@@ -733,11 +614,10 @@ unsafe_string_bad_index: {
|
|||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
prototype_function: {
|
unsafe_prototype_function: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate : true,
|
||||||
properties: true,
|
unsafe : true
|
||||||
side_effects: true,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = ({valueOf: 0}) < 1;
|
var a = ({valueOf: 0}) < 1;
|
||||||
@@ -756,16 +636,14 @@ prototype_function: {
|
|||||||
var d = ({toString: 0}) + "";
|
var d = ({toString: 0}) + "";
|
||||||
var e = (({valueOf: 0}) + "")[2];
|
var e = (({valueOf: 0}) + "")[2];
|
||||||
var f = (({toString: 0}) + "")[2];
|
var f = (({toString: 0}) + "")[2];
|
||||||
var g = 0();
|
var g = ({valueOf: 0}).valueOf();
|
||||||
var h = 0();
|
var h = "" + ({toString: 0});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
call_args: {
|
call_args: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -786,9 +664,7 @@ call_args: {
|
|||||||
call_args_drop_param: {
|
call_args_drop_param: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -903,15 +779,13 @@ unsafe_charAt_noop: {
|
|||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
s.charAt(0),
|
s.charAt(0),
|
||||||
"string".charAt(x),
|
"string".charAt(x)
|
||||||
(typeof x).charAt()
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(
|
console.log(
|
||||||
s.charAt(0),
|
s.charAt(0),
|
||||||
"string".charAt(x),
|
"string".charAt(x)
|
||||||
(typeof x)[0]
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1048,12 +922,12 @@ delete_binary_1: {
|
|||||||
console.log(delete (true && (0 / 0)));
|
console.log(delete (true && (0 / 0)));
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(!0);
|
console.log((void 0, !0));
|
||||||
console.log(!0);
|
console.log((void 0, !0));
|
||||||
console.log(!0);
|
console.log((1 / 0, !0));
|
||||||
console.log(!0);
|
console.log((1 / 0, !0));
|
||||||
console.log(!0);
|
console.log((NaN, !0));
|
||||||
console.log(!0);
|
console.log((NaN, !0));
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
@@ -1074,12 +948,12 @@ delete_binary_2: {
|
|||||||
console.log(delete (false || (0 / 0)));
|
console.log(delete (false || (0 / 0)));
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(!0);
|
console.log((void 0, !0));
|
||||||
console.log(!0);
|
console.log((void 0, !0));
|
||||||
console.log(!0);
|
console.log((Infinity, !0));
|
||||||
console.log(!0);
|
console.log((1 / 0, !0));
|
||||||
console.log(!0);
|
console.log((NaN, !0));
|
||||||
console.log(!0);
|
console.log((NaN, !0));
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
@@ -1119,7 +993,6 @@ Infinity_NaN_undefined_LHS: {
|
|||||||
issue_1964_1: {
|
issue_1964_1: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unsafe_regexp: false,
|
unsafe_regexp: false,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -1127,7 +1000,6 @@ issue_1964_1: {
|
|||||||
input: {
|
input: {
|
||||||
function f() {
|
function f() {
|
||||||
var long_variable_name = /\s/;
|
var long_variable_name = /\s/;
|
||||||
console.log(long_variable_name.source);
|
|
||||||
return "a b c".split(long_variable_name)[1];
|
return "a b c".split(long_variable_name)[1];
|
||||||
}
|
}
|
||||||
console.log(f());
|
console.log(f());
|
||||||
@@ -1135,21 +1007,16 @@ issue_1964_1: {
|
|||||||
expect: {
|
expect: {
|
||||||
function f() {
|
function f() {
|
||||||
var long_variable_name = /\s/;
|
var long_variable_name = /\s/;
|
||||||
console.log(long_variable_name.source);
|
|
||||||
return "a b c".split(long_variable_name)[1];
|
return "a b c".split(long_variable_name)[1];
|
||||||
}
|
}
|
||||||
console.log(f());
|
console.log(f());
|
||||||
}
|
}
|
||||||
expect_stdout: [
|
expect_stdout: "b"
|
||||||
"\\s",
|
|
||||||
"b",
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1964_2: {
|
issue_1964_2: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unsafe_regexp: true,
|
unsafe_regexp: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -1157,279 +1024,15 @@ issue_1964_2: {
|
|||||||
input: {
|
input: {
|
||||||
function f() {
|
function f() {
|
||||||
var long_variable_name = /\s/;
|
var long_variable_name = /\s/;
|
||||||
console.log(long_variable_name.source);
|
|
||||||
return "a b c".split(long_variable_name)[1];
|
return "a b c".split(long_variable_name)[1];
|
||||||
}
|
}
|
||||||
console.log(f());
|
console.log(f());
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f() {
|
function f() {
|
||||||
console.log(/\s/.source);
|
|
||||||
return "a b c".split(/\s/)[1];
|
return "a b c".split(/\s/)[1];
|
||||||
}
|
}
|
||||||
console.log(f());
|
console.log(f());
|
||||||
}
|
}
|
||||||
expect_stdout: [
|
expect_stdout: "b"
|
||||||
"\\s",
|
|
||||||
"b",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
array_slice_index: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
unsafe: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log([1,2,3].slice(1)[1]);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(3);
|
|
||||||
}
|
|
||||||
expect_stdout: "3"
|
|
||||||
}
|
|
||||||
|
|
||||||
string_charCodeAt: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
unsafe: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log("foo".charCodeAt("bar".length));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(NaN);
|
|
||||||
}
|
|
||||||
expect_stdout: "NaN"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2207_1: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
unsafe: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(String.fromCharCode(65));
|
|
||||||
console.log(Math.max(3, 6, 2, 7, 3, 4));
|
|
||||||
console.log(Math.cos(1.2345));
|
|
||||||
console.log(Math.cos(1.2345) - Math.sin(4.321));
|
|
||||||
console.log(Math.pow(Math.PI, Math.E - Math.LN10));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log("A");
|
|
||||||
console.log(7);
|
|
||||||
console.log(Math.cos(1.2345));
|
|
||||||
console.log(1.2543732512566947);
|
|
||||||
console.log(1.6093984514472044);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2207_2: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
unsafe: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(Math.E);
|
|
||||||
console.log(Math.LN10);
|
|
||||||
console.log(Math.LN2);
|
|
||||||
console.log(Math.LOG2E);
|
|
||||||
console.log(Math.LOG10E);
|
|
||||||
console.log(Math.PI);
|
|
||||||
console.log(Math.SQRT1_2);
|
|
||||||
console.log(Math.SQRT2);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(Math.E);
|
|
||||||
console.log(Math.LN10);
|
|
||||||
console.log(Math.LN2);
|
|
||||||
console.log(Math.LOG2E);
|
|
||||||
console.log(Math.LOG10E);
|
|
||||||
console.log(Math.PI);
|
|
||||||
console.log(Math.SQRT1_2);
|
|
||||||
console.log(Math.SQRT2);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2207_3: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
unsafe: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(Number.MAX_VALUE);
|
|
||||||
console.log(Number.MIN_VALUE);
|
|
||||||
console.log(Number.NaN);
|
|
||||||
console.log(Number.NEGATIVE_INFINITY);
|
|
||||||
console.log(Number.POSITIVE_INFINITY);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(Number.MAX_VALUE);
|
|
||||||
console.log(5e-324);
|
|
||||||
console.log(NaN);
|
|
||||||
console.log(-1/0);
|
|
||||||
console.log(1/0);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2231_1: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
unsafe: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(Object.keys(void 0));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(Object.keys(void 0));
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2231_2: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
unsafe: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(Object.getOwnPropertyNames(null));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(Object.getOwnPropertyNames(null));
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
self_comparison_1: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unsafe: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = { n: NaN };
|
|
||||||
console.log(o.n == o.n, o.n === o.n, o.n != o.n, o.n !== o.n, typeof o.n);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(false, false, true, true, "number");
|
|
||||||
}
|
|
||||||
expect_stdout: "false false true true 'number'"
|
|
||||||
}
|
|
||||||
|
|
||||||
self_comparison_2: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
hoist_props: true,
|
|
||||||
passes: 2,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = { n: NaN };
|
|
||||||
console.log(o.n == o.n, o.n === o.n, o.n != o.n, o.n !== o.n, typeof o.n);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(false, false, true, true, "number");
|
|
||||||
}
|
|
||||||
expect_stdout: "false false true true 'number'"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2535_1: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
evaluate: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
if ((x() || true) || y()) z();
|
|
||||||
if ((x() || true) && y()) z();
|
|
||||||
if ((x() && true) || y()) z();
|
|
||||||
if ((x() && true) && y()) z();
|
|
||||||
if ((x() || false) || y()) z();
|
|
||||||
if ((x() || false) && y()) z();
|
|
||||||
if ((x() && false) || y()) z();
|
|
||||||
if ((x() && false) && y()) z();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
if (x(), 1) z();
|
|
||||||
if (x(), y()) z();
|
|
||||||
if (x() || y()) z();
|
|
||||||
if (x() && y()) z();
|
|
||||||
if (x() || y()) z();
|
|
||||||
if (x() && y()) z();
|
|
||||||
if (x(), y()) z();
|
|
||||||
if (x(), 0) z();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2535_2: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
evaluate: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(x() || true) || y();
|
|
||||||
(x() || true) && y();
|
|
||||||
(x() && true) || y();
|
|
||||||
(x() && true) && y();
|
|
||||||
(x() || false) || y();
|
|
||||||
(x() || false) && y();
|
|
||||||
(x() && false) || y();
|
|
||||||
(x() && false) && y();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
x(),
|
|
||||||
x(), y(),
|
|
||||||
x() || y(),
|
|
||||||
x() && y(),
|
|
||||||
x() || y(),
|
|
||||||
x() && y(),
|
|
||||||
x(), y(),
|
|
||||||
x();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2535_3: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(Object(1) && 1 && 2);
|
|
||||||
console.log(Object(1) && true && 1 && 2 && Object(2));
|
|
||||||
console.log(Object(1) && true && 1 && null && 2 && Object(2));
|
|
||||||
console.log(2 == Object(1) || 0 || void 0 || null);
|
|
||||||
console.log(2 == Object(1) || 0 || void 0 || null || Object(2));
|
|
||||||
console.log(2 == Object(1) || 0 || void 0 || "ok" || null || Object(2));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(Object(1) && 2);
|
|
||||||
console.log(Object(1) && Object(2));
|
|
||||||
console.log(Object(1) && null);
|
|
||||||
console.log(2 == Object(1) || null);
|
|
||||||
console.log(2 == Object(1) || Object(2));
|
|
||||||
console.log(2 == Object(1) || "ok");
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
expect_warnings: [
|
|
||||||
"WARN: Dropping side-effect-free && [test/compress/evaluate.js:1409,20]",
|
|
||||||
"WARN: Dropping side-effect-free && [test/compress/evaluate.js:1410,20]",
|
|
||||||
"WARN: Dropping side-effect-free && [test/compress/evaluate.js:1411,20]",
|
|
||||||
"WARN: Condition left of && always false [test/compress/evaluate.js:1411,20]",
|
|
||||||
"WARN: Dropping side-effect-free || [test/compress/evaluate.js:1412,20]",
|
|
||||||
"WARN: Dropping side-effect-free || [test/compress/evaluate.js:1413,20]",
|
|
||||||
"WARN: Dropping side-effect-free || [test/compress/evaluate.js:1414,20]",
|
|
||||||
"WARN: Condition left of || always true [test/compress/evaluate.js:1414,20]",
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -37,7 +37,6 @@ object: {
|
|||||||
VALUE: 42,
|
VALUE: 42,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
side_effects: true,
|
|
||||||
unsafe: true,
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -141,9 +140,9 @@ mixed: {
|
|||||||
console.log(CONFIG);
|
console.log(CONFIG);
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
|
'WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:126,22]',
|
||||||
'WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:127,22]',
|
'WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:127,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:129,8]',
|
||||||
'WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:130,8]',
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,39 +160,3 @@ issue_1801: {
|
|||||||
console.log(!0);
|
console.log(!0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1986: {
|
|
||||||
options = {
|
|
||||||
global_defs: {
|
|
||||||
"@alert": "console.log",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
alert(42);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(42);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2167: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
global_defs: {
|
|
||||||
"@isDevMode": "function(){}",
|
|
||||||
},
|
|
||||||
passes: 2,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
if (isDevMode()) {
|
|
||||||
greetOverlord();
|
|
||||||
}
|
|
||||||
doWork();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
doWork();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
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,829 +0,0 @@
|
|||||||
issue_2377_1: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
inline: true,
|
|
||||||
hoist_props: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var obj = {
|
|
||||||
foo: 1,
|
|
||||||
bar: 2,
|
|
||||||
square: function(x) {
|
|
||||||
return x * x;
|
|
||||||
},
|
|
||||||
cube: function(x) {
|
|
||||||
return x * x * x;
|
|
||||||
},
|
|
||||||
};
|
|
||||||
console.log(obj.foo, obj.cube(3));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var obj_foo = 1, obj_cube = function(x) {
|
|
||||||
return x * x * x;
|
|
||||||
};
|
|
||||||
console.log(obj_foo, obj_cube(3));
|
|
||||||
}
|
|
||||||
expect_stdout: "1 27"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2377_2: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
inline: true,
|
|
||||||
hoist_props: true,
|
|
||||||
passes: 2,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var obj = {
|
|
||||||
foo: 1,
|
|
||||||
bar: 2,
|
|
||||||
square: function(x) {
|
|
||||||
return x * x;
|
|
||||||
},
|
|
||||||
cube: function(x) {
|
|
||||||
return x * x * x;
|
|
||||||
},
|
|
||||||
};
|
|
||||||
console.log(obj.foo, obj.cube(3));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(1, (x = 3, x * x * x));
|
|
||||||
var x;
|
|
||||||
}
|
|
||||||
expect_stdout: "1 27"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2377_3: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
inline: true,
|
|
||||||
hoist_props: true,
|
|
||||||
passes: 4,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var obj = {
|
|
||||||
foo: 1,
|
|
||||||
bar: 2,
|
|
||||||
square: function(x) {
|
|
||||||
return x * x;
|
|
||||||
},
|
|
||||||
cube: function(x) {
|
|
||||||
return x * x * x;
|
|
||||||
},
|
|
||||||
};
|
|
||||||
console.log(obj.foo, obj.cube(3));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(1, 27);
|
|
||||||
}
|
|
||||||
expect_stdout: "1 27"
|
|
||||||
}
|
|
||||||
|
|
||||||
direct_access_1: {
|
|
||||||
options = {
|
|
||||||
hoist_props: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 0;
|
|
||||||
var obj = {
|
|
||||||
a: 1,
|
|
||||||
b: 2,
|
|
||||||
};
|
|
||||||
for (var k in obj) a++;
|
|
||||||
console.log(a, obj.a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 0;
|
|
||||||
var obj = {
|
|
||||||
a: 1,
|
|
||||||
b: 2,
|
|
||||||
};
|
|
||||||
for (var k in obj) a++;
|
|
||||||
console.log(a, obj.a);
|
|
||||||
}
|
|
||||||
expect_stdout: "2 1"
|
|
||||||
}
|
|
||||||
|
|
||||||
direct_access_2: {
|
|
||||||
options = {
|
|
||||||
hoist_props: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = { a: 1 };
|
|
||||||
var f = function(k) {
|
|
||||||
if (o[k]) return "PASS";
|
|
||||||
};
|
|
||||||
console.log(f("a"));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var o = { a: 1 };
|
|
||||||
console.log(function(k) {
|
|
||||||
if (o[k]) return "PASS";
|
|
||||||
}("a"));
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
direct_access_3: {
|
|
||||||
options = {
|
|
||||||
hoist_props: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = { a: 1 };
|
|
||||||
o.b;
|
|
||||||
console.log(o.a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var o = { a: 1 };
|
|
||||||
o.b;
|
|
||||||
console.log(o.a);
|
|
||||||
}
|
|
||||||
expect_stdout: "1"
|
|
||||||
}
|
|
||||||
|
|
||||||
single_use: {
|
|
||||||
options = {
|
|
||||||
hoist_props: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var obj = {
|
|
||||||
bar: function() {
|
|
||||||
return 42;
|
|
||||||
},
|
|
||||||
};
|
|
||||||
console.log(obj.bar());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log({
|
|
||||||
bar: function() {
|
|
||||||
return 42;
|
|
||||||
},
|
|
||||||
}.bar());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
name_collision_1: {
|
|
||||||
options = {
|
|
||||||
hoist_props: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var obj_foo = 1;
|
|
||||||
var obj_bar = 2;
|
|
||||||
function f() {
|
|
||||||
var obj = {
|
|
||||||
foo: 3,
|
|
||||||
bar: 4,
|
|
||||||
"b-r": 5,
|
|
||||||
"b+r": 6,
|
|
||||||
"b!r": 7,
|
|
||||||
};
|
|
||||||
console.log(obj_foo, obj.foo, obj.bar, obj["b-r"], obj["b+r"], obj["b!r"]);
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var obj_foo = 1;
|
|
||||||
var obj_bar = 2;
|
|
||||||
function f() {
|
|
||||||
var obj_foo$0 = 3,
|
|
||||||
obj_bar = 4,
|
|
||||||
obj_b_r = 5,
|
|
||||||
obj_b_r$0 = 6,
|
|
||||||
obj_b_r$1 = 7;
|
|
||||||
console.log(obj_foo, obj_foo$0, obj_bar, obj_b_r, obj_b_r$0, obj_b_r$1);
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect_stdout: "1 3 4 5 6 7"
|
|
||||||
}
|
|
||||||
|
|
||||||
name_collision_2: {
|
|
||||||
options = {
|
|
||||||
hoist_props: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = {
|
|
||||||
p: 1,
|
|
||||||
0: function(x) {
|
|
||||||
return x;
|
|
||||||
},
|
|
||||||
1: function(x) {
|
|
||||||
return x + 1;
|
|
||||||
}
|
|
||||||
}, o__$0 = 2, o__$1 = 3;
|
|
||||||
console.log(o.p === o.p, o[0](4), o[1](5), o__$0, o__$1);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var o_p = 1,
|
|
||||||
o__ = function(x) {
|
|
||||||
return x;
|
|
||||||
},
|
|
||||||
o__$2 = function(x) {
|
|
||||||
return x + 1;
|
|
||||||
},
|
|
||||||
o__$0 = 2,
|
|
||||||
o__$1 = 3;
|
|
||||||
console.log(o_p === o_p, o__(4), o__$2(5), o__$0, o__$1);
|
|
||||||
}
|
|
||||||
expect_stdout: "true 4 6 2 3"
|
|
||||||
}
|
|
||||||
|
|
||||||
name_collision_3: {
|
|
||||||
options = {
|
|
||||||
hoist_props: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = {
|
|
||||||
p: 1,
|
|
||||||
0: function(x) {
|
|
||||||
return x;
|
|
||||||
},
|
|
||||||
1: function(x) {
|
|
||||||
return x + 1;
|
|
||||||
}
|
|
||||||
}, o__$0 = 2, o__$1 = 3;
|
|
||||||
console.log(o.p === o.p, o[0](4), o[1](5));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var o_p = 1,
|
|
||||||
o__ = function(x) {
|
|
||||||
return x;
|
|
||||||
},
|
|
||||||
o__$2 = function(x) {
|
|
||||||
return x + 1;
|
|
||||||
},
|
|
||||||
o__$0 = 2,
|
|
||||||
o__$1 = 3;
|
|
||||||
console.log(o_p === o_p, o__(4), o__$2(5));
|
|
||||||
}
|
|
||||||
expect_stdout: "true 4 6"
|
|
||||||
}
|
|
||||||
|
|
||||||
contains_this_1: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
hoist_props: true,
|
|
||||||
inline: true,
|
|
||||||
passes: 2,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = {
|
|
||||||
u: function() {
|
|
||||||
return this === this;
|
|
||||||
},
|
|
||||||
p: 1
|
|
||||||
};
|
|
||||||
console.log(o.p, o.p);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(1, 1);
|
|
||||||
}
|
|
||||||
expect_stdout: "1 1"
|
|
||||||
}
|
|
||||||
|
|
||||||
contains_this_2: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
hoist_props: true,
|
|
||||||
inline: true,
|
|
||||||
passes: 2,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = {
|
|
||||||
u: function() {
|
|
||||||
return this === this;
|
|
||||||
},
|
|
||||||
p: 1
|
|
||||||
};
|
|
||||||
console.log(o.p, o.p, o.u);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(1, 1, function() {
|
|
||||||
return this === this;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
contains_this_3: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
hoist_props: true,
|
|
||||||
inline: true,
|
|
||||||
passes: 2,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = {
|
|
||||||
u: function() {
|
|
||||||
return this === this;
|
|
||||||
},
|
|
||||||
p: 1
|
|
||||||
};
|
|
||||||
console.log(o.p, o.p, o.u());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var o = {
|
|
||||||
u: function() {
|
|
||||||
return this === this;
|
|
||||||
},
|
|
||||||
p: 1
|
|
||||||
};
|
|
||||||
console.log(o.p, o.p, o.u());
|
|
||||||
}
|
|
||||||
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: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
hoist_props: true,
|
|
||||||
inline: true,
|
|
||||||
passes: 2,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = {
|
|
||||||
a: 1,
|
|
||||||
b: 2,
|
|
||||||
f: function(a) {
|
|
||||||
this.b = a;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
console.log(new o.f(o.a).b, o.b);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(new function(a) {
|
|
||||||
this.b = a;
|
|
||||||
}(1).b, 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: {
|
|
||||||
options = {
|
|
||||||
hoist_props: false,
|
|
||||||
reduce_vars: true,
|
|
||||||
top_retain: [ "x", "y" ],
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var x = {};
|
|
||||||
var y = [];
|
|
||||||
var z = {};
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var x = {};
|
|
||||||
var y = [];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2473_2: {
|
|
||||||
options = {
|
|
||||||
hoist_props: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
top_retain: [ "x", "y" ],
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var x = {};
|
|
||||||
var y = [];
|
|
||||||
var z = {};
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var x = {};
|
|
||||||
var y = [];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2473_3: {
|
|
||||||
options = {
|
|
||||||
hoist_props: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
top_retain: "o",
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = {
|
|
||||||
a: 1,
|
|
||||||
b: 2,
|
|
||||||
};
|
|
||||||
console.log(o.a, o.b);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var o = {
|
|
||||||
a: 1,
|
|
||||||
b: 2,
|
|
||||||
};
|
|
||||||
console.log(o.a, o.b);
|
|
||||||
}
|
|
||||||
expect_stdout: "1 2"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2473_4: {
|
|
||||||
options = {
|
|
||||||
hoist_props: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
top_retain: "o",
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function() {
|
|
||||||
var o = {
|
|
||||||
a: 1,
|
|
||||||
b: 2,
|
|
||||||
};
|
|
||||||
console.log(o.a, o.b);
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function() {
|
|
||||||
var o_a = 1, o_b = 2;
|
|
||||||
console.log(o_a, o_b);
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect_stdout: "1 2"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2508_1: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
hoist_props: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = {
|
|
||||||
a: [ 1 ],
|
|
||||||
f: function(x) {
|
|
||||||
console.log(x);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
o.f(o.a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function(x) {
|
|
||||||
console.log(x);
|
|
||||||
})([ 1 ]);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2508_2: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
hoist_props: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = {
|
|
||||||
a: { b: 2 },
|
|
||||||
f: function(x) {
|
|
||||||
console.log(x);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
o.f(o.a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function(x) {
|
|
||||||
console.log(x);
|
|
||||||
})({ b: 2 });
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2508_3: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
hoist_props: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = {
|
|
||||||
a: [ o ],
|
|
||||||
f: function(x) {
|
|
||||||
console.log(x);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
o.f(o.a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var o = {
|
|
||||||
a: [ o ],
|
|
||||||
f: function(x) {
|
|
||||||
console.log(x);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
o.f(o.a);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2508_4: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
hoist_props: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = {
|
|
||||||
a: { b: o },
|
|
||||||
f: function(x) {
|
|
||||||
console.log(x);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
o.f(o.a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var o = {
|
|
||||||
a: { b: o },
|
|
||||||
f: function(x) {
|
|
||||||
console.log(x);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
o.f(o.a);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2508_5: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
hoist_props: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = {
|
|
||||||
f: function(x) {
|
|
||||||
console.log(x);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
o.f(o.f);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var o_f = function(x) {
|
|
||||||
console.log(x);
|
|
||||||
};
|
|
||||||
o_f(o_f);
|
|
||||||
}
|
|
||||||
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: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
evaluate: true,
|
|
||||||
hoist_props: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function testFunc() {
|
|
||||||
var dimensions = {
|
|
||||||
minX: 5,
|
|
||||||
maxX: 6,
|
|
||||||
};
|
|
||||||
var scale = 1;
|
|
||||||
var d = {
|
|
||||||
x: (dimensions.maxX + dimensions.minX) / 2,
|
|
||||||
};
|
|
||||||
return d.x * scale;
|
|
||||||
}
|
|
||||||
console.log(testFunc());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function testFunc() {
|
|
||||||
return 1 * ((6 + 5) / 2);
|
|
||||||
}
|
|
||||||
console.log(testFunc());
|
|
||||||
}
|
|
||||||
expect_stdout: "5.5"
|
|
||||||
}
|
|
||||||
@@ -88,24 +88,3 @@ sequences_funs: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_2295: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
hoist_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function foo(o) {
|
|
||||||
var a = o.a;
|
|
||||||
if (a) return a;
|
|
||||||
var a = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function foo(o) {
|
|
||||||
var a = o.a;
|
|
||||||
if (a) return a;
|
|
||||||
a = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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;"
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -302,85 +302,3 @@ issue_1437_conditionals: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_512: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
if_return: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function a() {
|
|
||||||
if (b()) {
|
|
||||||
c();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function a() {
|
|
||||||
if (!b()) throw e;
|
|
||||||
c();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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"
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
parenthesis_strings_in_parenthesis: {
|
|
||||||
input: {
|
|
||||||
var foo = ('(');
|
|
||||||
a(')');
|
|
||||||
|
|
||||||
}
|
|
||||||
expect_exact: 'var foo="(";a(")");'
|
|
||||||
}
|
|
||||||
@@ -2,7 +2,7 @@ non_hoisted_function_after_return: {
|
|||||||
options = {
|
options = {
|
||||||
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
||||||
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
||||||
if_return: true, join_vars: true, side_effects: true
|
if_return: true, join_vars: true, cascade: true, side_effects: true
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo(x) {
|
function foo(x) {
|
||||||
@@ -38,7 +38,7 @@ non_hoisted_function_after_return_2a: {
|
|||||||
options = {
|
options = {
|
||||||
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
||||||
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
||||||
if_return: true, join_vars: true, side_effects: true,
|
if_return: true, join_vars: true, cascade: true, side_effects: true,
|
||||||
collapse_vars: false, passes: 2, warnings: "verbose"
|
collapse_vars: false, passes: 2, warnings: "verbose"
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -71,13 +71,11 @@ non_hoisted_function_after_return_2a: {
|
|||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:51,16]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:51,16]",
|
||||||
"WARN: Dropping unused variable a [test/compress/issue-1034.js:48,20]",
|
"WARN: Dropping unused variable a [test/compress/issue-1034.js:48,20]",
|
||||||
"WARN: Dropping unused function nope [test/compress/issue-1034.js:55,21]",
|
"WARN: Dropping unused function nope [test/compress/issue-1034.js:55,21]",
|
||||||
"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:53,12]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:53,12]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:53,12]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:56,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:56,12]",
|
||||||
"WARN: Dropping unused variable b [test/compress/issue-1034.js:51,20]",
|
"WARN: Dropping unused variable b [test/compress/issue-1034.js:51,20]",
|
||||||
"WARN: Dropping unused variable c [test/compress/issue-1034.js:53,16]",
|
"WARN: Dropping unused variable c [test/compress/issue-1034.js:53,16]",
|
||||||
"WARN: pass 1: last_count: 37, count: 18",
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,7 +83,7 @@ non_hoisted_function_after_return_2b: {
|
|||||||
options = {
|
options = {
|
||||||
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
||||||
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
||||||
if_return: true, join_vars: true, side_effects: true,
|
if_return: true, join_vars: true, cascade: true, side_effects: true,
|
||||||
collapse_vars: false
|
collapse_vars: false
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -111,146 +109,10 @@ non_hoisted_function_after_return_2b: {
|
|||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
// duplicate warnings no longer emitted
|
// duplicate warnings no longer emitted
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:97,16]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:95,16]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:97,16]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:95,16]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:99,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:97,12]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:99,12]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:97,12]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:103,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:101,12]",
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
non_hoisted_function_after_return_strict: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: false, 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
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
"use strict";
|
|
||||||
function foo(x) {
|
|
||||||
if (x) {
|
|
||||||
return bar();
|
|
||||||
not_called1();
|
|
||||||
} else {
|
|
||||||
return baz();
|
|
||||||
not_called2();
|
|
||||||
}
|
|
||||||
function bar() { return 7; }
|
|
||||||
return not_reached;
|
|
||||||
function UnusedFunction() {}
|
|
||||||
function baz() { return 8; }
|
|
||||||
}
|
|
||||||
console.log(foo(0), foo(1));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
"use strict";
|
|
||||||
function foo(x) {
|
|
||||||
return x ? bar() : baz();
|
|
||||||
function bar() { return 7 }
|
|
||||||
function baz() { return 8 }
|
|
||||||
}
|
|
||||||
console.log(foo(0), foo(1));
|
|
||||||
}
|
|
||||||
expect_stdout: "8 7"
|
|
||||||
expect_warnings: [
|
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:133,16]",
|
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:136,16]",
|
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:139,12]",
|
|
||||||
"WARN: Dropping unused function UnusedFunction [test/compress/issue-1034.js:140,21]",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
non_hoisted_function_after_return_2a_strict: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: false, 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: false, passes: 2, warnings: "verbose"
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
"use strict";
|
|
||||||
function foo(x) {
|
|
||||||
if (x) {
|
|
||||||
return bar(1);
|
|
||||||
var a = not_called(1);
|
|
||||||
} else {
|
|
||||||
return bar(2);
|
|
||||||
var b = not_called(2);
|
|
||||||
}
|
|
||||||
var c = bar(3);
|
|
||||||
function bar(x) { return 7 - x; }
|
|
||||||
function nope() {}
|
|
||||||
return b || c;
|
|
||||||
}
|
|
||||||
console.log(foo(0), foo(1));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
"use strict";
|
|
||||||
function foo(x) {
|
|
||||||
return bar(x ? 1 : 2);
|
|
||||||
function bar(x) {
|
|
||||||
return 7 - x;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
console.log(foo(0), foo(1));
|
|
||||||
}
|
|
||||||
expect_stdout: "5 6"
|
|
||||||
expect_warnings: [
|
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:175,16]",
|
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:175,16]",
|
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:178,16]",
|
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:178,16]",
|
|
||||||
"WARN: Dropping unused variable a [test/compress/issue-1034.js:175,20]",
|
|
||||||
"WARN: Dropping unused function nope [test/compress/issue-1034.js:182,21]",
|
|
||||||
"WARN: pass 0: last_count: Infinity, count: 48",
|
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:180,12]",
|
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:180,12]",
|
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:183,12]",
|
|
||||||
"WARN: Dropping unused variable b [test/compress/issue-1034.js:178,20]",
|
|
||||||
"WARN: Dropping unused variable c [test/compress/issue-1034.js:180,16]",
|
|
||||||
"WARN: pass 1: last_count: 48, count: 29",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
non_hoisted_function_after_return_2b_strict: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: false, 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: false
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
"use strict";
|
|
||||||
function foo(x) {
|
|
||||||
if (x) {
|
|
||||||
return bar(1);
|
|
||||||
} else {
|
|
||||||
return bar(2);
|
|
||||||
var b;
|
|
||||||
}
|
|
||||||
var c = bar(3);
|
|
||||||
function bar(x) {
|
|
||||||
return 7 - x;
|
|
||||||
}
|
|
||||||
return b || c;
|
|
||||||
}
|
|
||||||
console.log(foo(0), foo(1));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
"use strict";
|
|
||||||
function foo(x) {
|
|
||||||
return bar(x ? 1 : 2);
|
|
||||||
function bar(x) { return 7 - x; }
|
|
||||||
}
|
|
||||||
console.log(foo(0), foo(1));
|
|
||||||
}
|
|
||||||
expect_stdout: "5 6"
|
|
||||||
expect_warnings: [
|
|
||||||
// duplicate warnings no longer emitted
|
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:229,16]",
|
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:229,16]",
|
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:231,12]",
|
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:231,12]",
|
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:235,12]",
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ const_declaration: {
|
|||||||
const_pragma: {
|
const_pragma: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -30,7 +29,6 @@ const_pragma: {
|
|||||||
not_const: {
|
not_const: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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 {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,91 +1,90 @@
|
|||||||
multiple_functions: {
|
multiple_functions: {
|
||||||
options = {
|
options = { if_return: true, hoist_funs: false };
|
||||||
hoist_funs: false,
|
|
||||||
if_return: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
( function() {
|
( function() {
|
||||||
if ( !window ) {
|
if ( !window ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
function f() {}
|
function f() {}
|
||||||
function g() {}
|
function g() {}
|
||||||
} )();
|
} )();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
( function() {
|
( function() {
|
||||||
|
function f() {}
|
||||||
|
function g() {}
|
||||||
|
|
||||||
// NOTE: other compression steps will reduce this
|
// NOTE: other compression steps will reduce this
|
||||||
// down to just `window`.
|
// down to just `window`.
|
||||||
if ( window );
|
if ( window );
|
||||||
function f() {}
|
|
||||||
function g() {}
|
|
||||||
} )();
|
} )();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
single_function: {
|
single_function: {
|
||||||
options = {
|
options = { if_return: true, hoist_funs: false };
|
||||||
hoist_funs: false,
|
|
||||||
if_return: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
( function() {
|
( function() {
|
||||||
if ( !window ) {
|
if ( !window ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
function f() {}
|
function f() {}
|
||||||
} )();
|
} )();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
( function() {
|
( function() {
|
||||||
if ( window );
|
|
||||||
function f() {}
|
function f() {}
|
||||||
|
|
||||||
|
if ( window );
|
||||||
} )();
|
} )();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
deeply_nested: {
|
deeply_nested: {
|
||||||
options = {
|
options = { if_return: true, hoist_funs: false };
|
||||||
hoist_funs: false,
|
|
||||||
if_return: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
( function() {
|
( function() {
|
||||||
if ( !window ) {
|
if ( !window ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
function f() {}
|
function f() {}
|
||||||
function g() {}
|
function g() {}
|
||||||
|
|
||||||
if ( !document ) {
|
if ( !document ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
function h() {}
|
function h() {}
|
||||||
} )();
|
} )();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
( function() {
|
( function() {
|
||||||
|
function f() {}
|
||||||
|
function g() {}
|
||||||
|
|
||||||
|
function h() {}
|
||||||
|
|
||||||
// NOTE: other compression steps will reduce this
|
// NOTE: other compression steps will reduce this
|
||||||
// down to just `window`.
|
// down to just `window`.
|
||||||
if ( window )
|
if ( window )
|
||||||
if (document);
|
if (document);
|
||||||
function f() {}
|
|
||||||
function g() {}
|
|
||||||
function h() {}
|
|
||||||
} )();
|
} )();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
not_hoisted_when_already_nested: {
|
not_hoisted_when_already_nested: {
|
||||||
options = {
|
options = { if_return: true, hoist_funs: false };
|
||||||
hoist_funs: false,
|
|
||||||
if_return: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
( function() {
|
( function() {
|
||||||
if ( !window ) {
|
if ( !window ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( foo ) function f() {}
|
if ( foo ) function f() {}
|
||||||
|
|
||||||
} )();
|
} )();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
@@ -95,69 +94,3 @@ not_hoisted_when_already_nested: {
|
|||||||
} )();
|
} )();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
defun_if_return: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: false,
|
|
||||||
if_return: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function e() {
|
|
||||||
function f() {}
|
|
||||||
if (!window) return;
|
|
||||||
else function g() {}
|
|
||||||
function h() {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function e() {
|
|
||||||
function f() {}
|
|
||||||
if (window) function g() {}
|
|
||||||
function h() {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
defun_hoist_funs: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
if_return: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function e() {
|
|
||||||
function f() {}
|
|
||||||
if (!window) return;
|
|
||||||
else function g() {}
|
|
||||||
function h() {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function e() {
|
|
||||||
function f() {}
|
|
||||||
function h() {}
|
|
||||||
if (window) function g() {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
defun_else_if_return: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: false,
|
|
||||||
if_return: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function e() {
|
|
||||||
function f() {}
|
|
||||||
if (window) function g() {}
|
|
||||||
else return;
|
|
||||||
function h() {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function e() {
|
|
||||||
function f() {}
|
|
||||||
if (window) function g() {}
|
|
||||||
function h() {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -190,6 +190,7 @@ assorted_Infinity_NaN_undefined_in_with_scope: {
|
|||||||
keep_fargs: true,
|
keep_fargs: true,
|
||||||
if_return: true,
|
if_return: true,
|
||||||
join_vars: true,
|
join_vars: true,
|
||||||
|
cascade: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
sequences: false,
|
sequences: false,
|
||||||
keep_infinity: false,
|
keep_infinity: false,
|
||||||
@@ -252,6 +253,7 @@ assorted_Infinity_NaN_undefined_in_with_scope_keep_infinity: {
|
|||||||
keep_fargs: true,
|
keep_fargs: true,
|
||||||
if_return: true,
|
if_return: true,
|
||||||
join_vars: true,
|
join_vars: true,
|
||||||
|
cascade: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
sequences: false,
|
sequences: false,
|
||||||
keep_infinity: true,
|
keep_infinity: 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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -8,6 +8,7 @@ pure_function_calls: {
|
|||||||
unused : true,
|
unused : true,
|
||||||
if_return : true,
|
if_return : true,
|
||||||
join_vars : true,
|
join_vars : true,
|
||||||
|
cascade : true,
|
||||||
negate_iife : true,
|
negate_iife : true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -48,13 +49,13 @@ 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:17,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:17,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:29,37]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:30,37]",
|
||||||
"WARN: Dropping unused variable iife2 [test/compress/issue-1261.js:29,16]",
|
"WARN: Dropping unused variable iife2 [test/compress/issue-1261.js:30,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:28,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:37,8]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:38,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:38,31]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:39,31]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,6 +69,7 @@ pure_function_calls_toplevel: {
|
|||||||
unused : true,
|
unused : true,
|
||||||
if_return : true,
|
if_return : true,
|
||||||
join_vars : true,
|
join_vars : true,
|
||||||
|
cascade : true,
|
||||||
negate_iife : true,
|
negate_iife : true,
|
||||||
toplevel : true,
|
toplevel : true,
|
||||||
}
|
}
|
||||||
@@ -94,13 +96,6 @@ pure_function_calls_toplevel: {
|
|||||||
})();
|
})();
|
||||||
})();
|
})();
|
||||||
|
|
||||||
// pure top-level calls will be dropped regardless of the leading comments position
|
|
||||||
var MyClass = /*#__PURE__*//*@class*/(function(){
|
|
||||||
function MyClass() {}
|
|
||||||
MyClass.prototype.method = function() {};
|
|
||||||
return MyClass;
|
|
||||||
})();
|
|
||||||
|
|
||||||
// comment #__PURE__ comment
|
// comment #__PURE__ comment
|
||||||
bar(), baz(), quux();
|
bar(), baz(), quux();
|
||||||
a.b(), /* @__PURE__ */ c.d.e(), f.g();
|
a.b(), /* @__PURE__ */ c.d.e(), f.g();
|
||||||
@@ -110,17 +105,15 @@ 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:79,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:79,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:90,37]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:92,37]",
|
||||||
"WARN: Dropping unused variable iife2 [test/compress/issue-1261.js:90,16]",
|
"WARN: Dropping unused variable iife2 [test/compress/issue-1261.js:92,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:90,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:105,8]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:100,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:106,31]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:101,31]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:82,33]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:84,33]",
|
||||||
"WARN: Dropping unused variable iife1 [test/compress/issue-1261.js:82,12]",
|
"WARN: Dropping unused variable iife1 [test/compress/issue-1261.js:84,12]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:98,45]",
|
|
||||||
"WARN: Dropping unused variable MyClass [test/compress/issue-1261.js:98,12]",
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,29 +148,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:128,61]",
|
||||||
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:128,23]",
|
||||||
|
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:128,23]",
|
||||||
|
"WARN: Boolean || always true [test/compress/issue-1261.js:129,23]",
|
||||||
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:129,23]",
|
||||||
|
"WARN: Condition always true [test/compress/issue-1261.js:129,23]",
|
||||||
|
"WARN: Condition left of || always true [test/compress/issue-1261.js:130,8]",
|
||||||
|
"WARN: Condition always true [test/compress/issue-1261.js:130,8]",
|
||||||
|
"WARN: Boolean && always false [test/compress/issue-1261.js:131,23]",
|
||||||
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:131,23]",
|
||||||
|
"WARN: Condition always false [test/compress/issue-1261.js:131,23]",
|
||||||
|
"WARN: Condition left of && always false [test/compress/issue-1261.js:132,8]",
|
||||||
|
"WARN: Condition always false [test/compress/issue-1261.js:132,8]",
|
||||||
|
"WARN: + in boolean context always true [test/compress/issue-1261.js:133,23]",
|
||||||
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:133,23]",
|
||||||
|
"WARN: Condition always true [test/compress/issue-1261.js:133,23]",
|
||||||
|
"WARN: + in boolean context always true [test/compress/issue-1261.js:134,8]",
|
||||||
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:134,31]",
|
||||||
|
"WARN: Condition always true [test/compress/issue-1261.js:134,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:135,23]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:135,23]",
|
||||||
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:135,23]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:136,24]",
|
||||||
"WARN: Boolean || always true [test/compress/issue-1261.js:136,23]",
|
"WARN: Condition always true [test/compress/issue-1261.js:136,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:136,23]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:137,31]",
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:136,23]",
|
"WARN: Condition always false [test/compress/issue-1261.js:137,8]",
|
||||||
"WARN: Condition left of || always true [test/compress/issue-1261.js:137,8]",
|
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:137,8]",
|
|
||||||
"WARN: Boolean && always false [test/compress/issue-1261.js:138,23]",
|
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:138,23]",
|
|
||||||
"WARN: Condition always false [test/compress/issue-1261.js:138,23]",
|
|
||||||
"WARN: Condition left of && always false [test/compress/issue-1261.js:139,8]",
|
|
||||||
"WARN: Condition always false [test/compress/issue-1261.js:139,8]",
|
|
||||||
"WARN: + in boolean context always true [test/compress/issue-1261.js:140,23]",
|
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:140,23]",
|
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:140,23]",
|
|
||||||
"WARN: + in boolean context always true [test/compress/issue-1261.js:141,8]",
|
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:141,31]",
|
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:141,8]",
|
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:142,23]",
|
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:143,24]",
|
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:143,8]",
|
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:144,31]",
|
|
||||||
"WARN: Condition always false [test/compress/issue-1261.js:144,8]",
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ string_plus_optimization: {
|
|||||||
unused : true,
|
unused : true,
|
||||||
if_return : true,
|
if_return : true,
|
||||||
join_vars : true,
|
join_vars : true,
|
||||||
|
cascade : true,
|
||||||
hoist_funs : true,
|
hoist_funs : true,
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
issue_1321_no_debug: {
|
issue_1321_no_debug: {
|
||||||
mangle = {
|
mangle_props = {
|
||||||
properties: {
|
ignore_quoted: true
|
||||||
keep_quoted: true,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = {};
|
var x = {};
|
||||||
@@ -12,19 +10,17 @@ issue_1321_no_debug: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var x = {};
|
var x = {};
|
||||||
x.x = 1;
|
x.b = 1;
|
||||||
x["a"] = 2 * x.x;
|
x["a"] = 2 * x.b;
|
||||||
console.log(x.x, x["a"]);
|
console.log(x.b, x["a"]);
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1321_debug: {
|
issue_1321_debug: {
|
||||||
mangle = {
|
mangle_props = {
|
||||||
properties: {
|
ignore_quoted: true,
|
||||||
debug: "",
|
debug: ""
|
||||||
keep_quoted: true,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = {};
|
var x = {};
|
||||||
@@ -34,18 +30,16 @@ issue_1321_debug: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var x = {};
|
var x = {};
|
||||||
x.x = 1;
|
x.a = 1;
|
||||||
x["_$foo$_"] = 2 * x.x;
|
x["_$foo$_"] = 2 * x.a;
|
||||||
console.log(x.x, x["_$foo$_"]);
|
console.log(x.a, x["_$foo$_"]);
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1321_with_quoted: {
|
issue_1321_with_quoted: {
|
||||||
mangle = {
|
mangle_props = {
|
||||||
properties: {
|
ignore_quoted: false
|
||||||
keep_quoted: false,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = {};
|
var x = {};
|
||||||
@@ -55,9 +49,9 @@ issue_1321_with_quoted: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var x = {};
|
var x = {};
|
||||||
x.x = 1;
|
x.a = 1;
|
||||||
x["o"] = 2 * x.x;
|
x["b"] = 2 * x.a;
|
||||||
console.log(x.x, x["o"]);
|
console.log(x.a, x["b"]);
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
typeof_eq_undefined: {
|
typeof_eq_undefined: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true
|
||||||
typeofs: true,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = typeof b != "undefined";
|
var a = typeof b != "undefined";
|
||||||
@@ -24,8 +23,7 @@ typeof_eq_undefined: {
|
|||||||
typeof_eq_undefined_ie8: {
|
typeof_eq_undefined_ie8: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
ie8: true,
|
screw_ie8: false
|
||||||
typeofs: true,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = typeof b != "undefined";
|
var a = typeof b != "undefined";
|
||||||
@@ -47,8 +45,7 @@ typeof_eq_undefined_ie8: {
|
|||||||
|
|
||||||
undefined_redefined: {
|
undefined_redefined: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true
|
||||||
typeofs: true,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(undefined) {
|
function f(undefined) {
|
||||||
@@ -61,8 +58,7 @@ undefined_redefined: {
|
|||||||
|
|
||||||
undefined_redefined_mangle: {
|
undefined_redefined_mangle: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true
|
||||||
typeofs: true,
|
|
||||||
}
|
}
|
||||||
mangle = {}
|
mangle = {}
|
||||||
input: {
|
input: {
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ conditional_false_stray_else_in_loop: {
|
|||||||
hoist_vars : true,
|
hoist_vars : true,
|
||||||
join_vars : true,
|
join_vars : true,
|
||||||
if_return : true,
|
if_return : true,
|
||||||
|
cascade : true,
|
||||||
conditionals : false,
|
conditionals : false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
|||||||
@@ -1,284 +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
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
screw_ie8: {
|
screw_ie8: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
try { throw "foo"; } catch (x) { console.log(x); }
|
try { throw "foo"; } catch (x) { console.log(x); }
|
||||||
@@ -16,10 +16,10 @@ screw_ie8: {
|
|||||||
|
|
||||||
support_ie8: {
|
support_ie8: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
try { throw "foo"; } catch (x) { console.log(x); }
|
try { throw "foo"; } catch (x) { console.log(x); }
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ chained_evaluation_1: {
|
|||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -19,7 +18,9 @@ chained_evaluation_1: {
|
|||||||
expect: {
|
expect: {
|
||||||
(function() {
|
(function() {
|
||||||
(function() {
|
(function() {
|
||||||
f(1).bar = 1;
|
var c;
|
||||||
|
c = f(1);
|
||||||
|
c.bar = 1;
|
||||||
})();
|
})();
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
@@ -29,7 +30,6 @@ chained_evaluation_2: {
|
|||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -46,8 +46,9 @@ chained_evaluation_2: {
|
|||||||
expect: {
|
expect: {
|
||||||
(function() {
|
(function() {
|
||||||
(function() {
|
(function() {
|
||||||
var b = "long piece of string";
|
var c, b = "long piece of string";
|
||||||
f(b).bar = b;
|
c = f(b);
|
||||||
|
c.bar = b;
|
||||||
})();
|
})();
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
issue_1639_1: {
|
issue_1639_1: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
collapse_vars: true,
|
cascade: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
join_vars: true,
|
join_vars: true,
|
||||||
@@ -26,7 +26,7 @@ issue_1639_1: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
for (var a = 100, b = 10, L1 = 5; --L1 > 0;)
|
for (var a = 100, b = 10, L1 = 5; --L1 > 0;)
|
||||||
if (--b, 0) var ignore = 0;
|
if (--b, !1) var ignore = 0;
|
||||||
console.log(a, b);
|
console.log(a, b);
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
@@ -35,7 +35,7 @@ issue_1639_1: {
|
|||||||
issue_1639_2: {
|
issue_1639_2: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
collapse_vars: true,
|
cascade: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
join_vars: true,
|
join_vars: true,
|
||||||
@@ -57,7 +57,7 @@ issue_1639_2: {
|
|||||||
expect: {
|
expect: {
|
||||||
var a = 100, b = 10;
|
var a = 100, b = 10;
|
||||||
function f19() {
|
function f19() {
|
||||||
++a, 0;
|
++a, 1;
|
||||||
}
|
}
|
||||||
f19(),
|
f19(),
|
||||||
console.log(a, b);
|
console.log(a, b);
|
||||||
@@ -68,7 +68,7 @@ issue_1639_2: {
|
|||||||
issue_1639_3: {
|
issue_1639_3: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
collapse_vars: true,
|
cascade: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
f7: {
|
f7: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
|
cascade: true,
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
@@ -14,7 +15,6 @@ f7: {
|
|||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
passes: 3,
|
passes: 3,
|
||||||
properties: true,
|
properties: true,
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -38,7 +38,7 @@ f7: {
|
|||||||
"var b = 10;",
|
"var b = 10;",
|
||||||
"",
|
"",
|
||||||
"!function() {",
|
"!function() {",
|
||||||
" b = 100;",
|
" for (;b = 100, !1; ) ;",
|
||||||
"}(), console.log(100, b);",
|
"}(), console.log(100, b);",
|
||||||
]
|
]
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
side_effects_catch: {
|
side_effects_catch: {
|
||||||
options = {
|
options = {
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -35,7 +34,6 @@ side_effects_catch: {
|
|||||||
|
|
||||||
side_effects_else: {
|
side_effects_else: {
|
||||||
options = {
|
options = {
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -64,7 +62,6 @@ side_effects_else: {
|
|||||||
|
|
||||||
side_effects_finally: {
|
side_effects_finally: {
|
||||||
options = {
|
options = {
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -101,7 +98,6 @@ side_effects_finally: {
|
|||||||
|
|
||||||
side_effects_label: {
|
side_effects_label: {
|
||||||
options = {
|
options = {
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -134,7 +130,6 @@ side_effects_label: {
|
|||||||
|
|
||||||
side_effects_switch: {
|
side_effects_switch: {
|
||||||
options = {
|
options = {
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
mangle_catch: {
|
mangle_catch: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -22,11 +22,11 @@ mangle_catch: {
|
|||||||
|
|
||||||
mangle_catch_ie8: {
|
mangle_catch_ie8: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -44,11 +44,11 @@ mangle_catch_ie8: {
|
|||||||
|
|
||||||
mangle_catch_var: {
|
mangle_catch_var: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -66,11 +66,11 @@ mangle_catch_var: {
|
|||||||
|
|
||||||
mangle_catch_var_ie8: {
|
mangle_catch_var_ie8: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -88,11 +88,11 @@ mangle_catch_var_ie8: {
|
|||||||
|
|
||||||
mangle_catch_toplevel: {
|
mangle_catch_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -110,11 +110,11 @@ mangle_catch_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_ie8_toplevel: {
|
mangle_catch_ie8_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -132,11 +132,11 @@ mangle_catch_ie8_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_var_toplevel: {
|
mangle_catch_var_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -154,11 +154,11 @@ mangle_catch_var_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_var_ie8_toplevel: {
|
mangle_catch_var_ie8_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -176,11 +176,11 @@ mangle_catch_var_ie8_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_redef_1: {
|
mangle_catch_redef_1: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -198,11 +198,11 @@ mangle_catch_redef_1: {
|
|||||||
|
|
||||||
mangle_catch_redef_1_ie8: {
|
mangle_catch_redef_1_ie8: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -220,11 +220,11 @@ mangle_catch_redef_1_ie8: {
|
|||||||
|
|
||||||
mangle_catch_redef_1_toplevel: {
|
mangle_catch_redef_1_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -242,11 +242,11 @@ mangle_catch_redef_1_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_redef_1_ie8_toplevel: {
|
mangle_catch_redef_1_ie8_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -264,11 +264,11 @@ mangle_catch_redef_1_ie8_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_redef_2: {
|
mangle_catch_redef_2: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -285,11 +285,11 @@ mangle_catch_redef_2: {
|
|||||||
|
|
||||||
mangle_catch_redef_2_ie8: {
|
mangle_catch_redef_2_ie8: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -306,11 +306,11 @@ mangle_catch_redef_2_ie8: {
|
|||||||
|
|
||||||
mangle_catch_redef_2_toplevel: {
|
mangle_catch_redef_2_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -327,11 +327,11 @@ mangle_catch_redef_2_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_redef_2_ie8_toplevel: {
|
mangle_catch_redef_2_ie8_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
function_iife_catch: {
|
function_iife_catch: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(n) {
|
function f(n) {
|
||||||
@@ -21,7 +21,7 @@ function_iife_catch: {
|
|||||||
|
|
||||||
function_iife_catch_ie8: {
|
function_iife_catch_ie8: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(n) {
|
function f(n) {
|
||||||
@@ -42,7 +42,7 @@ function_iife_catch_ie8: {
|
|||||||
|
|
||||||
function_catch_catch: {
|
function_catch_catch: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var o = 0;
|
var o = 0;
|
||||||
@@ -70,7 +70,7 @@ function_catch_catch: {
|
|||||||
|
|
||||||
function_catch_catch_ie8: {
|
function_catch_catch_ie8: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var o = 0;
|
var o = 0;
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ case_1: {
|
|||||||
input: {
|
input: {
|
||||||
var a = 0, b = 1;
|
var a = 0, b = 1;
|
||||||
switch (true) {
|
switch (true) {
|
||||||
case a || true:
|
case a, true:
|
||||||
default:
|
default:
|
||||||
b = 2;
|
b = 2;
|
||||||
case true:
|
case true:
|
||||||
@@ -17,7 +17,7 @@ case_1: {
|
|||||||
expect: {
|
expect: {
|
||||||
var a = 0, b = 1;
|
var a = 0, b = 1;
|
||||||
switch (true) {
|
switch (true) {
|
||||||
case a || true:
|
case a, true:
|
||||||
b = 2;
|
b = 2;
|
||||||
}
|
}
|
||||||
console.log(a, b);
|
console.log(a, b);
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
mangle_props: {
|
mangle_props: {
|
||||||
mangle = {
|
mangle_props = {}
|
||||||
properties: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
var obj = {
|
var obj = {
|
||||||
undefined: 1,
|
undefined: 1,
|
||||||
@@ -56,12 +54,10 @@ mangle_props: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
numeric_literal: {
|
numeric_literal: {
|
||||||
mangle = {
|
|
||||||
properties: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
}
|
}
|
||||||
|
mangle_props = {}
|
||||||
input: {
|
input: {
|
||||||
var obj = {
|
var obj = {
|
||||||
0: 0,
|
0: 0,
|
||||||
@@ -86,7 +82,7 @@ numeric_literal: {
|
|||||||
' 42: 2,',
|
' 42: 2,',
|
||||||
' "42": 3,',
|
' "42": 3,',
|
||||||
' 37: 4,',
|
' 37: 4,',
|
||||||
' o: 5,',
|
' a: 5,',
|
||||||
' 1e42: 6,',
|
' 1e42: 6,',
|
||||||
' b: 7,',
|
' b: 7,',
|
||||||
' "1e+42": 8',
|
' "1e+42": 8',
|
||||||
@@ -96,7 +92,7 @@ numeric_literal: {
|
|||||||
'',
|
'',
|
||||||
'console.log(obj[42], obj["42"]);',
|
'console.log(obj[42], obj["42"]);',
|
||||||
'',
|
'',
|
||||||
'console.log(obj[37], obj["o"], obj[37], obj["37"]);',
|
'console.log(obj[37], obj["a"], obj[37], obj["37"]);',
|
||||||
'',
|
'',
|
||||||
'console.log(obj[1e42], obj["b"], obj["1e+42"]);',
|
'console.log(obj[1e42], obj["b"], obj["1e+42"]);',
|
||||||
]
|
]
|
||||||
@@ -107,3 +103,137 @@ numeric_literal: {
|
|||||||
"8 7 8",
|
"8 7 8",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
identifier: {
|
||||||
|
mangle_props = {}
|
||||||
|
input: {
|
||||||
|
var obj = {
|
||||||
|
abstract: 1,
|
||||||
|
boolean: 2,
|
||||||
|
byte: 3,
|
||||||
|
char: 4,
|
||||||
|
class: 5,
|
||||||
|
double: 6,
|
||||||
|
enum: 7,
|
||||||
|
export: 8,
|
||||||
|
extends: 9,
|
||||||
|
final: 10,
|
||||||
|
float: 11,
|
||||||
|
goto: 12,
|
||||||
|
implements: 13,
|
||||||
|
import: 14,
|
||||||
|
int: 15,
|
||||||
|
interface: 16,
|
||||||
|
let: 17,
|
||||||
|
long: 18,
|
||||||
|
native: 19,
|
||||||
|
package: 20,
|
||||||
|
private: 21,
|
||||||
|
protected: 22,
|
||||||
|
public: 23,
|
||||||
|
short: 24,
|
||||||
|
static: 25,
|
||||||
|
super: 26,
|
||||||
|
synchronized: 27,
|
||||||
|
this: 28,
|
||||||
|
throws: 29,
|
||||||
|
transient: 30,
|
||||||
|
volatile: 31,
|
||||||
|
yield: 32,
|
||||||
|
false: 33,
|
||||||
|
null: 34,
|
||||||
|
true: 35,
|
||||||
|
break: 36,
|
||||||
|
case: 37,
|
||||||
|
catch: 38,
|
||||||
|
const: 39,
|
||||||
|
continue: 40,
|
||||||
|
debugger: 41,
|
||||||
|
default: 42,
|
||||||
|
delete: 43,
|
||||||
|
do: 44,
|
||||||
|
else: 45,
|
||||||
|
finally: 46,
|
||||||
|
for: 47,
|
||||||
|
function: 48,
|
||||||
|
if: 49,
|
||||||
|
in: 50,
|
||||||
|
instanceof: 51,
|
||||||
|
new: 52,
|
||||||
|
return: 53,
|
||||||
|
switch: 54,
|
||||||
|
throw: 55,
|
||||||
|
try: 56,
|
||||||
|
typeof: 57,
|
||||||
|
var: 58,
|
||||||
|
void: 59,
|
||||||
|
while: 60,
|
||||||
|
with: 61,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var obj = {
|
||||||
|
a: 1,
|
||||||
|
b: 2,
|
||||||
|
c: 3,
|
||||||
|
d: 4,
|
||||||
|
e: 5,
|
||||||
|
f: 6,
|
||||||
|
g: 7,
|
||||||
|
h: 8,
|
||||||
|
i: 9,
|
||||||
|
j: 10,
|
||||||
|
k: 11,
|
||||||
|
l: 12,
|
||||||
|
m: 13,
|
||||||
|
n: 14,
|
||||||
|
o: 15,
|
||||||
|
p: 16,
|
||||||
|
q: 17,
|
||||||
|
r: 18,
|
||||||
|
s: 19,
|
||||||
|
t: 20,
|
||||||
|
u: 21,
|
||||||
|
v: 22,
|
||||||
|
w: 23,
|
||||||
|
x: 24,
|
||||||
|
y: 25,
|
||||||
|
z: 26,
|
||||||
|
A: 27,
|
||||||
|
B: 28,
|
||||||
|
C: 29,
|
||||||
|
D: 30,
|
||||||
|
F: 31,
|
||||||
|
G: 32,
|
||||||
|
false: 33,
|
||||||
|
null: 34,
|
||||||
|
true: 35,
|
||||||
|
H: 36,
|
||||||
|
I: 37,
|
||||||
|
J: 38,
|
||||||
|
K: 39,
|
||||||
|
L: 40,
|
||||||
|
M: 41,
|
||||||
|
N: 42,
|
||||||
|
O: 43,
|
||||||
|
P: 44,
|
||||||
|
Q: 45,
|
||||||
|
R: 46,
|
||||||
|
S: 47,
|
||||||
|
T: 48,
|
||||||
|
U: 49,
|
||||||
|
V: 50,
|
||||||
|
W: 51,
|
||||||
|
X: 52,
|
||||||
|
Y: 53,
|
||||||
|
Z: 54,
|
||||||
|
$: 55,
|
||||||
|
_: 56,
|
||||||
|
aa: 57,
|
||||||
|
ba: 58,
|
||||||
|
ca: 59,
|
||||||
|
da: 60,
|
||||||
|
ea: 61,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
unary_prefix: {
|
unary_prefix: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -12,6 +10,10 @@ unary_prefix: {
|
|||||||
return x;
|
return x;
|
||||||
}());
|
}());
|
||||||
}
|
}
|
||||||
expect_exact: "console.log(-2/3);"
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
return -2 / 3;
|
||||||
|
}());
|
||||||
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
iife_for: {
|
iife_for: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -27,7 +26,6 @@ iife_for: {
|
|||||||
iife_for_in: {
|
iife_for_in: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -53,7 +51,6 @@ iife_for_in: {
|
|||||||
iife_do: {
|
iife_do: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -83,7 +80,6 @@ iife_do: {
|
|||||||
iife_while: {
|
iife_while: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -134,5 +130,5 @@ label_while: {
|
|||||||
L: while (0) continue L;
|
L: while (0) continue L;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_exact: "function f(){L:0}"
|
expect_exact: "function f(){L:;}"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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_Func: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
new Function("aa, bb", 'return aa;');
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
Function("n,r", "return n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
compress_new_function_with_destruct: {
|
|
||||||
options = {
|
|
||||||
unsafe: true,
|
|
||||||
unsafe_Func: 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_Func: 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,498 +0,0 @@
|
|||||||
collapse_vars_constants: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
evaluate: true,
|
|
||||||
inline: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f1(x) {
|
|
||||||
var a = 4, b = x.prop, c = 5, d = sideeffect1(), e = sideeffect2();
|
|
||||||
return b + (function() { return d - a * e - c; })();
|
|
||||||
}
|
|
||||||
function f2(x) {
|
|
||||||
var a = 4, b = x.prop, c = 5, not_used = sideeffect1(), e = sideeffect2();
|
|
||||||
return b + (function() { return -a * e - c; })();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f1(x) {
|
|
||||||
var b = x.prop, d = sideeffect1(), e = sideeffect2();
|
|
||||||
return b + (d - 4 * e - 5);
|
|
||||||
}
|
|
||||||
function f2(x) {
|
|
||||||
var b = x.prop;
|
|
||||||
sideeffect1();
|
|
||||||
return b + (-4 * sideeffect2() - 5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
modified: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
inline: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f5(b) {
|
|
||||||
var a = function() {
|
|
||||||
return b;
|
|
||||||
}();
|
|
||||||
return b++ + a;
|
|
||||||
}
|
|
||||||
console.log(f5(1));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f5(b) {
|
|
||||||
var a = b;
|
|
||||||
return b++ + a;
|
|
||||||
}
|
|
||||||
console.log(f5(1));
|
|
||||||
}
|
|
||||||
expect_stdout: "2"
|
|
||||||
}
|
|
||||||
|
|
||||||
ref_scope: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
inline: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(function() {
|
|
||||||
var a = 1, b = 2, c = 3;
|
|
||||||
var a = c++, b = b /= a;
|
|
||||||
return function() {
|
|
||||||
return a;
|
|
||||||
}() + b;
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(function() {
|
|
||||||
var a = 1, b = 2, c = 3;
|
|
||||||
b = b /= a = c++;
|
|
||||||
return a + b;
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
safe_undefined: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
if_return: true,
|
|
||||||
inline: true,
|
|
||||||
unsafe: false,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
mangle = {}
|
|
||||||
input: {
|
|
||||||
var a, c;
|
|
||||||
console.log(function(undefined) {
|
|
||||||
return function() {
|
|
||||||
if (a)
|
|
||||||
return b;
|
|
||||||
if (c)
|
|
||||||
return d;
|
|
||||||
};
|
|
||||||
}(1)());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a, c;
|
|
||||||
console.log(a ? b : c ? d : void 0);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
negate_iife_3: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
expression: true,
|
|
||||||
inline: true,
|
|
||||||
negate_iife: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function(){ return t })() ? console.log(true) : console.log(false);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
t ? console.log(true) : console.log(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
negate_iife_3_off: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
expression: true,
|
|
||||||
inline: true,
|
|
||||||
negate_iife: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function(){ return t })() ? console.log(true) : console.log(false);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
t ? console.log(true) : console.log(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
negate_iife_4: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
expression: true,
|
|
||||||
inline: true,
|
|
||||||
negate_iife: true,
|
|
||||||
sequences: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function(){ return t })() ? console.log(true) : console.log(false);
|
|
||||||
(function(){
|
|
||||||
console.log("something");
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
t ? console.log(true) : console.log(false), void console.log("something");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
negate_iife_5: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
expression: true,
|
|
||||||
inline: true,
|
|
||||||
negate_iife: true,
|
|
||||||
sequences: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
if ((function(){ return t })()) {
|
|
||||||
foo(true);
|
|
||||||
} else {
|
|
||||||
bar(false);
|
|
||||||
}
|
|
||||||
(function(){
|
|
||||||
console.log("something");
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
t ? foo(true) : bar(false), void console.log("something");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
negate_iife_5_off: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
expression: true,
|
|
||||||
inline: true,
|
|
||||||
negate_iife: false,
|
|
||||||
sequences: true,
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
if ((function(){ return t })()) {
|
|
||||||
foo(true);
|
|
||||||
} else {
|
|
||||||
bar(false);
|
|
||||||
}
|
|
||||||
(function(){
|
|
||||||
console.log("something");
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
t ? foo(true) : bar(false), void console.log("something");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1254_negate_iife_true: {
|
|
||||||
options = {
|
|
||||||
expression: true,
|
|
||||||
inline: true,
|
|
||||||
negate_iife: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function() {
|
|
||||||
return function() {
|
|
||||||
console.log('test')
|
|
||||||
};
|
|
||||||
})()();
|
|
||||||
}
|
|
||||||
expect_exact: 'void console.log("test");'
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1254_negate_iife_nested: {
|
|
||||||
options = {
|
|
||||||
expression: true,
|
|
||||||
inline: true,
|
|
||||||
negate_iife: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function() {
|
|
||||||
return function() {
|
|
||||||
console.log('test')
|
|
||||||
};
|
|
||||||
})()()()()();
|
|
||||||
}
|
|
||||||
expect_exact: '(void console.log("test"))()()();'
|
|
||||||
}
|
|
||||||
|
|
||||||
negate_iife_issue_1073: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
evaluate: true,
|
|
||||||
inline: true,
|
|
||||||
negate_iife: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
sequences: true,
|
|
||||||
unused: true,
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
new (function(a) {
|
|
||||||
return function Foo() {
|
|
||||||
this.x = a;
|
|
||||||
console.log(this);
|
|
||||||
};
|
|
||||||
}(7))();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
new function() {
|
|
||||||
this.x = 7,
|
|
||||||
console.log(this);
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1288_side_effects: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
evaluate: true,
|
|
||||||
inline: true,
|
|
||||||
negate_iife: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
if (w) ;
|
|
||||||
else {
|
|
||||||
(function f() {})();
|
|
||||||
}
|
|
||||||
if (!x) {
|
|
||||||
(function() {
|
|
||||||
x = {};
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
if (y)
|
|
||||||
(function() {})();
|
|
||||||
else
|
|
||||||
(function(z) {
|
|
||||||
return z;
|
|
||||||
})(0);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
w;
|
|
||||||
x || (x = {});
|
|
||||||
y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inner_var_for_in_1: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
inline: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
var a = 1, b = 2;
|
|
||||||
for (b in (function() {
|
|
||||||
return x(a, b, c);
|
|
||||||
})()) {
|
|
||||||
var c = 3, d = 4;
|
|
||||||
x(a, b, c, d);
|
|
||||||
}
|
|
||||||
x(a, b, c, d);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {
|
|
||||||
var a = 1, b = 2;
|
|
||||||
for (b in x(1, b, c)) {
|
|
||||||
var c = 3, d = 4;
|
|
||||||
x(1, b, c, d);
|
|
||||||
}
|
|
||||||
x(1, b, c, d);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1595_3: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
inline: true,
|
|
||||||
passes: 2,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function f(a) {
|
|
||||||
return g(a + 1);
|
|
||||||
})(2);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
g(3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1758: {
|
|
||||||
options = {
|
|
||||||
inline: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(function(c) {
|
|
||||||
var undefined = 42;
|
|
||||||
return function() {
|
|
||||||
c--;
|
|
||||||
c--, c.toString();
|
|
||||||
return;
|
|
||||||
}();
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(function(c) {
|
|
||||||
var undefined = 42;
|
|
||||||
return c--, c--, void c.toString();
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect_stdout: "undefined"
|
|
||||||
}
|
|
||||||
wrap_iife: {
|
|
||||||
options = {
|
|
||||||
inline: true,
|
|
||||||
negate_iife: false,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
wrap_iife: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function() {
|
|
||||||
return function() {
|
|
||||||
console.log('test')
|
|
||||||
};
|
|
||||||
})()();
|
|
||||||
}
|
|
||||||
expect_exact: 'void console.log("test");'
|
|
||||||
}
|
|
||||||
|
|
||||||
wrap_iife_in_expression: {
|
|
||||||
options = {
|
|
||||||
inline: true,
|
|
||||||
negate_iife: false,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
wrap_iife: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
foo = (function () {
|
|
||||||
return bar();
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect_exact: 'foo=bar();'
|
|
||||||
}
|
|
||||||
|
|
||||||
wrap_iife_in_return_call: {
|
|
||||||
options = {
|
|
||||||
inline: true,
|
|
||||||
negate_iife: false,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
wrap_iife: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function() {
|
|
||||||
return (function() {
|
|
||||||
console.log('test')
|
|
||||||
})();
|
|
||||||
})()();
|
|
||||||
}
|
|
||||||
expect_exact: '(void console.log("test"))();'
|
|
||||||
}
|
|
||||||
|
|
||||||
pure_annotation_1: {
|
|
||||||
options = {
|
|
||||||
inline: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
/*@__PURE__*/(function() {
|
|
||||||
console.log("hello");
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect_exact: ""
|
|
||||||
}
|
|
||||||
|
|
||||||
pure_annotation_2: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
inline: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
/*@__PURE__*/(function(n) {
|
|
||||||
console.log("hello", n);
|
|
||||||
}(42));
|
|
||||||
}
|
|
||||||
expect_exact: ""
|
|
||||||
}
|
|
||||||
|
|
||||||
drop_fargs: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
inline: true,
|
|
||||||
keep_fargs: false,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 1;
|
|
||||||
!function(a_1) {
|
|
||||||
a++;
|
|
||||||
}(a++ + (a && a.var));
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 1;
|
|
||||||
++a && a.var, a++;
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: "3"
|
|
||||||
}
|
|
||||||
|
|
||||||
keep_fargs: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
inline: true,
|
|
||||||
keep_fargs: true,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 1;
|
|
||||||
!function(a_1) {
|
|
||||||
a++;
|
|
||||||
}(a++ + (a && a.var));
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 1;
|
|
||||||
++a && a.var, a++;
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: "3"
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
collapse: {
|
collapse: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
cascade: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -41,7 +41,7 @@ collapse: {
|
|||||||
return void 0 !== ('function' === typeof b ? b() : b) && c();
|
return void 0 !== ('function' === typeof b ? b() : b) && c();
|
||||||
}
|
}
|
||||||
function f2(b) {
|
function f2(b) {
|
||||||
return 'stirng' == typeof ('function' === typeof (b = c()) ? b() : b) && d();
|
return b = c(), 'stirng' == typeof ('function' === typeof b ? b() : b) && d();
|
||||||
}
|
}
|
||||||
function f3(c) {
|
function f3(c) {
|
||||||
var a;
|
var a;
|
||||||
|
|||||||
@@ -17,6 +17,6 @@ wrongly_optimized: {
|
|||||||
foo();
|
foo();
|
||||||
}
|
}
|
||||||
// TODO: optimize to `func(), bar()`
|
// TODO: optimize to `func(), bar()`
|
||||||
(func(), 1) && bar();
|
(func(), 0) || bar();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ wrongly_optimized: {
|
|||||||
foo();
|
foo();
|
||||||
}
|
}
|
||||||
// TODO: optimize to `func(), bar()`
|
// TODO: optimize to `func(), bar()`
|
||||||
if (func(), 1) bar();
|
if (func(), !0) bar();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -159,7 +159,7 @@ negate_iife_4: {
|
|||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
!function(){ return t }() ? console.log(false) : console.log(true), function(){
|
(function(){ return t })() ? console.log(true) : console.log(false), function(){
|
||||||
console.log("something");
|
console.log("something");
|
||||||
}();
|
}();
|
||||||
}
|
}
|
||||||
@@ -183,7 +183,7 @@ negate_iife_5: {
|
|||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
!function(){ return t }() ? bar(false) : foo(true), function(){
|
(function(){ return t })() ? foo(true) : bar(false), function(){
|
||||||
console.log("something");
|
console.log("something");
|
||||||
}();
|
}();
|
||||||
}
|
}
|
||||||
@@ -207,7 +207,7 @@ negate_iife_5_off: {
|
|||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
!function(){ return t }() ? bar(false) : foo(true), function(){
|
(function(){ return t })() ? foo(true) : bar(false), function(){
|
||||||
console.log("something");
|
console.log("something");
|
||||||
}();
|
}();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,45 +1,37 @@
|
|||||||
dont_reuse_prop: {
|
dont_reuse_prop: {
|
||||||
mangle = {
|
mangle_props = {
|
||||||
properties: {
|
regex: /asd/
|
||||||
regex: /asd/,
|
};
|
||||||
},
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
"aaaaaaaaaabbbbb";
|
|
||||||
var obj = {};
|
var obj = {};
|
||||||
obj.a = 123;
|
obj.a = 123;
|
||||||
obj.asd = 256;
|
obj.asd = 256;
|
||||||
console.log(obj.a);
|
console.log(obj.a);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
"aaaaaaaaaabbbbb";
|
|
||||||
var obj = {};
|
var obj = {};
|
||||||
obj.a = 123;
|
obj.a = 123;
|
||||||
obj.b = 256;
|
obj.b = 256;
|
||||||
console.log(obj.a);
|
console.log(obj.a);
|
||||||
}
|
}
|
||||||
expect_stdout: "123"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unmangleable_props_should_always_be_reserved: {
|
unmangleable_props_should_always_be_reserved: {
|
||||||
mangle = {
|
mangle_props = {
|
||||||
properties: {
|
regex: /asd/
|
||||||
regex: /asd/,
|
};
|
||||||
},
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
"aaaaaaaaaabbbbb";
|
|
||||||
var obj = {};
|
var obj = {};
|
||||||
obj.asd = 256;
|
obj.asd = 256;
|
||||||
obj.a = 123;
|
obj.a = 123;
|
||||||
console.log(obj.a);
|
console.log(obj.a);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
"aaaaaaaaaabbbbb";
|
|
||||||
var obj = {};
|
var obj = {};
|
||||||
obj.b = 256;
|
obj.b = 256;
|
||||||
obj.a = 123;
|
obj.a = 123;
|
||||||
console.log(obj.a);
|
console.log(obj.a);
|
||||||
}
|
}
|
||||||
expect_stdout: "123"
|
|
||||||
}
|
}
|
||||||
@@ -18,6 +18,7 @@ dont_mangle_arguments: {
|
|||||||
hoist_vars : true,
|
hoist_vars : true,
|
||||||
if_return : true,
|
if_return : true,
|
||||||
join_vars : true,
|
join_vars : true,
|
||||||
|
cascade : true,
|
||||||
side_effects : true,
|
side_effects : true,
|
||||||
negate_iife : false
|
negate_iife : false
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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>`);"
|
|
||||||
}
|
|
||||||
@@ -1,8 +1,7 @@
|
|||||||
this_binding_conditionals: {
|
this_binding_conditionals: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate: true,
|
evaluate : true
|
||||||
side_effects: true,
|
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
(1 && a)();
|
(1 && a)();
|
||||||
@@ -52,7 +51,6 @@ this_binding_collapse_vars: {
|
|||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
var c = a; c();
|
var c = a; c();
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ eval_collapse_vars: {
|
|||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:false, properties:true, dead_code:true, conditionals:true,
|
collapse_vars:true, sequences:false, properties:true, dead_code:true, conditionals:true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
function f1() {
|
function f1() {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ issue979_reported: {
|
|||||||
options = {
|
options = {
|
||||||
sequences:true, properties:true, dead_code:true, conditionals:true,
|
sequences:true, properties:true, dead_code:true, conditionals:true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1() {
|
function f1() {
|
||||||
@@ -32,7 +32,7 @@ issue979_test_negated_is_best: {
|
|||||||
options = {
|
options = {
|
||||||
sequences:true, properties:true, dead_code:true, conditionals:true,
|
sequences:true, properties:true, dead_code:true, conditionals:true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects: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';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -192,11 +192,9 @@ keep_collapse_const_in_own_block_scope_2: {
|
|||||||
|
|
||||||
evaluate: {
|
evaluate: {
|
||||||
options = {
|
options = {
|
||||||
|
loops: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
loops: true,
|
|
||||||
passes: 2,
|
|
||||||
side_effects: true,
|
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
while (true) {
|
while (true) {
|
||||||
@@ -247,7 +245,7 @@ issue_1532: {
|
|||||||
issue_186: {
|
issue_186: {
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: false,
|
beautify: false,
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -266,7 +264,7 @@ issue_186: {
|
|||||||
issue_186_ie8: {
|
issue_186_ie8: {
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: false,
|
beautify: false,
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -285,7 +283,7 @@ issue_186_ie8: {
|
|||||||
issue_186_beautify: {
|
issue_186_beautify: {
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -312,7 +310,7 @@ issue_186_beautify: {
|
|||||||
issue_186_beautify_ie8: {
|
issue_186_beautify_ie8: {
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -342,7 +340,7 @@ issue_186_bracketize: {
|
|||||||
beautify = {
|
beautify = {
|
||||||
beautify: false,
|
beautify: false,
|
||||||
bracketize: true,
|
bracketize: true,
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -362,7 +360,7 @@ issue_186_bracketize_ie8: {
|
|||||||
beautify = {
|
beautify = {
|
||||||
beautify: false,
|
beautify: false,
|
||||||
bracketize: true,
|
bracketize: true,
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -382,7 +380,7 @@ issue_186_beautify_bracketize: {
|
|||||||
beautify = {
|
beautify = {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
bracketize: true,
|
bracketize: true,
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -414,7 +412,7 @@ issue_186_beautify_bracketize_ie8: {
|
|||||||
beautify = {
|
beautify = {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
bracketize: true,
|
bracketize: true,
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -482,57 +480,3 @@ do_switch: {
|
|||||||
} while (false);
|
} while (false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
in_parenthesis_1: {
|
|
||||||
input: {
|
|
||||||
for (("foo" in {});0;);
|
|
||||||
}
|
|
||||||
expect_exact: 'for(("foo"in{});0;);'
|
|
||||||
}
|
|
||||||
|
|
||||||
in_parenthesis_2: {
|
|
||||||
input: {
|
|
||||||
for ((function(){ "foo" in {}; });0;);
|
|
||||||
}
|
|
||||||
expect_exact: 'for(function(){"foo"in{}};0;);'
|
|
||||||
}
|
|
||||||
|
|
||||||
init_side_effects: {
|
|
||||||
options = {
|
|
||||||
loops: true,
|
|
||||||
side_effects: true,
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
for (function() {}(), i = 0; i < 5; i++) console.log(i);
|
|
||||||
for (function() {}(); i < 10; i++) console.log(i);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
for (i = 0; i < 5; i++) console.log(i);
|
|
||||||
for (; i < 10; i++) console.log(i);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
dead_code_condition: {
|
|
||||||
options = {
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
loops: true,
|
|
||||||
sequences: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
for (var a = 0, b = 5; (a += 1, 3) - 3 && b > 0; b--) {
|
|
||||||
var c = function() {
|
|
||||||
b--;
|
|
||||||
}(a++);
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var c;
|
|
||||||
var a = 0, b = 5;
|
|
||||||
a += 1, 0,
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: "1"
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -22,25 +22,27 @@ negate_iife_1_off: {
|
|||||||
|
|
||||||
negate_iife_2: {
|
negate_iife_2: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
negate_iife: true
|
||||||
negate_iife: true,
|
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
|
(function(){ return {} })().x = 10; // should not transform this one
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
(function(){ return {} })().x = 10;
|
(function(){ return {} })().x = 10;
|
||||||
}
|
}
|
||||||
expect_exact: "({}).x=10;"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
negate_iife_2_side_effects: {
|
negate_iife_2_side_effects: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
(function(){ return {} })().x = 10; // should not transform this one
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
(function(){ return {} })().x = 10;
|
(function(){ return {} })().x = 10;
|
||||||
}
|
}
|
||||||
expect_exact: "({}).x=10;"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
negate_iife_3: {
|
negate_iife_3: {
|
||||||
@@ -60,7 +62,6 @@ negate_iife_3_evaluate: {
|
|||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -103,7 +104,6 @@ negate_iife_3_off_evaluate: {
|
|||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
|
||||||
negate_iife: false,
|
negate_iife: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
|||||||
@@ -82,35 +82,3 @@ 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: {
|
|
||||||
input: {
|
|
||||||
console.log(new (Math.random().constructor) instanceof Number);
|
|
||||||
}
|
|
||||||
expect_exact: "console.log(new(Math.random().constructor)instanceof Number);"
|
|
||||||
expect_stdout: "true"
|
|
||||||
}
|
|
||||||
|
|
||||||
dot_parenthesis_2: {
|
|
||||||
input: {
|
|
||||||
console.log(typeof new function(){Math.random()}.constructor);
|
|
||||||
}
|
|
||||||
expect_exact: "console.log(typeof new function(){Math.random()}.constructor);"
|
|
||||||
expect_stdout: "function"
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,38 +0,0 @@
|
|||||||
eval_let_6: {
|
|
||||||
input: {
|
|
||||||
eval("let a;");
|
|
||||||
console.log();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
eval("let a;");
|
|
||||||
console.log();
|
|
||||||
}
|
|
||||||
expect_stdout: ""
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
eval_let_4: {
|
|
||||||
input: {
|
|
||||||
eval("let a;");
|
|
||||||
console.log();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
eval("let a;");
|
|
||||||
console.log();
|
|
||||||
}
|
|
||||||
expect_stdout: SyntaxError("Block-scoped declarations (let, const, function, class) not yet supported outside strict mode")
|
|
||||||
node_version: "4"
|
|
||||||
}
|
|
||||||
|
|
||||||
eval_let_0: {
|
|
||||||
input: {
|
|
||||||
eval("let a;");
|
|
||||||
console.log();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
eval("let a;");
|
|
||||||
console.log();
|
|
||||||
}
|
|
||||||
expect_stdout: SyntaxError("Unexpected identifier")
|
|
||||||
node_version: "<=0.12"
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,186 +0,0 @@
|
|||||||
arrow_functions: {
|
|
||||||
options = {
|
|
||||||
arrows: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(a) => b; // 1 args
|
|
||||||
(a, b) => c; // n args
|
|
||||||
() => b; // 0 args
|
|
||||||
(a) => (b) => c; // func returns func returns func
|
|
||||||
(a) => ((b) => c); // So these parens are dropped
|
|
||||||
() => (b,c) => d; // func returns func returns func
|
|
||||||
a=>{return b;}
|
|
||||||
a => 'lel'; // Dropping the parens
|
|
||||||
}
|
|
||||||
expect_exact: "a=>b;(a,b)=>c;()=>b;a=>b=>c;a=>b=>c;()=>(b,c)=>d;a=>b;a=>\"lel\";"
|
|
||||||
}
|
|
||||||
|
|
||||||
arrow_return: {
|
|
||||||
options = {
|
|
||||||
arrows: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
() => {};
|
|
||||||
() => { return; };
|
|
||||||
a => { return 1; }
|
|
||||||
a => { return -b }
|
|
||||||
a => { return b; var b; }
|
|
||||||
(x, y) => { return x - y; }
|
|
||||||
}
|
|
||||||
expect_exact: "()=>{};()=>{};a=>1;a=>-b;a=>{return b;var b};(x,y)=>x-y;"
|
|
||||||
}
|
|
||||||
|
|
||||||
regression_arrow_functions_and_hoist: {
|
|
||||||
options = {
|
|
||||||
hoist_vars: true,
|
|
||||||
hoist_funs: true
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(a) => b;
|
|
||||||
}
|
|
||||||
expect_exact: "a=>b;"
|
|
||||||
}
|
|
||||||
|
|
||||||
regression_assign_arrow_functions: {
|
|
||||||
input: {
|
|
||||||
oninstall = e => false;
|
|
||||||
oninstall = () => false;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
oninstall=e=>false;
|
|
||||||
oninstall=()=>false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
destructuring_arguments_1: {
|
|
||||||
input: {
|
|
||||||
(function ( a ) { });
|
|
||||||
(function ( [ a ] ) { });
|
|
||||||
(function ( [ a, b ] ) { });
|
|
||||||
(function ( [ [ a ] ] ) { });
|
|
||||||
(function ( [ [ a, b ] ] ) { });
|
|
||||||
(function ( [ a, [ b ] ] ) { });
|
|
||||||
(function ( [ [ b ], a ] ) { });
|
|
||||||
|
|
||||||
(function ( { a } ) { });
|
|
||||||
(function ( { a, b } ) { });
|
|
||||||
|
|
||||||
(function ( [ { a } ] ) { });
|
|
||||||
(function ( [ { a, b } ] ) { });
|
|
||||||
(function ( [ a, { b } ] ) { });
|
|
||||||
(function ( [ { b }, a ] ) { });
|
|
||||||
|
|
||||||
( [ a ] ) => { };
|
|
||||||
( [ a, b ] ) => { };
|
|
||||||
|
|
||||||
( { a } ) => { };
|
|
||||||
( { a, b, c, d, e } ) => { };
|
|
||||||
|
|
||||||
( [ a ] ) => b;
|
|
||||||
( [ a, b ] ) => c;
|
|
||||||
|
|
||||||
( { a } ) => b;
|
|
||||||
( { a, b } ) => c;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function(a){});
|
|
||||||
(function([a]){});
|
|
||||||
(function([a,b]){});
|
|
||||||
(function([[a]]){});
|
|
||||||
(function([[a,b]]){});
|
|
||||||
(function([a,[b]]){});
|
|
||||||
(function([[b],a]){});
|
|
||||||
|
|
||||||
(function({a}){});
|
|
||||||
(function({a,b}){});
|
|
||||||
|
|
||||||
(function([{a}]){});
|
|
||||||
(function([{a,b}]){});
|
|
||||||
(function([a,{b}]){});
|
|
||||||
(function([{b},a]){});
|
|
||||||
|
|
||||||
([a])=>{};
|
|
||||||
([a,b])=>{};
|
|
||||||
|
|
||||||
({a})=>{};
|
|
||||||
({a,b,c,d,e})=>{};
|
|
||||||
|
|
||||||
([a])=>b;
|
|
||||||
([a,b])=>c;
|
|
||||||
|
|
||||||
({a})=>b;
|
|
||||||
({a,b})=>c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
destructuring_arguments_2: {
|
|
||||||
input: {
|
|
||||||
(function([]) {});
|
|
||||||
(function({}) {});
|
|
||||||
(function([,,,,,]) {});
|
|
||||||
(function ([a, {b: c}]) {});
|
|
||||||
(function ([...args]) {});
|
|
||||||
(function ({x,}) {});
|
|
||||||
class a { *method({ [thrower()]: x } = {}) {}};
|
|
||||||
(function(a, b, c, d, [{e: [...f]}]){})(1, 2, 3, 4, [{e: [1, 2, 3]}]);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function([]) {});
|
|
||||||
(function({}) {});
|
|
||||||
(function([,,,,,]) {});
|
|
||||||
(function ([a, {b: c}]) {});
|
|
||||||
(function ([...args]) {});
|
|
||||||
(function ({x,}) {});
|
|
||||||
class a { *method({ [thrower()]: x } = {}) {}};
|
|
||||||
(function(a, b, c, d, [{e: [...f]}]){})(1, 2, 3, 4, [{e: [1, 2, 3]}]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
destructuring_arguments_3: {
|
|
||||||
beautify = {
|
|
||||||
ecma: 6
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function fn3({x: {y: {z: {} = 42}}}) {}
|
|
||||||
const { a = (function () {}), b = (0, function() {}) } = {};
|
|
||||||
let { c = (function () {}), d = (0, function() {}) } = {};
|
|
||||||
var { e = (function () {}), f = (0, function() {}) } = {};
|
|
||||||
}
|
|
||||||
expect_exact: "function fn3({x:{y:{z:{}=42}}}){}const{a=function(){},b=(0,function(){})}={};let{c=function(){},d=(0,function(){})}={};var{e=function(){},f=(0,function(){})}={};"
|
|
||||||
}
|
|
||||||
|
|
||||||
default_arguments: {
|
|
||||||
beautify = {
|
|
||||||
ecma: 6
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function x(a = 6) { }
|
|
||||||
function x(a = (6 + 5)) { }
|
|
||||||
function x({ foo } = {}, [ bar ] = [ 1 ]) { }
|
|
||||||
}
|
|
||||||
expect_exact: "function x(a=6){}function x(a=6+5){}function x({foo}={},[bar]=[1]){}"
|
|
||||||
}
|
|
||||||
|
|
||||||
default_values_in_destructurings: {
|
|
||||||
beautify = {
|
|
||||||
ecma: 6
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function x({a=(4), b}) {}
|
|
||||||
function x([b, c=(12)]) {}
|
|
||||||
var { x = (6), y } = x;
|
|
||||||
var [ x, y = (6) ] = x;
|
|
||||||
}
|
|
||||||
expect_exact: "function x({a=4,b}){}function x([b,c=12]){}var{x=6,y}=x;var[x,y=6]=x;"
|
|
||||||
}
|
|
||||||
|
|
||||||
accept_duplicated_parameters_in_non_strict_without_spread_or_default_assignment: {
|
|
||||||
input: {
|
|
||||||
function a(b, b){}
|
|
||||||
function b({c: test, c: test}){}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function a(b, b){}
|
|
||||||
function b({c: test, c: test}){}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -293,124 +293,3 @@ unary: {
|
|||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_2629_1: {
|
|
||||||
options = {
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
comments: "all",
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
/*@__PURE__*/ a();
|
|
||||||
/*@__PURE__*/ (b());
|
|
||||||
(/*@__PURE__*/ c)();
|
|
||||||
(/*@__PURE__*/ d());
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"/* */c();",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2629_2: {
|
|
||||||
options = {
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
comments: "all",
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
/*@__PURE__*/ a(1)(2)(3);
|
|
||||||
/*@__PURE__*/ (b(1))(2)(3);
|
|
||||||
/*@__PURE__*/ (c(1)(2))(3);
|
|
||||||
/*@__PURE__*/ (d(1)(2)(3));
|
|
||||||
(/*@__PURE__*/ e)(1)(2)(3);
|
|
||||||
(/*@__PURE__*/ f(1))(2)(3);
|
|
||||||
(/*@__PURE__*/ g(1)(2))(3);
|
|
||||||
(/*@__PURE__*/ h(1)(2)(3));
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"/* */e(1)(2)(3);",
|
|
||||||
"/* */f(1)(2)(3);",
|
|
||||||
"/* */g(1)(2)(3);",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2629_3: {
|
|
||||||
options = {
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
comments: "all",
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
/*@__PURE__*/ a.x(1).y(2).z(3);
|
|
||||||
/*@__PURE__*/ (b.x)(1).y(2).z(3);
|
|
||||||
/*@__PURE__*/ (c.x(1)).y(2).z(3);
|
|
||||||
/*@__PURE__*/ (d.x(1).y)(2).z(3);
|
|
||||||
/*@__PURE__*/ (e.x(1).y(2)).z(3);
|
|
||||||
/*@__PURE__*/ (f.x(1).y(2).z)(3);
|
|
||||||
/*@__PURE__*/ (g.x(1).y(2).z(3));
|
|
||||||
(/*@__PURE__*/ h).x(1).y(2).z(3);
|
|
||||||
(/*@__PURE__*/ i.x)(1).y(2).z(3);
|
|
||||||
(/*@__PURE__*/ j.x(1)).y(2).z(3);
|
|
||||||
(/*@__PURE__*/ k.x(1).y)(2).z(3);
|
|
||||||
(/*@__PURE__*/ l.x(1).y(2)).z(3);
|
|
||||||
(/*@__PURE__*/ m.x(1).y(2).z)(3);
|
|
||||||
(/*@__PURE__*/ n.x(1).y(2).z(3));
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"/* */h.x(1).y(2).z(3);",
|
|
||||||
"/* */i.x(1).y(2).z(3);",
|
|
||||||
"/* */j.x(1).y(2).z(3);",
|
|
||||||
"/* */k.x(1).y(2).z(3);",
|
|
||||||
"/* */l.x(1).y(2).z(3);",
|
|
||||||
"/* */m.x(1).y(2).z(3);",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2629_4: {
|
|
||||||
options = {
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(/*@__PURE__*/ x(), y());
|
|
||||||
(w(), /*@__PURE__*/ x(), y());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
y();
|
|
||||||
w(), y();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2629_5: {
|
|
||||||
options = {
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
[ /*@__PURE__*/ x() ];
|
|
||||||
[ /*@__PURE__*/ x(), y() ];
|
|
||||||
[ w(), /*@__PURE__*/ x(), y() ];
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
y();
|
|
||||||
w(), y();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2638: {
|
|
||||||
options = {
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
comments: "all",
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
/*@__PURE__*/(g() || h())(x(), y());
|
|
||||||
(/*@__PURE__*/ (a() || b()))(c(), d());
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"/* */x(),y();",
|
|
||||||
"/* */(a()||b())(c(),d());",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
strict: {
|
strict: {
|
||||||
options = {
|
options = {
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
reduce_funcs: false,
|
|
||||||
reduce_vars: false,
|
reduce_vars: false,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
@@ -31,7 +30,6 @@ strict: {
|
|||||||
strict_reduce_vars: {
|
strict_reduce_vars: {
|
||||||
options = {
|
options = {
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
@@ -60,7 +58,6 @@ strict_reduce_vars: {
|
|||||||
unsafe: {
|
unsafe: {
|
||||||
options = {
|
options = {
|
||||||
pure_getters: true,
|
pure_getters: true,
|
||||||
reduce_funcs: false,
|
|
||||||
reduce_vars: false,
|
reduce_vars: false,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
@@ -87,7 +84,6 @@ unsafe: {
|
|||||||
unsafe_reduce_vars: {
|
unsafe_reduce_vars: {
|
||||||
options = {
|
options = {
|
||||||
pure_getters: true,
|
pure_getters: true,
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
@@ -182,556 +178,3 @@ impure_getter_2: {
|
|||||||
}
|
}
|
||||||
expect: {}
|
expect: {}
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_2110_1: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
pure_getters: "strict",
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
function f() {}
|
|
||||||
function g() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
f.g = g;
|
|
||||||
return f.g();
|
|
||||||
}
|
|
||||||
console.log(typeof f());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {
|
|
||||||
function f() {}
|
|
||||||
return f.g = function() {
|
|
||||||
return this;
|
|
||||||
}, f.g();
|
|
||||||
}
|
|
||||||
console.log(typeof f());
|
|
||||||
}
|
|
||||||
expect_stdout: "function"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2110_2: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
pure_getters: "strict",
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
function f() {}
|
|
||||||
function g() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
f.g = g;
|
|
||||||
return f.g();
|
|
||||||
}
|
|
||||||
console.log(typeof f());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {
|
|
||||||
function f() {}
|
|
||||||
f.g = function() {
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
return f.g();
|
|
||||||
}
|
|
||||||
console.log(typeof f());
|
|
||||||
}
|
|
||||||
expect_stdout: "function"
|
|
||||||
}
|
|
||||||
|
|
||||||
set_immutable_1: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
evaluate: true,
|
|
||||||
pure_getters: "strict",
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 1;
|
|
||||||
a.foo += "";
|
|
||||||
if (a.foo) console.log("FAIL");
|
|
||||||
else console.log("PASS");
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
1..foo += "";
|
|
||||||
if (1..foo) console.log("FAIL");
|
|
||||||
else console.log("PASS");
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
set_immutable_2: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
conditionals: true,
|
|
||||||
pure_getters: "strict",
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 1;
|
|
||||||
a.foo += "";
|
|
||||||
if (a.foo) console.log("FAIL");
|
|
||||||
else console.log("PASS");
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 1;
|
|
||||||
a.foo += "", a.foo ? console.log("FAIL") : console.log("PASS");
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
set_immutable_3: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
evaluate: true,
|
|
||||||
pure_getters: "strict",
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
"use strict";
|
|
||||||
var a = 1;
|
|
||||||
a.foo += "";
|
|
||||||
if (a.foo) console.log("FAIL");
|
|
||||||
else console.log("PASS");
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
"use strict";
|
|
||||||
1..foo += "";
|
|
||||||
if (1..foo) console.log("FAIL");
|
|
||||||
else console.log("PASS");
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
set_immutable_4: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
conditionals: true,
|
|
||||||
pure_getters: "strict",
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
"use strict";
|
|
||||||
var a = 1;
|
|
||||||
a.foo += "";
|
|
||||||
if (a.foo) console.log("FAIL");
|
|
||||||
else console.log("PASS");
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
"use strict";
|
|
||||||
var a = 1;
|
|
||||||
a.foo += "", a.foo ? console.log("FAIL") : console.log("PASS");
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
set_mutable_1: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
evaluate: true,
|
|
||||||
pure_getters: "strict",
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
!function a() {
|
|
||||||
a.foo += "";
|
|
||||||
if (a.foo) console.log("PASS");
|
|
||||||
else console.log("FAIL");
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
!function a() {
|
|
||||||
if (a.foo += "") console.log("PASS");
|
|
||||||
else console.log("FAIL");
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
set_mutable_2: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
conditionals: true,
|
|
||||||
pure_getters: "strict",
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
!function a() {
|
|
||||||
a.foo += "";
|
|
||||||
if (a.foo) console.log("PASS");
|
|
||||||
else console.log("FAIL");
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
!function a() {
|
|
||||||
(a.foo += "") ? console.log("PASS") : console.log("FAIL");
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2265_1: {
|
|
||||||
options = {
|
|
||||||
pure_getters: "strict",
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
({ ...{} }).p;
|
|
||||||
({ ...g }).p;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
({ ...g }).p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2265_2: {
|
|
||||||
options = {
|
|
||||||
pure_getters: "strict",
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = {
|
|
||||||
get b() {
|
|
||||||
throw 0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
({...a}).b;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = {
|
|
||||||
get b() {
|
|
||||||
throw 0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
({...a}).b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2265_3: {
|
|
||||||
options = {
|
|
||||||
pure_getters: "strict",
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = {
|
|
||||||
set b() {
|
|
||||||
throw 0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
({...a}).b;
|
|
||||||
}
|
|
||||||
expect: {}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2265_4: {
|
|
||||||
options = {
|
|
||||||
pure_getters: "strict",
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = { b: 1 };
|
|
||||||
({...a}).b;
|
|
||||||
}
|
|
||||||
expect: {}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2313_1: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
conditionals: true,
|
|
||||||
pure_getters: "strict",
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function x() {
|
|
||||||
console.log(1);
|
|
||||||
return {
|
|
||||||
y: function() {
|
|
||||||
console.log(2);
|
|
||||||
return {
|
|
||||||
z: 0
|
|
||||||
};
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
x().y().z++;
|
|
||||||
if (x().y().z) {
|
|
||||||
console.log(3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function x() {
|
|
||||||
return console.log(1), {
|
|
||||||
y: function() {
|
|
||||||
return console.log(2), {
|
|
||||||
z: 0
|
|
||||||
};
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
x().y().z++,
|
|
||||||
x().y().z && console.log(3);
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"1",
|
|
||||||
"2",
|
|
||||||
"1",
|
|
||||||
"2",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2313_2: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
conditionals: true,
|
|
||||||
pure_getters: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function x() {
|
|
||||||
console.log(1);
|
|
||||||
return {
|
|
||||||
y: function() {
|
|
||||||
console.log(2);
|
|
||||||
return {
|
|
||||||
z: 0
|
|
||||||
};
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
x().y().z++;
|
|
||||||
if (x().y().z) {
|
|
||||||
console.log(3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function x() {
|
|
||||||
return console.log(1), {
|
|
||||||
y: function() {
|
|
||||||
return console.log(2), {
|
|
||||||
z: 0
|
|
||||||
};
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
x().y().z++,
|
|
||||||
x().y().z && console.log(3);
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"1",
|
|
||||||
"2",
|
|
||||||
"1",
|
|
||||||
"2",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2313_3: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
conditionals: true,
|
|
||||||
pure_getters: "strict",
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function x() {
|
|
||||||
console.log(1);
|
|
||||||
return {
|
|
||||||
y: function() {
|
|
||||||
console.log(2);
|
|
||||||
return {
|
|
||||||
z: 0
|
|
||||||
};
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
x().y().z++;
|
|
||||||
if (x().y().z) {
|
|
||||||
console.log(3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function x() {
|
|
||||||
console.log(1);
|
|
||||||
return {
|
|
||||||
y: function() {
|
|
||||||
console.log(2);
|
|
||||||
return {
|
|
||||||
z: 0
|
|
||||||
};
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
x().y().z++;
|
|
||||||
x().y().z && console.log(3);
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"1",
|
|
||||||
"2",
|
|
||||||
"1",
|
|
||||||
"2",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2313_4: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
conditionals: true,
|
|
||||||
pure_getters: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function x() {
|
|
||||||
console.log(1);
|
|
||||||
return {
|
|
||||||
y: function() {
|
|
||||||
console.log(2);
|
|
||||||
return {
|
|
||||||
z: 0
|
|
||||||
};
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
x().y().z++;
|
|
||||||
if (x().y().z) {
|
|
||||||
console.log(3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function x() {
|
|
||||||
console.log(1);
|
|
||||||
return {
|
|
||||||
y: function() {
|
|
||||||
console.log(2);
|
|
||||||
return {
|
|
||||||
z: 0
|
|
||||||
};
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
x().y().z++;
|
|
||||||
x().y().z && console.log(3);
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"1",
|
|
||||||
"2",
|
|
||||||
"1",
|
|
||||||
"2",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2313_5: {
|
|
||||||
options = {
|
|
||||||
pure_getters: "strict",
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
x().y++;
|
|
||||||
x().y;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
x().y++;
|
|
||||||
x().y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2313_6: {
|
|
||||||
options = {
|
|
||||||
pure_getters: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
x().y++;
|
|
||||||
x().y;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
x().y++;
|
|
||||||
x();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2313_7: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
conditionals: true,
|
|
||||||
pure_getters: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 0, b = 0;
|
|
||||||
class foo {
|
|
||||||
get c() {
|
|
||||||
a++;
|
|
||||||
return 42;
|
|
||||||
}
|
|
||||||
set c(c) {
|
|
||||||
b++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
class bar extends foo {
|
|
||||||
d() {
|
|
||||||
super.c++;
|
|
||||||
if (super.c) console.log(a, b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
new bar().d();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 0, b = 0;
|
|
||||||
class foo {
|
|
||||||
get c() {
|
|
||||||
a++;
|
|
||||||
return 42;
|
|
||||||
}
|
|
||||||
set c(c) {
|
|
||||||
b++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
class bar extends foo {
|
|
||||||
d() {
|
|
||||||
super.c++;
|
|
||||||
super.c && console.log(a, b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
new bar().d();
|
|
||||||
}
|
|
||||||
expect_stdout: "2 1"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,536 +0,0 @@
|
|||||||
mangle_catch: {
|
|
||||||
rename = true
|
|
||||||
options = {
|
|
||||||
ie8: false,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
ie8: false,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "FAIL";
|
|
||||||
try {
|
|
||||||
throw 1;
|
|
||||||
} catch (args) {
|
|
||||||
a = "PASS";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'var a="FAIL";try{throw 1}catch(o){a="PASS"}console.log(a);'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_ie8: {
|
|
||||||
rename = true
|
|
||||||
options = {
|
|
||||||
ie8: true,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
ie8: true,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "FAIL";
|
|
||||||
try {
|
|
||||||
throw 1;
|
|
||||||
} catch (args) {
|
|
||||||
a = "PASS";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'var a="FAIL";try{throw 1}catch(args){a="PASS"}console.log(a);'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_var: {
|
|
||||||
rename = true
|
|
||||||
options = {
|
|
||||||
ie8: false,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
ie8: false,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "FAIL";
|
|
||||||
try {
|
|
||||||
throw 1;
|
|
||||||
} catch (args) {
|
|
||||||
var a = "PASS";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'var a="FAIL";try{throw 1}catch(o){var a="PASS"}console.log(a);'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_var_ie8: {
|
|
||||||
rename = true
|
|
||||||
options = {
|
|
||||||
ie8: true,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
ie8: true,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "FAIL";
|
|
||||||
try {
|
|
||||||
throw 1;
|
|
||||||
} catch (args) {
|
|
||||||
var a = "PASS";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'var a="FAIL";try{throw 1}catch(args){var a="PASS"}console.log(a);'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_toplevel: {
|
|
||||||
rename = true
|
|
||||||
options = {
|
|
||||||
ie8: false,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
ie8: false,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "FAIL";
|
|
||||||
try {
|
|
||||||
throw 1;
|
|
||||||
} catch (args) {
|
|
||||||
a = "PASS";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'var o="FAIL";try{throw 1}catch(c){o="PASS"}console.log(o);'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_ie8_toplevel: {
|
|
||||||
rename = true
|
|
||||||
options = {
|
|
||||||
ie8: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
ie8: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "FAIL";
|
|
||||||
try {
|
|
||||||
throw 1;
|
|
||||||
} catch (args) {
|
|
||||||
a = "PASS";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'var o="FAIL";try{throw 1}catch(c){o="PASS"}console.log(o);'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_var_toplevel: {
|
|
||||||
rename = true
|
|
||||||
options = {
|
|
||||||
ie8: false,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
ie8: false,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "FAIL";
|
|
||||||
try {
|
|
||||||
throw 1;
|
|
||||||
} catch (args) {
|
|
||||||
var a = "PASS";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'var o="FAIL";try{throw 1}catch(r){var o="PASS"}console.log(o);'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_var_ie8_toplevel: {
|
|
||||||
rename = true
|
|
||||||
options = {
|
|
||||||
ie8: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
ie8: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "FAIL";
|
|
||||||
try {
|
|
||||||
throw 1;
|
|
||||||
} catch (args) {
|
|
||||||
var a = "PASS";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'var o="FAIL";try{throw 1}catch(r){var o="PASS"}console.log(o);'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_redef_1: {
|
|
||||||
rename = true
|
|
||||||
options = {
|
|
||||||
ie8: false,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
ie8: false,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "PASS";
|
|
||||||
try {
|
|
||||||
throw "FAIL1";
|
|
||||||
} catch (a) {
|
|
||||||
var a = "FAIL2";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'var a="PASS";try{throw"FAIL1"}catch(a){var a="FAIL2"}console.log(a);'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_redef_1_ie8: {
|
|
||||||
rename = true
|
|
||||||
options = {
|
|
||||||
ie8: true,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
ie8: true,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "PASS";
|
|
||||||
try {
|
|
||||||
throw "FAIL1";
|
|
||||||
} catch (a) {
|
|
||||||
var a = "FAIL2";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'var a="PASS";try{throw"FAIL1"}catch(a){var a="FAIL2"}console.log(a);'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_redef_1_toplevel: {
|
|
||||||
rename = true
|
|
||||||
options = {
|
|
||||||
ie8: false,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
ie8: false,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "PASS";
|
|
||||||
try {
|
|
||||||
throw "FAIL1";
|
|
||||||
} catch (a) {
|
|
||||||
var a = "FAIL2";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'var o="PASS";try{throw"FAIL1"}catch(o){var o="FAIL2"}console.log(o);'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_redef_1_ie8_toplevel: {
|
|
||||||
rename = true
|
|
||||||
options = {
|
|
||||||
ie8: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
ie8: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "PASS";
|
|
||||||
try {
|
|
||||||
throw "FAIL1";
|
|
||||||
} catch (a) {
|
|
||||||
var a = "FAIL2";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'var o="PASS";try{throw"FAIL1"}catch(o){var o="FAIL2"}console.log(o);'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_redef_2: {
|
|
||||||
rename = true
|
|
||||||
options = {
|
|
||||||
ie8: false,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
ie8: false,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
try {
|
|
||||||
throw "FAIL1";
|
|
||||||
} catch (a) {
|
|
||||||
var a = "FAIL2";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'try{throw"FAIL1"}catch(a){var a="FAIL2"}console.log(a);'
|
|
||||||
expect_stdout: "undefined"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_redef_2_ie8: {
|
|
||||||
rename = true
|
|
||||||
options = {
|
|
||||||
ie8: true,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
ie8: true,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
try {
|
|
||||||
throw "FAIL1";
|
|
||||||
} catch (a) {
|
|
||||||
var a = "FAIL2";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'try{throw"FAIL1"}catch(a){var a="FAIL2"}console.log(a);'
|
|
||||||
expect_stdout: "undefined"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_redef_2_toplevel: {
|
|
||||||
rename = true
|
|
||||||
options = {
|
|
||||||
ie8: false,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
ie8: false,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
try {
|
|
||||||
throw "FAIL1";
|
|
||||||
} catch (a) {
|
|
||||||
var a = "FAIL2";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'try{throw"FAIL1"}catch(o){var o="FAIL2"}console.log(o);'
|
|
||||||
expect_stdout: "undefined"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_redef_2_ie8_toplevel: {
|
|
||||||
rename = true
|
|
||||||
options = {
|
|
||||||
ie8: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
ie8: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
try {
|
|
||||||
throw "FAIL1";
|
|
||||||
} catch (a) {
|
|
||||||
var a = "FAIL2";
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: 'try{throw"FAIL1"}catch(o){var o="FAIL2"}console.log(o);'
|
|
||||||
expect_stdout: "undefined"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2120_1: {
|
|
||||||
rename = true
|
|
||||||
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: {
|
|
||||||
rename = true
|
|
||||||
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"
|
|
||||||
}
|
|
||||||
function_iife_catch: {
|
|
||||||
rename = true
|
|
||||||
mangle = {
|
|
||||||
ie8: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(n) {
|
|
||||||
!function() {
|
|
||||||
try {
|
|
||||||
throw 0;
|
|
||||||
} catch (n) {
|
|
||||||
var a = 1;
|
|
||||||
console.log(n, a);
|
|
||||||
}
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect_exact: "function f(o){!function(){try{throw 0}catch(c){var o=1;console.log(c,o)}}()}f();"
|
|
||||||
expect_stdout: "0 1"
|
|
||||||
}
|
|
||||||
|
|
||||||
function_iife_catch_ie8: {
|
|
||||||
rename = true
|
|
||||||
mangle = {
|
|
||||||
ie8: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(n) {
|
|
||||||
!function() {
|
|
||||||
try {
|
|
||||||
throw 0;
|
|
||||||
} catch (n) {
|
|
||||||
var a = 1;
|
|
||||||
console.log(n, a);
|
|
||||||
}
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect_exact: "function f(o){!function(){try{throw 0}catch(o){var c=1;console.log(o,c)}}()}f();"
|
|
||||||
expect_stdout: "0 1"
|
|
||||||
}
|
|
||||||
|
|
||||||
function_catch_catch: {
|
|
||||||
rename = true
|
|
||||||
mangle = {
|
|
||||||
ie8: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = 0;
|
|
||||||
function f() {
|
|
||||||
try {
|
|
||||||
throw 1;
|
|
||||||
} catch (c) {
|
|
||||||
try {
|
|
||||||
throw 2;
|
|
||||||
} catch (o) {
|
|
||||||
var o = 3;
|
|
||||||
console.log(o);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
console.log(o);
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect_exact: "var o=0;function f(){try{throw 1}catch(c){try{throw 2}catch(o){var o=3;console.log(o)}}console.log(o)}f();"
|
|
||||||
expect_stdout: [
|
|
||||||
"3",
|
|
||||||
"undefined",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
function_catch_catch_ie8: {
|
|
||||||
rename = true
|
|
||||||
mangle = {
|
|
||||||
ie8: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = 0;
|
|
||||||
function f() {
|
|
||||||
try {
|
|
||||||
throw 1;
|
|
||||||
} catch (c) {
|
|
||||||
try {
|
|
||||||
throw 2;
|
|
||||||
} catch (o) {
|
|
||||||
var o = 3;
|
|
||||||
console.log(o);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
console.log(o);
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect_exact: "var o=0;function f(){try{throw 1}catch(c){try{throw 2}catch(o){var o=3;console.log(o)}}console.log(o)}f();"
|
|
||||||
expect_stdout: [
|
|
||||||
"3",
|
|
||||||
"undefined",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -17,6 +17,7 @@ return_undefined: {
|
|||||||
keep_fnames : false,
|
keep_fnames : false,
|
||||||
hoist_vars : true,
|
hoist_vars : true,
|
||||||
join_vars : true,
|
join_vars : true,
|
||||||
|
cascade : true,
|
||||||
negate_iife : true
|
negate_iife : true
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
@@ -121,25 +122,3 @@ return_undefined: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return_void: {
|
|
||||||
options = {
|
|
||||||
if_return: true,
|
|
||||||
inline: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
function g() {
|
|
||||||
h();
|
|
||||||
}
|
|
||||||
return g();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {
|
|
||||||
h();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
console_log: {
|
|
||||||
input: {
|
|
||||||
console.log("%% %s");
|
|
||||||
console.log("%% %s", "%s");
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log("%% %s");
|
|
||||||
console.log("%% %s", "%s");
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"%% %s",
|
|
||||||
"% %s",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
do_screw: {
|
do_screw: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
}
|
}
|
||||||
beautify = {
|
beautify = {
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
ascii_only: true,
|
ascii_only: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -14,10 +14,10 @@ do_screw: {
|
|||||||
|
|
||||||
dont_screw: {
|
dont_screw: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
}
|
}
|
||||||
beautify = {
|
beautify = {
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
ascii_only: true,
|
ascii_only: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -28,7 +28,7 @@ dont_screw: {
|
|||||||
|
|
||||||
do_screw_constants: {
|
do_screw_constants: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
f(undefined, Infinity);
|
f(undefined, Infinity);
|
||||||
@@ -38,7 +38,7 @@ do_screw_constants: {
|
|||||||
|
|
||||||
dont_screw_constants: {
|
dont_screw_constants: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
f(undefined, Infinity);
|
f(undefined, Infinity);
|
||||||
@@ -47,15 +47,9 @@ dont_screw_constants: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
do_screw_try_catch: {
|
do_screw_try_catch: {
|
||||||
options = {
|
options = { screw_ie8: true };
|
||||||
ie8: false,
|
mangle = { screw_ie8: true };
|
||||||
}
|
beautify = { screw_ie8: true };
|
||||||
mangle = {
|
|
||||||
ie8: false,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
ie8: false,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
good = function(e){
|
good = function(e){
|
||||||
return function(error){
|
return function(error){
|
||||||
@@ -81,15 +75,9 @@ do_screw_try_catch: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dont_screw_try_catch: {
|
dont_screw_try_catch: {
|
||||||
options = {
|
options = { screw_ie8: false };
|
||||||
ie8: true,
|
mangle = { screw_ie8: false };
|
||||||
}
|
beautify = { screw_ie8: false };
|
||||||
mangle = {
|
|
||||||
ie8: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
ie8: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
bad = function(e){
|
bad = function(e){
|
||||||
return function(error){
|
return function(error){
|
||||||
@@ -115,15 +103,9 @@ dont_screw_try_catch: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
do_screw_try_catch_undefined: {
|
do_screw_try_catch_undefined: {
|
||||||
options = {
|
options = { screw_ie8: true };
|
||||||
ie8: false,
|
mangle = { screw_ie8: true };
|
||||||
}
|
beautify = { screw_ie8: true };
|
||||||
mangle = {
|
|
||||||
ie8: false,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
ie8: false,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
function a(b){
|
function a(b){
|
||||||
try {
|
try {
|
||||||
@@ -150,15 +132,9 @@ do_screw_try_catch_undefined: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dont_screw_try_catch_undefined: {
|
dont_screw_try_catch_undefined: {
|
||||||
options = {
|
options = { screw_ie8: false };
|
||||||
ie8: true,
|
mangle = { screw_ie8: false };
|
||||||
}
|
beautify = { screw_ie8: false };
|
||||||
mangle = {
|
|
||||||
ie8: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
ie8: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
function a(b){
|
function a(b){
|
||||||
try {
|
try {
|
||||||
@@ -187,13 +163,12 @@ dont_screw_try_catch_undefined: {
|
|||||||
reduce_vars: {
|
reduce_vars: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f() {
|
function f() {
|
||||||
@@ -221,10 +196,10 @@ reduce_vars: {
|
|||||||
|
|
||||||
issue_1586_1: {
|
issue_1586_1: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
screw_ie8: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f() {
|
function f() {
|
||||||
@@ -240,10 +215,10 @@ issue_1586_1: {
|
|||||||
|
|
||||||
issue_1586_2: {
|
issue_1586_2: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
screw_ie8: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f() {
|
function f() {
|
||||||
@@ -256,139 +231,3 @@ issue_1586_2: {
|
|||||||
}
|
}
|
||||||
expect_exact: "function f(){try{x()}catch(c){console.log(c.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(e) {
|
|
||||||
try {
|
|
||||||
throw "FAIL";
|
|
||||||
} catch (t) {
|
|
||||||
return e;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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"
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -176,11 +176,6 @@ for_sequences: {
|
|||||||
// 4
|
// 4
|
||||||
x = (foo in bar);
|
x = (foo in bar);
|
||||||
for (y = 5; false;);
|
for (y = 5; false;);
|
||||||
// 5
|
|
||||||
x = function() {
|
|
||||||
foo in bar;
|
|
||||||
};
|
|
||||||
for (y = 5; false;);
|
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
// 1
|
// 1
|
||||||
@@ -193,10 +188,6 @@ for_sequences: {
|
|||||||
// 4
|
// 4
|
||||||
x = (foo in bar);
|
x = (foo in bar);
|
||||||
for (y = 5; false;);
|
for (y = 5; false;);
|
||||||
// 5
|
|
||||||
for (x = function() {
|
|
||||||
foo in bar;
|
|
||||||
}, y = 5; false;);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -252,12 +243,13 @@ negate_iife_for: {
|
|||||||
input: {
|
input: {
|
||||||
(function() {})();
|
(function() {})();
|
||||||
for (i = 0; i < 5; i++) console.log(i);
|
for (i = 0; i < 5; i++) console.log(i);
|
||||||
|
|
||||||
(function() {})();
|
(function() {})();
|
||||||
for (; i < 10; i++) console.log(i);
|
for (; i < 5; i++) console.log(i);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
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 < 5; i++) console.log(i);
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
@@ -317,7 +309,7 @@ unsafe_undefined: {
|
|||||||
|
|
||||||
issue_1685: {
|
issue_1685: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
cascade: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -341,7 +333,7 @@ issue_1685: {
|
|||||||
|
|
||||||
func_def_1: {
|
func_def_1: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
cascade: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -361,7 +353,7 @@ func_def_1: {
|
|||||||
|
|
||||||
func_def_2: {
|
func_def_2: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
cascade: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -379,7 +371,7 @@ func_def_2: {
|
|||||||
|
|
||||||
func_def_3: {
|
func_def_3: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
cascade: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -401,7 +393,7 @@ func_def_3: {
|
|||||||
|
|
||||||
func_def_4: {
|
func_def_4: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
cascade: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -427,7 +419,7 @@ func_def_4: {
|
|||||||
|
|
||||||
func_def_5: {
|
func_def_5: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
cascade: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -468,7 +460,7 @@ issue_1758: {
|
|||||||
console.log(function(c) {
|
console.log(function(c) {
|
||||||
var undefined = 42;
|
var undefined = 42;
|
||||||
return function() {
|
return function() {
|
||||||
return c--, c--, void c.toString();
|
return c--, c--, c.toString(), void 0;
|
||||||
}();
|
}();
|
||||||
}());
|
}());
|
||||||
}
|
}
|
||||||
@@ -489,12 +481,12 @@ delete_seq_1: {
|
|||||||
console.log(delete (1, 0 / 0));
|
console.log(delete (1, 0 / 0));
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(!0);
|
console.log((void 0, !0));
|
||||||
console.log(!0);
|
console.log((void 0, !0));
|
||||||
console.log(!0);
|
console.log((1 / 0, !0));
|
||||||
console.log(!0);
|
console.log((1 / 0, !0));
|
||||||
console.log(!0);
|
console.log((NaN, !0));
|
||||||
console.log(!0);
|
console.log((0 / 0, !0));
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
@@ -513,12 +505,12 @@ delete_seq_2: {
|
|||||||
console.log(delete (1, 2, 0 / 0));
|
console.log(delete (1, 2, 0 / 0));
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(!0);
|
console.log((void 0, !0));
|
||||||
console.log(!0);
|
console.log((void 0, !0));
|
||||||
console.log(!0);
|
console.log((1 / 0, !0));
|
||||||
console.log(!0);
|
console.log((1 / 0, !0));
|
||||||
console.log(!0);
|
console.log((NaN, !0));
|
||||||
console.log(!0);
|
console.log((0 / 0, !0));
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
@@ -538,12 +530,12 @@ delete_seq_3: {
|
|||||||
console.log(delete (1, 2, 0 / 0));
|
console.log(delete (1, 2, 0 / 0));
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(!0);
|
console.log((void 0, !0));
|
||||||
console.log(!0);
|
console.log((void 0, !0));
|
||||||
console.log(!0);
|
console.log((Infinity, !0));
|
||||||
console.log(!0);
|
console.log((1 / 0, !0));
|
||||||
console.log(!0);
|
console.log((NaN, !0));
|
||||||
console.log(!0);
|
console.log((0 / 0, !0));
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
@@ -614,114 +606,14 @@ delete_seq_6: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a;
|
var a;
|
||||||
console.log(!0);
|
console.log((a, !0));
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
side_effects: {
|
|
||||||
options = {
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
0, a(), 1, b(), 2, c(), 3;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
a(), b(), c();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
side_effects_cascade_1: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
conditionals: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a, b) {
|
|
||||||
a -= 42;
|
|
||||||
if (a < 0) a = 0;
|
|
||||||
b.a = a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a, b) {
|
|
||||||
(a -= 42) < 0 && (a = 0), b.a = a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
side_effects_cascade_2: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a, b) {
|
|
||||||
b = a,
|
|
||||||
!a + (b += a) || (b += a),
|
|
||||||
b = a,
|
|
||||||
b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a, b) {
|
|
||||||
b = a,
|
|
||||||
!a + (b += a) || (b += a),
|
|
||||||
b = a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
side_effects_cascade_3: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
conditionals: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a, b) {
|
|
||||||
"foo" ^ (b += a),
|
|
||||||
b ? false : (b = a) ? -1 : (b -= a) - (b ^= a),
|
|
||||||
a-- || !a,
|
|
||||||
a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a, b) {
|
|
||||||
!(b += a) && ((b = a) || (b -= a, b ^= a)),
|
|
||||||
a--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_27: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
passes: 2,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function(jQuery) {
|
|
||||||
var $;
|
|
||||||
$ = jQuery;
|
|
||||||
$("body").addClass("foo");
|
|
||||||
})(jQuery);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function(jQuery) {
|
|
||||||
jQuery("body").addClass("foo");
|
|
||||||
})(jQuery);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
reassign_const: {
|
reassign_const: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
cascade: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
@@ -742,81 +634,3 @@ reassign_const: {
|
|||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_2062: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
collapse_vars: true,
|
|
||||||
conditionals: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 1;
|
|
||||||
if ([ a || a++ + a--, a++ + a--, a && a.var ]);
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 1;
|
|
||||||
a || (a++, a--), a++, --a && a.var;
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: "1"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2313: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 0, b = 0;
|
|
||||||
var foo = {
|
|
||||||
get c() {
|
|
||||||
a++;
|
|
||||||
return 42;
|
|
||||||
},
|
|
||||||
set c(c) {
|
|
||||||
b++;
|
|
||||||
},
|
|
||||||
d: function() {
|
|
||||||
this.c++;
|
|
||||||
if (this.c) console.log(a, b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
foo.d();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 0, b = 0;
|
|
||||||
var foo = {
|
|
||||||
get c() {
|
|
||||||
return a++, 42;
|
|
||||||
},
|
|
||||||
set c(c) {
|
|
||||||
b++;
|
|
||||||
},
|
|
||||||
d: function() {
|
|
||||||
if (this.c++, this.c) console.log(a, b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
foo.d();
|
|
||||||
}
|
|
||||||
expect_stdout: "2 1"
|
|
||||||
}
|
|
||||||
|
|
||||||
cascade_assignment_in_return: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a, b) {
|
|
||||||
return a = x(), b(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a, b) {
|
|
||||||
return b(x());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -8,12 +8,3 @@ octal_escape_sequence: {
|
|||||||
var border_check = "\x20\x30\x38\x30\x00\x30\xc0\x30";
|
var border_check = "\x20\x30\x38\x30\x00\x30\xc0\x30";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1929: {
|
|
||||||
input: {
|
|
||||||
function f(s) {
|
|
||||||
return s.split(/[\\/]/);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_exact: "function f(s){return s.split(/[\\\\/]/)}"
|
|
||||||
}
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user