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.
Files changed (221) hide show
  1. package/dist/analyzers/ast-analyzer.d.ts +251 -0
  2. package/dist/analyzers/ast-analyzer.d.ts.map +1 -0
  3. package/dist/analyzers/ast-analyzer.js +548 -0
  4. package/dist/analyzers/ast-analyzer.js.map +1 -0
  5. package/dist/analyzers/flow-analyzer.d.ts +241 -0
  6. package/dist/analyzers/flow-analyzer.d.ts.map +1 -0
  7. package/dist/analyzers/flow-analyzer.js +1219 -0
  8. package/dist/analyzers/flow-analyzer.js.map +1 -0
  9. package/dist/analyzers/index.d.ts +18 -0
  10. package/dist/analyzers/index.d.ts.map +1 -0
  11. package/dist/analyzers/index.js +19 -0
  12. package/dist/analyzers/index.js.map +1 -0
  13. package/dist/analyzers/semantic-analyzer.d.ts +252 -0
  14. package/dist/analyzers/semantic-analyzer.d.ts.map +1 -0
  15. package/dist/analyzers/semantic-analyzer.js +1182 -0
  16. package/dist/analyzers/semantic-analyzer.js.map +1 -0
  17. package/dist/analyzers/type-analyzer.d.ts +289 -0
  18. package/dist/analyzers/type-analyzer.d.ts.map +1 -0
  19. package/dist/analyzers/type-analyzer.js +1269 -0
  20. package/dist/analyzers/type-analyzer.js.map +1 -0
  21. package/dist/analyzers/types.d.ts +537 -0
  22. package/dist/analyzers/types.d.ts.map +1 -0
  23. package/dist/analyzers/types.js +11 -0
  24. package/dist/analyzers/types.js.map +1 -0
  25. package/dist/config/config-loader.d.ts +166 -0
  26. package/dist/config/config-loader.d.ts.map +1 -0
  27. package/dist/config/config-loader.js +429 -0
  28. package/dist/config/config-loader.js.map +1 -0
  29. package/dist/config/config-validator.d.ts +204 -0
  30. package/dist/config/config-validator.d.ts.map +1 -0
  31. package/dist/config/config-validator.js +632 -0
  32. package/dist/config/config-validator.js.map +1 -0
  33. package/dist/config/defaults.d.ts +8 -0
  34. package/dist/config/defaults.d.ts.map +1 -0
  35. package/dist/config/defaults.js +26 -0
  36. package/dist/config/defaults.js.map +1 -0
  37. package/dist/config/index.d.ts +10 -0
  38. package/dist/config/index.d.ts.map +1 -0
  39. package/dist/config/index.js +10 -0
  40. package/dist/config/index.js.map +1 -0
  41. package/dist/config/types.d.ts +47 -0
  42. package/dist/config/types.d.ts.map +1 -0
  43. package/dist/config/types.js +7 -0
  44. package/dist/config/types.js.map +1 -0
  45. package/dist/index.d.ts +37 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +39 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/manifest/exporter.d.ts +21 -0
  50. package/dist/manifest/exporter.d.ts.map +1 -0
  51. package/dist/manifest/exporter.js +339 -0
  52. package/dist/manifest/exporter.js.map +1 -0
  53. package/dist/manifest/index.d.ts +14 -0
  54. package/dist/manifest/index.d.ts.map +1 -0
  55. package/dist/manifest/index.js +15 -0
  56. package/dist/manifest/index.js.map +1 -0
  57. package/dist/manifest/manifest-store.d.ts +111 -0
  58. package/dist/manifest/manifest-store.d.ts.map +1 -0
  59. package/dist/manifest/manifest-store.js +418 -0
  60. package/dist/manifest/manifest-store.js.map +1 -0
  61. package/dist/manifest/types.d.ts +238 -0
  62. package/dist/manifest/types.d.ts.map +1 -0
  63. package/dist/manifest/types.js +11 -0
  64. package/dist/manifest/types.js.map +1 -0
  65. package/dist/matcher/confidence-scorer.d.ts +188 -0
  66. package/dist/matcher/confidence-scorer.d.ts.map +1 -0
  67. package/dist/matcher/confidence-scorer.js +302 -0
  68. package/dist/matcher/confidence-scorer.js.map +1 -0
  69. package/dist/matcher/index.d.ts +24 -0
  70. package/dist/matcher/index.d.ts.map +1 -0
  71. package/dist/matcher/index.js +26 -0
  72. package/dist/matcher/index.js.map +1 -0
  73. package/dist/matcher/outlier-detector.d.ts +252 -0
  74. package/dist/matcher/outlier-detector.d.ts.map +1 -0
  75. package/dist/matcher/outlier-detector.js +544 -0
  76. package/dist/matcher/outlier-detector.js.map +1 -0
  77. package/dist/matcher/pattern-matcher.d.ts +169 -0
  78. package/dist/matcher/pattern-matcher.d.ts.map +1 -0
  79. package/dist/matcher/pattern-matcher.js +692 -0
  80. package/dist/matcher/pattern-matcher.js.map +1 -0
  81. package/dist/matcher/types.d.ts +476 -0
  82. package/dist/matcher/types.d.ts.map +1 -0
  83. package/dist/matcher/types.js +36 -0
  84. package/dist/matcher/types.js.map +1 -0
  85. package/dist/parsers/base-parser.d.ts +282 -0
  86. package/dist/parsers/base-parser.d.ts.map +1 -0
  87. package/dist/parsers/base-parser.js +421 -0
  88. package/dist/parsers/base-parser.js.map +1 -0
  89. package/dist/parsers/css-parser.d.ts +225 -0
  90. package/dist/parsers/css-parser.d.ts.map +1 -0
  91. package/dist/parsers/css-parser.js +477 -0
  92. package/dist/parsers/css-parser.js.map +1 -0
  93. package/dist/parsers/index.d.ts +15 -0
  94. package/dist/parsers/index.d.ts.map +1 -0
  95. package/dist/parsers/index.js +15 -0
  96. package/dist/parsers/index.js.map +1 -0
  97. package/dist/parsers/json-parser.d.ts +219 -0
  98. package/dist/parsers/json-parser.d.ts.map +1 -0
  99. package/dist/parsers/json-parser.js +602 -0
  100. package/dist/parsers/json-parser.js.map +1 -0
  101. package/dist/parsers/markdown-parser.d.ts +276 -0
  102. package/dist/parsers/markdown-parser.d.ts.map +1 -0
  103. package/dist/parsers/markdown-parser.js +731 -0
  104. package/dist/parsers/markdown-parser.js.map +1 -0
  105. package/dist/parsers/parser-manager.d.ts +294 -0
  106. package/dist/parsers/parser-manager.d.ts.map +1 -0
  107. package/dist/parsers/parser-manager.js +738 -0
  108. package/dist/parsers/parser-manager.js.map +1 -0
  109. package/dist/parsers/python-parser.d.ts +204 -0
  110. package/dist/parsers/python-parser.d.ts.map +1 -0
  111. package/dist/parsers/python-parser.js +517 -0
  112. package/dist/parsers/python-parser.js.map +1 -0
  113. package/dist/parsers/types.d.ts +43 -0
  114. package/dist/parsers/types.d.ts.map +1 -0
  115. package/dist/parsers/types.js +7 -0
  116. package/dist/parsers/types.js.map +1 -0
  117. package/dist/parsers/typescript-parser.d.ts +264 -0
  118. package/dist/parsers/typescript-parser.d.ts.map +1 -0
  119. package/dist/parsers/typescript-parser.js +658 -0
  120. package/dist/parsers/typescript-parser.js.map +1 -0
  121. package/dist/rules/evaluator.d.ts +305 -0
  122. package/dist/rules/evaluator.d.ts.map +1 -0
  123. package/dist/rules/evaluator.js +579 -0
  124. package/dist/rules/evaluator.js.map +1 -0
  125. package/dist/rules/index.d.ts +13 -0
  126. package/dist/rules/index.d.ts.map +1 -0
  127. package/dist/rules/index.js +13 -0
  128. package/dist/rules/index.js.map +1 -0
  129. package/dist/rules/quick-fix-generator.d.ts +334 -0
  130. package/dist/rules/quick-fix-generator.d.ts.map +1 -0
  131. package/dist/rules/quick-fix-generator.js +1075 -0
  132. package/dist/rules/quick-fix-generator.js.map +1 -0
  133. package/dist/rules/rule-engine.d.ts +241 -0
  134. package/dist/rules/rule-engine.d.ts.map +1 -0
  135. package/dist/rules/rule-engine.js +585 -0
  136. package/dist/rules/rule-engine.js.map +1 -0
  137. package/dist/rules/severity-manager.d.ts +394 -0
  138. package/dist/rules/severity-manager.d.ts.map +1 -0
  139. package/dist/rules/severity-manager.js +619 -0
  140. package/dist/rules/severity-manager.js.map +1 -0
  141. package/dist/rules/types.d.ts +370 -0
  142. package/dist/rules/types.d.ts.map +1 -0
  143. package/dist/rules/types.js +133 -0
  144. package/dist/rules/types.js.map +1 -0
  145. package/dist/rules/variant-manager.d.ts +388 -0
  146. package/dist/rules/variant-manager.d.ts.map +1 -0
  147. package/dist/rules/variant-manager.js +777 -0
  148. package/dist/rules/variant-manager.js.map +1 -0
  149. package/dist/scanner/change-detector.d.ts +164 -0
  150. package/dist/scanner/change-detector.d.ts.map +1 -0
  151. package/dist/scanner/change-detector.js +263 -0
  152. package/dist/scanner/change-detector.js.map +1 -0
  153. package/dist/scanner/dependency-graph.d.ts +270 -0
  154. package/dist/scanner/dependency-graph.d.ts.map +1 -0
  155. package/dist/scanner/dependency-graph.js +436 -0
  156. package/dist/scanner/dependency-graph.js.map +1 -0
  157. package/dist/scanner/file-walker.d.ts +127 -0
  158. package/dist/scanner/file-walker.d.ts.map +1 -0
  159. package/dist/scanner/file-walker.js +526 -0
  160. package/dist/scanner/file-walker.js.map +1 -0
  161. package/dist/scanner/index.d.ts +12 -0
  162. package/dist/scanner/index.d.ts.map +1 -0
  163. package/dist/scanner/index.js +12 -0
  164. package/dist/scanner/index.js.map +1 -0
  165. package/dist/scanner/types.d.ts +218 -0
  166. package/dist/scanner/types.d.ts.map +1 -0
  167. package/dist/scanner/types.js +10 -0
  168. package/dist/scanner/types.js.map +1 -0
  169. package/dist/scanner/worker-pool.d.ts +317 -0
  170. package/dist/scanner/worker-pool.d.ts.map +1 -0
  171. package/dist/scanner/worker-pool.js +571 -0
  172. package/dist/scanner/worker-pool.js.map +1 -0
  173. package/dist/store/cache-manager.d.ts +179 -0
  174. package/dist/store/cache-manager.d.ts.map +1 -0
  175. package/dist/store/cache-manager.js +391 -0
  176. package/dist/store/cache-manager.js.map +1 -0
  177. package/dist/store/history-store.d.ts +314 -0
  178. package/dist/store/history-store.d.ts.map +1 -0
  179. package/dist/store/history-store.js +707 -0
  180. package/dist/store/history-store.js.map +1 -0
  181. package/dist/store/index.d.ts +20 -0
  182. package/dist/store/index.d.ts.map +1 -0
  183. package/dist/store/index.js +26 -0
  184. package/dist/store/index.js.map +1 -0
  185. package/dist/store/lock-file-manager.d.ts +202 -0
  186. package/dist/store/lock-file-manager.d.ts.map +1 -0
  187. package/dist/store/lock-file-manager.js +475 -0
  188. package/dist/store/lock-file-manager.js.map +1 -0
  189. package/dist/store/pattern-store.d.ts +289 -0
  190. package/dist/store/pattern-store.d.ts.map +1 -0
  191. package/dist/store/pattern-store.js +936 -0
  192. package/dist/store/pattern-store.js.map +1 -0
  193. package/dist/store/schema-validator.d.ts +159 -0
  194. package/dist/store/schema-validator.d.ts.map +1 -0
  195. package/dist/store/schema-validator.js +1096 -0
  196. package/dist/store/schema-validator.js.map +1 -0
  197. package/dist/store/types.d.ts +585 -0
  198. package/dist/store/types.d.ts.map +1 -0
  199. package/dist/store/types.js +82 -0
  200. package/dist/store/types.js.map +1 -0
  201. package/dist/types/analysis.d.ts +19 -0
  202. package/dist/types/analysis.d.ts.map +1 -0
  203. package/dist/types/analysis.js +5 -0
  204. package/dist/types/analysis.js.map +1 -0
  205. package/dist/types/common.d.ts +7 -0
  206. package/dist/types/common.d.ts.map +1 -0
  207. package/dist/types/common.js +5 -0
  208. package/dist/types/common.js.map +1 -0
  209. package/dist/types/index.d.ts +12 -0
  210. package/dist/types/index.d.ts.map +1 -0
  211. package/dist/types/index.js +10 -0
  212. package/dist/types/index.js.map +1 -0
  213. package/dist/types/patterns.d.ts +40 -0
  214. package/dist/types/patterns.d.ts.map +1 -0
  215. package/dist/types/patterns.js +7 -0
  216. package/dist/types/patterns.js.map +1 -0
  217. package/dist/types/violations.d.ts +7 -0
  218. package/dist/types/violations.d.ts.map +1 -0
  219. package/dist/types/violations.js +7 -0
  220. package/dist/types/violations.js.map +1 -0
  221. 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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"}