UNPKG

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
/** * @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;