[Pkg-javascript-commits] [node-acorn-jsx] 205/484: Basic ES6 Arrow Expressions support. Added Property type to ObjectExpression properties. Reserved ES6 properties in Property type.
Bastien Roucariès
rouca at moszumanska.debian.org
Sat Aug 19 14:20:28 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 757545a6124f285829e41932f0ffefaf43cd39e8
Author: Ingvar Stepanyan <me at rreverser.com>
Date: Thu Jul 24 01:44:22 2014 +0300
Basic ES6 Arrow Expressions support.
Added Property type to ObjectExpression properties.
Reserved ES6 properties in Property type.
---
acorn.js | 87 ++++++++++++++++++++++++++++++++++++++++++++-------
test/tests-harmony.js | 35 +++++++++++----------
2 files changed, 93 insertions(+), 29 deletions(-)
diff --git a/acorn.js b/acorn.js
index 2aa13ec..19a2bbc 100644
--- a/acorn.js
+++ b/acorn.js
@@ -313,6 +313,7 @@
var _braceR = {type: "}"}, _parenL = {type: "(", beforeExpr: true}, _parenR = {type: ")"};
var _comma = {type: ",", beforeExpr: true}, _semi = {type: ";", beforeExpr: true};
var _colon = {type: ":", beforeExpr: true}, _dot = {type: "."}, _ellipsis = {type: "..."}, _question = {type: "?", beforeExpr: true};
+ var _arrow = {type: "=>", beforeExpr: true};
// Operators. These carry several kinds of properties to help the
// parser use them properly (the presence of these properties is
@@ -667,9 +668,13 @@
return finishOp(_relational, size);
}
- function readToken_eq_excl(code) { // '=!'
+ function readToken_eq_excl(code) { // '=!', '=>'
var next = input.charCodeAt(tokPos + 1);
if (next === 61) return finishOp(_equality, input.charCodeAt(tokPos + 2) === 61 ? 3 : 2);
+ if (code === 61 && next === 62 && options.ecmaVersion >= 6) { // '=>'
+ tokPos += 2;
+ return finishToken(_arrow);
+ }
return finishOp(code === 61 ? _eq : _prefix, 1);
}
@@ -1134,8 +1139,8 @@
// Raise an unexpected token error.
- function unexpected() {
- raise(tokStart, "Unexpected token");
+ function unexpected(pos) {
+ raise(pos != null ? pos : tokStart, "Unexpected token");
}
// Verify that a node is an lval — something that can be assigned
@@ -1656,8 +1661,14 @@
var node = startNode();
next();
return finishNode(node, "ThisExpression");
+
case _name:
- return parseIdent();
+ var id = parseIdent();
+ if (eat(_arrow)) {
+ return parseArrowExpression(startNodeFrom(id), [id]);
+ }
+ return id;
+
case _num: case _string: case _regexp:
var node = startNode();
node.value = tokVal;
@@ -1673,18 +1684,27 @@
return finishNode(node, "Literal");
case _parenL:
- var tokStartLoc1 = tokStartLoc, tokStart1 = tokStart;
+ var node = startNode(), tokStartLoc1 = tokStartLoc, tokStart1 = tokStart, val;
next();
- var val = parseExpression();
+ if (tokType !== _parenR) {
+ val = parseExpression();
+ }
+ expect(_parenR);
+ if (eat(_arrow)) {
+ val = parseArrowExpression(node, !val ? [] : val.type === "SequenceExpression" ? val.expressions : [val]);
+ } else
+ // disallow '()' before everything but error
+ if (!val) {
+ unexpected(tokPos - 1);
+ }
val.start = tokStart1;
- val.end = tokEnd;
+ val.end = lastEnd;
if (options.locations) {
val.loc.start = tokStartLoc1;
- val.loc.end = tokEndLoc;
+ val.loc.end = lastEndLoc;
}
if (options.ranges)
- val.range = [tokStart1, tokEnd];
- expect(_parenR);
+ val.range = [tokStart1, lastEnd];
return val;
case _bracketL:
@@ -1734,7 +1754,8 @@
if (options.allowTrailingCommas && eat(_braceR)) break;
} else first = false;
- var prop = {key: parsePropertyName()}, isGetSet = false, kind;
+ var prop = startNode(), isGetSet = false, kind;
+ prop.key = parsePropertyName();
if (eat(_colon)) {
prop.value = parseExpression(true);
kind = prop.kind = "init";
@@ -1762,7 +1783,12 @@
}
}
}
- node.properties.push(prop);
+ if (options.ecmaVersion >= 6) {
+ prop.method = false;
+ prop.shorthand = false;
+ prop.computed = false;
+ }
+ node.properties.push(finishNode(prop, "Property"));
}
return finishNode(node, "ObjectExpression");
}
@@ -1835,6 +1861,43 @@
return finishNode(node, isStatement ? "FunctionDeclaration" : "FunctionExpression");
}
+ // Parse arrow function expression with given parameters.
+
+ function parseArrowExpression(node, params) {
+ var defaults = [], hasDefaults = false;
+
+ for (var i = 0; i < params.length; i++) {
+ var param = params[i];
+
+ switch (param.type) {
+ case "Identifier":
+ defaults.push(null);
+ break;
+
+ case "AssignmentExpression":
+ defaults.push(param.right);
+ hasDefaults = true;
+ params[i] = param.left;
+ break;
+
+ default:
+ unexpected(param.start);
+ }
+ }
+
+ var isExpression = tokType !== _braceL;
+ var body = isExpression ? parseExpression() : parseBlock(true);
+
+ node.id = null;
+ node.params = params;
+ node.defaults = hasDefaults ? defaults : [];
+ node.rest = null;
+ node.body = body;
+ node.generator = false;
+ node.expression = isExpression;
+ return finishNode(node, "ArrowFunctionExpression");
+ }
+
// Parses a comma-separated list of expressions, and returns them as
// an array. `close` is the token type that ends the list, and
// `allowEmpty` can be turned on to allow subsequent commas with
diff --git a/test/tests-harmony.js b/test/tests-harmony.js
index 2678593..1abcf22 100644
--- a/test/tests-harmony.js
+++ b/test/tests-harmony.js
@@ -35,7 +35,8 @@ if (typeof exports != "undefined") {
}
/*
- Tests below are automatically converted from https://github.com/ariya/esprima/blob/2bb17ef9a45c88e82d72c2c61b7b7af93caef028/test/harmonytest.js.
+ Tests below were automatically converted from https://github.com/ariya/esprima/blob/2bb17ef9a45c88e82d72c2c61b7b7af93caef028/test/harmonytest.js.
+ Locations for parenthesized expressions and expression statements were manually fixed.
*/
// ES6 Unicode Code Point Escape Sequence
@@ -1504,10 +1505,10 @@ test("e => ({ property: 42 })", {
end: {line: 1, column: 20}
}
}],
- range: [6, 22],
+ range: [5, 23],
loc: {
- start: {line: 1, column: 6},
- end: {line: 1, column: 22}
+ start: {line: 1, column: 5},
+ end: {line: 1, column: 23}
}
},
rest: null,
@@ -1578,16 +1579,16 @@ test("e => { label: 42 }", {
end: {line: 1, column: 16}
}
},
- range: [14, 17],
+ range: [14, 16],
loc: {
start: {line: 1, column: 14},
- end: {line: 1, column: 17}
+ end: {line: 1, column: 16}
}
},
- range: [7, 17],
+ range: [7, 16],
loc: {
start: {line: 1, column: 7},
- end: {line: 1, column: 17}
+ end: {line: 1, column: 16}
}
}],
range: [5, 18],
@@ -2323,10 +2324,10 @@ test("(x => x)", {
rest: null,
generator: false,
expression: true,
- range: [1, 7],
+ range: [0, 8],
loc: {
- start: {line: 1, column: 1},
- end: {line: 1, column: 7}
+ start: {line: 1, column: 0},
+ end: {line: 1, column: 8}
}
},
range: [0, 8],
@@ -2493,19 +2494,19 @@ test("(x) => ((y, z) => (x, y, z))", {
}
}
],
- range: [19, 26],
+ range: [18, 27],
loc: {
- start: {line: 1, column: 19},
- end: {line: 1, column: 26}
+ start: {line: 1, column: 18},
+ end: {line: 1, column: 27}
}
},
rest: null,
generator: false,
expression: true,
- range: [8, 27],
+ range: [7, 28],
loc: {
- start: {line: 1, column: 8},
- end: {line: 1, column: 27}
+ start: {line: 1, column: 7},
+ end: {line: 1, column: 28}
}
},
rest: null,
--
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