UNPKG

agentsqripts

Version:

Comprehensive static code analysis toolkit for identifying technical debt, security vulnerabilities, performance issues, and code quality problems

87 lines (76 loc) 2.87 kB
/** * @file String concatenation in loops detector * @description Detects inefficient string concatenation in loops */ /** * Detects string concatenation in loops * @param {string} content - File content * @param {string} filePath - Path to the file * @returns {Array} Array of string concatenation issues */ function detectStringConcatInLoops(content, filePath) { const issues = []; const lines = content.split('\n'); // Define default pattern if performance patterns aren't available const defaultPattern = { severity: 'MEDIUM', category: 'String', effort: 1, impact: 6 }; let pattern; try { const { PERFORMANCE_PATTERNS } = require('./performancePatterns'); pattern = PERFORMANCE_PATTERNS['string_concat_loop'] || defaultPattern; } catch (error) { pattern = defaultPattern; } // Simplified approach: look for concatenation patterns in proximity to loop keywords for (let i = 0; i < lines.length; i++) { const line = lines[i]; const lineNumber = i + 1; // Enhanced concatenation pattern detection const concatPatterns = [ /\w+\s*\+=\s*.*['"`]/, // str += "..." or str += var + "..." /\w+\s*\+=\s*\w+\[.*\]/, // str += array[i] /\w+\s*=\s*\w+\s*\+\s*['"`]/, // str = str + "..." /\w+\s*\+=\s*\w+\.toString\(\)/, // str += var.toString() /\w+\s*=\s*\w+\s*\+\s*\w+\.toString\(\)/, // str = str + var.toString() /\w+\s*\+=\s*\w+\.render\(/, // str += template.render(data) /\w+\s*\+=\s*\w+\[.*\]\s*\+/, // str += items[i] + something ]; const hasConcatenation = concatPatterns.some(pat => pat.test(line)); if (hasConcatenation) { // Check nearby lines (within 10 lines) for loop patterns let isInLoop = false; const checkRange = 10; for (let j = Math.max(0, i - checkRange); j <= Math.min(lines.length - 1, i + checkRange); j++) { const nearbyLine = lines[j]; if (/for\s*\(|while\s*\(|\.forEach\s*\(|\.map\s*\(|\.reduce\s*\(|do\s*\{/.test(nearbyLine)) { isInLoop = true; break; } } if (isInLoop) { issues.push({ type: 'string_concat_loop', severity: pattern.severity, category: pattern.category, location: `${filePath}:${lineNumber}`, line: lineNumber, code: line.trim(), description: 'String concatenation in loop creates new strings each iteration', summary: 'Inefficient string concatenation in loop', recommendation: 'Use array.push() and join() instead of string concatenation', effort: pattern.effort, impact: pattern.impact, estimatedSavings: '20-40% performance gain for string operations' }); } } } return issues; } module.exports = { detectStringConcatInLoops };