[Pkg-javascript-commits] [node-acorn-jsx] 227/484: Added `for (..of..)` support and guard against `for (let var=.. in|of ..)` loops.
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 648f3159cc22cabb42773b590d9305618224ae83
Author: Ingvar Stepanyan <me at rreverser.com>
Date: Fri Jul 25 16:14:11 2014 +0300
Added `for (..of..)` support and guard against `for (let var=.. in|of ..)` loops.
---
acorn.js | 32 +++--
test/tests-harmony.js | 10 +-
test/tests.js | 383 --------------------------------------------------
3 files changed, 25 insertions(+), 400 deletions(-)
diff --git a/acorn.js b/acorn.js
index 25638b3..81c4755 100644
--- a/acorn.js
+++ b/acorn.js
@@ -298,6 +298,7 @@
// we assign a variable name to it for quick comparing.
var _in = {keyword: "in", binop: 7, beforeExpr: true};
+ var _of = {keyword: "of", beforeExpr: true};
// Map keyword names to token types.
@@ -312,7 +313,7 @@
"typeof": {keyword: "typeof", prefix: true, beforeExpr: true},
"void": {keyword: "void", prefix: true, beforeExpr: true},
"delete": {keyword: "delete", prefix: true, beforeExpr: true},
- "class": _class, "extends": _extends, "static": _static};
+ "class": _class, "extends": _extends, "static": _static, "of": _of};
// Punctuation token types. Again, the `type` property is purely for debugging.
@@ -431,7 +432,7 @@
var isEcma5AndLessKeyword = makePredicate(ecma5AndLessKeywords);
- var isEcma6Keyword = makePredicate(ecma5AndLessKeywords + " let const class extends static");
+ var isEcma6Keyword = makePredicate(ecma5AndLessKeywords + " let const class extends static of");
var isKeyword = isEcma5AndLessKeyword;
@@ -1300,13 +1301,13 @@
return finishNode(node, "DoWhileStatement");
}
- // Disambiguating between a `for` and a `for`/`in` loop is
- // non-trivial. Basically, we have to parse the init `var`
+ // Disambiguating between a `for` and a `for`/`in` or `for`/`of`
+ // loop is non-trivial. Basically, we have to parse the init `var`
// statement or expression, disallowing the `in` operator (see
// the second parameter to `parseExpression`), and then check
- // whether the next token is `in`. When there is no init part
- // (semicolon immediately after the opening parenthesis), it is
- // a regular `for` loop.
+ // whether the next token is `in` or `of`. When there is no init
+ // part (semicolon immediately after the opening parenthesis), it
+ // is a regular `for` loop.
function parseForStatement(node) {
next();
@@ -1314,16 +1315,20 @@
expect(_parenL);
if (tokType === _semi) return parseFor(node, null);
if (tokType === _var || tokType === _let) {
- var init = startNode(), varKind = tokType.keyword;
+ var init = startNode(), varKind = tokType.keyword, isLet = tokType === _let;
next();
parseVar(init, true, varKind);
finishNode(init, "VariableDeclaration");
- if (init.declarations.length === 1 && eat(_in))
+ if ((tokType === _in || tokType === _of) && init.declarations.length === 1 &&
+ !(isLet && init.declarations[0].init))
return parseForIn(node, init);
return parseFor(node, init);
}
var init = parseExpression(false, true);
- if (eat(_in)) {checkLVal(init); return parseForIn(node, init);}
+ if (tokType === _in || tokType === _of) {
+ checkLVal(init);
+ return parseForIn(node, init);
+ }
return parseFor(node, init);
}
@@ -1514,15 +1519,18 @@
return finishNode(node, "ForStatement");
}
- // Parse a `for`/`in` loop.
+ // Parse a `for`/`in` and `for`/`of` loop, which are almost
+ // same from parser's perspective.
function parseForIn(node, init) {
+ var type = tokType === _in ? "ForInStatement" : "ForOfStatement";
+ next();
node.left = init;
node.right = parseExpression();
expect(_parenR);
node.body = parseStatement();
labels.pop();
- return finishNode(node, "ForInStatement");
+ return finishNode(node, type);
}
// Parse a list of variable declarations.
diff --git a/test/tests-harmony.js b/test/tests-harmony.js
index c688ade..862e19b 100644
--- a/test/tests-harmony.js
+++ b/test/tests-harmony.js
@@ -15899,9 +15899,9 @@ testFail("({ obj:20 }) = 42", "Unexpected token (1:7)", {ecmaVersion: 6});
testFail("( { get x() {} } ) = 0", "Unexpected token (1:8)", {ecmaVersion: 6});
-testFail("x \n is y", "Unexpected token (2:5)", {ecmaVersion: 6});
+testFail("x \n is y", "Unexpected token (2:4)", {ecmaVersion: 6});
-testFail("x \n isnt y", "Unexpected token (2:7)", {ecmaVersion: 6});
+testFail("x \n isnt y", "Unexpected token (2:6)", {ecmaVersion: 6});
testFail("function default() {}", "Unexpected token (1:9)", {ecmaVersion: 6});
@@ -15921,11 +15921,11 @@ 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:45)", {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:17)", {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:17)", {ecmaVersion: 6});
+testFail("for (let x = 42 of list) process(x);", "Unexpected token (1:16)", {ecmaVersion: 6});
testFail("module\n\"crypto\" {}", "Unexpected token (1:7)", {ecmaVersion: 6});
diff --git a/test/tests.js b/test/tests.js
index 9a7793e..f7d9e04 100644
--- a/test/tests.js
+++ b/test/tests.js
@@ -28221,389 +28221,6 @@ test("for (let x in list) process(x);", {
}
}, {ecmaVersion: 6, locations: true});
-test("for (let x = 42 in list) process(x);", {
- type: "Program",
- body: [
- {
- type: "ForInStatement",
- left: {
- type: "VariableDeclaration",
- declarations: [
- {
- type: "VariableDeclarator",
- id: {
- type: "Identifier",
- name: "x",
- loc: {
- start: {
- line: 1,
- column: 9
- },
- end: {
- line: 1,
- column: 10
- }
- }
- },
- init: {
- type: "Literal",
- value: 42,
- loc: {
- start: {
- line: 1,
- column: 13
- },
- end: {
- line: 1,
- column: 15
- }
- }
- },
- loc: {
- start: {
- line: 1,
- column: 9
- },
- end: {
- line: 1,
- column: 15
- }
- }
- }
- ],
- kind: "let",
- loc: {
- start: {
- line: 1,
- column: 5
- },
- end: {
- line: 1,
- column: 15
- }
- }
- },
- right: {
- type: "Identifier",
- name: "list",
- loc: {
- start: {
- line: 1,
- column: 19
- },
- end: {
- line: 1,
- column: 23
- }
- }
- },
- body: {
- type: "ExpressionStatement",
- expression: {
- type: "CallExpression",
- callee: {
- type: "Identifier",
- name: "process",
- loc: {
- start: {
- line: 1,
- column: 25
- },
- end: {
- line: 1,
- column: 32
- }
- }
- },
- arguments: [
- {
- type: "Identifier",
- name: "x",
- loc: {
- start: {
- line: 1,
- column: 33
- },
- end: {
- line: 1,
- column: 34
- }
- }
- }
- ],
- loc: {
- start: {
- line: 1,
- column: 25
- },
- end: {
- line: 1,
- column: 35
- }
- }
- },
- loc: {
- start: {
- line: 1,
- column: 25
- },
- end: {
- line: 1,
- column: 36
- }
- }
- },
- loc: {
- start: {
- line: 1,
- column: 0
- },
- end: {
- line: 1,
- column: 36
- }
- }
- }
- ],
- loc: {
- start: {
- line: 1,
- column: 0
- },
- end: {
- line: 1,
- column: 36
- }
- }
-}, {ecmaVersion: 6, locations: true});
-
-test("for (let i = function() { return 10 in [] } in list) process(x);", {
- type: "Program",
- body: [
- {
- type: "ForInStatement",
- left: {
- type: "VariableDeclaration",
- declarations: [
- {
- type: "VariableDeclarator",
- id: {
- type: "Identifier",
- name: "i",
- loc: {
- start: {
- line: 1,
- column: 9
- },
- end: {
- line: 1,
- column: 10
- }
- }
- },
- init: {
- type: "FunctionExpression",
- id: null,
- params: [],
- body: {
- type: "BlockStatement",
- body: [
- {
- type: "ReturnStatement",
- argument: {
- type: "BinaryExpression",
- left: {
- type: "Literal",
- value: 10,
- loc: {
- start: {
- line: 1,
- column: 33
- },
- end: {
- line: 1,
- column: 35
- }
- }
- },
- operator: "in",
- right: {
- type: "ArrayExpression",
- elements: [],
- loc: {
- start: {
- line: 1,
- column: 39
- },
- end: {
- line: 1,
- column: 41
- }
- }
- },
- loc: {
- start: {
- line: 1,
- column: 33
- },
- end: {
- line: 1,
- column: 41
- }
- }
- },
- loc: {
- start: {
- line: 1,
- column: 26
- },
- end: {
- line: 1,
- column: 41
- }
- }
- }
- ],
- loc: {
- start: {
- line: 1,
- column: 24
- },
- end: {
- line: 1,
- column: 43
- }
- }
- },
- loc: {
- start: {
- line: 1,
- column: 13
- },
- end: {
- line: 1,
- column: 43
- }
- }
- },
- loc: {
- start: {
- line: 1,
- column: 9
- },
- end: {
- line: 1,
- column: 43
- }
- }
- }
- ],
- kind: "let",
- loc: {
- start: {
- line: 1,
- column: 5
- },
- end: {
- line: 1,
- column: 43
- }
- }
- },
- right: {
- type: "Identifier",
- name: "list",
- loc: {
- start: {
- line: 1,
- column: 47
- },
- end: {
- line: 1,
- column: 51
- }
- }
- },
- body: {
- type: "ExpressionStatement",
- expression: {
- type: "CallExpression",
- callee: {
- type: "Identifier",
- name: "process",
- loc: {
- start: {
- line: 1,
- column: 53
- },
- end: {
- line: 1,
- column: 60
- }
- }
- },
- arguments: [
- {
- type: "Identifier",
- name: "x",
- loc: {
- start: {
- line: 1,
- column: 61
- },
- end: {
- line: 1,
- column: 62
- }
- }
- }
- ],
- loc: {
- start: {
- line: 1,
- column: 53
- },
- end: {
- line: 1,
- column: 63
- }
- }
- },
- loc: {
- start: {
- line: 1,
- column: 53
- },
- end: {
- line: 1,
- column: 64
- }
- }
- },
- loc: {
- start: {
- line: 1,
- column: 0
- },
- end: {
- line: 1,
- column: 64
- }
- }
- }
- ],
- loc: {
- start: {
- line: 1,
- column: 0
- },
- end: {
- line: 1,
- column: 64
- }
- }
-}, {ecmaVersion: 6, locations: true});
-
test("const x = 42", {
type: "Program",
body: [
--
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