Fix class extends parenthesis (#396)
This should fix all of the issues with the fuzzer :) Fixes #387
This commit is contained in:
1 parent
9a71a907e5
commit
fac5cd0801
4 files changed
+190
-4
No files matched your search
+18
-4
@@ -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) {}
|
||||
}
|
||||
"
|
||||
`;
|
||||
@@ -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) {}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
run_spec(__dirname);
|
||||
Reference in new issue
Block a user