always use closure wrap - fixes #864
This commit is contained in:
@@ -15,49 +15,20 @@ var visitor = {
|
||||
if (localDeclar !== state.outerDeclar) return;
|
||||
|
||||
state.selfReference = true;
|
||||
state.references.push(this);
|
||||
|
||||
if (t.isPattern(parent) || t.isAssignmentExpression(parent) || t.isUpdateExpression(parent)) {
|
||||
state.selfAssignment = true;
|
||||
}
|
||||
this.stop();
|
||||
}
|
||||
};
|
||||
|
||||
var wrapIncludesSelfReference = function (state, method, id, scope) {
|
||||
var outerId = scope.generateUidIdentifier("getOuter");
|
||||
var outerIdCall = t.callExpression(outerId, []);
|
||||
|
||||
for (var i = 0; i < state.references.length; i++) {
|
||||
state.references[i].replaceNode(outerIdCall);
|
||||
}
|
||||
|
||||
method.id = id;
|
||||
|
||||
return util.template("named-function", {
|
||||
GET_OUTER_ID: outerId,
|
||||
FUNCTION_ID: id,
|
||||
FUNCTION: method
|
||||
});
|
||||
};
|
||||
|
||||
var wrapIncludesSelfAssignment = function (state, method, id, scope) {
|
||||
var templateName = "property-method-assignment-wrapper";
|
||||
if (method.generator) templateName += "-generator";
|
||||
return util.template(templateName, {
|
||||
FUNCTION: method,
|
||||
FUNCTION_ID: id,
|
||||
FUNCTION_KEY: scope.generateUidIdentifier(id.name),
|
||||
WRAPPER_KEY: scope.generateUidIdentifier(id.name + "Wrapper")
|
||||
});
|
||||
};
|
||||
|
||||
var wrap = function (state, method, id, scope) {
|
||||
if (state.selfReference) {
|
||||
if (state.selfAssignment) {
|
||||
return wrapIncludesSelfAssignment(state, method, id, scope);
|
||||
} else {
|
||||
return wrapIncludesSelfReference(state, method, id, scope);
|
||||
}
|
||||
var templateName = "property-method-assignment-wrapper";
|
||||
if (method.generator) templateName += "-generator";
|
||||
return util.template(templateName, {
|
||||
FUNCTION: method,
|
||||
FUNCTION_ID: id,
|
||||
FUNCTION_KEY: scope.generateUidIdentifier(id.name),
|
||||
WRAPPER_KEY: scope.generateUidIdentifier(id.name + "Wrapper")
|
||||
});
|
||||
} else {
|
||||
method.id = id;
|
||||
return method;
|
||||
@@ -92,7 +63,6 @@ var visit = function (node, name, scope) {
|
||||
// this isn't to the spec and they've invented this behaviour which is
|
||||
// **extremely** annoying so we avoid setting the name if it has a param
|
||||
// with the same id
|
||||
state.selfAssignment = true;
|
||||
state.selfReference = true;
|
||||
} else {
|
||||
// otherwise it's defined somewhere in scope like:
|
||||
|
||||
Reference in New Issue
Block a user