Add handling parens for extends clause in generator (#6897)
This commit is contained in:
parent
7d8932b6be
commit
881fc14329
@ -27,6 +27,10 @@ const PRECEDENCE = {
|
|||||||
"**": 10,
|
"**": 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 {
|
export function NullableTypeAnnotation(node: Object, parent: Object): boolean {
|
||||||
return t.isArrayTypeAnnotation(parent);
|
return t.isArrayTypeAnnotation(parent);
|
||||||
}
|
}
|
||||||
@ -35,7 +39,10 @@ export { NullableTypeAnnotation as FunctionTypeAnnotation };
|
|||||||
|
|
||||||
export function UpdateExpression(node: Object, parent: Object): boolean {
|
export function UpdateExpression(node: Object, parent: Object): boolean {
|
||||||
// (foo++).test()
|
// (foo++).test()
|
||||||
return t.isMemberExpression(parent) && parent.object === node;
|
return (
|
||||||
|
(t.isMemberExpression(parent) && parent.object === node) ||
|
||||||
|
isClassExtendsClause(node, parent)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function ObjectExpression(
|
export function ObjectExpression(
|
||||||
@ -62,6 +69,10 @@ export function Binary(node: Object, parent: Object): boolean {
|
|||||||
return parent.left === node;
|
return parent.left === node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isClassExtendsClause(node, parent)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
((t.isCallExpression(parent) || t.isNewExpression(parent)) &&
|
((t.isCallExpression(parent) || t.isNewExpression(parent)) &&
|
||||||
parent.callee === node) ||
|
parent.callee === node) ||
|
||||||
@ -151,7 +162,8 @@ export function YieldExpression(node: Object, parent: Object): boolean {
|
|||||||
t.isCallExpression(parent) ||
|
t.isCallExpression(parent) ||
|
||||||
t.isMemberExpression(parent) ||
|
t.isMemberExpression(parent) ||
|
||||||
t.isNewExpression(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.isMemberExpression(parent, { object: node }) ||
|
||||||
t.isCallExpression(parent, { callee: node }) ||
|
t.isCallExpression(parent, { callee: node }) ||
|
||||||
t.isNewExpression(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
|
// Walk up the print stack to determine if our node can come first
|
||||||
// in statement.
|
// in statement.
|
||||||
function isFirstInStatement(
|
function isFirstInStatement(
|
||||||
|
|||||||
22
packages/babel-generator/test/fixtures/parentheses/class-extends/actual.js
vendored
Normal file
22
packages/babel-generator/test/fixtures/parentheses/class-extends/actual.js
vendored
Normal 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) {}
|
||||||
|
}
|
||||||
35
packages/babel-generator/test/fixtures/parentheses/class-extends/expected.js
vendored
Normal file
35
packages/babel-generator/test/fixtures/parentheses/class-extends/expected.js
vendored
Normal 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) {}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user