Allow static as method name in class (fixes #192).

Add uncommitted tests for #191.
This commit is contained in:
Ingvar Stepanyan 2015-01-09 15:31:01 +02:00
parent 3d9048a692
commit bc2e01aa03
3 changed files with 176 additions and 6 deletions

View File

@ -2510,14 +2510,17 @@
expect(_braceL);
while (!eat(_braceR)) {
var method = startNode();
if (tokType === _name && tokVal === "static") {
next();
var isGenerator = eat(_star);
parsePropertyName(method);
if (tokType !== _parenL && !method.computed && method.key.type === "Identifier" &&
method.key.name === "static") {
if (isGenerator) unexpected();
method['static'] = true;
isGenerator = eat(_star);
parsePropertyName(method);
} else {
method['static'] = false;
}
var isGenerator = eat(_star);
parsePropertyName(method);
if (tokType !== _parenL && !method.computed && method.key.type === "Identifier" &&
(method.key.name === "get" || method.key.name === "set")) {
if (isGenerator) unexpected();

View File

@ -862,7 +862,7 @@
var prop = startNode(), isGenerator;
if (options.ecmaVersion >= 6) {
if (isClass) {
if (prop['static'] = (token.type === tt.name && token.value === "static")) next();
prop['static'] = false;
} else {
prop.method = false;
prop.shorthand = false;
@ -871,6 +871,16 @@
}
parsePropertyName(prop);
if (isDummy(prop.key)) { if (isDummy(parseExpression(true))) next(); eat(tt.comma); continue; }
if (isClass) {
if (prop.key.type === "Identifier" && !prop.computed && prop.key.name === "static" &&
(token.type != tt.parenL && token.type != tt.braceL)) {
prop['static'] = true;
isGenerator = eat(tt.star);
parsePropertyName(prop);
} else {
prop['static'] = false;
}
}
if (!isClass && eat(tt.colon)) {
prop.kind = "init";
prop.value = parseExpression(true);
@ -883,7 +893,7 @@
}
prop.value = parseMethod(isGenerator);
} else if (options.ecmaVersion >= 5 && prop.key.type === "Identifier" &&
(prop.key.name === "get" || prop.key.name === "set") &&
!prop.computed && (prop.key.name === "get" || prop.key.name === "set") &&
(token.type != tt.comma && token.type != tt.braceR)) {
prop.kind = prop.key.name;
parsePropertyName(prop);

View File

@ -14598,3 +14598,160 @@ test("var [localVar = defaultValue] = obj", {
locations: true,
loose: false
});
// https://github.com/marijnh/acorn/issues/191
test("try {} catch ({message}) {}", {
type: "Program",
range: [0, 27],
body: [{
type: "TryStatement",
range: [0, 27],
block: {
type: "BlockStatement",
range: [4, 6],
body: []
},
handler: {
type: "CatchClause",
range: [7, 27],
param: {
type: "ObjectPattern",
range: [14, 23],
properties: [{
type: "Property",
range: [15, 22],
method: false,
shorthand: true,
computed: false,
key: {
type: "Identifier",
range: [15, 22],
name: "message"
},
kind: "init",
value: {
type: "Identifier",
range: [15, 22],
name: "message"
}
}]
},
guard: null,
body: {
type: "BlockStatement",
range: [25, 27],
body: []
}
},
guardedHandlers: [],
finalizer: null
}]
}, {
ecmaVersion: 6,
ranges: true,
locations: true,
loose: false
});
// https://github.com/marijnh/acorn/issues/192
test("class A { static() {} }", {
type: "Program",
range: [0, 23],
body: [{
type: "ClassDeclaration",
range: [0, 23],
id: {
type: "Identifier",
range: [6, 7],
name: "A"
},
superClass: null,
body: {
type: "ClassBody",
range: [8, 23],
body: [{
type: "MethodDefinition",
range: [10, 21],
computed: false,
key: {
type: "Identifier",
range: [10, 16],
name: "static"
},
static: false,
kind: "",
value: {
type: "FunctionExpression",
range: [16, 21],
id: null,
params: [],
defaults: [],
rest: null,
generator: false,
body: {
type: "BlockStatement",
range: [19, 21],
body: []
},
expression: false
}
}]
}
}]
}, {
ecmaVersion: 6,
ranges: true,
locations: true
});
test("class A { *static() {} }", {
type: "Program",
range: [0, 24],
body: [{
type: "ClassDeclaration",
range: [0, 24],
id: {
type: "Identifier",
range: [6, 7],
name: "A"
},
superClass: null,
body: {
type: "ClassBody",
range: [8, 24],
body: [{
type: "MethodDefinition",
range: [10, 22],
computed: false,
key: {
type: "Identifier",
range: [11, 17],
name: "static"
},
static: false,
kind: "",
value: {
type: "FunctionExpression",
range: [17, 22],
id: null,
params: [],
defaults: [],
rest: null,
generator: true,
body: {
type: "BlockStatement",
range: [20, 22],
body: []
},
expression: false
}
}]
}
}]
}, {
ecmaVersion: 6,
ranges: true,
locations: true
});