agentsqripts
Version:
Comprehensive static code analysis toolkit for identifying technical debt, security vulnerabilities, performance issues, and code quality problems
63 lines (56 loc) • 2.98 kB
JavaScript
/**
* @file Code block difference pattern analyzer for duplication characterization
* @description Single responsibility: Analyze and aggregate difference patterns to characterize duplication types
*
* This analyzer performs comprehensive difference pattern analysis across multiple code blocks
* to identify the nature and characteristics of code duplication. It evaluates structural,
* logical, and parameteric differences to determine whether detected similarities represent
* true duplication opportunities or coincidental pattern matches.
*
* Design rationale:
* - Comprehensive difference analysis enables accurate duplication classification
* - Pattern aggregation reveals systematic differences that indicate parameterizable variations
* - Multi-dimensional similarity assessment provides holistic duplication characterization
* - Confidence scoring helps prioritize refactoring opportunities based on analysis certainty
* - Statistical aggregation identifies consistent patterns across multiple code blocks
*
* Analysis methodology:
* - Base block comparison establishes reference point for difference pattern analysis
* - Difference type categorization identifies specific areas of variation (variables, literals, structure)
* - Pattern identification determines whether differences represent parameterizable variations
* - Structural and logical similarity assessment provides comprehensive duplication characterization
* - Confidence calculation weights analysis reliability for prioritization decisions
*/
const compareBlocks = require('./compareBlocks');
const analyzeDifferenceTypes = require('./analyzeDifferenceTypes');
const identifyPattern = require('./identifyPattern');
const calculateStructuralSimilarity = require('./calculateStructuralSimilarity');
const calculateLogicalSimilarity = require('./calculateLogicalSimilarity');
const calculateConfidence = require('./calculateConfidence');
/**
* Analyze the patterns of differences between blocks
*/
function analyzeDifferencePatterns(blocks) {
const differences = [];
const baseBlock = blocks[0];
// Compare each block to the base
for (let i = 1; i < blocks.length; i++) {
const diff = compareBlocks(baseBlock, blocks[i]);
differences.push(diff);
}
// Aggregate difference patterns
const totalDiffs = differences.reduce((sum, d) => sum + d.totalDifferences, 0);
const avgDiffs = totalDiffs / differences.length;
// Check what types of differences exist
const diffTypes = analyzeDifferenceTypes(differences);
return {
totalDifferences: totalDiffs,
averageDifferences: avgDiffs,
pattern: identifyPattern(diffTypes),
parameterizableVariations: diffTypes.variableNames / (diffTypes.total || 1),
structuralSimilarity: calculateStructuralSimilarity(blocks),
logicalSimilarity: calculateLogicalSimilarity(blocks),
confidence: calculateConfidence(diffTypes, avgDiffs)
};
}
module.exports = analyzeDifferencePatterns;