add pretzel maps

This commit is contained in:
Sebastian McKenzie 2014-11-26 16:16:47 +11:00
parent 9e204a7fee
commit 2ec2a4b5af
3 changed files with 124 additions and 1 deletions

View File

@ -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

View File

@ -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",

View File

@ -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)");