68 lines
1.7 KiB
JavaScript
68 lines
1.7 KiB
JavaScript
import nameFunction from "@babel/helper-function-name";
|
|
import VanillaTransformer from "./vanilla";
|
|
import * as t from "@babel/types";
|
|
|
|
export default class LooseClassTransformer extends VanillaTransformer {
|
|
constructor() {
|
|
super(...arguments);
|
|
this._protoAlias = null;
|
|
this.isLoose = true;
|
|
}
|
|
|
|
_insertProtoAliasOnce() {
|
|
if (!this._protoAlias) {
|
|
this._protoAlias = this.scope.generateUidIdentifier("proto");
|
|
const classProto = t.memberExpression(
|
|
this.classRef,
|
|
t.identifier("prototype"),
|
|
);
|
|
const protoDeclaration = t.variableDeclaration("var", [
|
|
t.variableDeclarator(this._protoAlias, classProto),
|
|
]);
|
|
|
|
this.body.push(protoDeclaration);
|
|
}
|
|
}
|
|
|
|
_processMethod(node, scope) {
|
|
if (!node.decorators) {
|
|
// use assignments instead of define properties for loose classes
|
|
|
|
let classRef = this.classRef;
|
|
if (!node.static) {
|
|
this._insertProtoAliasOnce();
|
|
classRef = this._protoAlias;
|
|
}
|
|
const methodName = t.memberExpression(
|
|
classRef,
|
|
node.key,
|
|
node.computed || t.isLiteral(node.key),
|
|
);
|
|
|
|
let func = t.functionExpression(
|
|
null,
|
|
node.params,
|
|
node.body,
|
|
node.generator,
|
|
node.async,
|
|
);
|
|
func.returnType = node.returnType;
|
|
const key = t.toComputedKey(node, node.key);
|
|
if (t.isStringLiteral(key)) {
|
|
func = nameFunction({
|
|
node: func,
|
|
id: key,
|
|
scope,
|
|
});
|
|
}
|
|
|
|
const expr = t.expressionStatement(
|
|
t.assignmentExpression("=", methodName, func),
|
|
);
|
|
t.inheritsComments(expr, node);
|
|
this.body.push(expr);
|
|
return true;
|
|
}
|
|
}
|
|
}
|