agentsqripts
Version:
Comprehensive static code analysis toolkit for identifying technical debt, security vulnerabilities, performance issues, and code quality problems
71 lines (63 loc) • 2.31 kB
JavaScript
/**
* @file Detect problematic state updates
* @description Single responsibility: Identify performance issues with React state updates
*/
const { iterateLines } = require('../../utils/patternDetector');
/**
* Detect problematic state updates
*/
function detectStateUpdates(lines, filePath) {
const issues = [];
iterateLines(lines, (line, lineNumber, trimmed, i) => {
// setState in loops
if (/for\s*\(|\.forEach\s*\(|\.map\s*\(|while\s*\(/.test(trimmed)) {
for (let j = i + 1; j < Math.min(i + 10, lines.length); j++) {
const innerLine = lines[j].trim();
if (/set\w+\s*\(|setState\s*\(/.test(innerLine)) {
issues.push({
type: 'state_update_in_loop',
severity: 'HIGH',
category: 'React',
location: `${filePath}:${j + 1}`,
line: j + 1,
code: innerLine,
description: 'State update in loop causes multiple re-renders',
summary: 'State updates inside loop',
recommendation: 'Batch state updates or collect changes and update once',
effort: 2,
impact: 'Reduces number of re-renders significantly',
estimatedSavings: '70-90% re-render reduction'
});
break;
}
}
}
// Multiple setState calls
if (/set\w+\s*\(|setState\s*\(/.test(trimmed)) {
let setStateCount = 1;
for (let j = i + 1; j < Math.min(i + 5, lines.length); j++) {
if (/set\w+\s*\(|setState\s*\(/.test(lines[j])) {
setStateCount++;
}
}
if (setStateCount >= 3) {
issues.push({
type: 'multiple_state_updates',
severity: 'MEDIUM',
category: 'React',
location: `${filePath}:${lineNumber}`,
line: lineNumber,
code: trimmed,
description: `Multiple state updates (${setStateCount}) in sequence cause multiple re-renders`,
summary: 'Multiple consecutive state updates',
recommendation: 'Combine state updates or use useReducer for complex state',
effort: 2,
impact: 'Reduces re-renders',
estimatedSavings: '50-70% re-render reduction'
});
}
}
});
return issues;
}
module.exports = detectStateUpdates;