babel/test/acorn/tests-babel.js

3434 lines
72 KiB
JavaScript

var test = require("./driver.js").test;
var testFail = require("./driver.js").testFail;
var testAssert = require("./driver.js").testAssert;
testFail("({a}) = 2;", "You're trying to assign to a parenthesized expression, eg. instead of `({a}) = 0` use `({a} = 0)` (1:1)", {
ecmaVersion: 6
});
testFail("([a]) = 2;", "You're trying to assign to a parenthesized expression, eg. instead of `([a]) = 0` use `([a] = 0)` (1:1)", {
ecmaVersion: 6
});
// ES7: Exponentiation Operator
test('a **= 2;', {
type: "Program",
start: 0,
end: 8,
body: [{
type: "ExpressionStatement",
start: 0,
end: 8,
expression: {
type: "AssignmentExpression",
start: 0,
end: 7,
operator: "**=",
left: {
type: "Identifier",
start: 0,
end: 1,
name: "a"
},
right: {
type: "Literal",
start: 6,
end: 7,
value: 2
}
}
}]
}, {
ecmaVersion: 7
});
test('var squared = 2 ** 2;', {
type: "Program",
start: 0,
end: 21,
body: [{
type: "VariableDeclaration",
start: 0,
end: 21,
declarations: [{
type: "VariableDeclarator",
start: 4,
end: 20,
id: {
type: "Identifier",
start: 4,
end: 11,
name: "squared"
},
init: {
type: "BinaryExpression",
start: 14,
end: 20,
left: {
type: "Literal",
start: 14,
end: 15,
value: 2
},
operator: "**",
right: {
type: "Literal",
start: 19,
end: 20,
value: 2
}
}
}],
kind: "var"
}]
}, {
ecmaVersion: 7
});
test("2 ** (3 ** 2)", {
type: "Program",
body: [{
type: "ExpressionStatement",
expression: {
type: "BinaryExpression",
left: {
type: "Literal",
value: 2
},
operator: "**",
right: {
type: "BinaryExpression",
left: {
type: "Literal",
value: 3
},
operator: "**",
right: {
type: "Literal",
value: 2
}
}
}
}]
}, {
ecmaVersion: 7
});
test("2 ** 3 ** 2", {
type: "Program",
body: [{
type: "ExpressionStatement",
expression: {
type: "BinaryExpression",
left: {
type: "Literal",
value: 2
},
operator: "**",
right: {
type: "BinaryExpression",
left: {
type: "Literal",
value: 3
},
operator: "**",
right: {
type: "Literal",
value: 2
}
}
}
}]
}, {
ecmaVersion: 7
});
test("(2 ** -1) * 2", {
type: "Program",
body: [{
type: "ExpressionStatement",
expression: {
type: "BinaryExpression",
left: {
type: "BinaryExpression",
left: {
type: "Literal",
value: 2
},
operator: "**",
right: {
type: "UnaryExpression",
operator: "-",
prefix: true,
argument: {
type: "Literal",
value: 1
}
}
},
operator: "*",
right: {
type: "Literal",
value: 2
}
}
}]
}, {
ecmaVersion: 7
});
test("2 ** -1 * 2", {
type: "Program",
body: [{
type: "ExpressionStatement",
expression: {
type: "BinaryExpression",
left: {
type: "BinaryExpression",
left: {
type: "Literal",
value: 2
},
operator: "**",
right: {
type: "UnaryExpression",
operator: "-",
prefix: true,
argument: {
type: "Literal",
value: 1
}
}
},
operator: "*",
right: {
type: "Literal",
value: 2
}
}
}]
}, {
ecmaVersion: 7
});
// ES7: Object Rest/Spread
test('let {...x} = z', {
type: "Program",
start: 0,
end: 14,
body: [{
type: "VariableDeclaration",
start: 0,
end: 14,
declarations: [
{
type: "VariableDeclarator",
start: 4,
end: 14,
id: {
type: "ObjectPattern",
start: 4,
end: 10,
properties: [
{
type: "SpreadProperty",
start: 5,
end: 9,
argument: {
type: "Identifier",
start: 8,
end: 9,
name: "x"
}
}
]
},
init: {
type: "Identifier",
start: 13,
end: 14,
name: "z"
}
}
],
kind: "let"
}]
}, {
ecmaVersion: 7,
features: { "es7.objectRestSpread": true }
});
test('let {x, ...y} = z', {
type: "Program",
start: 0,
end: 17,
body: [{
type: "VariableDeclaration",
start: 0,
end: 17,
declarations: [
{
type: "VariableDeclarator",
start: 4,
end: 17,
id: {
type: "ObjectPattern",
start: 4,
end: 13,
properties: [
{
type: "Property",
start: 5,
end: 6,
method: false,
shorthand: true,
computed: false,
key: {
type: "Identifier",
start: 5,
end: 6,
name: "x"
},
kind: "init",
value: {
type: "Identifier",
start: 5,
end: 6,
name: "x"
}
},
{
type: "SpreadProperty",
start: 8,
end: 12,
argument: {
type: "Identifier",
start: 11,
end: 12,
name: "y"
}
}
]
},
init: {
type: "Identifier",
start: 16,
end: 17,
name: "z"
}
}
],
kind: "let"
}]
}, {
ecmaVersion: 7,
features: { "es7.objectRestSpread": true }
});
test('(function({x, ...y}) { })', {
type: "Program",
start: 0,
end: 25,
body: [{
type: "ExpressionStatement",
start: 0,
end: 25,
expression: {
type: "FunctionExpression",
start: 1,
end: 24,
id: null,
params: [
{
type: "ObjectPattern",
start: 10,
end: 19,
properties: [
{
type: "Property",
start: 11,
end: 12,
method: false,
shorthand: true,
computed: false,
key: {
type: "Identifier",
start: 11,
end: 12,
name: "x"
},
kind: "init",
value: {
type: "Identifier",
start: 11,
end: 12,
name: "x"
}
},
{
type: "SpreadProperty",
start: 14,
end: 18,
argument: {
type: "Identifier",
start: 17,
end: 18,
name: "y"
}
}
]
}
],
generator: false,
body: {
type: "BlockStatement",
start: 21,
end: 24,
body: []
},
expression: false
}
}]
}, {
ecmaVersion: 7,
features: { "es7.objectRestSpread": true }
});
test('let z = {...x}', {
type: "Program",
start: 0,
end: 14,
body: [{
type: "VariableDeclaration",
start: 0,
end: 14,
declarations: [
{
type: "VariableDeclarator",
start: 4,
end: 14,
id: {
type: "Identifier",
start: 4,
end: 5,
name: "z"
},
init: {
type: "ObjectExpression",
start: 8,
end: 14,
properties: [
{
type: "SpreadProperty",
start: 9,
end: 13,
argument: {
type: "Identifier",
start: 12,
end: 13,
name: "x"
}
}
]
}
}
],
kind: "let"
}]
}, {
ecmaVersion: 7,
features: { "es7.objectRestSpread": true }
});
test('z = {x, ...y}', {
type: "Program",
start: 0,
end: 13,
body: [{
type: "ExpressionStatement",
start: 0,
end: 13,
expression: {
type: "AssignmentExpression",
start: 0,
end: 13,
operator: "=",
left: {
type: "Identifier",
start: 0,
end: 1,
name: "z"
},
right: {
type: "ObjectExpression",
start: 4,
end: 13,
properties: [
{
type: "Property",
start: 5,
end: 6,
method: false,
shorthand: true,
computed: false,
key: {
type: "Identifier",
start: 5,
end: 6,
name: "x"
},
kind: "init",
value: {
type: "Identifier",
start: 5,
end: 6,
name: "x"
}
},
{
type: "SpreadProperty",
start: 8,
end: 12,
argument: {
type: "Identifier",
start: 11,
end: 12,
name: "y"
}
}
]
}
}
}]
}, {
ecmaVersion: 7,
features: { "es7.objectRestSpread": true }
});
test('({x, ...y, a, ...b, c})', {
type: "Program",
start: 0,
end: 23,
body: [{
type: "ExpressionStatement",
start: 0,
end: 23,
expression: {
type: "ObjectExpression",
start: 1,
end: 22,
properties: [
{
type: "Property",
start: 2,
end: 3,
method: false,
shorthand: true,
computed: false,
key: {
type: "Identifier",
start: 2,
end: 3,
name: "x"
},
kind: "init",
value: {
type: "Identifier",
start: 2,
end: 3,
name: "x"
}
},
{
type: "SpreadProperty",
start: 5,
end: 9,
argument: {
type: "Identifier",
start: 8,
end: 9,
name: "y"
}
},
{
type: "Property",
start: 11,
end: 12,
method: false,
shorthand: true,
computed: false,
key: {
type: "Identifier",
start: 11,
end: 12,
name: "a"
},
kind: "init",
value: {
type: "Identifier",
start: 11,
end: 12,
name: "a"
}
},
{
type: "SpreadProperty",
start: 14,
end: 18,
argument: {
type: "Identifier",
start: 17,
end: 18,
name: "b"
}
},
{
type: "Property",
start: 20,
end: 21,
method: false,
shorthand: true,
computed: false,
key: {
type: "Identifier",
start: 20,
end: 21,
name: "c"
},
kind: "init",
value: {
type: "Identifier",
start: 20,
end: 21,
name: "c"
}
}
]
}
}]
}, {
ecmaVersion: 7,
features: { "es7.objectRestSpread": true }
});
// ES7: Async Functions
testFail("function foo(promise) { await promise; }", "Unexpected token (1:30)", {
ecmaVersion: 7,
features: { "es7.asyncFunctions": true }
});
testFail("var x = async\n(x) => x + 1;", "Unexpected token (2:4)", {
ecmaVersion: 7,
features: { "es7.asyncFunctions": true }
});
test("async\nfunction foo() {}", {
type: "Program",
body: [
{
type: "ExpressionStatement",
expression: {
type: "Identifier",
name: "async",
loc: {
start: {line: 1, column: 0},
end: {line: 1, column: 5}
}
},
loc: {
start: {line: 1, column: 0},
end: {line: 1, column: 5}
}
},
{
type: "FunctionDeclaration",
id: {
type: "Identifier",
name: "foo",
loc: {
start: {line: 2, column: 9},
end: {line: 2, column: 12}
}
},
params: [],
body: {
type: "BlockStatement",
body: [],
loc: {
start: {line: 2, column: 15},
end: {line: 2, column: 17}
}
},
generator: false,
expression: false,
async: false,
loc: {
start: {line: 2, column: 0},
end: {line: 2, column: 17}
}
}
]
}, {
ecmaVersion: 7,
features: { "es7.asyncFunctions": true },
locations: true
});
test('async function foo(promise) { await promise; }', {
type: "Program",
body: [{
type: "FunctionDeclaration",
id: {
type: "Identifier",
name: "foo",
loc: {
start: {line: 1, column: 15},
end: {line: 1, column: 18}
}
},
params: [{
type: "Identifier",
name: "promise",
loc: {
start: {line: 1, column: 19},
end: {line: 1, column: 26}
}
}],
body: {
type: "BlockStatement",
body: [{
type: "ExpressionStatement",
expression: {
type: "AwaitExpression",
argument: {
type: "Identifier",
name: "promise",
loc: {
start: {line: 1, column: 36},
end: {line: 1, column: 43}
}
},
loc: {
start: {line: 1, column: 30},
end: {line: 1, column: 43}
}
},
loc: {
start: {line: 1, column: 30},
end: {line: 1, column: 44}
}
}],
loc: {
start: {line: 1, column: 28},
end: {line: 1, column: 46}
}
},
generator: false,
expression: false,
async: true,
loc: {
start: {line: 1, column: 0},
end: {line: 1, column: 46}
}
}]
}, {
ecmaVersion: 7,
features: { "es7.asyncFunctions": true },
locations: true
});
test('(function(x) { async function inner() { await x } })', {
type: "Program",
body: [{
type: "ExpressionStatement",
expression: {
type: "FunctionExpression",
id: null,
params: [
{
type: "Identifier",
name: "x",
loc: {
start: {line: 1, column: 10},
end: {line: 1, column: 11}
}
}
],
body: {
type: "BlockStatement",
body: [
{
type: "FunctionDeclaration",
id: {
type: "Identifier",
name: "inner",
loc: {
start: {line: 1, column: 30},
end: {line: 1, column: 35}
}
},
params: [],
body: {
type: "BlockStatement",
body: [
{
type: "ExpressionStatement",
expression: {
type: "AwaitExpression",
argument: {
type: "Identifier",
name: "x",
loc: {
start: {line: 1, column: 46},
end: {line: 1, column: 47}
}
},
loc: {
start: {line: 1, column: 40},
end: {line: 1, column: 47}
}
},
loc: {
start: {line: 1, column: 40},
end: {line: 1, column: 47}
}
}
],
loc: {
start: {line: 1, column: 38},
end: {line: 1, column: 49}
}
},
generator: false,
expression: false,
async: true,
loc: {
start: {line: 1, column: 15},
end: {line: 1, column: 49}
}
}
],
loc: {
start: {line: 1, column: 13},
end: {line: 1, column: 51}
}
},
generator: false,
expression: false,
loc: {
start: {line: 1, column: 1},
end: {line: 1, column: 51}
}
},
loc: {
start: {line: 1, column: 0},
end: {line: 1, column: 52}
}
}]
}, {
ecmaVersion: 7,
features: { "es7.asyncFunctions": true },
locations: true
});
test('var foo = async function(promise) { await promise; }', {
type: "Program",
body: [{
type: "VariableDeclaration",
declarations: [
{
type: "VariableDeclarator",
id: {
type: "Identifier",
name: "foo",
loc: {
start: {line: 1, column: 4},
end: {line: 1, column: 7}
}
},
init: {
type: "FunctionExpression",
id: null,
params: [
{
type: "Identifier",
name: "promise",
loc: {
start: {line: 1, column: 25},
end: {line: 1, column: 32}
}
}
],
body: {
type: "BlockStatement",
body: [
{
type: "ExpressionStatement",
expression: {
type: "AwaitExpression",
argument: {
type: "Identifier",
name: "promise",
loc: {
start: {line: 1, column: 42},
end: {line: 1, column: 49}
}
},
loc: {
start: {line: 1, column: 36},
end: {line: 1, column: 49}
}
},
loc: {
start: {line: 1, column: 36},
end: {line: 1, column: 50}
}
}
],
loc: {
start: {line: 1, column: 34},
end: {line: 1, column: 52}
}
},
generator: false,
expression: false,
async: true,
loc: {
start: {line: 1, column: 10},
end: {line: 1, column: 52}
}
},
loc: {
start: {line: 1, column: 4},
end: {line: 1, column: 52}
}
}
],
kind: "var",
loc: {
start: {line: 1, column: 0},
end: {line: 1, column: 52}
}
}]
}, {
ecmaVersion: 7,
features: { "es7.asyncFunctions": true },
locations: true
});
test('var o = { a: 1, async foo(promise) { await promise } }', {
type: "Program",
body: [{
type: "VariableDeclaration",
declarations: [
{
type: "VariableDeclarator",
id: {
type: "Identifier",
name: "o",
loc: {
start: {line: 1, column: 4},
end: {line: 1, column: 5}
}
},
init: {
type: "ObjectExpression",
properties: [
{
type: "Property",
key: {
type: "Identifier",
name: "a",
loc: {
start: {line: 1, column: 10},
end: {line: 1, column: 11}
}
},
value: {
type: "Literal",
value: 1,
loc: {
start: {line: 1, column: 13},
end: {line: 1, column: 14}
}
},
kind: "init",
method: false,
shorthand: false,
computed: false,
loc: {
start: {line: 1, column: 10},
end: {line: 1, column: 14}
}
},
{
type: "Property",
key: {
type: "Identifier",
name: "foo",
loc: {
start: {line: 1, column: 22},
end: {line: 1, column: 25}
}
},
value: {
type: "FunctionExpression",
id: null,
params: [
{
type: "Identifier",
name: "promise",
loc: {
start: {line: 1, column: 26},
end: {line: 1, column: 33}
}
}
],
body: {
type: "BlockStatement",
body: [
{
type: "ExpressionStatement",
expression: {
type: "AwaitExpression",
argument: {
type: "Identifier",
name: "promise",
loc: {
start: {line: 1, column: 43},
end: {line: 1, column: 50}
}
},
loc: {
start: {line: 1, column: 37},
end: {line: 1, column: 50}
}
},
loc: {
start: {line: 1, column: 37},
end: {line: 1, column: 50}
}
}
],
loc: {
start: {line: 1, column: 35},
end: {line: 1, column: 52}
}
},
generator: false,
expression: false,
async: true,
loc: {
start: {line: 1, column: 25},
end: {line: 1, column: 52}
}
},
kind: "init",
method: true,
shorthand: false,
computed: false,
loc: {
start: {line: 1, column: 16},
end: {line: 1, column: 52}
}
}
],
loc: {
start: {line: 1, column: 8},
end: {line: 1, column: 54}
}
},
loc: {
start: {line: 1, column: 4},
end: {line: 1, column: 54}
}
}
],
kind: "var",
loc: {
start: {line: 1, column: 0},
end: {line: 1, column: 54}
}
}]
}, {
ecmaVersion: 7,
features: { "es7.asyncFunctions": true },
locations: true
});
test('class Foo { async bar(promise) { await promise } }', {
type: "Program",
body: [{
type: "ClassDeclaration",
id: {
type: "Identifier",
name: "Foo",
loc: {
start: {line: 1, column: 6},
end: {line: 1, column: 9}
}
},
superClass: null,
body: {
type: "ClassBody",
body: [
{
type: "MethodDefinition",
key: {
type: "Identifier",
name: "bar",
loc: {
start: {line: 1, column: 18},
end: {line: 1, column: 21}
}
},
value: {
type: "FunctionExpression",
id: null,
params: [
{
type: "Identifier",
name: "promise",
loc: {
start: {line: 1, column: 22},
end: {line: 1, column: 29}
}
}
],
body: {
type: "BlockStatement",
body: [
{
type: "ExpressionStatement",
expression: {
type: "AwaitExpression",
argument: {
type: "Identifier",
name: "promise",
loc: {
start: {line: 1, column: 39},
end: {line: 1, column: 46}
}
},
loc: {
start: {line: 1, column: 33},
end: {line: 1, column: 46}
}
},
loc: {
start: {line: 1, column: 33},
end: {line: 1, column: 46}
}
}
],
loc: {
start: {line: 1, column: 31},
end: {line: 1, column: 48}
}
},
generator: false,
expression: false,
async: true,
loc: {
start: {line: 1, column: 21},
end: {line: 1, column: 48}
}
},
kind: "method",
static: false,
loc: {
start: {line: 1, column: 12},
end: {line: 1, column: 48}
}
}
],
loc: {
start: {line: 1, column: 10},
end: {line: 1, column: 50}
}
},
loc: {
start: {line: 1, column: 0},
end: {line: 1, column: 50}
}
}]
}, {
ecmaVersion: 7,
features: { "es7.asyncFunctions": true },
locations: true
});
test('f(a, async promise => await promise)', {
type: "Program",
body: [{
type: "ExpressionStatement",
expression: {
type: "CallExpression",
callee: {
type: "Identifier",
name: "f",
loc: {
start: {line: 1, column: 0},
end: {line: 1, column: 1}
}
},
arguments: [
{
type: "Identifier",
name: "a",
loc: {
start: {line: 1, column: 2},
end: {line: 1, column: 3}
}
},
{
type: "ArrowFunctionExpression",
id: null,
params: [
{
type: "Identifier",
name: "promise",
loc: {
start: {line: 1, column: 11},
end: {line: 1, column: 18}
}
}
],
body: {
type: "AwaitExpression",
argument: {
type: "Identifier",
name: "promise",
loc: {
start: {line: 1, column: 28},
end: {line: 1, column: 35}
}
},
loc: {
start: {line: 1, column: 22},
end: {line: 1, column: 35}
}
},
generator: false,
expression: true,
async: true,
loc: {
start: {line: 1, column: 5},
end: {line: 1, column: 35}
}
}
],
loc: {
start: {line: 1, column: 0},
end: {line: 1, column: 36}
}
},
loc: {
start: {line: 1, column: 0},
end: {line: 1, column: 36}
}
}]
}, {
ecmaVersion: 7,
features: { "es7.asyncFunctions": true },
locations: true
});
test('f(a, async(x, y) => await [x, y], b)', {
type: "Program",
body: [{
type: "ExpressionStatement",
expression: {
type: "CallExpression",
callee: {
type: "Identifier",
name: "f",
loc: {
start: {line: 1, column: 0},
end: {line: 1, column: 1}
}
},
arguments: [
{
type: "Identifier",
name: "a",
loc: {
start: {line: 1, column: 2},
end: {line: 1, column: 3}
}
},
{
type: "ArrowFunctionExpression",
id: null,
params: [
{
type: "Identifier",
name: "x",
loc: {
start: {line: 1, column: 11},
end: {line: 1, column: 12}
}
},
{
type: "Identifier",
name: "y",
loc: {
start: {line: 1, column: 14},
end: {line: 1, column: 15}
}
}
],
body: {
type: "AwaitExpression",
argument: {
type: "ArrayExpression",
elements: [
{
type: "Identifier",
name: "x",
loc: {
start: {line: 1, column: 27},
end: {line: 1, column: 28}
}
},
{
type: "Identifier",
name: "y",
loc: {
start: {line: 1, column: 30},
end: {line: 1, column: 31}
}
}
],
loc: {
start: {line: 1, column: 26},
end: {line: 1, column: 32}
}
},
loc: {
start: {line: 1, column: 20},
end: {line: 1, column: 32}
}
},
generator: false,
expression: true,
async: true,
loc: {
start: {line: 1, column: 5},
end: {line: 1, column: 32}
}
},
{
type: "Identifier",
name: "b",
loc: {
start: {line: 1, column: 34},
end: {line: 1, column: 35}
}
}
],
loc: {
start: {line: 1, column: 0},
end: {line: 1, column: 36}
}
},
loc: {
start: {line: 1, column: 0},
end: {line: 1, column: 36}
}
}]
}, {
ecmaVersion: 7,
features: { "es7.asyncFunctions": true },
locations: true
});
test('f(async function(promise) { await promise })', {
type: "Program",
body: [{
type: "ExpressionStatement",
expression: {
type: "CallExpression",
callee: {
type: "Identifier",
name: "f",
loc: {
start: {line: 1, column: 0},
end: {line: 1, column: 1}
}
},
arguments: [
{
type: "FunctionExpression",
id: null,
params: [
{
type: "Identifier",
name: "promise",
loc: {
start: {line: 1, column: 17},
end: {line: 1, column: 24}
}
}
],
body: {
type: "BlockStatement",
body: [
{
type: "ExpressionStatement",
expression: {
type: "AwaitExpression",
argument: {
type: "Identifier",
name: "promise",
loc: {
start: {line: 1, column: 34},
end: {line: 1, column: 41}
}
},
loc: {
start: {line: 1, column: 28},
end: {line: 1, column: 41}
}
},
loc: {
start: {line: 1, column: 28},
end: {line: 1, column: 41}
}
}
],
loc: {
start: {line: 1, column: 26},
end: {line: 1, column: 43}
}
},
generator: false,
expression: false,
async: true,
loc: {
start: {line: 1, column: 2},
end: {line: 1, column: 43}
}
}
],
loc: {
start: {line: 1, column: 0},
end: {line: 1, column: 44}
}
},
loc: {
start: {line: 1, column: 0},
end: {line: 1, column: 44}
}
}]
}, {
ecmaVersion: 7,
features: { "es7.asyncFunctions": true },
locations: true
});
test('f(a, async(1, 2), b)', {
type: "Program",
body: [{
"type": "ExpressionStatement",
"expression": {
"type": "CallExpression",
"callee": {
"type": "Identifier",
"name": "f",
"range": [
0,
1
],
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 1
}
}
},
"arguments": [
{
"type": "Identifier",
"name": "a",
"range": [
2,
3
],
"loc": {
"start": {
"line": 1,
"column": 2
},
"end": {
"line": 1,
"column": 3
}
}
},
{
"type": "CallExpression",
"callee": {
"type": "Identifier",
"name": "async",
"range": [
5,
10
],
"loc": {
"start": {
"line": 1,
"column": 5
},
"end": {
"line": 1,
"column": 10
}
}
},
"arguments": [
{
"type": "Literal",
"value": 1,
"raw": "1",
"range": [
11,
12
],
"loc": {
"start": {
"line": 1,
"column": 11
},
"end": {
"line": 1,
"column": 12
}
}
},
{
"type": "Literal",
"value": 2,
"raw": "2",
"range": [
14,
15
],
"loc": {
"start": {
"line": 1,
"column": 14
},
"end": {
"line": 1,
"column": 15
}
}
}
],
"range": [
5,
16
],
"loc": {
"start": {
"line": 1,
"column": 5
},
"end": {
"line": 1,
"column": 16
}
}
},
{
"type": "Identifier",
"name": "b",
"range": [
18,
19
],
"loc": {
"start": {
"line": 1,
"column": 18
},
"end": {
"line": 1,
"column": 19
}
}
}
],
"range": [
0,
20
],
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 20
}
}
},
"range": [
0,
20
],
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 20
}
}
}]
}, {
ecmaVersion: 7,
features: { "es7.asyncFunctions": true },
locations: true,
ranges: true
});
test('var ok = async(x)', {
type: "Program",
body: [{
"type": "VariableDeclaration",
"declarations": [
{
"type": "VariableDeclarator",
"id": {
"type": "Identifier",
"name": "ok",
"range": [
4,
6
],
"loc": {
"start": {
"line": 1,
"column": 4
},
"end": {
"line": 1,
"column": 6
}
}
},
"init": {
"type": "CallExpression",
"callee": {
"type": "Identifier",
"name": "async",
"range": [
9,
14
],
"loc": {
"start": {
"line": 1,
"column": 9
},
"end": {
"line": 1,
"column": 14
}
}
},
"arguments": [
{
"type": "Identifier",
"name": "x",
"range": [
15,
16
],
"loc": {
"start": {
"line": 1,
"column": 15
},
"end": {
"line": 1,
"column": 16
}
}
}
],
"range": [
9,
17
],
"loc": {
"start": {
"line": 1,
"column": 9
},
"end": {
"line": 1,
"column": 17
}
}
},
"range": [
4,
17
],
"loc": {
"start": {
"line": 1,
"column": 4
},
"end": {
"line": 1,
"column": 17
}
}
}
],
"kind": "var",
"range": [
0,
17
],
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 17
}
}
}]
}, {
ecmaVersion: 7,
features: { "es7.asyncFunctions": true },
locations: true,
ranges: true
});
test('(function() { var async; async = 10 })', {
type: "Program",
body: [{
"type": "ExpressionStatement",
"expression": {
"type": "FunctionExpression",
"id": null,
"params": [],
"body": {
"type": "BlockStatement",
"body": [
{
"type": "VariableDeclaration",
"declarations": [
{
"type": "VariableDeclarator",
"id": {
"type": "Identifier",
"name": "async",
"range": [
18,
23
],
"loc": {
"start": {
"line": 1,
"column": 18
},
"end": {
"line": 1,
"column": 23
}
}
},
"init": null,
"range": [
18,
23
],
"loc": {
"start": {
"line": 1,
"column": 18
},
"end": {
"line": 1,
"column": 23
}
}
}
],
"kind": "var",
"range": [
14,
24
],
"loc": {
"start": {
"line": 1,
"column": 14
},
"end": {
"line": 1,
"column": 24
}
}
},
{
"type": "ExpressionStatement",
"expression": {
"type": "AssignmentExpression",
"operator": "=",
"left": {
"type": "Identifier",
"name": "async",
"range": [
25,
30
],
"loc": {
"start": {
"line": 1,
"column": 25
},
"end": {
"line": 1,
"column": 30
}
}
},
"right": {
"type": "Literal",
"value": 10,
"raw": "10",
"range": [
33,
35
],
"loc": {
"start": {
"line": 1,
"column": 33
},
"end": {
"line": 1,
"column": 35
}
}
},
"range": [
25,
35
],
"loc": {
"start": {
"line": 1,
"column": 25
},
"end": {
"line": 1,
"column": 35
}
}
},
"range": [
25,
35
],
"loc": {
"start": {
"line": 1,
"column": 25
},
"end": {
"line": 1,
"column": 35
}
}
}
],
"range": [
12,
37
],
"loc": {
"start": {
"line": 1,
"column": 12
},
"end": {
"line": 1,
"column": 37
}
}
},
"generator": false,
"expression": false,
"range": [
1,
37
],
"loc": {
"start": {
"line": 1,
"column": 1
},
"end": {
"line": 1,
"column": 37
}
}
},
"range": [
0,
38
],
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 38
}
}
}]
}, {
ecmaVersion: 7,
features: { "es7.asyncFunctions": true },
locations: true,
ranges: true
});
test('class Test { async() {} }', {
type: "Program",
start: 0,
end: 25,
body: [{
type: "ClassDeclaration",
start: 0,
end: 25,
id: {
type: "Identifier",
start: 6,
end: 10,
name: "Test"
},
superClass: null,
body: {
type: "ClassBody",
start: 11,
end: 25,
body: [{
type: "MethodDefinition",
start: 13,
end: 23,
static: false,
key: {
type: "Identifier",
start: 13,
end: 18,
name: "async"
},
kind: "method",
value: {
type: "FunctionExpression",
start: 18,
end: 23,
id: null,
params: [],
generator: false,
async: false,
body: {
type: "BlockStatement",
start: 21,
end: 23,
body: []
},
expression: false
}
}]
}
}]
}, {
ecmaVersion: 7,
features: { "es7.asyncFunctions": true }
});
test('var obj = { async: "test" };', {
type: "Program",
start: 0,
end: 28,
body: [{
type: "VariableDeclaration",
start: 0,
end: 28,
declarations: [{
type: "VariableDeclarator",
start: 4,
end: 27,
id: {
type: "Identifier",
start: 4,
end: 7,
name: "obj"
},
init: {
type: "ObjectExpression",
start: 10,
end: 27,
properties: [{
type: "Property",
start: 12,
end: 25,
method: false,
shorthand: false,
key: {
type: "Identifier",
start: 12,
end: 17,
name: "async"
},
value: {
type: "Literal",
start: 19,
end: 25,
value: "test",
raw: "\"test\""
},
kind: "init"
}]
}
}],
kind: "var"
}]
}, {
ecmaVersion: 7,
features: { "es7.asyncFunctions": true }
});
test('var obj = { async() {} };', {
type: "Program",
start: 0,
end: 25,
body: [{
type: "VariableDeclaration",
start: 0,
end: 25,
declarations: [{
type: "VariableDeclarator",
start: 4,
end: 24,
id: {
type: "Identifier",
start: 4,
end: 7,
name: "obj"
},
init: {
type: "ObjectExpression",
start: 10,
end: 24,
properties: [{
type: "Property",
start: 12,
end: 22,
method: true,
shorthand: false,
key: {
type: "Identifier",
start: 12,
end: 17,
name: "async"
},
kind: "init",
value: {
type: "FunctionExpression",
start: 17,
end: 22,
id: null,
params: [],
generator: false,
body: {
type: "BlockStatement",
start: 20,
end: 22,
body: []
},
expression: false
}
}]
}
}],
kind: "var"
}]
}, {
ecmaVersion: 7,
features: { "es7.asyncFunctions": true }
});
test('export async function foo(){}', {
"type": "Program",
"start": 0,
"end": 29,
"body": [{
"type": "ExportNamedDeclaration",
"start": 0,
"end": 29,
"declaration": {
"type": "FunctionDeclaration",
"start": 7,
"end": 29,
"id": {
"type": "Identifier",
"start": 22,
"end": 25,
"name": "foo"
},
"params": [],
"generator": false,
"async": true,
"body": {
"type": "BlockStatement",
"start": 27,
"end": 29,
"body": []
},
"expression": false
},
"specifiers": [],
"source": null
}]
}, {
ecmaVersion: 7,
sourceType: "module",
features: { "es7.asyncFunctions": true }
});
// ES7 decorators - https://github.com/wycats/javascript-decorators
test("@foo class Foo {}", {
"start": 0,
"body": [
{
"start": 5,
"decorators": [
{
"start": 0,
"expression": {
"start": 1,
"name": "foo",
"type": "Identifier",
"end": 4
},
"type": "Decorator",
"end": 4
}
],
"id": {
"start": 11,
"name": "Foo",
"type": "Identifier",
"end": 14
},
"superClass": null,
"body": {
"start": 15,
"body": [],
"type": "ClassBody",
"end": 17
},
"type": "ClassDeclaration",
"end": 17
}
],
"type": "Program",
"end": 17
}, {
ecmaVersion: 6,
features: { "es7.decorators": true }
});
test("var Foo = @foo class Foo {}", {
"start": 0,
"body": [
{
"start": 0,
"declarations": [
{
"start": 4,
"id": {
"start": 4,
"name": "Foo",
"type": "Identifier",
"end": 7
},
"init": {
"start": 15,
"decorators": [
{
"start": 10,
"expression": {
"start": 11,
"name": "foo",
"type": "Identifier",
"end": 14
},
"type": "Decorator",
"end": 14
}
],
"id": {
"start": 21,
"name": "Foo",
"type": "Identifier",
"end": 24
},
"superClass": null,
"body": {
"start": 25,
"body": [],
"type": "ClassBody",
"end": 27
},
"type": "ClassExpression",
"end": 27
},
"type": "VariableDeclarator",
"end": 27
}
],
"kind": "var",
"type": "VariableDeclaration",
"end": 27
}
],
"type": "Program",
"end": 27
}, {
ecmaVersion: 6,
features: { "es7.decorators": true }
});
test("class Foo { @foo bar() {} }", {
"start": 0,
"body": [
{
"start": 0,
"id": {
"start": 6,
"name": "Foo",
"type": "Identifier",
"end": 9
},
"superClass": null,
"body": {
"start": 10,
"body": [
{
"start": 17,
"decorators": [
{
"start": 12,
"expression": {
"start": 13,
"name": "foo",
"type": "Identifier",
"end": 16
},
"type": "Decorator",
"end": 16
}
],
"computed": false,
"key": {
"start": 17,
"name": "bar",
"type": "Identifier",
"end": 20
},
"static": false,
"kind": "method",
"value": {
"start": 20,
"id": null,
"generator": false,
"expression": false,
"params": [],
"body": {
"start": 23,
"body": [],
"type": "BlockStatement",
"end": 25
},
"type": "FunctionExpression",
"end": 25
},
"type": "MethodDefinition",
"end": 25
}
],
"type": "ClassBody",
"end": 27
},
"type": "ClassDeclaration",
"end": 27
}
],
"type": "Program",
"end": 27
}, {
ecmaVersion: 6,
features: { "es7.decorators": true }
});
test("class Foo { @foo set bar(f) {} }", {
"start": 0,
"body": [
{
"start": 0,
"id": {
"start": 6,
"name": "Foo",
"type": "Identifier",
"end": 9
},
"superClass": null,
"body": {
"start": 10,
"body": [
{
"start": 17,
"decorators": [
{
"start": 12,
"expression": {
"start": 13,
"name": "foo",
"type": "Identifier",
"end": 16
},
"type": "Decorator",
"end": 16
}
],
"computed": false,
"key": {
"start": 21,
"name": "bar",
"type": "Identifier",
"end": 24
},
"static": false,
"kind": "set",
"value": {
"start": 24,
"id": null,
"generator": false,
"expression": false,
"params": [{
"type": "Identifier",
"name": "f"
}],
"body": {
"start": 28,
"body": [],
"type": "BlockStatement",
"end": 30
},
"type": "FunctionExpression",
"end": 30
},
"type": "MethodDefinition",
"end": 30
}
],
"type": "ClassBody",
"end": 32
},
"type": "ClassDeclaration",
"end": 32
}
],
"type": "Program",
"end": 32
}, {
ecmaVersion: 6,
features: { "es7.decorators": true }
});
test("class Foo { @foo get bar() {} }", {
"start": 0,
"body": [
{
"start": 0,
"id": {
"start": 6,
"name": "Foo",
"type": "Identifier",
"end": 9
},
"superClass": null,
"body": {
"start": 10,
"body": [
{
"start": 17,
"decorators": [
{
"start": 12,
"expression": {
"start": 13,
"name": "foo",
"type": "Identifier",
"end": 16
},
"type": "Decorator",
"end": 16
}
],
"computed": false,
"key": {
"start": 21,
"name": "bar",
"type": "Identifier",
"end": 24
},
"static": false,
"kind": "get",
"value": {
"start": 24,
"id": null,
"generator": false,
"expression": false,
"params": [],
"body": {
"start": 27,
"body": [],
"type": "BlockStatement",
"end": 29
},
"type": "FunctionExpression",
"end": 29
},
"type": "MethodDefinition",
"end": 29
}
],
"type": "ClassBody",
"end": 31
},
"type": "ClassDeclaration",
"end": 31
}
],
"type": "Program",
"end": 31
}, {
ecmaVersion: 6,
features: { "es7.decorators": true }
});
test("class Foo { @foo @bar bar() {} }", {
"start": 0,
"body": [
{
"start": 0,
"id": {
"start": 6,
"name": "Foo",
"type": "Identifier",
"end": 9
},
"superClass": null,
"body": {
"start": 10,
"body": [
{
"start": 22,
"decorators": [
{
"start": 12,
"expression": {
"start": 13,
"name": "foo",
"type": "Identifier",
"end": 16
},
"type": "Decorator",
"end": 16
},
{
"start": 17,
"expression": {
"start": 18,
"name": "bar",
"type": "Identifier",
"end": 21
},
"type": "Decorator",
"end": 21
}
],
"computed": false,
"key": {
"start": 22,
"name": "bar",
"type": "Identifier",
"end": 25
},
"static": false,
"kind": "method",
"value": {
"start": 25,
"id": null,
"generator": false,
"expression": false,
"params": [],
"body": {
"start": 28,
"body": [],
"type": "BlockStatement",
"end": 30
},
"type": "FunctionExpression",
"end": 30
},
"type": "MethodDefinition",
"end": 30
}
],
"type": "ClassBody",
"end": 32
},
"type": "ClassDeclaration",
"end": 32
}
],
"type": "Program",
"end": 32
}, {
ecmaVersion: 6,
features: { "es7.decorators": true }
});
test('@foo({ @bar foo: "bar" }) @bar class Foo {}', {
"start": 0,
"body": [{
"start": 31,
"decorators": [{
"start": 0,
"expression": {
"start": 1,
"callee": {
"start": 1,
"name": "foo",
"type": "Identifier",
"end": 4
},
"arguments": [{
"start": 5,
"properties": [{
"start": 12,
"decorators": [{
"start": 7,
"expression": {
"start": 8,
"name": "bar",
"type": "Identifier",
"end": 11
},
"type": "Decorator",
"end": 11
}],
"method": false,
"shorthand": false,
"computed": false,
"key": {
"start": 12,
"name": "foo",
"type": "Identifier",
"end": 15
},
"value": {
"start": 17,
"value": "bar",
"raw": "\"bar\"",
"type": "Literal",
"end": 22
},
"kind": "init",
"type": "Property",
"end": 22
}],
"type": "ObjectExpression",
"end": 24
}],
"type": "CallExpression",
"end": 25
},
"type": "Decorator",
"end": 25
},
{
"start": 26,
"expression": {
"start": 27,
"name": "bar",
"type": "Identifier",
"end": 30
},
"type": "Decorator",
"end": 30
}],
"id": {
"start": 37,
"name": "Foo",
"type": "Identifier",
"end": 40
},
"superClass": null,
"body": {
"start": 41,
"body": [],
"type": "ClassBody",
"end": 43
},
"type": "ClassDeclaration",
"end": 43
}],
"sourceType": "script",
"type": "Program",
"end": 43
}, {
ecmaVersion: 6,
features: { "es7.decorators": true }
});
test('@bar class Foo extends @foo class Bar {} {}', {
"start": 0,
"body": [{
"start": 5,
"decorators": [{
"start": 0,
"expression": {
"start": 1,
"name": "bar",
"type": "Identifier",
"end": 4
},
"type": "Decorator",
"end": 4
}],
"id": {
"start": 11,
"name": "Foo",
"type": "Identifier",
"end": 14
},
"superClass": {
"start": 28,
"decorators": [{
"start": 23,
"expression": {
"start": 24,
"name": "foo",
"type": "Identifier",
"end": 27
},
"type": "Decorator",
"end": 27
}],
"id": {
"start": 34,
"name": "Bar",
"type": "Identifier",
"end": 37
},
"superClass": null,
"body": {
"start": 38,
"body": [],
"type": "ClassBody",
"end": 40
},
"type": "ClassExpression",
"end": 40
},
"body": {
"start": 41,
"body": [],
"type": "ClassBody",
"end": 43
},
"type": "ClassDeclaration",
"end": 43
}],
"sourceType": "script",
"type": "Program",
"end": 43
}, {
ecmaVersion: 6,
features: { "es7.decorators": true }
});
testFail("@foo function bar() {}", "Leading decorators must be attached to a class declaration (1:5)", {
ecmaVersion: 6,
features: { "es7.decorators": true }
})
testFail("class Foo { @foo }", "You have trailing decorators with no method (1:18)", {
ecmaVersion: 6,
features: { "es7.decorators": true }
})
// ES7 class property initializers - https://gist.github.com/jeffmo/054df782c05639da2adb
test('class Foo { foo = "bar"; }', {
"start": 0,
"body": [
{
"start": 0,
"id": {
"start": 6,
"name": "Foo",
"type": "Identifier",
"end": 9
},
"superClass": null,
"body": {
"start": 10,
"body": [
{
"start": 12,
"computed": false,
"key": {
"start": 12,
"name": "foo",
"type": "Identifier",
"end": 15
},
"static": false,
"value": {
"start": 18,
"value": "bar",
"raw": "\"bar\"",
"type": "Literal",
"end": 23
},
"type": "ClassProperty",
"end": 24
}
],
"type": "ClassBody",
"end": 26
},
"type": "ClassDeclaration",
"end": 26
}
],
"type": "Program",
"end": 26
}, {
ecmaVersion: 6,
features: { "es7.classProperties": true }
});
test('class Foo { foo; }', {
"start": 0,
"body": [
{
"start": 0,
"id": {
"start": 6,
"name": "Foo",
"type": "Identifier",
"end": 9
},
"superClass": null,
"body": {
"start": 10,
"body": [
{
"start": 12,
"computed": false,
"key": {
"start": 12,
"name": "foo",
"type": "Identifier",
"end": 15
},
"static": false,
"value": null,
"type": "ClassProperty",
"end": 16
}
],
"type": "ClassBody",
"end": 18
},
"type": "ClassDeclaration",
"end": 18
}
],
"type": "Program",
"end": 18
}, {
ecmaVersion: 6,
features: { "es7.classProperties": true }
});
test('class Foo { static foo; }', {
"start": 0,
"body": [
{
"start": 0,
"id": {
"start": 6,
"name": "Foo",
"type": "Identifier",
"end": 9
},
"superClass": null,
"body": {
"start": 10,
"body": [
{
"start": 12,
"computed": false,
"key": {
"start": 19,
"name": "foo",
"type": "Identifier",
"end": 22
},
"static": true,
"value": null,
"type": "ClassProperty",
"end": 23
}
],
"type": "ClassBody",
"end": 25
},
"type": "ClassDeclaration",
"end": 25
}
],
"type": "Program",
"end": 25
}, {
ecmaVersion: 6,
features: { "es7.classProperties": true }
});
test('class Foo { static foo = "bar"; }', {
"start": 0,
"body": [
{
"start": 0,
"id": {
"start": 6,
"name": "Foo",
"type": "Identifier",
"end": 9
},
"superClass": null,
"body": {
"start": 10,
"body": [
{
"start": 12,
"computed": false,
"key": {
"start": 19,
"name": "foo",
"type": "Identifier",
"end": 22
},
"static": true,
"value": {
"start": 25,
"value": "bar",
"raw": "\"bar\"",
"type": "Literal",
"end": 30
},
"type": "ClassProperty",
"end": 31
}
],
"type": "ClassBody",
"end": 33
},
"type": "ClassDeclaration",
"end": 33
}
],
"type": "Program",
"end": 33
}, {
ecmaVersion: 6,
features: { "es7.classProperties": true }
});
test('class Foo { @bar foo = "bar"; }', {
"start": 0,
"body": [
{
"start": 0,
"id": {
"start": 6,
"name": "Foo",
"type": "Identifier",
"end": 9
},
"superClass": null,
"body": {
"start": 10,
"body": [
{
"start": 17,
"decorators": [
{
"start": 12,
"expression": {
"start": 13,
"name": "bar",
"type": "Identifier",
"end": 16
},
"type": "Decorator",
"end": 16
}
],
"computed": false,
"key": {
"start": 17,
"name": "foo",
"type": "Identifier",
"end": 20
},
"static": false,
"value": {
"start": 23,
"value": "bar",
"raw": "\"bar\"",
"type": "Literal",
"end": 28
},
"type": "ClassProperty",
"end": 29
}
],
"type": "ClassBody",
"end": 31
},
"type": "ClassDeclaration",
"end": 31
}
],
"type": "Program",
"end": 31
}, {
ecmaVersion: 6,
features: { "es7.classProperties": true, "es7.decorators": true }
});
test('class Foo { @bar static foo = "bar"; }', {
"start": 0,
"body": [
{
"start": 0,
"id": {
"start": 6,
"name": "Foo",
"type": "Identifier",
"end": 9
},
"superClass": null,
"body": {
"start": 10,
"body": [
{
"start": 17,
"decorators": [
{
"start": 12,
"expression": {
"start": 13,
"name": "bar",
"type": "Identifier",
"end": 16
},
"type": "Decorator",
"end": 16
}
],
"computed": false,
"key": {
"start": 24,
"name": "foo",
"type": "Identifier",
"end": 27
},
"static": true,
"value": {
"start": 30,
"value": "bar",
"raw": "\"bar\"",
"type": "Literal",
"end": 35
},
"type": "ClassProperty",
"end": 36
}
],
"type": "ClassBody",
"end": 38
},
"type": "ClassDeclaration",
"end": 38
}
],
"type": "Program",
"end": 38
}, {
ecmaVersion: 6,
features: { "es7.classProperties": true, "es7.decorators": true }
});
test("var obj = { @foo bar: 'wow' };", {
"start": 0,
"body": [{
"start": 0,
"declarations": [{
"start": 4,
"id": {
"start": 4,
"name": "obj",
"type": "Identifier",
"end": 7
},
"init": {
"start": 10,
"properties": [{
"start": 17,
"key": {
"start": 17,
"name": "bar",
"type": "Identifier",
"end": 20
},
"value": {
"start": 22,
"value": "wow",
"raw": "'wow'",
"type": "Literal",
"end": 27
},
"kind": "init",
"decorators": [{
"start": 12,
"expression": {
"start": 13,
"name": "foo",
"type": "Identifier",
"end": 16
},
"type": "Decorator",
"end": 16
}],
"type": "Property",
"end": 27
}],
"type": "ObjectExpression",
"end": 29
},
"type": "VariableDeclarator",
"end": 29
}],
"kind": "var",
"type": "VariableDeclaration",
"end": 30
}],
"type": "Program",
"end": 30
}, {
features: { "es7.decorators": true }
});
// ES7 export extensions - https://github.com/leebyron/ecmascript-more-export-from
test('export foo, { bar } from "bar";', {
type: "Program",
body: [{
type: "ExportNamedDeclaration",
start: 0,
end: 31,
specifiers: [{
type: "ExportDefaultSpecifier",
exported: {
type: "Identifier",
name: "foo",
start: 7,
end: 10,
}
}, {
type: "ExportSpecifier",
exported: {
type: "Identifier",
name: "bar"
}
}],
source: {
type: "Literal",
value: "bar",
start: 25,
end: 30
}
}]
}, {
ecmaVersion: 7,
sourceType: "module",
features: { "es7.exportExtensions": true }
});
test('export * as foo, { bar } from "bar";', {
type: "Program",
body: [{
type: "ExportNamedDeclaration",
start: 0,
end: 36,
specifiers: [{
type: "ExportNamespaceSpecifier",
exported: {
type: "Identifier",
name: "foo",
start: 12,
end: 15,
}
}, {
type: "ExportSpecifier",
exported: {
type: "Identifier",
name: "bar"
}
}],
source: {
type: "Literal",
value: "bar",
start: 30,
end: 35
}
}]
}, {
ecmaVersion: 7,
sourceType: "module",
features: { "es7.exportExtensions": true }
});
test('export foo from "bar";', {
type: "Program",
body: [{
type: "ExportNamedDeclaration",
start: 0,
end: 22,
specifiers: [{
type: "ExportDefaultSpecifier",
exported: {
type: "Identifier",
name: "foo",
start: 7,
end: 10,
}
}],
source: {
type: "Literal",
value: "bar",
start: 16,
end: 21
}
}]
}, {
ecmaVersion: 7,
sourceType: "module",
features: { "es7.exportExtensions": true }
});
test('export default from "bar";', {
type: "Program",
body: [{
type: "ExportNamedDeclaration",
start: 0,
end: 26,
specifiers: [{
type: "ExportDefaultSpecifier",
exported: {
type: "Identifier",
name: "default",
start: 7,
end: 14,
}
}],
source: {
type: "Literal",
value: "bar",
start: 20,
end: 25
}
}]
}, {
ecmaVersion: 7,
sourceType: "module",
features: { "es7.exportExtensions": true }
});
test('export * as foo from "bar";', {
type: "Program",
body: [{
type: "ExportNamedDeclaration",
start: 0,
end: 27,
specifiers: [{
type: "ExportNamespaceSpecifier",
exported: {
type: "Identifier",
name: "foo",
start: 12,
end: 15,
}
}],
source: {
type: "Literal",
value: "bar",
start: 21,
end: 26
}
}]
}, {
ecmaVersion: 7,
sourceType: "module",
features: { "es7.exportExtensions": true }
});
// ES7: Trailing Function Commas
test("log(n, '=', 2,);", {
type: "Program",
start: 0,
end: 16,
body: [{
type: "ExpressionStatement",
start: 0,
end: 16,
expression: {
type: "CallExpression",
callee: {
type: "Identifier",
name: "log",
start: 0,
end: 3
},
arguments: [{
type: "Identifier",
name: "n",
start: 4,
end: 5
}, {
type: "Literal",
value: "=",
raw: "'='",
start: 7,
end: 10
}, {
type: "Literal",
raw: "2",
value: 2,
start: 12,
end: 13
}]
}
}]
}, {
ecmaVersion: 7,
features: { "es7.trailingFunctionCommas": true }
});
test("function log(n, op, val,) { }", {
type: "Program",
start: 0,
end: 29,
body: [{
type: "FunctionDeclaration",
id: {
type: "Identifier",
name: "log",
start: 9,
end: 12
},
start: 0,
end: 29,
expression: false,
params: [{
type: "Identifier",
name: "n",
start: 13,
end: 14
}, {
type: "Identifier",
name: "op",
start: 16,
end: 18
}, {
type: "Identifier",
name: "val",
start: 20,
end: 23
}],
body: {
type: "BlockStatement",
start: 26,
end: 29,
body: []
}
}]
}, {
ecmaVersion: 7,
features: { "es7.trailingFunctionCommas": true }
});
test("class Foo { bar(a,) { } }", {
type: "Program",
start: 0,
end: 25,
body: [{
type: "ClassDeclaration",
start: 0,
end: 25,
id: {
type: "Identifier",
name: "Foo",
start: 6,
end: 9
},
superClass: null,
body: {
type: "ClassBody",
start: 10,
end: 25,
body: [{
type: "MethodDefinition",
start: 12,
end: 23,
static: false,
key: {
type: "Identifier",
start: 12,
end: 15,
name: "bar"
},
kind: "method",
value: {
type: "FunctionExpression",
start: 15,
end: 23,
id: null,
params: [{
type: "Identifier",
name: "a",
start: 16,
end: 17
}],
generator: false,
body: {
type: "BlockStatement",
start: 20,
end: 23,
body: []
},
expression: false
}
}]
}
}]
}, {
ecmaVersion: 7,
features: { "es7.trailingFunctionCommas": true }
});
test("(x, y, ) => 1;", {
start: 0,
body: [{
start: 0,
expression: {
start: 0,
id: null,
generator: false,
expression: true,
params: [
{
start: 1,
name: "x",
type: "Identifier",
end: 2
},
{
start: 4,
name: "y",
type: "Identifier",
end: 5
}
],
body: {
start: 12,
value: 1,
raw: "1",
type: "Literal",
end: 13
},
type: "ArrowFunctionExpression",
end: 13
},
type: "ExpressionStatement",
end: 14
}],
type: "Program",
end: 14
}, {
ecmaVersion: 7,
features: { "es7.trailingFunctionCommas": true }
});
testFail("log(,);", "Unexpected token (1:4)", {
ecmaVersion: 7,
features: { "es7.trailingFunctionCommas": true }
});
testFail("function log(,) { }", "Unexpected token (1:13)", {
ecmaVersion: 7,
features: { "es7.trailingFunctionCommas": true }
});
testFail("('foo',)", "Unexpected token (1:7)", {
ecmaVersion: 7,
features: { "es7.trailingFunctionCommas": true }
});