add react component optimisation base #653

This commit is contained in:
Sebastian McKenzie
2015-02-02 00:50:25 +11:00
parent ab63345764
commit dcf91db475
7 changed files with 80 additions and 26 deletions

View File

@@ -0,0 +1,31 @@
var t = require("../../types");
exports.isCreateClassCallExpression = function (node) {
if (!node || !t.isCallExpression(node)) return false;
var callee = node.callee;
if (!t.isMemberExpression(callee)) return false;
// not React call member object
if (!t.isIdentifier(callee.object, { name: "React" })) return false;
// not createClass call member property
if (!t.isIdentifier(callee.property, { name: "createClass" })) return false;
// no call arguments
var args = node.arguments;
if (args.length !== 1) return false;
// first node arg is not an object
var first = args[0];
if (!t.isObjectExpression(first)) return false;
return true;
};
exports.isReactComponentMemberExpression = function (node) {
if (!node || !t.isMemberExpression(node)) return false;
if (!t.isIdentifier(node.object, { name: "React" })) return false;
if (!t.isIdentifier(node.property, { name: "Component" })) return false;
return true;
};

View File

@@ -12,6 +12,7 @@ module.exports = {
"playground.objectGetterMemoization": require("./playground/object-getter-memoization"),
react: require("./other/react"),
"optimisation.react": require("./optimisation/react"),
_modules: require("./internal/modules"),

View File

@@ -0,0 +1,9 @@
module.exports = BaseOptimiser;
function BaseOptimiser() {
}
BaseOptimiser.prototype.optimise = function () {
};

View File

@@ -0,0 +1,10 @@
module.exports = CreateClassOptimiser;
var BaseOptimiser = require("./base");
var util = require("../../../../util");
function CreateClassOptimiser() {
}
util.inherits(CreateClassOptimiser, BaseOptimiser);

View File

@@ -0,0 +1,17 @@
var CreateClassOptimiser = require("./create-class");
var NativeClassOptimiser = require("./native-class");
var react = require("../../../helpers/react");
exports.optional = true;
exports.CallExpression = function (node) {
if (react.isCreateClassCallExpression(node)) {
new CreateClassOptimiser(node.arguments[0]).optimise();
}
};
exports.CallExpression = function (node) {
if (react.isReactComponentMemberExpression(node.superClass)) {
new NativeClassOptimiser(node).optimise();
}
};

View File

@@ -0,0 +1,10 @@
module.exports = NativeClassOptimiser;
var BaseOptimiser = require("./base");
var util = require("../../../../util");
function NativeClassOptimiser() {
}
util.inherits(NativeClassOptimiser, BaseOptimiser);

View File

@@ -6,6 +6,7 @@
// jsx
var esutils = require("esutils");
var react = require("../../helpers/react");
var t = require("../../../types");
exports.JSXIdentifier = function (node, parent) {
@@ -197,33 +198,8 @@ var cleanJSXElementLiteralChild = function (child, args) {
// display names
var isCreateClass = function (call) {
if (!call || !t.isCallExpression(call)) return false;
var callee = call.callee;
if (!t.isMemberExpression(callee)) return false;
// not React call member object
var obj = callee.object;
if (!t.isIdentifier(obj, { name: "React" })) return false;
// not createClass call member property
var prop = callee.property;
if (!t.isIdentifier(prop, { name: "createClass" })) return false;
// no call arguments
var args = call.arguments;
if (args.length !== 1) return false;
// first call arg is not an object
var first = args[0];
if (!t.isObjectExpression(first)) return;
return true;
};
var addDisplayName = function (id, call) {
if (!isCreateClass(call)) return;
if (!react.isCreateClassCallExpression(call)) return;
var props = call.arguments[0].properties;
var safe = true;