agentsqripts
Version:
Comprehensive static code analysis toolkit for identifying technical debt, security vulnerabilities, performance issues, and code quality problems
54 lines (47 loc) • 1.91 kB
JavaScript
/**
* @file Detect string concatenation in loops using AST
* @description Single responsibility: Main orchestrator for detecting string concatenation in loops
*/
const { parseToAST, isInsideLoop, getNodeLine, getNodeSource, walk } = require('../../astParser');
const { PERFORMANCE_PATTERNS } = require('../../../performancePatterns');
const isStringOperation = require('../check/isStringOperation');
const isStringConcatenation = require('../check/isStringConcatenation');
const createIssue = require('../createIssue');
/**
* Detect string concatenation in loops using AST
* @param {string} content - File content
* @param {string} filePath - File path
* @returns {Array} Array of string concatenation issues
*/
function detectStringConcatInLoopsAST(content, filePath) {
const issues = [];
const ast = parseToAST(content, filePath);
if (!ast) return [];
const pattern = PERFORMANCE_PATTERNS['string_concat_loop'];
// Find all assignment expressions
walk.simple(ast, {
AssignmentExpression(node) {
// Check for += operator with string concatenation
if (node.operator === '+=') {
const loop = isInsideLoop(ast, node);
if (loop) {
// Check if right side contains string literal or string operation
if (isStringOperation(node.right)) {
issues.push(createIssue(node, loop, content, filePath, pattern));
}
}
}
// Check for = operator with string concatenation (str = str + ...)
else if (node.operator === '=' &&
node.right.type === 'BinaryExpression' &&
node.right.operator === '+') {
const loop = isInsideLoop(ast, node);
if (loop && isStringConcatenation(node)) {
issues.push(createIssue(node, loop, content, filePath, pattern));
}
}
}
});
return issues;
}
module.exports = detectStringConcatInLoopsAST;