memoise and bind member expression decorators - fixes #1296

This commit is contained in:
Sebastian McKenzie
2015-04-20 06:16:20 +01:00
parent 7d4ecea8fb
commit 9360860601
4 changed files with 60 additions and 1 deletions

View File

@@ -0,0 +1,33 @@
import * as t from "../../types";
export default function (decorators, scope) {
for (var i = 0; i < decorators.length; i++) {
var decorator = decorators[i];
var expression = decorator.expression;
if (!t.isMemberExpression(expression)) continue;
var temp = scope.generateMemoisedReference(expression.object);
var ref;
var nodes = [];
if (temp) {
ref = temp;
nodes.push(t.assignmentExpression("=", temp, expression.object));
} else {
ref = expression.object;
}
nodes.push(t.callExpression(
t.memberExpression(
t.memberExpression(ref, expression.property, expression.computed),
t.identifier("bind")
),
[ref]
));
decorator.expression = t.sequenceExpression(nodes);
}
return decorators;
}

View File

@@ -1,3 +1,4 @@
import memoiseDecorators from "../../helpers/memoise-decorators";
import ReplaceSupers from "../../helpers/replace-supers";
import * as nameMethod from "../../helpers/name-method";
import * as defineMap from "../../helpers/define-map";
@@ -292,6 +293,10 @@ class ClassTransformer {
var node = classBody[i];
var path = classBodyPaths[i];
if (node.decorators) {
memoiseDecorators(node.decorators, this.scope);
}
if (t.isMethodDefinition(node)) {
var isConstructor = node.kind === "constructor";
if (isConstructor) this.verifyConstructor(path);

View File

@@ -1,3 +1,4 @@
import memoiseDecorators from "../../helpers/memoise-decorators";
import * as defineMap from "../../helpers/define-map";
import * as t from "../../../types";
@@ -24,7 +25,9 @@ export function ObjectExpression(node, parent, scope, file) {
var mutatorMap = {};
for (var i = 0; i < node.properties.length; i++) {
defineMap.push(mutatorMap, node.properties[i], null, file);
var prop = node.properties[i];
if (prop.decorators) memoiseDecorators(prop.decorators, scope);
defineMap.push(mutatorMap, prop, null, file);
}
var obj = defineMap.toClassObject(mutatorMap);