tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

rest-parameter-syntax.js (2828B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 
      6 const bindingPatterns = [
      7    "[]",
      8    "[a]",
      9    "[a, b]",
     10    "[a, ...b]",
     11    "[...a]",
     12    "[...[]]",
     13 
     14    "{}",
     15    "{p: a}",
     16    "{p: a = 0}",
     17    "{p: {}}",
     18    "{p: a, q: b}",
     19    "{a}",
     20    "{a, b}",
     21    "{a = 0}",
     22 ];
     23 
     24 const functions = [
     25    p => `function f(${p}) {}`,
     26    p => `function* g(${p}) {}`,
     27    p => `({m(${p}) {}});`,
     28    p => `(class {m(${p}) {}});`,
     29    p => `(${p}) => {};`,
     30 ];
     31 
     32 for (let pattern of bindingPatterns) {
     33    for (let fn of functions) {
     34        // No leading parameters.
     35        eval(fn(`...${pattern}`));
     36 
     37        // Leading normal parameters.
     38        eval(fn(`x, ...${pattern}`));
     39        eval(fn(`x, y, ...${pattern}`));
     40 
     41        // Leading parameters with defaults.
     42        eval(fn(`x = 0, ...${pattern}`));
     43        eval(fn(`x = 0, y = 0, ...${pattern}`));
     44 
     45        // Leading array destructuring parameters.
     46        eval(fn(`[], ...${pattern}`));
     47        eval(fn(`[x], ...${pattern}`));
     48        eval(fn(`[x = 0], ...${pattern}`));
     49        eval(fn(`[...x], ...${pattern}`));
     50 
     51        // Leading object destructuring parameters.
     52        eval(fn(`{}, ...${pattern}`));
     53        eval(fn(`{p: x}, ...${pattern}`));
     54        eval(fn(`{x}, ...${pattern}`));
     55        eval(fn(`{x = 0}, ...${pattern}`));
     56 
     57        // Trailing parameters after rest parameter.
     58        assertThrowsInstanceOf(() => eval(fn(`...${pattern},`)), SyntaxError);
     59        assertThrowsInstanceOf(() => eval(fn(`...${pattern}, x`)), SyntaxError);
     60        assertThrowsInstanceOf(() => eval(fn(`...${pattern}, x = 0`)), SyntaxError);
     61        assertThrowsInstanceOf(() => eval(fn(`...${pattern}, ...x`)), SyntaxError);
     62        assertThrowsInstanceOf(() => eval(fn(`...${pattern}, []`)), SyntaxError);
     63        assertThrowsInstanceOf(() => eval(fn(`...${pattern}, {}`)), SyntaxError);
     64 
     65        // Rest parameter with defaults.
     66        assertThrowsInstanceOf(() => eval(fn(`...${pattern} = 0`)), SyntaxError);
     67    }
     68 }
     69 
     70 for (let fn of functions) {
     71    // Missing name, incomplete patterns.
     72    assertThrowsInstanceOf(() => eval(fn(`...`)), SyntaxError);
     73    assertThrowsInstanceOf(() => eval(fn(`...[`)), SyntaxError);
     74    assertThrowsInstanceOf(() => eval(fn(`...{`)), SyntaxError);
     75 
     76    // Invalid binding name.
     77    assertThrowsInstanceOf(() => eval(fn(`...[0]`)), SyntaxError);
     78    assertThrowsInstanceOf(() => eval(fn(`...[p.q]`)), SyntaxError);
     79 }
     80 
     81 // Rest parameters aren't valid in getter/setter methods.
     82 assertThrowsInstanceOf(() => eval(`({get p(...[]) {}})`), SyntaxError);
     83 assertThrowsInstanceOf(() => eval(`({set p(...[]) {}})`), SyntaxError);
     84 
     85 
     86 if (typeof reportCompare === "function")
     87    reportCompare(0, 0);