Sebastian McKenzie ae7d5367f1 6.0.0
I'm extremely stupid and didn't commit as I go. To anyone reading this
I'm extremely sorry. A lot of these changes are very broad and I plan on
releasing Babel 6.0.0 today live on stage at Ember Camp London so I'm
afraid I couldn't wait. If you're ever in London I'll buy you a beer
(or assorted beverage!) to make up for it, also I'll kiss your feet and
give you a back massage, maybe.
2015-10-29 17:51:24 +00:00

50 lines
1.3 KiB
JavaScript

import bindifyDecorators from "babel-helper-bindify-decorators";
import type { NodePath } from "babel-traverse"
import * as t from "babel-types";
export default function (classPath) {
classPath.assertClass();
let memoisedExpressions = [];
function maybeMemoise(path) {
if (!path.node || path.isPure()) return;
let uid = classPath.scope.generateDeclaredUidIdentifier();
memoisedExpressions.push(t.assignmentExpression("=", uid, path.node));
path.replaceWith(uid);
}
function memoiseDecorators(paths: Array<NodePath>) {
if (!Array.isArray(paths) || !paths.length) return;
// ensure correct evaluation order of decorators
paths = paths.reverse();
// bind decorators if they're member expressions
bindifyDecorators(paths);
for (let path of paths) {
maybeMemoise(path);
}
}
maybeMemoise(classPath.get("superClass"));
memoiseDecorators(classPath.get("decorators"), true);
let methods: Array<NodePath> = classPath.get("body.body");
for (let methodPath of methods) {
if (methodPath.is("computed")) {
maybeMemoise(methodPath.get("key"));
}
if (methodPath.has("decorators")) {
memoiseDecorators(classPath.get("decorators"));
}
}
if (memoisedExpressions) {
classPath.insertBefore(memoisedExpressions.map((expr) => t.expressionStatement(expr)));
}
}