[Pkg-javascript-commits] [node-acorn-jsx] 229/484: Array Comprehensions as per latest ES6 drafts.

Bastien Roucariès rouca at moszumanska.debian.org
Sat Aug 19 14:20:34 UTC 2017


This is an automated email from the git hooks/post-receive script.

rouca pushed a commit to branch master
in repository node-acorn-jsx.

commit bcc97e2d529d045ff7663a9fef048dca4c928d84
Author: Ingvar Stepanyan <me at rreverser.com>
Date:   Fri Jul 25 18:45:04 2014 +0300

    Array Comprehensions as per latest ES6 drafts.
---
 acorn.js              |  31 +++-
 test/tests-harmony.js | 481 ++++++--------------------------------------------
 2 files changed, 78 insertions(+), 434 deletions(-)

diff --git a/acorn.js b/acorn.js
index 81c4755..cb0e569 100644
--- a/acorn.js
+++ b/acorn.js
@@ -1174,8 +1174,10 @@
         break;
 
       case "ArrayPattern":
-        for (var i = 0; i < expr.elements.length; i++)
-          checkLVal(expr.elements[i], isBinding);
+        for (var i = 0; i < expr.elements.length; i++) {
+          var elem = expr.elements[i];
+          if (elem) checkLVal(elem, isBinding);
+        }
         break;
 
       case "SpreadElement":
@@ -1731,10 +1733,11 @@
         val = parseExpression();
       }
       expect(_parenR);
+      // if '=>' follows '(...)', convert contents to arguments
       if (metParenL === oldParenL && eat(_arrow)) {
         val = parseArrowExpression(node, !val ? [] : val.type === "SequenceExpression" ? val.expressions : [val]);
       } else {
-        // disallow '()' before everything but error
+        // forbid '()' before everything but '=>'
         if (!val) unexpected(lastStart);
       }
       val.start = tokStart1;
@@ -1751,6 +1754,28 @@
     case _bracketL:
       var node = startNode();
       next();
+      // check whether this is array comprehension or regular array
+      if (options.ecmaVersion >= 6 && tokType === _for) {
+        node.blocks = [];
+        while (tokType === _for) {
+          var block = startNode();
+          next();
+          expect(_parenL);
+          block.left = toAssignable(parseExprAtom());
+          checkLVal(block.left, true);
+          expect(_of);
+          // `of` property is here for compatibility with Esprima's AST
+          // which also supports deprecated [for (... in ...) expr]
+          block.of = true;
+          block.right = parseExpression();
+          expect(_parenR);
+          node.blocks.push(finishNode(block, "ComprehensionBlock"));
+        }
+        node.filter = eat(_if) ? parseParenExpression() : null;
+        node.body = parseExpression();
+        expect(_bracketR);
+        return finishNode(node, "ComprehensionExpression");
+      }
       node.elements = parseExprList(_bracketR, true, true);
       return finishNode(node, "ArrayExpression");
 
