Skip to content

Commit

Permalink
[Refactor] improve performance by avoiding unnecessary `Components.de…
Browse files Browse the repository at this point in the history
…tect`
  • Loading branch information
golopot authored and ljharb committed Apr 18, 2022
1 parent 2bf54d7 commit 18de0a6
Show file tree
Hide file tree
Showing 30 changed files with 337 additions and 271 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Expand Up @@ -24,7 +24,9 @@ This change log adheres to standards from [Keep a CHANGELOG](https://keepachange
* [Refactor] improve performance for detecting class components ([#3267][] @golopot)
* [Refactor] [`no-deprecated`]: improve performance ([#3271][] @golopot)
* [Refactor] [`no-did-mount-set-state`], [`no-did-update-set-state`], [`no-will-update-set-state`]: improve performance ([#3272][] @golopot)
* [Refactor] improve performance by avoiding unnecessary `Components.detect` ([#3273][] @golopot)

[#3273]: https://github.com/jsx-eslint/eslint-plugin-react/pull/3273
[#3272]: https://github.com/jsx-eslint/eslint-plugin-react/pull/3272
[#3271]: https://github.com/jsx-eslint/eslint-plugin-react/pull/3271
[#3267]: https://github.com/jsx-eslint/eslint-plugin-react/pull/3267
Expand Down
5 changes: 3 additions & 2 deletions lib/rules/display-name.js
Expand Up @@ -9,6 +9,7 @@ const values = require('object.values');

const Components = require('../util/Components');
const astUtil = require('../util/ast');
const componentUtil = require('../util/componentUtil');
const docsUrl = require('../util/docsUrl');
const propsUtil = require('../util/props');
const report = require('../util/report');
Expand Down Expand Up @@ -106,7 +107,7 @@ module.exports = {
astUtil.isFunctionLikeExpression(node)
&& node.parent
&& (node.parent.type === 'VariableDeclarator' || node.parent.type === 'Property' || node.parent.method === true)
&& (!node.parent.parent || !utils.isES5Component(node.parent.parent))
&& (!node.parent.parent || !componentUtil.isES5Component(node.parent.parent, context))
);

if (
Expand Down Expand Up @@ -192,7 +193,7 @@ module.exports = {
},

ObjectExpression(node) {
if (!utils.isES5Component(node)) {
if (!componentUtil.isES5Component(node, context)) {
return;
}
if (ignoreTranspilerName || !hasTranspilerName(node)) {
Expand Down
3 changes: 1 addition & 2 deletions lib/rules/jsx-indent.js
Expand Up @@ -36,7 +36,6 @@ const astUtil = require('../util/ast');
const docsUrl = require('../util/docsUrl');
const reportC = require('../util/report');
const jsxUtil = require('../util/jsx');
const isCreateElement = require('../util/isCreateElement');

// ------------------------------------------------------------------------------
// Rule Definition
Expand Down Expand Up @@ -428,7 +427,7 @@ module.exports = {
}
if (
!fn
|| !jsxUtil.isReturningJSX((n) => isCreateElement(n, context), node, context, true)
|| !jsxUtil.isReturningJSX(node, context, true)
) {
return;
}
Expand Down
5 changes: 2 additions & 3 deletions lib/rules/jsx-no-bind.js
Expand Up @@ -8,7 +8,6 @@
'use strict';

const propName = require('jsx-ast-utils/propName');
const Components = require('../util/Components');
const docsUrl = require('../util/docsUrl');
const jsxUtil = require('../util/jsx');
const report = require('../util/report');
Expand Down Expand Up @@ -63,7 +62,7 @@ module.exports = {
}],
},

create: Components.detect((context) => {
create(context) {
const configuration = context.options[0] || {};

// Keep track of all the variable names pointing to a bind call,
Expand Down Expand Up @@ -198,5 +197,5 @@ module.exports = {
}
},
};
}),
},
};
8 changes: 4 additions & 4 deletions lib/rules/no-access-state-in-setstate.js
Expand Up @@ -6,7 +6,7 @@
'use strict';

const docsUrl = require('../util/docsUrl');
const Components = require('../util/Components');
const componentUtil = require('../util/componentUtil');
const report = require('../util/report');

// ------------------------------------------------------------------------------
Expand All @@ -29,7 +29,7 @@ module.exports = {
messages,
},

create: Components.detect((context, components, utils) => {
create(context) {
function isSetStateCall(node) {
return node.type === 'CallExpression'
&& node.callee.property
Expand All @@ -48,7 +48,7 @@ module.exports = {
}

function isClassComponent() {
return !!(utils.getParentES6Component() || utils.getParentES5Component());
return !!(componentUtil.getParentES6Component(context) || componentUtil.getParentES5Component(context));
}

// The methods array contains all methods or functions that are using this.state
Expand Down Expand Up @@ -183,5 +183,5 @@ module.exports = {
});
},
};
}),
},
};
5 changes: 3 additions & 2 deletions lib/rules/no-arrow-function-lifecycle.js
Expand Up @@ -9,6 +9,7 @@ const values = require('object.values');

const Components = require('../util/Components');
const astUtil = require('../util/ast');
const componentUtil = require('../util/componentUtil');
const docsUrl = require('../util/docsUrl');
const lifecycleMethods = require('../util/lifecycleMethods');
const report = require('../util/report');
Expand Down Expand Up @@ -44,7 +45,7 @@ module.exports = {
fixable: 'code',
},

create: Components.detect((context, components, utils) => {
create: Components.detect((context, components) => {
/**
* @param {Array} properties list of component properties
*/
Expand All @@ -57,7 +58,7 @@ module.exports = {
const propertyName = astUtil.getPropertyName(node);
const nodeType = node.value.type;
const isLifecycleMethod = (
node.static && !utils.isES5Component(node)
node.static && !componentUtil.isES5Component(node, context)
? lifecycleMethods.static
: lifecycleMethods.instance
).indexOf(propertyName) > -1;
Expand Down
12 changes: 7 additions & 5 deletions lib/rules/no-deprecated.js
Expand Up @@ -8,9 +8,8 @@
'use strict';

const values = require('object.values');

const Components = require('../util/Components');
const astUtil = require('../util/ast');
const componentUtil = require('../util/componentUtil');
const docsUrl = require('../util/docsUrl');
const pragmaUtil = require('../util/pragma');
const testReactVersion = require('../util/version').testReactVersion;
Expand Down Expand Up @@ -104,7 +103,7 @@ module.exports = {
schema: [],
},

create: Components.detect((context, components, utils) => {
create(context) {
const pragma = pragmaUtil.getFromContext(context);
const deprecated = getDeprecated(pragma);

Expand Down Expand Up @@ -167,7 +166,10 @@ module.exports = {
* @param {ASTNode} node The AST node being checked.
*/
function checkLifeCycleMethods(node) {
if (utils.isES5Component(node) || utils.isES6Component(node)) {
if (
componentUtil.isES5Component(node, context)
|| componentUtil.isES6Component(node, context)
) {
const methods = getLifeCycleMethods(node);
methods.forEach((method) => checkDeprecation(node, method.name, method.node));
}
Expand Down Expand Up @@ -221,5 +223,5 @@ module.exports = {
ClassExpression: checkLifeCycleMethods,
ObjectExpression: checkLifeCycleMethods,
};
}),
},
};
5 changes: 3 additions & 2 deletions lib/rules/no-direct-mutation-state.js
Expand Up @@ -7,6 +7,7 @@
'use strict';

const Components = require('../util/Components');
const componentUtil = require('../util/componentUtil');
const docsUrl = require('../util/docsUrl');
const report = require('../util/report');

Expand Down Expand Up @@ -99,7 +100,7 @@ module.exports = {
return;
}
const item = getOuterMemberExpression(node.left);
if (utils.isStateMemberExpression(item)) {
if (componentUtil.isStateMemberExpression(item)) {
const mutations = (component && component.mutations) || [];
mutations.push(node.left.object);
components.set(node, {
Expand All @@ -115,7 +116,7 @@ module.exports = {
return;
}
const item = getOuterMemberExpression(node.argument);
if (utils.isStateMemberExpression(item)) {
if (componentUtil.isStateMemberExpression(item)) {
const mutations = (component && component.mutations) || [];
mutations.push(item);
components.set(node, {
Expand Down
8 changes: 4 additions & 4 deletions lib/rules/no-redundant-should-component-update.js
Expand Up @@ -4,8 +4,8 @@

'use strict';

const Components = require('../util/Components');
const astUtil = require('../util/ast');
const componentUtil = require('../util/componentUtil');
const docsUrl = require('../util/docsUrl');
const report = require('../util/report');

Expand All @@ -31,7 +31,7 @@ module.exports = {
schema: [],
},

create: Components.detect((context, components, utils) => {
create(context) {
/**
* Checks for shouldComponentUpdate property
* @param {ASTNode} node The AST node being checked.
Expand Down Expand Up @@ -65,7 +65,7 @@ module.exports = {
* @param {ASTNode} node The AST node being checked.
*/
function checkForViolation(node) {
if (utils.isPureComponent(node)) {
if (componentUtil.isPureComponent(node, context)) {
const hasScu = hasShouldComponentUpdate(node);
if (hasScu) {
const className = getNodeName(node);
Expand All @@ -83,5 +83,5 @@ module.exports = {
ClassDeclaration: checkForViolation,
ClassExpression: checkForViolation,
};
}),
},
};
8 changes: 4 additions & 4 deletions lib/rules/no-string-refs.js
Expand Up @@ -5,7 +5,7 @@

'use strict';

const Components = require('../util/Components');
const componentUtil = require('../util/componentUtil');
const docsUrl = require('../util/docsUrl');
const report = require('../util/report');

Expand Down Expand Up @@ -40,7 +40,7 @@ module.exports = {
}],
},

create: Components.detect((context, components, utils) => {
create(context) {
const detectTemplateLiterals = context.options[0] ? context.options[0].noTemplateLiterals : false;
/**
* Checks if we are using refs
Expand All @@ -49,7 +49,7 @@ module.exports = {
*/
function isRefsUsage(node) {
return !!(
(utils.getParentES6Component() || utils.getParentES5Component())
(componentUtil.getParentES6Component(context) || componentUtil.getParentES5Component(context))
&& node.object.type === 'ThisExpression'
&& node.property.name === 'refs'
);
Expand Down Expand Up @@ -115,5 +115,5 @@ module.exports = {
}
},
};
}),
},
};
9 changes: 5 additions & 4 deletions lib/rules/no-typos.js
Expand Up @@ -7,6 +7,7 @@
const PROP_TYPES = Object.keys(require('prop-types'));
const Components = require('../util/Components');
const docsUrl = require('../util/docsUrl');
const componentUtil = require('../util/componentUtil');
const report = require('../util/report');
const lifecycleMethods = require('../util/lifecycleMethods');

Expand Down Expand Up @@ -202,7 +203,7 @@ module.exports = {
},

'ClassProperty, PropertyDefinition'(node) {
if (!node.static || !utils.isES6Component(node.parent.parent)) {
if (!node.static || !componentUtil.isES6Component(node.parent.parent, context)) {
return;
}

Expand All @@ -223,7 +224,7 @@ module.exports = {

if (
relatedComponent
&& (utils.isES6Component(relatedComponent.node) || (
&& (componentUtil.isES6Component(relatedComponent.node, context) || (
relatedComponent.node.type !== 'ClassDeclaration' && utils.isReturningJSX(relatedComponent.node)))
&& (node.parent && node.parent.type === 'AssignmentExpression' && node.parent.right)
) {
Expand All @@ -232,15 +233,15 @@ module.exports = {
},

MethodDefinition(node) {
if (!utils.isES6Component(node.parent.parent)) {
if (!componentUtil.isES6Component(node.parent.parent, context)) {
return;
}

reportErrorIfLifecycleMethodCasingTypo(node);
},

ObjectExpression(node) {
const component = utils.isES5Component(node) && components.get(node);
const component = componentUtil.isES5Component(node, context) && components.get(node);

if (!component) {
return;
Expand Down
8 changes: 4 additions & 4 deletions lib/rules/no-unsafe.js
Expand Up @@ -5,8 +5,8 @@

'use strict';

const Components = require('../util/Components');
const astUtil = require('../util/ast');
const componentUtil = require('../util/componentUtil');
const docsUrl = require('../util/docsUrl');
const testReactVersion = require('../util/version').testReactVersion;
const report = require('../util/report');
Expand Down Expand Up @@ -44,7 +44,7 @@ module.exports = {
],
},

create: Components.detect((context, components, utils) => {
create(context) {
const config = context.options[0] || {};
const checkAliases = config.checkAliases || false;

Expand Down Expand Up @@ -133,7 +133,7 @@ module.exports = {
* @param {ASTNode} node The AST node being checked.
*/
function checkLifeCycleMethods(node) {
if (utils.isES5Component(node) || utils.isES6Component(node)) {
if (componentUtil.isES5Component(node, context) || componentUtil.isES6Component(node, context)) {
const methods = getLifeCycleMethods(node);
methods.forEach((method) => checkUnsafe(node, method));
}
Expand All @@ -144,5 +144,5 @@ module.exports = {
ClassExpression: checkLifeCycleMethods,
ObjectExpression: checkLifeCycleMethods,
};
}),
},
};
8 changes: 4 additions & 4 deletions lib/rules/no-unused-class-component-methods.js
Expand Up @@ -5,8 +5,8 @@

'use strict';

const Components = require('../util/Components');
const docsUrl = require('../util/docsUrl');
const componentUtil = require('../util/componentUtil');
const report = require('../util/report');

// ------------------------------------------------------------------------------
Expand Down Expand Up @@ -115,7 +115,7 @@ module.exports = {
],
},

create: Components.detect((context, components, utils) => {
create: ((context) => {
let classInfo = null;

// Takes an ObjectExpression node and adds all named Property nodes to the
Expand Down Expand Up @@ -171,13 +171,13 @@ module.exports = {

return {
ClassDeclaration(node) {
if (utils.isES6Component(node)) {
if (componentUtil.isES6Component(node, context)) {
classInfo = getInitialClassInfo(node, true);
}
},

ObjectExpression(node) {
if (utils.isES5Component(node)) {
if (componentUtil.isES5Component(node, context)) {
classInfo = getInitialClassInfo(node, false);
}
},
Expand Down

0 comments on commit 18de0a6

Please sign in to comment.