544 lines
12 KiB
JavaScript
544 lines
12 KiB
JavaScript
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 = {
|
|
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 = {
|
|
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 = {
|
|
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 = {
|
|
arrows: true,
|
|
collapse_vars: true,
|
|
ecma: 6,
|
|
inline: true,
|
|
passes: 3,
|
|
reduce_vars: true,
|
|
side_effects: 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: {
|
|
// TODO: outer function should be an arrow function
|
|
(function() {
|
|
var quux = () => {
|
|
console.log("PASS");
|
|
};
|
|
return {
|
|
prop() {
|
|
console.log;
|
|
quux();
|
|
}
|
|
};
|
|
})().prop();
|
|
}
|
|
expect_stdout: "PASS"
|
|
node_version: ">=4"
|
|
}
|
|
|
|
issue_2105_2: {
|
|
options = {
|
|
collapse_vars: true,
|
|
inline: true,
|
|
passes: 2,
|
|
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: {
|
|
(() => {
|
|
var quux = () => {
|
|
console.log("PASS");
|
|
};
|
|
return {
|
|
prop: () => {
|
|
console.log;
|
|
quux();
|
|
}
|
|
};
|
|
})().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_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_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_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,
|
|
}
|
|
input: {
|
|
(function(a) {
|
|
if (true) return;
|
|
var b = 42;
|
|
})(this);
|
|
}
|
|
expect: {
|
|
this, void 0;
|
|
}
|
|
}
|
|
|
|
issue_2084: {
|
|
options = {
|
|
arrows: true,
|
|
collapse_vars: true,
|
|
conditionals: true,
|
|
ecma: 6,
|
|
evaluate: true,
|
|
inline: true,
|
|
passes: 2,
|
|
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"
|
|
}
|