abstract out named method helper

This commit is contained in:
Sebastian McKenzie
2015-01-15 20:07:32 +11:00
parent 80764c214a
commit 6f7da38957
3 changed files with 50 additions and 45 deletions

View File

@@ -0,0 +1,43 @@
var traverse = require("../../traverse");
var util = require("../../util");
var t = require("../../types");
module.exports = function (node, file, scope) {
var key = t.toComputedKey(node, node.key);
if (!t.isLiteral(key)) return node; // we can't set a function id with this
var id = t.toIdentifier(key.value);
key = t.identifier(id);
var selfReference = false;
var outerDeclar = scope.get(id, true);
traverse(node, {
enter: function (node, parent, scope) {
// check if this node is an identifier that matches the same as our function id
if (!t.isIdentifier(node, { name: id })) return;
// check if this node is the one referenced
if (!t.isReferenced(node, parent)) return;
// check that we don't have a local variable declared as that removes the need
// for the wrapper
var localDeclar = scope.get(id, true);
if (localDeclar !== outerDeclar) return;
selfReference = true;
this.stop();
}
}, scope);
if (selfReference) {
node.value = util.template("property-method-assignment-wrapper", {
FUNCTION: node.value,
FUNCTION_ID: key,
FUNCTION_KEY: file.generateUidIdentifier(id, scope),
WRAPPER_KEY: file.generateUidIdentifier(id + "Wrapper", scope)
});
} else {
node.value.id = key;
}
};

View File

@@ -1,4 +1,5 @@
var propertyMethodAssignment = require("./es6-property-method-assignment");
var nameMethod = require("../helpers/name-method");
var traverse = require("../../traverse");
var util = require("../../util");
var t = require("../../types");
@@ -194,7 +195,7 @@ Class.prototype.pushMethod = function (node) {
var kind = node.kind;
if (kind === "") {
propertyMethodAssignment._namedMethod(node, this.file, this.scope);
nameMethod(node, this.file, this.scope);
if (this.isLoose) {
// use assignments instead of define properties for loose classes

View File

@@ -1,53 +1,14 @@
var traverse = require("../../traverse");
var util = require("../../util");
var t = require("../../types");
exports._namedMethod = function (node, file, scope) {
var key = t.toComputedKey(node, node.key);
if (!t.isLiteral(key)) return node; // we can't set a function id with this
var id = t.toIdentifier(key.value);
key = t.identifier(id);
var selfReference = false;
var outerDeclar = scope.get(id, true);
traverse(node, {
enter: function (node, parent, scope) {
// check if this node is an identifier that matches the same as our function id
if (!t.isIdentifier(node, { name: id })) return;
// check if this node is the one referenced
if (!t.isReferenced(node, parent)) return;
// check that we don't have a local variable declared as that removes the need
// for the wrapper
var localDeclar = scope.get(id, true);
if (localDeclar !== outerDeclar) return;
selfReference = true;
this.stop();
}
}, scope);
if (selfReference) {
node.value = util.template("property-method-assignment-wrapper", {
FUNCTION: node.value,
FUNCTION_ID: key,
FUNCTION_KEY: file.generateUidIdentifier(id, scope),
WRAPPER_KEY: file.generateUidIdentifier(id + "Wrapper", scope)
});
} else {
node.value.id = key;
}
};
var nameMethod = require("../helpers/name-method");
var traverse = require("../../traverse");
var util = require("../../util");
var t = require("../../types");
exports.Property = function (node, parent, file, scope) {
if (!node.method) return;
node.method = false;
exports._namedMethod(node, file, scope);
nameMethod(node, file, scope);
};
exports.ObjectExpression = function (node) {