Fix class extends parenthesis (#396)

This should fix all of the issues with the fuzzer :)

Fixes #387
This commit is contained in:
Christopher Chedeau authored and GitHub committed 2017-01-22 14:19:53 -08:00
1 parent 9a71a907e5
commit fac5cd0801
4 files changed
+190 -4

No files matched your search

+18 -4
View File
@@ -192,12 +192,26 @@ FPp.needsParens = function(assumeExpressionContext) {
return false;
}
// Add parens around a `class` that extends an expression (it should
// parse correctly, even if it's invalid)
// Add parens around the extends clause of a class. It is needed for almost
// all expressions.
if (
parent.type === "ClassDeclaration" &&
parent.superClass === node &&
node.type === "AwaitExpression"
parent.superClass === node && (
node.type === "ArrowFunctionExpression" ||
node.type === "AssignmentExpression" ||
node.type === "AwaitExpression" ||
node.type === "BinaryExpression" ||
node.type === "ConditionalExpression" ||
node.type === "LogicalExpression" ||
node.type === "NewExpression" ||
node.type === "ObjectExpression" ||
node.type === "ParenthesizedExpression" ||
node.type === "SequenceExpression" ||
node.type === "TaggedTemplateExpression" ||
node.type === "UnaryExpression" ||
node.type === "UpdateExpression" ||
node.type === "YieldExpression"
)
) {
return true;
}
@@ -0,0 +1,116 @@
exports[`test extends.js 1`] = `
"// \"ArrowFunctionExpression\"
class a extends (() => {}) {}
// \"AssignmentExpression\"
class a extends (b = c) {}
// \"AwaitExpression\"
async function f() {
class a extends (await b) {}
}
// \"BinaryExpression\"
class a extends (b + c) {}
// \"CallExpression\"
class a extends b() {}
// \"ClassExpression\"
class a extends class {} {}
// \"ConditionalExpression\"
class a extends (b ? c : d) {}
// \"FunctionExpression\"
class a extends (function() {}) {}
// \"LogicalExpression\"
class a extends (b || c) {}
// \"MemberExpression\"
class a extends b.c {}
// \"NewExpression\"
class a extends (new B()) {}
// \"ObjectExpression\"
class a extends ({}) {}
// \"SequenceExpression\"
class a extends (b, c) {}
// \"TaggedTemplateExpression\"
class a extends \`\` {}
// \"UnaryExpression\"
class a extends (void b) {}
// \"UpdateExpression\"
class a extends (++b) {}
// \"YieldExpression\"
function* f() {
// Flow has a bug parsing it.
// class a extends (yield 1) {}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// \"ArrowFunctionExpression\"
class a extends (() => {
}) {}
// \"AssignmentExpression\"
class a extends (b = c) {}
// \"AwaitExpression\"
async function f() {
class a extends (await b) {}
}
// \"BinaryExpression\"
class a extends (b + c) {}
// \"CallExpression\"
class a extends b() {}
// \"ClassExpression\"
class a extends class {} {}
// \"ConditionalExpression\"
class a extends (b ? c : d) {}
// \"FunctionExpression\"
class a extends function() {
} {}
// \"LogicalExpression\"
class a extends (b || c) {}
// \"MemberExpression\"
class a extends b.c {}
// \"NewExpression\"
class a extends (new B()) {}
// \"ObjectExpression\"
class a extends ({}) {}
// \"SequenceExpression\"
class a extends (b, c) {}
// \"TaggedTemplateExpression\"
class a extends \`\` {}
// \"UnaryExpression\"
class a extends (void b) {}
// \"UpdateExpression\"
class a extends (++b) {}
// \"YieldExpression\"
function* f() {
// Flow has a bug parsing it.
// class a extends (yield 1) {}
}
"
`;
+55
View File
@@ -0,0 +1,55 @@
// "ArrowFunctionExpression"
class a extends (() => {}) {}
// "AssignmentExpression"
class a extends (b = c) {}
// "AwaitExpression"
async function f() {
class a extends (await b) {}
}
// "BinaryExpression"
class a extends (b + c) {}
// "CallExpression"
class a extends b() {}
// "ClassExpression"
class a extends class {} {}
// "ConditionalExpression"
class a extends (b ? c : d) {}
// "FunctionExpression"
class a extends (function() {}) {}
// "LogicalExpression"
class a extends (b || c) {}
// "MemberExpression"
class a extends b.c {}
// "NewExpression"
class a extends (new B()) {}
// "ObjectExpression"
class a extends ({}) {}
// "SequenceExpression"
class a extends (b, c) {}
// "TaggedTemplateExpression"
class a extends `` {}
// "UnaryExpression"
class a extends (void b) {}
// "UpdateExpression"
class a extends (++b) {}
// "YieldExpression"
function* f() {
// Flow has a bug parsing it.
// class a extends (yield 1) {}
}
+1
View File
@@ -0,0 +1 @@
run_spec(__dirname);