Add handling parens for extends clause in generator (#6897)

This commit is contained in:
Brian Ng 2017-11-27 12:08:35 -06:00 committed by GitHub
parent 7d8932b6be
commit 881fc14329
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 77 additions and 3 deletions

View File

@ -27,6 +27,10 @@ const PRECEDENCE = {
"**": 10,
};
const isClassExtendsClause = (node: Object, parent: Object): boolean =>
(t.isClassDeclaration(parent) || t.isClassExpression(parent)) &&
parent.superClass === node;
export function NullableTypeAnnotation(node: Object, parent: Object): boolean {
return t.isArrayTypeAnnotation(parent);
}
@ -35,7 +39,10 @@ export { NullableTypeAnnotation as FunctionTypeAnnotation };
export function UpdateExpression(node: Object, parent: Object): boolean {
// (foo++).test()
return t.isMemberExpression(parent) && parent.object === node;
return (
(t.isMemberExpression(parent) && parent.object === node) ||
isClassExtendsClause(node, parent)
);
}
export function ObjectExpression(
@ -62,6 +69,10 @@ export function Binary(node: Object, parent: Object): boolean {
return parent.left === node;
}
if (isClassExtendsClause(node, parent)) {
return true;
}
if (
((t.isCallExpression(parent) || t.isNewExpression(parent)) &&
parent.callee === node) ||
@ -151,7 +162,8 @@ export function YieldExpression(node: Object, parent: Object): boolean {
t.isCallExpression(parent) ||
t.isMemberExpression(parent) ||
t.isNewExpression(parent) ||
(t.isConditionalExpression(parent) && node === parent.test)
(t.isConditionalExpression(parent) && node === parent.test) ||
isClassExtendsClause(node, parent)
);
}
@ -170,7 +182,8 @@ export function UnaryLike(node: Object, parent: Object): boolean {
t.isMemberExpression(parent, { object: node }) ||
t.isCallExpression(parent, { callee: node }) ||
t.isNewExpression(parent, { callee: node }) ||
t.isBinaryExpression(parent, { operator: "**", left: node })
t.isBinaryExpression(parent, { operator: "**", left: node }) ||
isClassExtendsClause(node, parent)
);
}
@ -210,6 +223,10 @@ export function AssignmentExpression(node: Object): boolean {
}
}
export function NewExpression(node: Object, parent: Object): boolean {
return isClassExtendsClause(node, parent);
}
// Walk up the print stack to determine if our node can come first
// in statement.
function isFirstInStatement(

View File

@ -0,0 +1,22 @@
class A extends (() => {}) {}
class A extends (B = C) {}
class A extends (B || C) {}
class A extends (B + C) {}
class A extends B() {}
class A extends class {} {}
class A extends (B ? C : D) {}
class A extends (new B()) {}
class A extends (B, C) {}
class A extends ({}) {}
class A extends B.C {}
class A extends function() {} {}
class A extends (void B) {}
class A extends (++B) {}
async function f() {
class A extends (await C) {}
}
function* f() {
class A extends (yield 1) {}
}

View File

@ -0,0 +1,35 @@
class A extends (() => {}) {}
class A extends (B = C) {}
class A extends (B || C) {}
class A extends (B + C) {}
class A extends B() {}
class A extends class {} {}
class A extends (B ? C : D) {}
class A extends (new B()) {}
class A extends (B, C) {}
class A extends {} {}
class A extends B.C {}
class A extends function () {} {}
class A extends (void B) {}
class A extends (++B) {}
async function f() {
class A extends (await C) {}
}
function* f() {
class A extends (yield 1) {}
}