driftdetect-core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analyzers/ast-analyzer.d.ts +251 -0
- package/dist/analyzers/ast-analyzer.d.ts.map +1 -0
- package/dist/analyzers/ast-analyzer.js +548 -0
- package/dist/analyzers/ast-analyzer.js.map +1 -0
- package/dist/analyzers/flow-analyzer.d.ts +241 -0
- package/dist/analyzers/flow-analyzer.d.ts.map +1 -0
- package/dist/analyzers/flow-analyzer.js +1219 -0
- package/dist/analyzers/flow-analyzer.js.map +1 -0
- package/dist/analyzers/index.d.ts +18 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +19 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/analyzers/semantic-analyzer.d.ts +252 -0
- package/dist/analyzers/semantic-analyzer.d.ts.map +1 -0
- package/dist/analyzers/semantic-analyzer.js +1182 -0
- package/dist/analyzers/semantic-analyzer.js.map +1 -0
- package/dist/analyzers/type-analyzer.d.ts +289 -0
- package/dist/analyzers/type-analyzer.d.ts.map +1 -0
- package/dist/analyzers/type-analyzer.js +1269 -0
- package/dist/analyzers/type-analyzer.js.map +1 -0
- package/dist/analyzers/types.d.ts +537 -0
- package/dist/analyzers/types.d.ts.map +1 -0
- package/dist/analyzers/types.js +11 -0
- package/dist/analyzers/types.js.map +1 -0
- package/dist/config/config-loader.d.ts +166 -0
- package/dist/config/config-loader.d.ts.map +1 -0
- package/dist/config/config-loader.js +429 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/config-validator.d.ts +204 -0
- package/dist/config/config-validator.d.ts.map +1 -0
- package/dist/config/config-validator.js +632 -0
- package/dist/config/config-validator.js.map +1 -0
- package/dist/config/defaults.d.ts +8 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +26 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +10 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +10 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/types.d.ts +47 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +7 -0
- package/dist/config/types.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest/exporter.d.ts +21 -0
- package/dist/manifest/exporter.d.ts.map +1 -0
- package/dist/manifest/exporter.js +339 -0
- package/dist/manifest/exporter.js.map +1 -0
- package/dist/manifest/index.d.ts +14 -0
- package/dist/manifest/index.d.ts.map +1 -0
- package/dist/manifest/index.js +15 -0
- package/dist/manifest/index.js.map +1 -0
- package/dist/manifest/manifest-store.d.ts +111 -0
- package/dist/manifest/manifest-store.d.ts.map +1 -0
- package/dist/manifest/manifest-store.js +418 -0
- package/dist/manifest/manifest-store.js.map +1 -0
- package/dist/manifest/types.d.ts +238 -0
- package/dist/manifest/types.d.ts.map +1 -0
- package/dist/manifest/types.js +11 -0
- package/dist/manifest/types.js.map +1 -0
- package/dist/matcher/confidence-scorer.d.ts +188 -0
- package/dist/matcher/confidence-scorer.d.ts.map +1 -0
- package/dist/matcher/confidence-scorer.js +302 -0
- package/dist/matcher/confidence-scorer.js.map +1 -0
- package/dist/matcher/index.d.ts +24 -0
- package/dist/matcher/index.d.ts.map +1 -0
- package/dist/matcher/index.js +26 -0
- package/dist/matcher/index.js.map +1 -0
- package/dist/matcher/outlier-detector.d.ts +252 -0
- package/dist/matcher/outlier-detector.d.ts.map +1 -0
- package/dist/matcher/outlier-detector.js +544 -0
- package/dist/matcher/outlier-detector.js.map +1 -0
- package/dist/matcher/pattern-matcher.d.ts +169 -0
- package/dist/matcher/pattern-matcher.d.ts.map +1 -0
- package/dist/matcher/pattern-matcher.js +692 -0
- package/dist/matcher/pattern-matcher.js.map +1 -0
- package/dist/matcher/types.d.ts +476 -0
- package/dist/matcher/types.d.ts.map +1 -0
- package/dist/matcher/types.js +36 -0
- package/dist/matcher/types.js.map +1 -0
- package/dist/parsers/base-parser.d.ts +282 -0
- package/dist/parsers/base-parser.d.ts.map +1 -0
- package/dist/parsers/base-parser.js +421 -0
- package/dist/parsers/base-parser.js.map +1 -0
- package/dist/parsers/css-parser.d.ts +225 -0
- package/dist/parsers/css-parser.d.ts.map +1 -0
- package/dist/parsers/css-parser.js +477 -0
- package/dist/parsers/css-parser.js.map +1 -0
- package/dist/parsers/index.d.ts +15 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +15 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/parsers/json-parser.d.ts +219 -0
- package/dist/parsers/json-parser.d.ts.map +1 -0
- package/dist/parsers/json-parser.js +602 -0
- package/dist/parsers/json-parser.js.map +1 -0
- package/dist/parsers/markdown-parser.d.ts +276 -0
- package/dist/parsers/markdown-parser.d.ts.map +1 -0
- package/dist/parsers/markdown-parser.js +731 -0
- package/dist/parsers/markdown-parser.js.map +1 -0
- package/dist/parsers/parser-manager.d.ts +294 -0
- package/dist/parsers/parser-manager.d.ts.map +1 -0
- package/dist/parsers/parser-manager.js +738 -0
- package/dist/parsers/parser-manager.js.map +1 -0
- package/dist/parsers/python-parser.d.ts +204 -0
- package/dist/parsers/python-parser.d.ts.map +1 -0
- package/dist/parsers/python-parser.js +517 -0
- package/dist/parsers/python-parser.js.map +1 -0
- package/dist/parsers/types.d.ts +43 -0
- package/dist/parsers/types.d.ts.map +1 -0
- package/dist/parsers/types.js +7 -0
- package/dist/parsers/types.js.map +1 -0
- package/dist/parsers/typescript-parser.d.ts +264 -0
- package/dist/parsers/typescript-parser.d.ts.map +1 -0
- package/dist/parsers/typescript-parser.js +658 -0
- package/dist/parsers/typescript-parser.js.map +1 -0
- package/dist/rules/evaluator.d.ts +305 -0
- package/dist/rules/evaluator.d.ts.map +1 -0
- package/dist/rules/evaluator.js +579 -0
- package/dist/rules/evaluator.js.map +1 -0
- package/dist/rules/index.d.ts +13 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +13 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/quick-fix-generator.d.ts +334 -0
- package/dist/rules/quick-fix-generator.d.ts.map +1 -0
- package/dist/rules/quick-fix-generator.js +1075 -0
- package/dist/rules/quick-fix-generator.js.map +1 -0
- package/dist/rules/rule-engine.d.ts +241 -0
- package/dist/rules/rule-engine.d.ts.map +1 -0
- package/dist/rules/rule-engine.js +585 -0
- package/dist/rules/rule-engine.js.map +1 -0
- package/dist/rules/severity-manager.d.ts +394 -0
- package/dist/rules/severity-manager.d.ts.map +1 -0
- package/dist/rules/severity-manager.js +619 -0
- package/dist/rules/severity-manager.js.map +1 -0
- package/dist/rules/types.d.ts +370 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +133 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/rules/variant-manager.d.ts +388 -0
- package/dist/rules/variant-manager.d.ts.map +1 -0
- package/dist/rules/variant-manager.js +777 -0
- package/dist/rules/variant-manager.js.map +1 -0
- package/dist/scanner/change-detector.d.ts +164 -0
- package/dist/scanner/change-detector.d.ts.map +1 -0
- package/dist/scanner/change-detector.js +263 -0
- package/dist/scanner/change-detector.js.map +1 -0
- package/dist/scanner/dependency-graph.d.ts +270 -0
- package/dist/scanner/dependency-graph.d.ts.map +1 -0
- package/dist/scanner/dependency-graph.js +436 -0
- package/dist/scanner/dependency-graph.js.map +1 -0
- package/dist/scanner/file-walker.d.ts +127 -0
- package/dist/scanner/file-walker.d.ts.map +1 -0
- package/dist/scanner/file-walker.js +526 -0
- package/dist/scanner/file-walker.js.map +1 -0
- package/dist/scanner/index.d.ts +12 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +12 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/types.d.ts +218 -0
- package/dist/scanner/types.d.ts.map +1 -0
- package/dist/scanner/types.js +10 -0
- package/dist/scanner/types.js.map +1 -0
- package/dist/scanner/worker-pool.d.ts +317 -0
- package/dist/scanner/worker-pool.d.ts.map +1 -0
- package/dist/scanner/worker-pool.js +571 -0
- package/dist/scanner/worker-pool.js.map +1 -0
- package/dist/store/cache-manager.d.ts +179 -0
- package/dist/store/cache-manager.d.ts.map +1 -0
- package/dist/store/cache-manager.js +391 -0
- package/dist/store/cache-manager.js.map +1 -0
- package/dist/store/history-store.d.ts +314 -0
- package/dist/store/history-store.d.ts.map +1 -0
- package/dist/store/history-store.js +707 -0
- package/dist/store/history-store.js.map +1 -0
- package/dist/store/index.d.ts +20 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +26 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/lock-file-manager.d.ts +202 -0
- package/dist/store/lock-file-manager.d.ts.map +1 -0
- package/dist/store/lock-file-manager.js +475 -0
- package/dist/store/lock-file-manager.js.map +1 -0
- package/dist/store/pattern-store.d.ts +289 -0
- package/dist/store/pattern-store.d.ts.map +1 -0
- package/dist/store/pattern-store.js +936 -0
- package/dist/store/pattern-store.js.map +1 -0
- package/dist/store/schema-validator.d.ts +159 -0
- package/dist/store/schema-validator.d.ts.map +1 -0
- package/dist/store/schema-validator.js +1096 -0
- package/dist/store/schema-validator.js.map +1 -0
- package/dist/store/types.d.ts +585 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/store/types.js +82 -0
- package/dist/store/types.js.map +1 -0
- package/dist/types/analysis.d.ts +19 -0
- package/dist/types/analysis.d.ts.map +1 -0
- package/dist/types/analysis.js +5 -0
- package/dist/types/analysis.js.map +1 -0
- package/dist/types/common.d.ts +7 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +5 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/index.d.ts +12 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +10 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/patterns.d.ts +40 -0
- package/dist/types/patterns.d.ts.map +1 -0
- package/dist/types/patterns.js +7 -0
- package/dist/types/patterns.js.map +1 -0
- package/dist/types/violations.d.ts +7 -0
- package/dist/types/violations.d.ts.map +1 -0
- package/dist/types/violations.js +7 -0
- package/dist/types/violations.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,548 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST Analyzer - AST pattern analysis
|
|
3
|
+
*
|
|
4
|
+
* Performs AST pattern matching, subtree comparison, and provides
|
|
5
|
+
* traversal utilities for analyzing code structure.
|
|
6
|
+
*
|
|
7
|
+
* @requirements 3.5 - Parser SHALL provide a unified AST query interface across all languages
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* AST Analyzer class for pattern matching and subtree comparison.
|
|
11
|
+
*
|
|
12
|
+
* Provides a unified interface for analyzing AST structures across
|
|
13
|
+
* all supported languages.
|
|
14
|
+
*
|
|
15
|
+
* @requirements 3.5 - Unified AST query interface across all languages
|
|
16
|
+
*/
|
|
17
|
+
export class ASTAnalyzer {
|
|
18
|
+
/**
|
|
19
|
+
* Find all nodes matching a pattern in the AST.
|
|
20
|
+
*
|
|
21
|
+
* @param ast - The AST to search
|
|
22
|
+
* @param pattern - The pattern to match
|
|
23
|
+
* @param options - Matching options
|
|
24
|
+
* @returns Array of pattern match results
|
|
25
|
+
*/
|
|
26
|
+
findPattern(ast, pattern, options = {}) {
|
|
27
|
+
const results = [];
|
|
28
|
+
const { limit, includeNested = true, startPosition, endPosition, minConfidence = 0 } = options;
|
|
29
|
+
let limitReached = false;
|
|
30
|
+
this.traverse(ast, (node, _parent, _depth, _path) => {
|
|
31
|
+
// Check if limit already reached
|
|
32
|
+
if (limitReached) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
// Check position constraints
|
|
36
|
+
if (startPosition && !this.isAfterPosition(node.startPosition, startPosition)) {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
if (endPosition && !this.isBeforePosition(node.endPosition, endPosition)) {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
// Try to match the pattern
|
|
43
|
+
const captures = new Map();
|
|
44
|
+
const confidence = this.matchPattern(node, pattern, captures);
|
|
45
|
+
if (confidence >= minConfidence && confidence > 0) {
|
|
46
|
+
results.push({
|
|
47
|
+
node,
|
|
48
|
+
confidence,
|
|
49
|
+
captures,
|
|
50
|
+
location: {
|
|
51
|
+
start: node.startPosition,
|
|
52
|
+
end: node.endPosition,
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
// Check limit after adding
|
|
56
|
+
if (limit !== undefined && results.length >= limit) {
|
|
57
|
+
limitReached = true;
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
// If not including nested matches, skip children of matched nodes
|
|
61
|
+
if (!includeNested) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return undefined;
|
|
66
|
+
});
|
|
67
|
+
return results;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Compare two AST subtrees for similarity.
|
|
71
|
+
*
|
|
72
|
+
* @param node1 - First subtree root
|
|
73
|
+
* @param node2 - Second subtree root
|
|
74
|
+
* @param options - Comparison options
|
|
75
|
+
* @returns Comparison result with similarity score and differences
|
|
76
|
+
*/
|
|
77
|
+
compareSubtrees(node1, node2, options = {}) {
|
|
78
|
+
const differences = [];
|
|
79
|
+
const stats = { nodesCompared: 0, matchingNodes: 0, differentNodes: 0 };
|
|
80
|
+
const similarity = this.compareNodes(node1, node2, [], [], options, differences, stats, 0);
|
|
81
|
+
return {
|
|
82
|
+
isIdentical: differences.length === 0 && similarity === 1,
|
|
83
|
+
similarity,
|
|
84
|
+
differences,
|
|
85
|
+
stats,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get statistics about an AST.
|
|
90
|
+
*
|
|
91
|
+
* @param ast - The AST to analyze
|
|
92
|
+
* @returns Statistics about the AST structure
|
|
93
|
+
*/
|
|
94
|
+
getStats(ast) {
|
|
95
|
+
const nodesByType = {};
|
|
96
|
+
let nodeCount = 0;
|
|
97
|
+
let maxDepth = 0;
|
|
98
|
+
let totalChildren = 0;
|
|
99
|
+
let nonLeafNodes = 0;
|
|
100
|
+
this.traverse(ast, (node, _parent, depth) => {
|
|
101
|
+
nodeCount++;
|
|
102
|
+
maxDepth = Math.max(maxDepth, depth);
|
|
103
|
+
// Count by type
|
|
104
|
+
nodesByType[node.type] = (nodesByType[node.type] || 0) + 1;
|
|
105
|
+
// Track children for average calculation
|
|
106
|
+
if (node.children.length > 0) {
|
|
107
|
+
totalChildren += node.children.length;
|
|
108
|
+
nonLeafNodes++;
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
return {
|
|
112
|
+
nodeCount,
|
|
113
|
+
nodesByType,
|
|
114
|
+
maxDepth,
|
|
115
|
+
avgChildren: nonLeafNodes > 0 ? totalChildren / nonLeafNodes : 0,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Traverse the AST depth-first, calling the visitor for each node.
|
|
120
|
+
*
|
|
121
|
+
* @param ast - The AST to traverse
|
|
122
|
+
* @param visitor - Function called for each node. Return false to stop traversal of subtree.
|
|
123
|
+
*/
|
|
124
|
+
traverse(ast, visitor) {
|
|
125
|
+
this.traverseNode(ast.rootNode, null, 0, [], visitor);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Find all nodes of a specific type in the AST.
|
|
129
|
+
*
|
|
130
|
+
* @param ast - The AST to search
|
|
131
|
+
* @param nodeType - The type of node to find
|
|
132
|
+
* @returns Array of matching nodes
|
|
133
|
+
*/
|
|
134
|
+
findNodesByType(ast, nodeType) {
|
|
135
|
+
const results = [];
|
|
136
|
+
this.traverse(ast, (node) => {
|
|
137
|
+
if (node.type === nodeType) {
|
|
138
|
+
results.push(node);
|
|
139
|
+
}
|
|
140
|
+
return undefined;
|
|
141
|
+
});
|
|
142
|
+
return results;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Find the first node of a specific type in the AST.
|
|
146
|
+
*
|
|
147
|
+
* @param ast - The AST to search
|
|
148
|
+
* @param nodeType - The type of node to find
|
|
149
|
+
* @returns The first matching node, or null if not found
|
|
150
|
+
*/
|
|
151
|
+
findFirstNodeByType(ast, nodeType) {
|
|
152
|
+
let result = null;
|
|
153
|
+
this.traverse(ast, (node) => {
|
|
154
|
+
if (node.type === nodeType) {
|
|
155
|
+
result = node;
|
|
156
|
+
return false; // Stop traversal
|
|
157
|
+
}
|
|
158
|
+
return undefined;
|
|
159
|
+
});
|
|
160
|
+
return result;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Find the node at a specific position in the source.
|
|
164
|
+
*
|
|
165
|
+
* @param ast - The AST to search
|
|
166
|
+
* @param position - The position to find
|
|
167
|
+
* @returns The most specific node at that position, or null
|
|
168
|
+
*/
|
|
169
|
+
findNodeAtPosition(ast, position) {
|
|
170
|
+
let result = null;
|
|
171
|
+
this.traverse(ast, (node) => {
|
|
172
|
+
if (this.positionInRange(position, node.startPosition, node.endPosition)) {
|
|
173
|
+
result = node; // Keep updating to get the most specific (deepest) node
|
|
174
|
+
}
|
|
175
|
+
return undefined;
|
|
176
|
+
});
|
|
177
|
+
return result;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Get all descendants of a node.
|
|
181
|
+
*
|
|
182
|
+
* @param node - The node to get descendants of
|
|
183
|
+
* @returns Array of all descendant nodes
|
|
184
|
+
*/
|
|
185
|
+
getDescendants(node) {
|
|
186
|
+
const descendants = [];
|
|
187
|
+
const collect = (n) => {
|
|
188
|
+
for (const child of n.children) {
|
|
189
|
+
descendants.push(child);
|
|
190
|
+
collect(child);
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
collect(node);
|
|
194
|
+
return descendants;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Get the depth of a node in the AST.
|
|
198
|
+
*
|
|
199
|
+
* @param ast - The AST containing the node
|
|
200
|
+
* @param targetNode - The node to get depth for
|
|
201
|
+
* @returns The depth (0 for root), or -1 if not found
|
|
202
|
+
*/
|
|
203
|
+
getNodeDepth(ast, targetNode) {
|
|
204
|
+
let foundDepth = -1;
|
|
205
|
+
this.traverse(ast, (node, _parent, depth) => {
|
|
206
|
+
if (node === targetNode) {
|
|
207
|
+
foundDepth = depth;
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
return undefined;
|
|
211
|
+
});
|
|
212
|
+
return foundDepth;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Get the parent chain from root to a specific node.
|
|
216
|
+
*
|
|
217
|
+
* @param ast - The AST to search
|
|
218
|
+
* @param targetNode - The node to find parents for
|
|
219
|
+
* @returns Array of parent nodes from root to immediate parent
|
|
220
|
+
*/
|
|
221
|
+
getParentChain(ast, targetNode) {
|
|
222
|
+
const parents = [];
|
|
223
|
+
const findParents = (node, chain) => {
|
|
224
|
+
if (node === targetNode) {
|
|
225
|
+
parents.push(...chain);
|
|
226
|
+
return true;
|
|
227
|
+
}
|
|
228
|
+
for (const child of node.children) {
|
|
229
|
+
if (findParents(child, [...chain, node])) {
|
|
230
|
+
return true;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return false;
|
|
234
|
+
};
|
|
235
|
+
findParents(ast.rootNode, []);
|
|
236
|
+
return parents;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Check if a node is a leaf node (has no children).
|
|
240
|
+
*
|
|
241
|
+
* @param node - The node to check
|
|
242
|
+
* @returns true if the node has no children
|
|
243
|
+
*/
|
|
244
|
+
isLeafNode(node) {
|
|
245
|
+
return node.children.length === 0;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Analyze an AST and return analysis results.
|
|
249
|
+
*
|
|
250
|
+
* @param ast - The AST to analyze
|
|
251
|
+
* @param patterns - Patterns to search for
|
|
252
|
+
* @returns Analysis result with matches and statistics
|
|
253
|
+
*/
|
|
254
|
+
analyze(ast, patterns) {
|
|
255
|
+
const matches = [];
|
|
256
|
+
const stats = this.getStats(ast);
|
|
257
|
+
for (const [patternId, pattern] of patterns) {
|
|
258
|
+
const patternMatches = this.findPattern(ast, pattern);
|
|
259
|
+
for (const match of patternMatches) {
|
|
260
|
+
matches.push({
|
|
261
|
+
patternId,
|
|
262
|
+
location: match.location,
|
|
263
|
+
confidence: match.confidence,
|
|
264
|
+
isOutlier: false,
|
|
265
|
+
node: match.node,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return { matches, stats };
|
|
270
|
+
}
|
|
271
|
+
// ============================================
|
|
272
|
+
// Private Helper Methods
|
|
273
|
+
// ============================================
|
|
274
|
+
/**
|
|
275
|
+
* Internal recursive traversal helper.
|
|
276
|
+
*/
|
|
277
|
+
traverseNode(node, parent, depth, path, visitor) {
|
|
278
|
+
const result = visitor(node, parent, depth, path);
|
|
279
|
+
// If visitor returns false, stop entire traversal
|
|
280
|
+
if (result === false) {
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
// Traverse children
|
|
284
|
+
for (let i = 0; i < node.children.length; i++) {
|
|
285
|
+
const child = node.children[i];
|
|
286
|
+
if (child) {
|
|
287
|
+
const shouldContinue = this.traverseNode(child, node, depth + 1, [...path, i], visitor);
|
|
288
|
+
if (!shouldContinue) {
|
|
289
|
+
return false;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return true;
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Match a pattern against a node and return confidence score.
|
|
297
|
+
*/
|
|
298
|
+
matchPattern(node, pattern, captures) {
|
|
299
|
+
let score = 1.0;
|
|
300
|
+
let matchCount = 0;
|
|
301
|
+
let totalChecks = 0;
|
|
302
|
+
// Check type
|
|
303
|
+
if (pattern.type !== undefined) {
|
|
304
|
+
totalChecks++;
|
|
305
|
+
if (node.type === pattern.type) {
|
|
306
|
+
matchCount++;
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
return 0; // Type mismatch is a hard failure
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
// Check text
|
|
313
|
+
if (pattern.text !== undefined) {
|
|
314
|
+
totalChecks++;
|
|
315
|
+
const textMatches = this.matchText(node.text, pattern.text, pattern.exactText);
|
|
316
|
+
if (textMatches) {
|
|
317
|
+
matchCount++;
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
return 0; // Text mismatch is a hard failure
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
// Check children count constraints
|
|
324
|
+
if (pattern.minChildren !== undefined) {
|
|
325
|
+
totalChecks++;
|
|
326
|
+
if (node.children.length >= pattern.minChildren) {
|
|
327
|
+
matchCount++;
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
return 0;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
if (pattern.maxChildren !== undefined) {
|
|
334
|
+
totalChecks++;
|
|
335
|
+
if (node.children.length <= pattern.maxChildren) {
|
|
336
|
+
matchCount++;
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
return 0;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
// Check custom predicate
|
|
343
|
+
if (pattern.predicate !== undefined) {
|
|
344
|
+
totalChecks++;
|
|
345
|
+
if (pattern.predicate(node)) {
|
|
346
|
+
matchCount++;
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
return 0;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
// Check child patterns
|
|
353
|
+
if (pattern.children !== undefined && pattern.children.length > 0) {
|
|
354
|
+
const childScore = this.matchChildPatterns(node, pattern.children, pattern.matchDescendants, captures);
|
|
355
|
+
if (childScore === 0) {
|
|
356
|
+
return 0;
|
|
357
|
+
}
|
|
358
|
+
score *= childScore;
|
|
359
|
+
}
|
|
360
|
+
// Capture the node if requested
|
|
361
|
+
if (pattern.capture !== undefined) {
|
|
362
|
+
captures.set(pattern.capture, node);
|
|
363
|
+
}
|
|
364
|
+
// Calculate final confidence
|
|
365
|
+
if (totalChecks > 0) {
|
|
366
|
+
score *= matchCount / totalChecks;
|
|
367
|
+
}
|
|
368
|
+
return score;
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Match text against a pattern (string or regex).
|
|
372
|
+
*/
|
|
373
|
+
matchText(text, pattern, exact) {
|
|
374
|
+
if (pattern instanceof RegExp) {
|
|
375
|
+
return pattern.test(text);
|
|
376
|
+
}
|
|
377
|
+
if (exact) {
|
|
378
|
+
return text === pattern;
|
|
379
|
+
}
|
|
380
|
+
return text.includes(pattern);
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Match child patterns against node children.
|
|
384
|
+
*/
|
|
385
|
+
matchChildPatterns(node, childPatterns, matchDescendants, captures) {
|
|
386
|
+
const nodesToSearch = matchDescendants ? this.getDescendants(node) : node.children;
|
|
387
|
+
let matchedCount = 0;
|
|
388
|
+
for (const childPattern of childPatterns) {
|
|
389
|
+
let found = false;
|
|
390
|
+
for (const child of nodesToSearch) {
|
|
391
|
+
const childCaptures = captures || new Map();
|
|
392
|
+
const confidence = this.matchPattern(child, childPattern, childCaptures);
|
|
393
|
+
if (confidence > 0) {
|
|
394
|
+
found = true;
|
|
395
|
+
matchedCount++;
|
|
396
|
+
// Merge captures
|
|
397
|
+
if (captures) {
|
|
398
|
+
for (const [key, value] of childCaptures) {
|
|
399
|
+
captures.set(key, value);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
break;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
if (!found) {
|
|
406
|
+
return 0; // Required child pattern not found
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
return matchedCount / childPatterns.length;
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Compare two nodes recursively.
|
|
413
|
+
*/
|
|
414
|
+
compareNodes(node1, node2, path1, path2, options, differences, stats, depth) {
|
|
415
|
+
// Check max depth
|
|
416
|
+
if (options.maxDepth !== undefined && depth > options.maxDepth) {
|
|
417
|
+
return 1;
|
|
418
|
+
}
|
|
419
|
+
stats.nodesCompared++;
|
|
420
|
+
// Check if type should be ignored
|
|
421
|
+
if (options.ignoreTypes?.includes(node1.type) || options.ignoreTypes?.includes(node2.type)) {
|
|
422
|
+
stats.matchingNodes++;
|
|
423
|
+
return 1;
|
|
424
|
+
}
|
|
425
|
+
let similarity = 1.0;
|
|
426
|
+
let isMatch = true;
|
|
427
|
+
// Compare types
|
|
428
|
+
if (node1.type !== node2.type) {
|
|
429
|
+
differences.push({
|
|
430
|
+
type: 'type_mismatch',
|
|
431
|
+
path1,
|
|
432
|
+
path2,
|
|
433
|
+
description: `Type mismatch: '${node1.type}' vs '${node2.type}'`,
|
|
434
|
+
node1,
|
|
435
|
+
node2,
|
|
436
|
+
});
|
|
437
|
+
isMatch = false;
|
|
438
|
+
similarity *= 0.5;
|
|
439
|
+
}
|
|
440
|
+
// Compare text (unless ignored)
|
|
441
|
+
if (!options.ignoreText && node1.text !== node2.text) {
|
|
442
|
+
differences.push({
|
|
443
|
+
type: 'text_mismatch',
|
|
444
|
+
path1,
|
|
445
|
+
path2,
|
|
446
|
+
description: `Text mismatch at ${node1.type}`,
|
|
447
|
+
node1,
|
|
448
|
+
node2,
|
|
449
|
+
});
|
|
450
|
+
isMatch = false;
|
|
451
|
+
similarity *= 0.8;
|
|
452
|
+
}
|
|
453
|
+
// Compare children count
|
|
454
|
+
if (node1.children.length !== node2.children.length) {
|
|
455
|
+
differences.push({
|
|
456
|
+
type: 'children_count',
|
|
457
|
+
path1,
|
|
458
|
+
path2,
|
|
459
|
+
description: `Children count mismatch: ${node1.children.length} vs ${node2.children.length}`,
|
|
460
|
+
node1,
|
|
461
|
+
node2,
|
|
462
|
+
});
|
|
463
|
+
isMatch = false;
|
|
464
|
+
}
|
|
465
|
+
// Compare children
|
|
466
|
+
const maxChildren = Math.max(node1.children.length, node2.children.length);
|
|
467
|
+
if (maxChildren > 0) {
|
|
468
|
+
let childSimilaritySum = 0;
|
|
469
|
+
let childCount = 0;
|
|
470
|
+
for (let i = 0; i < maxChildren; i++) {
|
|
471
|
+
const child1 = node1.children[i];
|
|
472
|
+
const child2 = node2.children[i];
|
|
473
|
+
if (child1 && child2) {
|
|
474
|
+
const childSimilarity = this.compareNodes(child1, child2, [...path1, i], [...path2, i], options, differences, stats, depth + 1);
|
|
475
|
+
childSimilaritySum += childSimilarity;
|
|
476
|
+
childCount++;
|
|
477
|
+
}
|
|
478
|
+
else if (child1 && !child2) {
|
|
479
|
+
differences.push({
|
|
480
|
+
type: 'extra_child',
|
|
481
|
+
path1: [...path1, i],
|
|
482
|
+
path2,
|
|
483
|
+
description: `Extra child in first subtree at index ${i}`,
|
|
484
|
+
node1: child1,
|
|
485
|
+
});
|
|
486
|
+
childCount++;
|
|
487
|
+
}
|
|
488
|
+
else if (!child1 && child2) {
|
|
489
|
+
differences.push({
|
|
490
|
+
type: 'missing_child',
|
|
491
|
+
path1,
|
|
492
|
+
path2: [...path2, i],
|
|
493
|
+
description: `Missing child in first subtree at index ${i}`,
|
|
494
|
+
node2: child2,
|
|
495
|
+
});
|
|
496
|
+
childCount++;
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
if (childCount > 0) {
|
|
500
|
+
similarity *= childSimilaritySum / childCount;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
if (isMatch) {
|
|
504
|
+
stats.matchingNodes++;
|
|
505
|
+
}
|
|
506
|
+
else {
|
|
507
|
+
stats.differentNodes++;
|
|
508
|
+
}
|
|
509
|
+
return similarity;
|
|
510
|
+
}
|
|
511
|
+
/**
|
|
512
|
+
* Check if a position is within a range.
|
|
513
|
+
*/
|
|
514
|
+
positionInRange(position, start, end) {
|
|
515
|
+
// Check if position is after start
|
|
516
|
+
if (position.row < start.row)
|
|
517
|
+
return false;
|
|
518
|
+
if (position.row === start.row && position.column < start.column)
|
|
519
|
+
return false;
|
|
520
|
+
// Check if position is before end
|
|
521
|
+
if (position.row > end.row)
|
|
522
|
+
return false;
|
|
523
|
+
if (position.row === end.row && position.column > end.column)
|
|
524
|
+
return false;
|
|
525
|
+
return true;
|
|
526
|
+
}
|
|
527
|
+
/**
|
|
528
|
+
* Check if position a is after position b.
|
|
529
|
+
*/
|
|
530
|
+
isAfterPosition(a, b) {
|
|
531
|
+
if (a.row > b.row)
|
|
532
|
+
return true;
|
|
533
|
+
if (a.row === b.row && a.column >= b.column)
|
|
534
|
+
return true;
|
|
535
|
+
return false;
|
|
536
|
+
}
|
|
537
|
+
/**
|
|
538
|
+
* Check if position a is before position b.
|
|
539
|
+
*/
|
|
540
|
+
isBeforePosition(a, b) {
|
|
541
|
+
if (a.row < b.row)
|
|
542
|
+
return true;
|
|
543
|
+
if (a.row === b.row && a.column <= b.column)
|
|
544
|
+
return true;
|
|
545
|
+
return false;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
//# sourceMappingURL=ast-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-analyzer.js","sourceRoot":"","sources":["../../src/analyzers/ast-analyzer.ts"],"names":[],"mappings":"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"}
|