agentsqripts
Version:
Comprehensive static code analysis toolkit for identifying technical debt, security vulnerabilities, performance issues, and code quality problems
49 lines (43 loc) • 2.33 kB
JavaScript
/**
* @file Function parameter similarity calculator for signature pattern analysis
* @description Single responsibility: Assess code block similarity based on function parameter patterns and signatures
*
* This calculator evaluates similarity between code blocks by analyzing their function
* parameter patterns, including parameter count, destructuring usage, and signature complexity.
* Similar parameter patterns often indicate functionally equivalent interfaces and comparable
* algorithmic approaches, making parameter analysis crucial for detecting refactorable code.
*
* Design rationale:
* - Parameter signature analysis identifies functionally equivalent interfaces with different implementations
* - Destructuring pattern detection recognizes modern JavaScript parameter usage patterns
* - Parameter count comparison reveals implementation complexity and functional scope
* - Graduated similarity scoring provides nuanced assessment of parameter compatibility
* - Conservative penalty for parameter count differences prevents false positive matches
*
* Parameter similarity methodology:
* - Identical parameter counts enable high similarity assessment with pattern analysis
* - Destructuring pattern matching identifies equivalent complex parameter structures
* - High similarity (0.9) for matching destructuring patterns indicating equivalent interfaces
* - Medium similarity (0.7) for same parameter count with different patterns
* - Graduated penalty (0.2 per parameter difference) for mismatched parameter counts
*/
/**
* Calculate parameter similarity
*/
function calculateParameterSimilarity(block1, block2) {
const params1 = block1.parameters || [];
const params2 = block2.parameters || [];
// Same number of parameters
if (params1.length === params2.length) {
if (params1.length === 0) return 1.0;
// Check for similar parameter patterns (even if names differ)
const hasDestructuring1 = params1.includes('destructured');
const hasDestructuring2 = params2.includes('destructured');
if (hasDestructuring1 === hasDestructuring2) return 0.9;
return 0.7;
}
// Different number of parameters
const diff = Math.abs(params1.length - params2.length);
return Math.max(0, 1 - (diff * 0.2));
}
module.exports = calculateParameterSimilarity;