64 lines
1.4 KiB
JavaScript
64 lines
1.4 KiB
JavaScript
var t = require("../../types");
|
|
var _ = require("lodash");
|
|
|
|
var addDisplayName = function (id, call) {
|
|
if (!call || !t.isCallExpression(call)) return;
|
|
|
|
var callee = call.callee;
|
|
if (!t.isMemberExpression(callee)) return;
|
|
|
|
// not React
|
|
var obj = callee.object;
|
|
if (!t.isIdentifier(obj, { name: "React" })) return;
|
|
|
|
// not createClass
|
|
var prop = callee.property;
|
|
if (!t.isIdentifier(prop, { name: "createClass" })) return;
|
|
|
|
// no arguments
|
|
var args = call.arguments;
|
|
if (args.length !== 1) return;
|
|
|
|
// not an object
|
|
var first = args[0];
|
|
if (!t.isObjectExpression(first)) return;
|
|
|
|
var props = first.properties;
|
|
var safe = true;
|
|
|
|
_.each(props, function (prop) {
|
|
if (t.isIdentifier(prop.key, { name: "displayName" })) {
|
|
return safe = false;
|
|
}
|
|
});
|
|
|
|
if (safe) {
|
|
props.unshift(t.property("init", t.identifier("displayName"), t.literal(id)));
|
|
}
|
|
};
|
|
|
|
exports.AssignmentExpression =
|
|
exports.Property =
|
|
exports.VariableDeclarator = function (node) {
|
|
var left, right;
|
|
|
|
if (t.isAssignmentExpression(node)) {
|
|
left = node.left;
|
|
right = node.right;
|
|
} else if (t.isProperty(node)) {
|
|
left = node.key;
|
|
right = node.value;
|
|
} else if (t.isVariableDeclarator(node)) {
|
|
left = node.id;
|
|
right = node.init;
|
|
}
|
|
|
|
if (t.isMemberExpression(left)) {
|
|
left = left.property;
|
|
}
|
|
|
|
if (t.isIdentifier(left)) {
|
|
addDisplayName(left.name, right);
|
|
}
|
|
};
|