diff --git a/acorn.js b/acorn.js index 84e3da283c..ed628ec5d5 100644 --- a/acorn.js +++ b/acorn.js @@ -2615,11 +2615,30 @@ case _lt: return parseXJSElement(); + case _colon: + return parsePretzelMap(); + default: unexpected(); } } + function parsePretzelMap() { + var node = startNode(); + next(); + + var start = storeCurrentPos(); + node.callee = parseSubscripts(parseExprAtom(), start, true); + + if (eat(_parenL)) { + node.arguments = parseExprList(_parenR, false); + } else { + node.arguments = []; + } + + return finishNode(node, "PretzelMapExpression"); + } + // New's precedence is slightly tricky. It must allow its argument // to be a `[]` or dot subscript expression, but not a call — at // least, not without wrapping it in parentheses. Thus, it uses the diff --git a/package.json b/package.json index c83a0a970b..05226d8805 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "acorn-6to5", "description": "Acorn fork used by 6to5", "main": "acorn.js", - "version": "0.9.1-8", + "version": "0.9.1-9", "maintainers": [ { "name": "Marijn Haverbeke", diff --git a/test/tests-6to5-playground.js b/test/tests-6to5-playground.js index d5085b9dcb..6e14bc445a 100644 --- a/test/tests-6to5-playground.js +++ b/test/tests-6to5-playground.js @@ -4,6 +4,110 @@ if (typeof exports != "undefined") { var testAssert = require("./driver.js").testAssert; } +// Pretzel map + +test("arr.map(:toUpperCase)", { + type: "Program", + start: 0, + end: 21, + body: [{ + type: "ExpressionStatement", + start: 0, + end: 21, + expression: { + type: "CallExpression", + start: 0, + end: 21, + callee: { + type: "MemberExpression", + start: 0, + end: 7, + object: { + type: "Identifier", + start: 0, + end: 3, + name: "arr" + }, + property: { + type: "Identifier", + start: 4, + end: 7, + name: "map" + }, + computed: false + }, + arguments: [{ + type: "PretzelMapExpression", + start: 8, + end: 20, + callee: { + type: "Identifier", + start: 9, + end: 20, + name: "toUpperCase" + }, + arguments: [] + }] + } + }] +}, { + playground: true +}); + +test("arr.map(:toFixed(2))", { + type: "Program", + start: 0, + end: 20, + body: [{ + type: "ExpressionStatement", + start: 0, + end: 20, + expression: { + type: "CallExpression", + start: 0, + end: 20, + callee: { + type: "MemberExpression", + start: 0, + end: 7, + object: { + type: "Identifier", + start: 0, + end: 3, + name: "arr" + }, + property: { + type: "Identifier", + start: 4, + end: 7, + name: "map" + }, + computed: false + }, + arguments: [{ + type: "PretzelMapExpression", + start: 8, + end: 19, + callee: { + type: "Identifier", + start: 9, + end: 16, + name: "toFixed" + }, + arguments: [{ + type: "Literal", + start: 17, + end: 18, + value: 2, + raw: "2" + }] + }] + } + }] +}, { + playground: true +}); + // Memoization assignment operator testFail("obj ?= 2;", "You can only use member expressions in memoization assignment (1:0)");