@@ -705,6 +705,56 @@ const CORRECTED_CASES = [
705705 "var x = 1; function f(a = x, b = a) { var x = 2, a; return x + a + b; } console.log(f());" ,
706706 { compress : false , mangle : true }
707707 ] ,
708+ [
709+ "a parameter pattern's computed key reading a name its body declares" ,
710+ "var k = 'a'; function f({ [k]: y } = { a: 'out', b: 'in' }) { var k = 'b'; return y; } console.log(f());" ,
711+ { compress : false , mangle : true }
712+ ] ,
713+ [
714+ "a parameter default assigning a name its body declares" ,
715+ "var x = 'out'; function f(_ = (x = 'set')) { var x = 'in'; return x; } console.log(f(), x);" ,
716+ { compress : false , mangle : true }
717+ ] ,
718+ [
719+ "a parameter default updating a name its body declares" ,
720+ "var n = 1; function f(_ = n++) { var n = 10; return n; } console.log(f(), n);" ,
721+ { compress : false , mangle : true }
722+ ] ,
723+ [
724+ "a parameter default testing the type of a function its body declares" ,
725+ "function f(_ = typeof h) { function h() {} return _; } console.log(f());" ,
726+ { compress : { } , mangle : false }
727+ ] ,
728+ [
729+ "a rest parameter's default reading a name its body declares" ,
730+ "var x = 'out'; var a; function f(...[_ = a = () => x]) { var x = 'in'; } f(); console.log(a());" ,
731+ { compress : false , mangle : true }
732+ ] ,
733+ [
734+ "a constructor's parameter default reading a name its body declares" ,
735+ "var x = 'out'; var a; class C { constructor(_ = a = () => x) { var x = 'in'; } } new C(); console.log(a());" ,
736+ { compress : false , mangle : true }
737+ ] ,
738+ [
739+ "a setter's parameter default reading a name its body declares" ,
740+ "var x = 'out'; var a; var o = { set p(_ = a = () => x) { var x = 'in'; } }; o.p = undefined; console.log(a());" ,
741+ { compress : false , mangle : true }
742+ ] ,
743+ [
744+ "a generator's parameter default reading a name its body declares" ,
745+ "var x = 'out'; var a; function* f(_ = a = () => x) { var x = 'in'; yield x; } console.log(f().next().value, a());" ,
746+ { compress : false , mangle : true }
747+ ] ,
748+ [
749+ "a parameter default reading a name its body declares with `const`" ,
750+ "var x = 'out'; var a; function f(_ = a = () => x) { const x = 'in'; } f(); console.log(a());" ,
751+ { compress : false , mangle : true }
752+ ] ,
753+ [
754+ "a parameter default reading a class its body declares" ,
755+ "var C = 'out'; var a; function f(_ = a = () => C) { class C {} } f(); console.log(a());" ,
756+ { compress : false , mangle : true }
757+ ] ,
708758 [
709759 "a parameter default's closure reading a name its body declares, compressed" ,
710760 "function g() { var x = 'out'; var a, b; function f(_ = a = () => x) { var x = 'in'; b = () => x; } f(); console.log(a(), b()); } g();" ,
@@ -4083,14 +4133,26 @@ describe("syntax-printer", () => {
40834133 } ) ;
40844134
40854135 describe ( "a parameter list's scope" , ( ) => {
4136+ it ( "should resolve a copied function's reads by no range an earlier analysis counted" , async ( ) => {
4137+ const { minify } = await load ( ) ;
4138+ // The copy of `h` is analysed again, its reads counted from zero.
4139+ const input =
4140+ "function P(a = q + q + q + q + q) { var y = arguments.length > 1 ? 'x' : 'in'; function h() { return y; } return [1].map(function () { return h(); })[0]; } var q = 1, y = 'out'; console.log(P());" ;
4141+ const { code } = await minify ( input , { compress : { } , mangle : false } ) ;
4142+
4143+ expect ( runProgram ( /** @type {string } */ ( code ) ) ) . toBe ( runProgram ( input ) ) ;
4144+ } ) ;
4145+
40864146 it ( "should still read in a parameter list what the list and its function name declare" , async ( ) => {
40874147 const { minify } = await load ( ) ;
40884148 for ( const input of [
40894149 "var a; function f(p = 'p', q = a = () => p) { var r = 1; } f(); console.log(a());" ,
40904150 "var a; var f = function self(_ = a = () => typeof self) { var z; }; f(); console.log(a());" ,
40914151 "var a; function f(_ = a = () => arguments.length) { var y; } f(1, 2); console.log(a());" ,
40924152 "var a; try { throw ['e']; } catch ([e, _ = a = () => e]) { let z; } console.log(a());" ,
4093- "var x = 'out'; function f(y = x) { var x = 'in'; return y; } console.log(f());"
4153+ "var x = 'out'; function f(y = x) { var x = 'in'; return y; } console.log(f());" ,
4154+ "function f() { var x = 'body'; function g(_ = () => x) { return _(); } return g(); } var x = 'global'; console.log(f());" ,
4155+ "var a; function h() { try { throw []; } catch ([_ = a = () => x]) { var x = 'fn'; } return a(); } console.log(h());"
40944156 ] ) {
40954157 for ( const options of [
40964158 { compress : false , mangle : true } ,
0 commit comments