agentsqripts
Version:
Comprehensive static code analysis toolkit for identifying technical debt, security vulnerabilities, performance issues, and code quality problems
85 lines (74 loc) • 2.92 kB
JavaScript
/**
* @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;
// More specific concatenation patterns to reduce false positives
const concatPatterns = [
/\w+\s*\+=\s*['"``]/, // Direct string concatenation like str += "text"
/\w+\s*\+=\s*\w+\[.*\]/, // Array access concatenation like str += array[i]
/\w+\s*\+=\s*\w+\.render\(/, // Template rendering like str += template.render(data)
/\w+\s*\+=\s*\w+\[.*\]\s*\+/, // Complex array concatenation like str += items[i] + something
];
const hasConcatenation = concatPatterns.some(pat => pat.test(line));
if (hasConcatenation) {
// Check nearby lines (within 5 lines) for loop patterns - reduced range for better accuracy
let isInLoop = false;
const checkRange = 5; // Reduced from 10 to be more strict
for (let j = Math.max(0, i - checkRange); j <= Math.min(lines.length - 1, i + checkRange); j++) {
const nearbyLine = lines[j];
// More specific loop patterns to reduce false positives
if (/\b(?:for\s*\(|while\s*\(|\.forEach\s*\(|do\s*\{)\b/.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
};