Skip to content

Commit

Permalink
Add optional delete in Handler
Browse files Browse the repository at this point in the history
  • Loading branch information
SuperSodaSea committed Nov 28, 2022
1 parent 64f4c70 commit 38dcf9d
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 21 deletions.
12 changes: 12 additions & 0 deletions packages/babel-helper-member-expression-to-functions/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,11 @@ const handle = {
} else if (parentIsCall) {
// `(a?.#b)()` to `(a == null ? void 0 : a.#b.bind(a))()`
member.replaceWith(this.boundGet(member));
} else if (
this.delete &&
parentPath.isUnaryExpression({ operator: "delete" })
) {
parentPath.replaceWith(this.delete(member));
} else {
member.replaceWith(this.get(member));
}
Expand Down Expand Up @@ -491,6 +496,12 @@ const handle = {
return;
}

// delete MEMBER -> _delete(MEMBER)
if (this.delete && parentPath.isUnaryExpression({ operator: "delete" })) {
parentPath.replaceWith(this.delete(member));
return;
}

// for (MEMBER of ARR)
// for (MEMBER in ARR)
// { KEY: MEMBER } = OBJ -> { KEY: _destructureSet(MEMBER) } = OBJ
Expand Down Expand Up @@ -562,6 +573,7 @@ export interface Handler<State> {
member: Member,
args: t.OptionalCallExpression["arguments"],
): t.Expression;
delete?(this: HandlerState<State> & State, member: Member): t.Expression;
}

export interface HandlerState<State = {}> extends Handler<State> {
Expand Down
45 changes: 24 additions & 21 deletions packages/babel-helper-replace-supers/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,26 +65,6 @@ const visitor = traverse.visitors.merge<
Super(path, state) {
const { node, parentPath } = path;
if (!parentPath.isMemberExpression({ object: node })) return;
if (parentPath.parentPath.isUnaryExpression({ operator: "delete" })) {
const deletePath = parentPath.parentPath;
if (parentPath.node.computed) {
deletePath.replaceWith(
sequenceExpression([
callExpression(this.file.addHelper("toPropertyKey"), [
cloneNode(parentPath.node.property as t.Expression),
]),
template.expression.ast`
function () { throw new ReferenceError("'delete super[expr]' is invalid"); }()
`,
]),
);
} else {
deletePath.replaceWith(template.expression.ast`
function () { throw new ReferenceError("'delete super.prop' is invalid"); }()
`);
}
return;
}
state.handle(parentPath);
},
},
Expand Down Expand Up @@ -128,7 +108,13 @@ type SuperMember = NodePath<
interface SpecHandler
extends Pick<
Handler,
"get" | "set" | "destructureSet" | "call" | "optionalCall" | "memoise"
| "memoise"
| "get"
| "set"
| "destructureSet"
| "call"
| "optionalCall"
| "delete"
> {
_get(
this: Handler & SpecHandler,
Expand Down Expand Up @@ -261,6 +247,23 @@ const specHandlers: SpecHandler = {
true,
);
},

delete(this: Handler & SpecHandler, superMember: SuperMember) {
if (superMember.node.computed) {
return sequenceExpression([
callExpression(this.file.addHelper("toPropertyKey"), [
cloneNode(superMember.node.property),
]),
template.expression.ast`
function () { throw new ReferenceError("'delete super[expr]' is invalid"); }()
`,
]);
} else {
return template.expression.ast`
function () { throw new ReferenceError("'delete super.prop' is invalid"); }()
`;
}
},
};

const looseHandlers = {
Expand Down

0 comments on commit 38dcf9d

Please sign in to comment.