agentsqripts
Version:
Comprehensive static code analysis toolkit for identifying technical debt, security vulnerabilities, performance issues, and code quality problems
53 lines (46 loc) • 1.59 kB
JavaScript
/**
* @file Detect setState calls in render methods
* @description Single responsibility: Detect setState calls within React render methods
*/
const walk = require('acorn-walk');
const { getLineNumber } = require('../../../utils/astParser');
/**
* Detect setState calls in render methods
* @param {Object} ast - AST tree
* @param {string} filePath - File path
* @returns {Array} Detected bugs
*/
function detectStateInRender(ast, filePath) {
const bugs = [];
let inRenderMethod = false;
walk.simple(ast, {
MethodDefinition(node) {
if (node.key.name === 'render') {
inRenderMethod = true;
// Check for setState calls within render
walk.simple(node.value.body, {
CallExpression(innerNode) {
if (innerNode.callee.type === 'MemberExpression' &&
innerNode.callee.property.name === 'setState') {
bugs.push({
type: 'setstate_in_render',
severity: 'HIGH',
category: 'React',
line: getLineNumber(innerNode),
column: innerNode.loc ? innerNode.loc.start.column : 0,
description: 'setState called in render method causes infinite loop',
recommendation: 'Move setState to lifecycle methods or event handlers',
effort: 2,
impact: 'high',
file: filePath
});
}
}
});
inRenderMethod = false;
}
}
});
return bugs;
}
module.exports = detectStateInRender;