tor-browser

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

object-rest.js (1941B)


      1 // |reftest| skip-if(!xulRuntime.shell)
      2 
      3 function property(key, value = key, shorthand = key === value) {
      4    return { key, value, shorthand };
      5 }
      6 
      7 function assertDestrAssign(src, pattern) {
      8    assertExpr(`(${src} = 0)`, aExpr("=", pattern, lit(0)));
      9 }
     10 
     11 function assertDestrBinding(src, pattern) {
     12    assertDecl(`var ${src} = 0`, varDecl([{id: pattern, init: lit(0)}]));
     13 }
     14 
     15 function test() {
     16    // Target expression must be a simple assignment target in object assignment patterns.
     17    assertDestrAssign("{...x}", objPatt([spread(ident("x"))]));
     18    assertDestrAssign("{...(x)}", objPatt([spread(ident("x"))]));
     19    assertDestrAssign("{...obj.p}", objPatt([spread(dotExpr(ident("obj"), ident("p")))]));
     20    assertDestrAssign("{...(obj.p)}", objPatt([spread(dotExpr(ident("obj"), ident("p")))]));
     21 
     22    // Object binding patterns only allow binding identifiers.
     23    assertDestrBinding("{...x}", objPatt([spread(ident("x"))]));
     24 
     25    // The rest-property can be preceded by other properties.
     26    for (var assertDestr of [assertDestrAssign, assertDestrBinding]) {
     27        assertDestr("{a, ...x}", objPatt([property(ident("a")), spread(ident("x"))]));
     28        assertDestr("{a: b, ...x}", objPatt([property(ident("a"), ident("b")), spread(ident("x"))]));
     29        assertDestr("{[a]: b, ...x}", objPatt([property(comp(ident("a")), ident("b")), spread(ident("x"))]));
     30    }
     31 
     32    // Tests when __proto__ is used in the object pattern.
     33    for (var assertDestr of [assertDestrAssign, assertDestrBinding]) {
     34        assertDestr("{...__proto__}", objPatt([spread(ident("__proto__"))]));
     35        assertDestr("{__proto__, ...x}", objPatt([property(ident("__proto__")), spread(ident("x"))]));
     36    }
     37    assertDestrAssign("{__proto__: a, ...x}", objPatt([property(lit("__proto__"), ident("a")), spread(ident("x"))]));
     38    assertDestrBinding("{__proto__: a, ...x}", objPatt([property(ident("__proto__"), ident("a")), spread(ident("x"))]));
     39 }
     40 
     41 runtest(test);