agentsqripts
Version:
Comprehensive static code analysis toolkit for identifying technical debt, security vulnerabilities, performance issues, and code quality problems
41 lines (37 loc) • 2.13 kB
JavaScript
/**
* @file AST-based structural similarity calculator for syntactic pattern analysis
* @description Single responsibility: Assess code block similarity through Abstract Syntax Tree node type comparison
*
* This calculator evaluates similarity between code blocks by analyzing their AST node types,
* providing fundamental structural similarity assessment based on syntactic patterns. AST-based
* comparison enables detection of functionally equivalent code that might use different surface
* syntax but share underlying structural patterns.
*
* Design rationale:
* - AST node type comparison provides syntax-agnostic structural similarity assessment
* - Function type equivalence recognizes different function declaration styles as structurally similar
* - High similarity for exact AST matches indicates strong structural equivalence
* - Medium similarity for function type variations accommodates different declaration styles
* - Conservative baseline similarity ensures meaningful assessment for diverse code patterns
*
* Structural similarity methodology:
* - Perfect AST node matches yield high similarity (0.9) indicating strong structural equivalence
* - Function type equivalence provides medium similarity (0.7) for different function declaration styles
* - ArrowFunctionExpression, FunctionDeclaration, and FunctionExpression treated as equivalent patterns
* - Conservative baseline similarity (0.3) for structurally different node types
* - Systematic classification enables consistent structural pattern recognition
*/
/**
* Calculate structural similarity based on AST node types
*/
function calculateStructureSimilarity(block1, block2) {
// If both have the same AST node type, high similarity
if (block1.astNode === block2.astNode) return 0.9;
// If both are functions (different types), medium similarity
const functionTypes = ['FunctionDeclaration', 'FunctionExpression', 'ArrowFunctionExpression'];
if (functionTypes.includes(block1.astNode) && functionTypes.includes(block2.astNode)) {
return 0.7;
}
return 0.3;
}
module.exports = calculateStructureSimilarity;