Skip to content

Commit 0df9f62

Browse files
authored
Remove Super from Expression alias (#14750)
1 parent bcf8b22 commit 0df9f62

File tree

17 files changed

+97
-37
lines changed

17 files changed

+97
-37
lines changed

packages/babel-generator/src/generators/expressions.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ export function Super(this: Printer) {
113113
}
114114

115115
function isDecoratorMemberExpression(
116-
node: t.Expression | t.V8IntrinsicIdentifier,
116+
node: t.Expression | t.Super | t.V8IntrinsicIdentifier,
117117
): boolean {
118118
switch (node.type) {
119119
case "Identifier":
@@ -129,7 +129,7 @@ function isDecoratorMemberExpression(
129129
}
130130
}
131131
function shouldParenthesizeDecoratorExpression(
132-
node: t.Expression | t.V8IntrinsicIdentifier,
132+
node: t.Expression | t.Super | t.V8IntrinsicIdentifier,
133133
) {
134134
if (node.type === "CallExpression") {
135135
node = node.callee;

packages/babel-helper-builder-binary-assignment-operator-visitor/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import type * as t from "@babel/types";
55

66
export default function (opts: {
77
build: (
8-
left: t.Expression | t.PrivateName,
8+
left: t.Expression | t.PrivateName | t.Super,
99
right: t.Expression,
1010
) => t.Expression;
1111
operator: t.BinaryExpression["operator"];

packages/babel-helper-create-class-features-plugin/src/fields.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ const privateNameHandlerSpec: Handler<PrivateNameState & Receiver> & Receiver =
258258
{
259259
memoise(member, count) {
260260
const { scope } = member;
261-
const { object } = member.node;
261+
const { object } = member.node as { object: t.Expression };
262262

263263
const memo = scope.maybeGenerateMemoised(object);
264264
if (!memo) {
@@ -269,10 +269,10 @@ const privateNameHandlerSpec: Handler<PrivateNameState & Receiver> & Receiver =
269269
},
270270

271271
receiver(member) {
272-
const { object } = member.node;
272+
const { object } = member.node as { object: t.Expression };
273273

274274
if (this.memoiser.has(object)) {
275-
return t.cloneNode(this.memoiser.get(object) as t.Expression);
275+
return t.cloneNode(this.memoiser.get(object));
276276
}
277277

278278
return t.cloneNode(object);
@@ -466,7 +466,7 @@ const privateNameHandlerLoose: Handler<PrivateNameState> = {
466466
boundGet(member) {
467467
return t.callExpression(
468468
t.memberExpression(this.get(member), t.identifier("bind")),
469-
[t.cloneNode(member.node.object)],
469+
[t.cloneNode(member.node.object as t.Expression)],
470470
);
471471
},
472472

packages/babel-helper-member-expression-to-functions/src/index.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,12 @@ const handle = {
279279
const { object } = regular;
280280
context = member.scope.maybeGenerateMemoised(object);
281281
if (context) {
282-
regular.object = assignmentExpression("=", context, object);
282+
regular.object = assignmentExpression(
283+
"=",
284+
context,
285+
// object must not be Super when `context` is an identifier
286+
object as t.Expression,
287+
);
283288
}
284289
}
285290

packages/babel-helper-skip-transparent-expression-wrappers/src/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ export function skipTransparentExprWrappers(
4343
}
4444

4545
export function skipTransparentExprWrapperNodes(
46-
node: t.Expression,
47-
): t.Expression {
46+
node: t.Expression | t.Super,
47+
): t.Expression | t.Super {
4848
while (isTransparentExprWrapper(node)) {
4949
node = node.expression;
5050
}

packages/babel-plugin-proposal-function-bind/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ export default declare(api => {
4444
bind.callee.object = t.assignmentExpression(
4545
"=",
4646
tempId,
47+
// @ts-ignore(Babel 7 vs Babel 8) Fixme: support `super.foo(?)`
4748
bind.callee.object,
4849
);
4950
}

packages/babel-plugin-proposal-logical-assignment-operators/src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ export default declare(api => {
2727
(lhs as t.MemberExpression).object = t.assignmentExpression(
2828
"=",
2929
t.cloneNode(memo),
30-
object,
30+
// object must not be Super when `memo` is an identifier
31+
object as t.Expression,
3132
);
3233
}
3334

packages/babel-plugin-proposal-optional-chaining/src/transform.ts

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { willPathCastToBoolean, findOutermostTransparentParent } from "./util";
99
const { ast } = template.expression;
1010

1111
function isSimpleMemberExpression(
12-
expression: t.Expression,
12+
expression: t.Expression | t.Super,
1313
): expression is t.Identifier | t.Super | t.MemberExpression {
1414
expression = skipTransparentExprWrapperNodes(expression);
1515
return (
@@ -102,6 +102,7 @@ export function transform(
102102
}
103103
}
104104

105+
// todo: Improve replacementPath typings
105106
let replacementPath: NodePath<any> = path;
106107
if (parentPath.isUnaryExpression({ operator: "delete" })) {
107108
replacementPath = parentPath;
@@ -139,8 +140,8 @@ export function transform(
139140
t.cloneNode(ref),
140141
// Here `chainWithTypes` MUST NOT be cloned because it could be
141142
// updated when generating the memoised context of a call
142-
// expression
143-
chainWithTypes,
143+
// expression. It must be an Expression when `ref` is an identifier
144+
chainWithTypes as t.Expression,
144145
);
145146

146147
isCall ? (node.callee = ref) : (node.object = ref);
@@ -160,13 +161,17 @@ export function transform(
160161
// Otherwise, we need to memoize the context object, and change the call into a Function#call.
161162
// `a.?b.?()` translates roughly to `(_b = _a.b) != null && _b.call(_a)`
162163
const { object } = chain;
163-
let context: t.Expression = scope.maybeGenerateMemoised(object);
164-
if (context) {
165-
chain.object = t.assignmentExpression("=", context, object);
166-
} else if (t.isSuper(object)) {
164+
let context: t.Expression;
165+
if (t.isSuper(object)) {
167166
context = t.thisExpression();
168167
} else {
169-
context = object;
168+
const memoized = scope.maybeGenerateMemoised(object);
169+
if (memoized) {
170+
context = memoized;
171+
chain.object = t.assignmentExpression("=", memoized, object);
172+
} else {
173+
context = object;
174+
}
170175
}
171176

172177
node.arguments.unshift(t.cloneNode(context));
@@ -181,7 +186,10 @@ export function transform(
181186
// i.e. `?.b` in `(a?.b.c)()`
182187
if (i === 0 && parentIsCall) {
183188
// `(a?.b)()` to `(a == null ? undefined : a.b.bind(a))()`
184-
const object = skipTransparentExprWrapperNodes(replacement.object);
189+
// object must not be Super as super?.foo is invalid
190+
const object = skipTransparentExprWrapperNodes(
191+
replacement.object,
192+
) as t.Expression;
185193
let baseRef;
186194
if (!pureGetters || !isSimpleMemberExpression(object)) {
187195
// memoize the context object when getters are not always pure

packages/babel-plugin-proposal-partial-application/src/index.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,12 @@ export default declare(api => {
101101
scope.push({ id: receiverLVal });
102102

103103
sequenceParts.push(
104-
t.assignmentExpression("=", t.cloneNode(receiverLVal), receiver),
104+
t.assignmentExpression(
105+
"=",
106+
t.cloneNode(receiverLVal),
107+
// @ts-ignore(Babel 7 vs Babel 8) Fixme: support `super.foo(?)`
108+
receiver,
109+
),
105110
t.assignmentExpression(
106111
"=",
107112
t.cloneNode(functionLVal),

packages/babel-plugin-transform-proto-to-assign/src/index.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,11 @@ export default declare(api => {
3131
file: File,
3232
) {
3333
return t.expressionStatement(
34-
t.callExpression(file.addHelper("defaults"), [ref, expr.right]),
34+
t.callExpression(file.addHelper("defaults"), [
35+
// @ts-ignore(Babel 7 vs Babel 8) Fixme: support `super.__proto__ = ...`
36+
ref,
37+
expr.right,
38+
]),
3539
);
3640
}
3741

@@ -48,7 +52,14 @@ export default declare(api => {
4852

4953
if (temp) {
5054
nodes.push(
51-
t.expressionStatement(t.assignmentExpression("=", temp, left)),
55+
t.expressionStatement(
56+
t.assignmentExpression(
57+
"=",
58+
temp,
59+
// left must not be Super when `temp` is an identifier
60+
left as t.Expression,
61+
),
62+
),
5263
);
5364
}
5465
nodes.push(

0 commit comments

Comments
 (0)