diff --git a/test/tests-harmony.js b/test/tests-harmony.js
index 862e19b..a0833d1 100644
--- a/test/tests-harmony.js
+++ b/test/tests-harmony.js
@@ -3513,225 +3513,7 @@ test("x = { set method(val) v = val }", {
 
 // Array Comprehension
 
-test("[[x,b,c] for (x in []) for (b in []) if (b && c)]", {
-  type: "Program",
-  body: [{
-    type: "ExpressionStatement",
-    expression: {
-      type: "ComprehensionExpression",
-      filter: {
-        type: "LogicalExpression",
-        operator: "&&",
-        left: {
-          type: "Identifier",
-          name: "b",
-          range: [41, 42],
-          loc: {
-            start: {line: 1, column: 41},
-            end: {line: 1, column: 42}
-          }
-        },
-        right: {
-          type: "Identifier",
-          name: "c",
-          range: [46, 47],
-          loc: {
-            start: {line: 1, column: 46},
-            end: {line: 1, column: 47}
-          }
-        },
-        range: [41, 47],
-        loc: {
-          start: {line: 1, column: 41},
-          end: {line: 1, column: 47}
-        }
-      },
-      blocks: [
-        {
-          type: "ComprehensionBlock",
-          left: {
-            type: "Identifier",
-            name: "x",
-            range: [14, 15],
-            loc: {
-              start: {line: 1, column: 14},
-              end: {line: 1, column: 15}
-            }
-          },
-          right: {
-            type: "ArrayExpression",
-            elements: [],
-            range: [19, 21],
-            loc: {
-              start: {line: 1, column: 19},
-              end: {line: 1, column: 21}
-            }
-          },
-          each: false,
-          range: [9, 22],
-          loc: {
-            start: {line: 1, column: 9},
-            end: {line: 1, column: 22}
-          },
-          of: false
-        },
-        {
-          type: "ComprehensionBlock",
-          left: {
-            type: "Identifier",
-            name: "b",
-            range: [28, 29],
-            loc: {
-              start: {line: 1, column: 28},
-              end: {line: 1, column: 29}
-            }
-          },
-          right: {
-            type: "ArrayExpression",
-            elements: [],
-            range: [33, 35],
-            loc: {
-              start: {line: 1, column: 33},
-              end: {line: 1, column: 35}
-            }
-          },
-          each: false,
-          range: [23, 36],
-          loc: {
-            start: {line: 1, column: 23},
-            end: {line: 1, column: 36}
-          },
-          of: false
-        }
-      ],
-      body: {
-        type: "ArrayExpression",
-        elements: [
-          {
-            type: "Identifier",
-            name: "x",
-            range: [2, 3],
-            loc: {
-              start: {line: 1, column: 2},
-              end: {line: 1, column: 3}
-            }
-          },
-          {
-            type: "Identifier",
-            name: "b",
-            range: [4, 5],
-            loc: {
-              start: {line: 1, column: 4},
-              end: {line: 1, column: 5}
-            }
-          },
-          {
-            type: "Identifier",
-            name: "c",
-            range: [6, 7],
-            loc: {
-              start: {line: 1, column: 6},
-              end: {line: 1, column: 7}
-            }
-          }
-        ],
-        range: [1, 8],
-        loc: {
-          start: {line: 1, column: 1},
-          end: {line: 1, column: 8}
-        }
-      },
-      range: [0, 49],
-      loc: {
-        start: {line: 1, column: 0},
-        end: {line: 1, column: 49}
-      }
-    },
-    range: [0, 49],
-    loc: {
-      start: {line: 1, column: 0},
-      end: {line: 1, column: 49}
-    }
-  }],
-  range: [0, 49],
-  loc: {
-    start: {line: 1, column: 0},
-    end: {line: 1, column: 49}
-  }
-}, {
-  ecmaVersion: 6,
-  ranges: true,
-  locations: true
-});
-
-test("[x for (a in [])]", {
-  type: "Program",
-  body: [{
-    type: "ExpressionStatement",
-    expression: {
-      type: "ComprehensionExpression",
-      filter: null,
-      blocks: [{
-        type: "ComprehensionBlock",
-        left: {
-          type: "Identifier",
-          name: "a",
-          range: [8, 9],
-          loc: {
-            start: {line: 1, column: 8},
-            end: {line: 1, column: 9}
-          }
-        },
-        right: {
-          type: "ArrayExpression",
-          elements: [],
-          range: [13, 15],
-          loc: {
-            start: {line: 1, column: 13},
-            end: {line: 1, column: 15}
-          }
-        },
-        each: false,
-        range: [3, 16],
-        loc: {
-          start: {line: 1, column: 3},
-          end: {line: 1, column: 16}
-        },
-        of: false
-      }],
-      body: {
-        type: "Identifier",
-        name: "x",
-        range: [1, 2],
-        loc: {
-          start: {line: 1, column: 1},
-          end: {line: 1, column: 2}
-        }
-      },
-      range: [0, 17],
-      loc: {
-        start: {line: 1, column: 0},
-        end: {line: 1, column: 17}
-      }
-    },
-    range: [0, 17],
-    loc: {
-      start: {line: 1, column: 0},
-      end: {line: 1, column: 17}
-    }
-  }],
-  range: [0, 17],
-  loc: {
-    start: {line: 1, column: 0},
-    end: {line: 1, column: 17}
-  }
-}, {
-  ecmaVersion: 6,
-  ranges: true,
-  locations: true
-});
-
-test("[1 for (x in [])]", {
+test("[for (x of array) x]", {
   type: "Program",
   body: [{
     type: "ExpressionStatement",
@@ -3743,190 +3525,35 @@ test("[1 for (x in [])]", {
         left: {
           type: "Identifier",
           name: "x",
-          range: [8, 9],
-          loc: {
-            start: {line: 1, column: 8},
-            end: {line: 1, column: 9}
-          }
-        },
-        right: {
-          type: "ArrayExpression",
-          elements: [],
-          range: [13, 15],
+          range: [6, 7],
           loc: {
-            start: {line: 1, column: 13},
-            end: {line: 1, column: 15}
-          }
-        },
-        each: false,
-        range: [3, 16],
-        loc: {
-          start: {line: 1, column: 3},
-          end: {line: 1, column: 16}
-        },
-        of: false
-      }],
-      body: {
-        type: "Literal",
-        value: 1,
-        raw: "1",
-        range: [1, 2],
-        loc: {
-          start: {line: 1, column: 1},
-          end: {line: 1, column: 2}
-        }
-      },
-      range: [0, 17],
-      loc: {
-        start: {line: 1, column: 0},
-        end: {line: 1, column: 17}
-      }
-    },
-    range: [0, 17],
-    loc: {
-      start: {line: 1, column: 0},
-      end: {line: 1, column: 17}
-    }
-  }],
-  range: [0, 17],
-  loc: {
-    start: {line: 1, column: 0},
-    end: {line: 1, column: 17}
-  }
-}, {
-  ecmaVersion: 6,
-  ranges: true,
-  locations: true
-});
-
-test("[(x,1) for (x in [])]", {
-  type: "Program",
-  body: [{
-    type: "ExpressionStatement",
-    expression: {
-      type: "ComprehensionExpression",
-      filter: null,
-      blocks: [{
-        type: "ComprehensionBlock",
-        left: {
-          type: "Identifier",
-          name: "x",
-          range: [12, 13],
-          loc: {
-            start: {line: 1, column: 12},
-            end: {line: 1, column: 13}
-          }
-        },
-        right: {
-          type: "ArrayExpression",
-          elements: [],
-          range: [17, 19],
-          loc: {
-            start: {line: 1, column: 17},
-            end: {line: 1, column: 19}
-          }
-        },
-        each: false,
-        range: [7, 20],
-        loc: {
-          start: {line: 1, column: 7},
-          end: {line: 1, column: 20}
-        },
-        of: false
-      }],
-      body: {
-        type: "SequenceExpression",
-        expressions: [
-          {
-            type: "Identifier",
-            name: "x",
-            range: [2, 3],
-            loc: {
-              start: {line: 1, column: 2},
-              end: {line: 1, column: 3}
-            }
-          },
-          {
-            type: "Literal",
-            value: 1,
-            raw: "1",
-            range: [4, 5],
-            loc: {
-              start: {line: 1, column: 4},
-              end: {line: 1, column: 5}
-            }
-          }
-        ],
-        range: [2, 5],
-        loc: {
-          start: {line: 1, column: 2},
-          end: {line: 1, column: 5}
-        }
-      },
-      range: [0, 21],
-      loc: {
-        start: {line: 1, column: 0},
-        end: {line: 1, column: 21}
-      }
-    },
-    range: [0, 21],
-    loc: {
-      start: {line: 1, column: 0},
-      end: {line: 1, column: 21}
-    }
-  }],
-  range: [0, 21],
-  loc: {
-    start: {line: 1, column: 0},
-    end: {line: 1, column: 21}
-  }
-}, {
-  ecmaVersion: 6,
-  ranges: true,
-  locations: true
-});
-
-test("[x for (x of array)]", {
-  type: "Program",
-  body: [{
-    type: "ExpressionStatement",
-    expression: {
-      type: "ComprehensionExpression",
-      filter: null,
-      blocks: [{
-        type: "ComprehensionBlock",
-        left: {
-          type: "Identifier",
-          name: "x",
-          range: [8, 9],
-          loc: {
-            start: {line: 1, column: 8},
-            end: {line: 1, column: 9}
+            start: {line: 1, column: 6},
+            end: {line: 1, column: 7}
           }
         },
         right: {
           type: "Identifier",
           name: "array",
-          range: [13, 18],
+          range: [11, 16],
           loc: {
-            start: {line: 1, column: 13},
-            end: {line: 1, column: 18}
+            start: {line: 1, column: 11},
+            end: {line: 1, column: 16}
           }
         },
-        range: [3, 19],
+        range: [1, 17],
         loc: {
-          start: {line: 1, column: 3},
-          end: {line: 1, column: 19}
+          start: {line: 1, column: 1},
+          end: {line: 1, column: 17}
         },
         of: true
       }],
       body: {
         type: "Identifier",
         name: "x",
-        range: [1, 2],
+        range: [18, 19],
         loc: {
-          start: {line: 1, column: 1},
-          end: {line: 1, column: 2}
+          start: {line: 1, column: 18},
+          end: {line: 1, column: 19}
         }
       },
       range: [0, 20],
@@ -3952,7 +3579,7 @@ test("[x for (x of array)]", {
   locations: true
 });
 
-test("[x for (x of array) for (y of array2) if (x === test)]", {
+test("[for (x of array) for (y of array2) if (x === test) x]", {
   type: "Program",
   body: [{
     type: "ExpressionStatement",
@@ -3964,25 +3591,25 @@ test("[x for (x of array) for (y of array2) if (x === test)]", {
         left: {
           type: "Identifier",
           name: "x",
-          range: [42, 43],
+          range: [40, 41],
           loc: {
-            start: {line: 1, column: 42},
-            end: {line: 1, column: 43}
+            start: {line: 1, column: 40},
+            end: {line: 1, column: 41}
           }
         },
         right: {
           type: "Identifier",
           name: "test",
-          range: [48, 52],
+          range: [46, 50],
           loc: {
-            start: {line: 1, column: 48},
-            end: {line: 1, column: 52}
+            start: {line: 1, column: 46},
+            end: {line: 1, column: 50}
           }
         },
-        range: [42, 52],
+        range: [40, 50],
         loc: {
-          start: {line: 1, column: 42},
-          end: {line: 1, column: 52}
+          start: {line: 1, column: 40},
+          end: {line: 1, column: 50}
         }
       },
       blocks: [
@@ -3991,25 +3618,25 @@ test("[x for (x of array) for (y of array2) if (x === test)]", {
           left: {
             type: "Identifier",
             name: "x",
-            range: [8, 9],
+            range: [6, 7],
             loc: {
-              start: {line: 1, column: 8},
-              end: {line: 1, column: 9}
+              start: {line: 1, column: 6},
+              end: {line: 1, column: 7}
             }
           },
           right: {
             type: "Identifier",
             name: "array",
-            range: [13, 18],
+            range: [11, 16],
             loc: {
-              start: {line: 1, column: 13},
-              end: {line: 1, column: 18}
+              start: {line: 1, column: 11},
+              end: {line: 1, column: 16}
             }
           },
-          range: [3, 19],
+          range: [1, 17],
           loc: {
-            start: {line: 1, column: 3},
-            end: {line: 1, column: 19}
+            start: {line: 1, column: 1},
+            end: {line: 1, column: 17}
           },
           of: true
         },
@@ -4018,25 +3645,25 @@ test("[x for (x of array) for (y of array2) if (x === test)]", {
           left: {
             type: "Identifier",
             name: "y",
-            range: [25, 26],
+            range: [23, 24],
             loc: {
-              start: {line: 1, column: 25},
-              end: {line: 1, column: 26}
+              start: {line: 1, column: 23},
+              end: {line: 1, column: 24}
             }
           },
           right: {
             type: "Identifier",
             name: "array2",
-            range: [30, 36],
+            range: [28, 34],
             loc: {
-              start: {line: 1, column: 30},
-              end: {line: 1, column: 36}
+              start: {line: 1, column: 28},
+              end: {line: 1, column: 34}
             }
           },
-          range: [20, 37],
+          range: [18, 35],
           loc: {
-            start: {line: 1, column: 20},
-            end: {line: 1, column: 37}
+            start: {line: 1, column: 18},
+            end: {line: 1, column: 35}
           },
           of: true
         }
@@ -4044,10 +3671,10 @@ test("[x for (x of array) for (y of array2) if (x === test)]", {
       body: {
         type: "Identifier",
         name: "x",
-        range: [1, 2],
+        range: [52, 53],
         loc: {
-          start: {line: 1, column: 1},
-          end: {line: 1, column: 2}
+          start: {line: 1, column: 52},
+          end: {line: 1, column: 53}
         }
       },
       range: [0, 54],
@@ -15921,8 +15548,6 @@ testFail("\"use strict\"; ({ v: eval }) = obj", "Assigning to eval in strict mod
 
 testFail("\"use strict\"; ({ v: arguments }) = obj", "Assigning to arguments in strict mode (1:20)", {ecmaVersion: 6});
 
-testFail("for (var i = function() { return 10 in [] } in list) process(x);", "Unexpected token (1:44)", {ecmaVersion: 6});
-
 testFail("for (let x = 42 in list) process(x);", "Unexpected token (1:16)", {ecmaVersion: 6});
 
 testFail("for (let x = 42 of list) process(x);", "Unexpected token (1:16)", {ecmaVersion: 6});
@@ -16194,23 +15819,17 @@ testFail("`hello ${10;test`", "Unexpected token (1:12)", {ecmaVersion: 6});
 
 testFail("function a() 1 // expression closure is not supported", "Unexpected token (1:13)", {ecmaVersion: 6});
 
-testFail("[a,b if (a)] // (a,b)", "Unexpected token (1:5)", {ecmaVersion: 6});
-
-testFail("for each (let x in {}) {};", "Unexpected token (1:4)", {ecmaVersion: 6});
-
-testFail("[x for (let x in [])]", "Unexpected token (1:21)", {ecmaVersion: 6});
-
-testFail("[x for (const x in [])]", "Unexpected token (1:23)", {ecmaVersion: 6});
+testFail("[for (let x of []) x]", "Unexpected token (1:6)", {ecmaVersion: 6});
 
-testFail("[x for (var x in [])]", "Unexpected token (1:21)", {ecmaVersion: 6});
+testFail("[for (const x of []) x]", "Unexpected token (1:6)", {ecmaVersion: 6});
 
-testFail("[a,b for (a in [])] // (a,b) ", "Unexpected token (1:5)", {ecmaVersion: 6});
+testFail("[for (var x of []) x]", "Unexpected token (1:6)", {ecmaVersion: 6});
 
-testFail("[x if (x)]  // block required", "Unexpected token (1:11)", {ecmaVersion: 6});
+testFail("[for (a in []) x] // (a,b) ", "Unexpected token (1:8)", {ecmaVersion: 6});
 
-testFail("var a = [x if (x)]", "Unexpected token (1:19)", {ecmaVersion: 6});
+testFail("var a = [if (x) x]", "Unexpected token (1:9)", {ecmaVersion: 6});
 
-testFail("[for (x in [])]  // no espression", "Unexpected token (1:16)", {ecmaVersion: 6});
+testFail("[for (x of [])]  // no expression", "Unexpected token (1:14)", {ecmaVersion: 6});
 
 testFail("({ \"chance\" }) = obj", "Unexpected token (1:12)", {ecmaVersion: 6});
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/node-acorn-jsx.git



More information about the Pkg-javascript-commits mailing list