@skillsmith/core 0.2.0 → 2.0.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/README.md +233 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/analysis/__tests__/incremental.test.d.ts +13 -0
- package/dist/src/analysis/__tests__/incremental.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/incremental.test.js +515 -0
- package/dist/src/analysis/__tests__/incremental.test.js.map +1 -0
- package/dist/src/analysis/__tests__/integration.test.d.ts +14 -0
- package/dist/src/analysis/__tests__/integration.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/integration.test.js +1059 -0
- package/dist/src/analysis/__tests__/integration.test.js.map +1 -0
- package/dist/src/analysis/__tests__/metrics.test.d.ts +9 -0
- package/dist/src/analysis/__tests__/metrics.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/metrics.test.js +369 -0
- package/dist/src/analysis/__tests__/metrics.test.js.map +1 -0
- package/dist/src/analysis/__tests__/performance.test.d.ts +15 -0
- package/dist/src/analysis/__tests__/performance.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/performance.test.js +402 -0
- package/dist/src/analysis/__tests__/performance.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/go.test.d.ts +12 -0
- package/dist/src/analysis/adapters/__tests__/go.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/go.test.js +561 -0
- package/dist/src/analysis/adapters/__tests__/go.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/python.test.d.ts +11 -0
- package/dist/src/analysis/adapters/__tests__/python.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/python.test.js +669 -0
- package/dist/src/analysis/adapters/__tests__/python.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.d.ts +12 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.js +676 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts +14 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.js +381 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.js.map +1 -0
- package/dist/src/analysis/adapters/base.d.ts +83 -0
- package/dist/src/analysis/adapters/base.d.ts.map +1 -0
- package/dist/src/analysis/adapters/base.js +40 -0
- package/dist/src/analysis/adapters/base.js.map +1 -0
- package/dist/src/analysis/adapters/factory.d.ts +150 -0
- package/dist/src/analysis/adapters/factory.d.ts.map +1 -0
- package/dist/src/analysis/adapters/factory.js +244 -0
- package/dist/src/analysis/adapters/factory.js.map +1 -0
- package/dist/src/analysis/adapters/go.d.ts +131 -0
- package/dist/src/analysis/adapters/go.d.ts.map +1 -0
- package/dist/src/analysis/adapters/go.js +414 -0
- package/dist/src/analysis/adapters/go.js.map +1 -0
- package/dist/src/analysis/adapters/index.d.ts +20 -0
- package/dist/src/analysis/adapters/index.d.ts.map +1 -0
- package/dist/src/analysis/adapters/index.js +23 -0
- package/dist/src/analysis/adapters/index.js.map +1 -0
- package/dist/src/analysis/adapters/java.d.ts +154 -0
- package/dist/src/analysis/adapters/java.d.ts.map +1 -0
- package/dist/src/analysis/adapters/java.js +407 -0
- package/dist/src/analysis/adapters/java.js.map +1 -0
- package/dist/src/analysis/adapters/python.d.ts +165 -0
- package/dist/src/analysis/adapters/python.d.ts.map +1 -0
- package/dist/src/analysis/adapters/python.js +475 -0
- package/dist/src/analysis/adapters/python.js.map +1 -0
- package/dist/src/analysis/adapters/rust.d.ts +116 -0
- package/dist/src/analysis/adapters/rust.d.ts.map +1 -0
- package/dist/src/analysis/adapters/rust.js +476 -0
- package/dist/src/analysis/adapters/rust.js.map +1 -0
- package/dist/src/analysis/adapters/typescript.d.ts +68 -0
- package/dist/src/analysis/adapters/typescript.d.ts.map +1 -0
- package/dist/src/analysis/adapters/typescript.js +79 -0
- package/dist/src/analysis/adapters/typescript.js.map +1 -0
- package/dist/src/analysis/aggregator.d.ts +193 -0
- package/dist/src/analysis/aggregator.d.ts.map +1 -0
- package/dist/src/analysis/aggregator.js +283 -0
- package/dist/src/analysis/aggregator.js.map +1 -0
- package/dist/src/analysis/cache.d.ts +180 -0
- package/dist/src/analysis/cache.d.ts.map +1 -0
- package/dist/src/analysis/cache.js +279 -0
- package/dist/src/analysis/cache.js.map +1 -0
- package/dist/src/analysis/file-streamer.d.ts +136 -0
- package/dist/src/analysis/file-streamer.d.ts.map +1 -0
- package/dist/src/analysis/file-streamer.js +291 -0
- package/dist/src/analysis/file-streamer.js.map +1 -0
- package/dist/src/analysis/incremental-parser.d.ts +186 -0
- package/dist/src/analysis/incremental-parser.d.ts.map +1 -0
- package/dist/src/analysis/incremental-parser.js +291 -0
- package/dist/src/analysis/incremental-parser.js.map +1 -0
- package/dist/src/analysis/incremental.d.ts +186 -0
- package/dist/src/analysis/incremental.d.ts.map +1 -0
- package/dist/src/analysis/incremental.js +247 -0
- package/dist/src/analysis/incremental.js.map +1 -0
- package/dist/src/analysis/index.d.ts +25 -3
- package/dist/src/analysis/index.d.ts.map +1 -1
- package/dist/src/analysis/index.js +45 -3
- package/dist/src/analysis/index.js.map +1 -1
- package/dist/src/analysis/language-detector.d.ts +92 -0
- package/dist/src/analysis/language-detector.d.ts.map +1 -0
- package/dist/src/analysis/language-detector.js +602 -0
- package/dist/src/analysis/language-detector.js.map +1 -0
- package/dist/src/analysis/memory-monitor.d.ts +199 -0
- package/dist/src/analysis/memory-monitor.d.ts.map +1 -0
- package/dist/src/analysis/memory-monitor.js +271 -0
- package/dist/src/analysis/memory-monitor.js.map +1 -0
- package/dist/src/analysis/metrics.d.ts +300 -0
- package/dist/src/analysis/metrics.d.ts.map +1 -0
- package/dist/src/analysis/metrics.js +537 -0
- package/dist/src/analysis/metrics.js.map +1 -0
- package/dist/src/analysis/router.d.ts +264 -0
- package/dist/src/analysis/router.d.ts.map +1 -0
- package/dist/src/analysis/router.js +398 -0
- package/dist/src/analysis/router.js.map +1 -0
- package/dist/src/analysis/tree-cache.d.ts +208 -0
- package/dist/src/analysis/tree-cache.d.ts.map +1 -0
- package/dist/src/analysis/tree-cache.js +288 -0
- package/dist/src/analysis/tree-cache.js.map +1 -0
- package/dist/src/analysis/tree-sitter/manager.d.ts +141 -0
- package/dist/src/analysis/tree-sitter/manager.d.ts.map +1 -0
- package/dist/src/analysis/tree-sitter/manager.js +239 -0
- package/dist/src/analysis/tree-sitter/manager.js.map +1 -0
- package/dist/src/analysis/types.d.ts +69 -6
- package/dist/src/analysis/types.d.ts.map +1 -1
- package/dist/src/analysis/types.js +23 -2
- package/dist/src/analysis/types.js.map +1 -1
- package/dist/src/analysis/worker-pool.d.ts +141 -0
- package/dist/src/analysis/worker-pool.d.ts.map +1 -0
- package/dist/src/analysis/worker-pool.js +418 -0
- package/dist/src/analysis/worker-pool.js.map +1 -0
- package/dist/src/analytics/schema.d.ts +1 -1
- package/dist/src/analytics/schema.d.ts.map +1 -1
- package/dist/src/analytics/schema.js +72 -0
- package/dist/src/analytics/schema.js.map +1 -1
- package/dist/src/api/cache.d.ts +24 -1
- package/dist/src/api/cache.d.ts.map +1 -1
- package/dist/src/api/cache.js +50 -2
- package/dist/src/api/cache.js.map +1 -1
- package/dist/src/api/client.d.ts +132 -2
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.js +214 -18
- package/dist/src/api/client.js.map +1 -1
- package/dist/src/api/index.d.ts +2 -0
- package/dist/src/api/index.d.ts.map +1 -1
- package/dist/src/api/index.js +7 -0
- package/dist/src/api/index.js.map +1 -1
- package/dist/src/api/types.d.ts +251 -0
- package/dist/src/api/types.d.ts.map +1 -0
- package/dist/src/api/types.js +9 -0
- package/dist/src/api/types.js.map +1 -0
- package/dist/src/benchmarks/memory/MemoryProfiler.d.ts.map +1 -1
- package/dist/src/benchmarks/memory/MemoryProfiler.js.map +1 -1
- package/dist/src/embeddings/index.d.ts.map +1 -1
- package/dist/src/embeddings/index.js.map +1 -1
- package/dist/src/errors.d.ts +1 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +1 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +3 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/repositories/IndexerRepository.d.ts.map +1 -1
- package/dist/src/repositories/IndexerRepository.js +1 -0
- package/dist/src/repositories/IndexerRepository.js.map +1 -1
- package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
- package/dist/src/repositories/SkillRepository.js +1 -0
- package/dist/src/repositories/SkillRepository.js.map +1 -1
- package/dist/src/repositories/quarantine/QuarantineRepository.d.ts.map +1 -1
- package/dist/src/repositories/quarantine/QuarantineRepository.js.map +1 -1
- package/dist/src/repositories/quarantine/query-builder.d.ts.map +1 -1
- package/dist/src/repositories/quarantine/query-builder.js +1 -1
- package/dist/src/repositories/quarantine/query-builder.js.map +1 -1
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js +3 -3
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
- package/dist/src/scripts/github-import/index.js.map +1 -1
- package/dist/src/scripts/import-github-skills.js +1 -1
- package/dist/src/scripts/import-github-skills.js.map +1 -1
- package/dist/src/scripts/skill-scanner/reporter.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/reporter.js.map +1 -1
- package/dist/src/scripts/skill-scanner/scanner.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/scanner.js.map +1 -1
- package/dist/src/scripts/skill-scanner/trust-scorer.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/trust-scorer.js.map +1 -1
- package/dist/src/scripts/validation/index.js +1 -2
- package/dist/src/scripts/validation/index.js.map +1 -1
- package/dist/src/scripts/validation/pipeline.d.ts.map +1 -1
- package/dist/src/scripts/validation/pipeline.js.map +1 -1
- package/dist/src/scripts/validation/types.d.ts +2 -2
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
- package/dist/src/services/SearchService.d.ts.map +1 -1
- package/dist/src/services/SearchService.js +1 -0
- package/dist/src/services/SearchService.js.map +1 -1
- package/dist/src/session/SessionHealthMonitor.d.ts +1 -1
- package/dist/src/session/SessionHealthMonitor.d.ts.map +1 -1
- package/dist/src/session/SessionHealthMonitor.js +1 -1
- package/dist/src/session/SessionHealthMonitor.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +1 -1
- package/dist/src/telemetry/index.d.ts.map +1 -1
- package/dist/src/telemetry/index.js +2 -2
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/posthog.d.ts +27 -5
- package/dist/src/telemetry/posthog.d.ts.map +1 -1
- package/dist/src/telemetry/posthog.js +20 -5
- package/dist/src/telemetry/posthog.js.map +1 -1
- package/dist/src/types/skill.d.ts +3 -0
- package/dist/src/types/skill.d.ts.map +1 -1
- package/dist/src/types.d.ts +2 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +2 -2
- package/dist/src/types.js.map +1 -1
- package/dist/tests/adapters-factory.test.d.ts +13 -0
- package/dist/tests/adapters-factory.test.d.ts.map +1 -0
- package/dist/tests/adapters-factory.test.js +308 -0
- package/dist/tests/adapters-factory.test.js.map +1 -0
- package/dist/tests/adapters-java.test.d.ts +13 -0
- package/dist/tests/adapters-java.test.d.ts.map +1 -0
- package/dist/tests/adapters-java.test.js +925 -0
- package/dist/tests/adapters-java.test.js.map +1 -0
- package/dist/tests/api/client.validation.test.d.ts +7 -0
- package/dist/tests/api/client.validation.test.d.ts.map +1 -0
- package/dist/tests/api/client.validation.test.js +183 -0
- package/dist/tests/api/client.validation.test.js.map +1 -0
- package/dist/tests/language-detector.test.d.ts +13 -0
- package/dist/tests/language-detector.test.d.ts.map +1 -0
- package/dist/tests/language-detector.test.js +674 -0
- package/dist/tests/language-detector.test.js.map +1 -0
- package/dist/tests/telemetry/posthog.test.d.ts +13 -0
- package/dist/tests/telemetry/posthog.test.d.ts.map +1 -0
- package/dist/tests/telemetry/posthog.test.js +600 -0
- package/dist/tests/telemetry/posthog.test.js.map +1 -0
- package/package.json +5 -6
- package/dist/src/security/RateLimiter.d.ts +0 -337
- package/dist/src/security/RateLimiter.d.ts.map +0 -1
- package/dist/src/security/RateLimiter.js +0 -782
- package/dist/src/security/RateLimiter.js.map +0 -1
- package/dist/src/security/scanner.d.ts +0 -151
- package/dist/src/security/scanner.d.ts.map +0 -1
- package/dist/src/security/scanner.js +0 -599
- package/dist/src/security/scanner.js.map +0 -1
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1309: Incremental Parser Coordinator
|
|
3
|
+
*
|
|
4
|
+
* Coordinates incremental parsing across language adapters.
|
|
5
|
+
* Uses tree caching to enable fast re-parsing when only
|
|
6
|
+
* small portions of files change.
|
|
7
|
+
*
|
|
8
|
+
* Performance target: < 100ms for incremental parse
|
|
9
|
+
*
|
|
10
|
+
* @see docs/architecture/multi-language-analysis.md
|
|
11
|
+
* @module analysis/incremental-parser
|
|
12
|
+
*/
|
|
13
|
+
import { createHash } from 'crypto';
|
|
14
|
+
import { TreeCache } from './tree-cache.js';
|
|
15
|
+
import { findMinimalEdit, calculateEdit } from './incremental.js';
|
|
16
|
+
/**
|
|
17
|
+
* Incremental parsing coordinator
|
|
18
|
+
*
|
|
19
|
+
* Manages tree caching and content tracking to enable efficient
|
|
20
|
+
* incremental parsing when files change.
|
|
21
|
+
*
|
|
22
|
+
* Flow:
|
|
23
|
+
* 1. Check if content unchanged (return cached result)
|
|
24
|
+
* 2. Check if previous tree exists for incremental parse
|
|
25
|
+
* 3. Calculate edit between old and new content
|
|
26
|
+
* 4. Apply edit to tree and re-parse incrementally
|
|
27
|
+
* 5. Cache new tree for future updates
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* const parser = new IncrementalParser({ maxTrees: 50 })
|
|
32
|
+
* const adapter = new TypeScriptAdapter()
|
|
33
|
+
*
|
|
34
|
+
* // First parse (full)
|
|
35
|
+
* const result1 = parser.parse('src/main.ts', content1, adapter)
|
|
36
|
+
* console.log(result1.wasIncremental) // false
|
|
37
|
+
*
|
|
38
|
+
* // Second parse with small change (incremental)
|
|
39
|
+
* const result2 = parser.parse('src/main.ts', content2, adapter)
|
|
40
|
+
* console.log(result2.wasIncremental) // true
|
|
41
|
+
* console.log(result2.durationMs) // < 100ms
|
|
42
|
+
*
|
|
43
|
+
* // Cleanup
|
|
44
|
+
* parser.dispose()
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export class IncrementalParser {
|
|
48
|
+
treeCache;
|
|
49
|
+
contentCache;
|
|
50
|
+
cacheContent;
|
|
51
|
+
incrementalParses = 0;
|
|
52
|
+
fullParses = 0;
|
|
53
|
+
totalIncrementalTime = 0;
|
|
54
|
+
totalFullTime = 0;
|
|
55
|
+
constructor(options = {}) {
|
|
56
|
+
this.treeCache = new TreeCache({ maxTrees: options.maxTrees });
|
|
57
|
+
this.contentCache = new Map();
|
|
58
|
+
this.cacheContent = options.cacheContent ?? true;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Parse file, using incremental parsing if possible
|
|
62
|
+
*
|
|
63
|
+
* Automatically determines whether to use incremental or
|
|
64
|
+
* full parsing based on cached state.
|
|
65
|
+
*
|
|
66
|
+
* @param filePath - Path to the file
|
|
67
|
+
* @param content - Current file content
|
|
68
|
+
* @param adapter - Language adapter for parsing
|
|
69
|
+
* @returns Parse result with metadata
|
|
70
|
+
*/
|
|
71
|
+
parse(filePath, content, adapter) {
|
|
72
|
+
const start = performance.now();
|
|
73
|
+
const contentHash = this.hashContent(content);
|
|
74
|
+
// Check if tree is still valid (content unchanged)
|
|
75
|
+
if (this.treeCache.isValid(filePath, contentHash)) {
|
|
76
|
+
// Content unchanged, use cached tree for extraction
|
|
77
|
+
const cachedTree = this.treeCache.get(filePath);
|
|
78
|
+
if (cachedTree) {
|
|
79
|
+
// Re-extract from cached tree (cheaper than full parse)
|
|
80
|
+
const result = adapter.parseFile(content, filePath);
|
|
81
|
+
const durationMs = performance.now() - start;
|
|
82
|
+
return {
|
|
83
|
+
result,
|
|
84
|
+
wasIncremental: true,
|
|
85
|
+
wasCached: true,
|
|
86
|
+
durationMs,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Check if we can do incremental parse
|
|
91
|
+
const oldContent = this.contentCache.get(filePath);
|
|
92
|
+
const previousTree = this.treeCache.get(filePath);
|
|
93
|
+
if (oldContent && previousTree && this.cacheContent) {
|
|
94
|
+
// Try incremental parse
|
|
95
|
+
const edit = findMinimalEdit(oldContent, content);
|
|
96
|
+
if (edit) {
|
|
97
|
+
return this.doIncrementalParse(filePath, content, contentHash, adapter, previousTree, edit, start);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Full parse required
|
|
101
|
+
return this.doFullParse(filePath, content, contentHash, adapter, start);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Parse file with explicit edit information
|
|
105
|
+
*
|
|
106
|
+
* Use this when edit information is already available
|
|
107
|
+
* (e.g., from an editor's change event).
|
|
108
|
+
*
|
|
109
|
+
* @param filePath - Path to the file
|
|
110
|
+
* @param content - Current file content
|
|
111
|
+
* @param adapter - Language adapter
|
|
112
|
+
* @param edit - Edit information
|
|
113
|
+
* @returns Parse result with metadata
|
|
114
|
+
*/
|
|
115
|
+
parseWithEdit(filePath, content, adapter, edit) {
|
|
116
|
+
const start = performance.now();
|
|
117
|
+
const contentHash = this.hashContent(content);
|
|
118
|
+
const previousTree = this.treeCache.get(filePath);
|
|
119
|
+
if (previousTree) {
|
|
120
|
+
// Apply edit to previous tree
|
|
121
|
+
const result = adapter.parseIncremental(content, filePath, {
|
|
122
|
+
previousTree,
|
|
123
|
+
edit,
|
|
124
|
+
});
|
|
125
|
+
// Update caches
|
|
126
|
+
if (this.cacheContent) {
|
|
127
|
+
this.contentCache.set(filePath, content);
|
|
128
|
+
}
|
|
129
|
+
this.treeCache.set(filePath, null, contentHash); // Store hash for validation
|
|
130
|
+
const durationMs = performance.now() - start;
|
|
131
|
+
this.recordIncremental(durationMs);
|
|
132
|
+
return {
|
|
133
|
+
result,
|
|
134
|
+
wasIncremental: true,
|
|
135
|
+
wasCached: false,
|
|
136
|
+
durationMs,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
// No previous tree, fall back to full parse
|
|
140
|
+
return this.doFullParse(filePath, content, contentHash, adapter, start);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Invalidate cache for file(s)
|
|
144
|
+
*
|
|
145
|
+
* Call this when files are deleted or externally modified.
|
|
146
|
+
*
|
|
147
|
+
* @param filePaths - Path or paths to invalidate
|
|
148
|
+
*/
|
|
149
|
+
invalidate(filePaths) {
|
|
150
|
+
const paths = Array.isArray(filePaths) ? filePaths : [filePaths];
|
|
151
|
+
this.treeCache.invalidateMany(paths);
|
|
152
|
+
for (const path of paths) {
|
|
153
|
+
this.contentCache.delete(path);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Invalidate files matching a pattern
|
|
158
|
+
*
|
|
159
|
+
* @param pattern - Regex to match file paths
|
|
160
|
+
* @returns Number of entries invalidated
|
|
161
|
+
*/
|
|
162
|
+
invalidatePattern(pattern) {
|
|
163
|
+
let count = this.treeCache.invalidatePattern(pattern);
|
|
164
|
+
for (const path of this.contentCache.keys()) {
|
|
165
|
+
if (pattern.test(path)) {
|
|
166
|
+
this.contentCache.delete(path);
|
|
167
|
+
count++;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return count;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Check if a file is cached
|
|
174
|
+
*
|
|
175
|
+
* @param filePath - Path to check
|
|
176
|
+
* @returns True if content and/or tree is cached
|
|
177
|
+
*/
|
|
178
|
+
isCached(filePath) {
|
|
179
|
+
return this.treeCache.has(filePath) || this.contentCache.has(filePath);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Get cache statistics
|
|
183
|
+
*/
|
|
184
|
+
getStats() {
|
|
185
|
+
return {
|
|
186
|
+
treeCache: this.treeCache.getStats(),
|
|
187
|
+
contentCacheSize: this.contentCache.size,
|
|
188
|
+
incrementalParses: this.incrementalParses,
|
|
189
|
+
fullParses: this.fullParses,
|
|
190
|
+
avgIncrementalTimeMs: this.incrementalParses > 0 ? this.totalIncrementalTime / this.incrementalParses : 0,
|
|
191
|
+
avgFullTimeMs: this.fullParses > 0 ? this.totalFullTime / this.fullParses : 0,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Reset statistics
|
|
196
|
+
*/
|
|
197
|
+
resetStats() {
|
|
198
|
+
this.treeCache.resetStats();
|
|
199
|
+
this.incrementalParses = 0;
|
|
200
|
+
this.fullParses = 0;
|
|
201
|
+
this.totalIncrementalTime = 0;
|
|
202
|
+
this.totalFullTime = 0;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Clear all caches
|
|
206
|
+
*/
|
|
207
|
+
clear() {
|
|
208
|
+
this.treeCache.clear();
|
|
209
|
+
this.contentCache.clear();
|
|
210
|
+
this.resetStats();
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Dispose of all resources
|
|
214
|
+
*
|
|
215
|
+
* Call this when the parser is no longer needed.
|
|
216
|
+
*/
|
|
217
|
+
dispose() {
|
|
218
|
+
this.treeCache.dispose();
|
|
219
|
+
this.contentCache.clear();
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Get the underlying tree cache (for advanced use)
|
|
223
|
+
*/
|
|
224
|
+
getTreeCache() {
|
|
225
|
+
return this.treeCache;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Perform incremental parse
|
|
229
|
+
*/
|
|
230
|
+
doIncrementalParse(filePath, content, contentHash, adapter, previousTree, edit, startTime) {
|
|
231
|
+
const oldContent = this.contentCache.get(filePath);
|
|
232
|
+
const fileEdit = calculateEdit(oldContent, content, edit.changeStart, edit.changeEnd, edit.newText);
|
|
233
|
+
const result = adapter.parseIncremental(content, filePath, {
|
|
234
|
+
previousTree,
|
|
235
|
+
edit: fileEdit,
|
|
236
|
+
});
|
|
237
|
+
// Update caches
|
|
238
|
+
if (this.cacheContent) {
|
|
239
|
+
this.contentCache.set(filePath, content);
|
|
240
|
+
}
|
|
241
|
+
this.treeCache.set(filePath, null, contentHash); // Store hash for validation
|
|
242
|
+
const durationMs = performance.now() - startTime;
|
|
243
|
+
this.recordIncremental(durationMs);
|
|
244
|
+
return {
|
|
245
|
+
result,
|
|
246
|
+
wasIncremental: true,
|
|
247
|
+
wasCached: false,
|
|
248
|
+
durationMs,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Perform full parse
|
|
253
|
+
*/
|
|
254
|
+
doFullParse(filePath, content, contentHash, adapter, startTime) {
|
|
255
|
+
const result = adapter.parseFile(content, filePath);
|
|
256
|
+
// Update caches
|
|
257
|
+
if (this.cacheContent) {
|
|
258
|
+
this.contentCache.set(filePath, content);
|
|
259
|
+
}
|
|
260
|
+
this.treeCache.set(filePath, null, contentHash); // Store hash for validation
|
|
261
|
+
const durationMs = performance.now() - startTime;
|
|
262
|
+
this.recordFull(durationMs);
|
|
263
|
+
return {
|
|
264
|
+
result,
|
|
265
|
+
wasIncremental: false,
|
|
266
|
+
wasCached: false,
|
|
267
|
+
durationMs,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Record incremental parse statistics
|
|
272
|
+
*/
|
|
273
|
+
recordIncremental(durationMs) {
|
|
274
|
+
this.incrementalParses++;
|
|
275
|
+
this.totalIncrementalTime += durationMs;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Record full parse statistics
|
|
279
|
+
*/
|
|
280
|
+
recordFull(durationMs) {
|
|
281
|
+
this.fullParses++;
|
|
282
|
+
this.totalFullTime += durationMs;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Hash content for cache validation
|
|
286
|
+
*/
|
|
287
|
+
hashContent(content) {
|
|
288
|
+
return createHash('sha256').update(content).digest('hex').slice(0, 16);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=incremental-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incremental-parser.js","sourceRoot":"","sources":["../../../src/analysis/incremental-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1309: Incremental Parsing Support
|
|
3
|
+
*
|
|
4
|
+
* Edit tracking utilities for multi-language AST analysis.
|
|
5
|
+
* Enables efficient incremental parsing by detecting minimal
|
|
6
|
+
* edit regions between old and new content.
|
|
7
|
+
*
|
|
8
|
+
* @see docs/architecture/multi-language-analysis.md
|
|
9
|
+
* @module analysis/incremental
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Position in source code (row/column)
|
|
13
|
+
*
|
|
14
|
+
* Matches tree-sitter Point interface for compatibility.
|
|
15
|
+
*/
|
|
16
|
+
export interface Point {
|
|
17
|
+
/** Zero-based line number */
|
|
18
|
+
row: number;
|
|
19
|
+
/** Zero-based column offset (byte offset within line) */
|
|
20
|
+
column: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* File edit information for incremental parsing
|
|
24
|
+
*
|
|
25
|
+
* Contains all information needed by tree-sitter's
|
|
26
|
+
* incremental parsing API to update an existing tree.
|
|
27
|
+
*/
|
|
28
|
+
export interface FileEdit {
|
|
29
|
+
/** Byte offset where the edit starts */
|
|
30
|
+
startIndex: number;
|
|
31
|
+
/** Byte offset where the old content ends */
|
|
32
|
+
oldEndIndex: number;
|
|
33
|
+
/** Byte offset where the new content ends */
|
|
34
|
+
newEndIndex: number;
|
|
35
|
+
/** Position (row/column) where edit starts */
|
|
36
|
+
startPosition: Point;
|
|
37
|
+
/** Position where old content ended */
|
|
38
|
+
oldEndPosition: Point;
|
|
39
|
+
/** Position where new content ends */
|
|
40
|
+
newEndPosition: Point;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Simple edit diff result
|
|
44
|
+
*
|
|
45
|
+
* Represents the minimal change between two strings.
|
|
46
|
+
*/
|
|
47
|
+
export interface EditDiff {
|
|
48
|
+
/** Index where the change starts */
|
|
49
|
+
changeStart: number;
|
|
50
|
+
/** Index where old content ends (exclusive) */
|
|
51
|
+
changeEnd: number;
|
|
52
|
+
/** New text that replaces [changeStart, changeEnd) */
|
|
53
|
+
newText: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Calculate file edit from content diff
|
|
57
|
+
*
|
|
58
|
+
* Converts a simple diff into the format required by
|
|
59
|
+
* tree-sitter's incremental parsing API.
|
|
60
|
+
*
|
|
61
|
+
* @param oldContent - Original file content
|
|
62
|
+
* @param newContent - Updated file content
|
|
63
|
+
* @param changeStart - Start index of the change
|
|
64
|
+
* @param changeEnd - End index in old content
|
|
65
|
+
* @param newText - Replacement text
|
|
66
|
+
* @returns FileEdit structure for tree-sitter
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```typescript
|
|
70
|
+
* const edit = calculateEdit(
|
|
71
|
+
* 'hello world',
|
|
72
|
+
* 'hello there world',
|
|
73
|
+
* 6, // after 'hello '
|
|
74
|
+
* 6, // no text removed
|
|
75
|
+
* 'there ' // inserted text
|
|
76
|
+
* )
|
|
77
|
+
* tree.edit(edit)
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
export declare function calculateEdit(oldContent: string, newContent: string, changeStart: number, changeEnd: number, newText: string): FileEdit;
|
|
81
|
+
/**
|
|
82
|
+
* Convert byte index to row/column position
|
|
83
|
+
*
|
|
84
|
+
* Scans through content counting newlines to determine
|
|
85
|
+
* the row and column for a given byte offset.
|
|
86
|
+
*
|
|
87
|
+
* @param content - File content to scan
|
|
88
|
+
* @param index - Byte offset to convert
|
|
89
|
+
* @returns Position with row and column (both zero-based)
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```typescript
|
|
93
|
+
* const pos = indexToPosition('hello\nworld', 8)
|
|
94
|
+
* // pos = { row: 1, column: 2 } (the 'r' in 'world')
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
export declare function indexToPosition(content: string, index: number): Point;
|
|
98
|
+
/**
|
|
99
|
+
* Convert row/column position to byte index
|
|
100
|
+
*
|
|
101
|
+
* Scans through content to find the byte offset for
|
|
102
|
+
* a given row and column position.
|
|
103
|
+
*
|
|
104
|
+
* @param content - File content to scan
|
|
105
|
+
* @param position - Position to convert
|
|
106
|
+
* @returns Byte offset, or content length if position is past end
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```typescript
|
|
110
|
+
* const index = positionToIndex('hello\nworld', { row: 1, column: 2 })
|
|
111
|
+
* // index = 8 (the 'r' in 'world')
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
export declare function positionToIndex(content: string, position: Point): number;
|
|
115
|
+
/**
|
|
116
|
+
* Find the minimal edit between two strings
|
|
117
|
+
*
|
|
118
|
+
* Uses a simple prefix/suffix matching algorithm to find
|
|
119
|
+
* the smallest region that changed between old and new content.
|
|
120
|
+
* Returns null if contents are identical.
|
|
121
|
+
*
|
|
122
|
+
* @param oldContent - Original string
|
|
123
|
+
* @param newContent - Modified string
|
|
124
|
+
* @returns EditDiff describing the change, or null if identical
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
* ```typescript
|
|
128
|
+
* const diff = findMinimalEdit('hello world', 'hello there world')
|
|
129
|
+
* // diff = { changeStart: 6, changeEnd: 6, newText: 'there ' }
|
|
130
|
+
*
|
|
131
|
+
* const same = findMinimalEdit('hello', 'hello')
|
|
132
|
+
* // same = null
|
|
133
|
+
* ```
|
|
134
|
+
*/
|
|
135
|
+
export declare function findMinimalEdit(oldContent: string, newContent: string): EditDiff | null;
|
|
136
|
+
/**
|
|
137
|
+
* Merge multiple edits into a single encompassing edit
|
|
138
|
+
*
|
|
139
|
+
* Useful when multiple small edits occur and need to be
|
|
140
|
+
* applied as a single incremental update.
|
|
141
|
+
*
|
|
142
|
+
* Note: This is a simplistic merge that finds the bounding
|
|
143
|
+
* region. It may over-invalidate if edits are far apart.
|
|
144
|
+
*
|
|
145
|
+
* @param edits - Array of edits to merge
|
|
146
|
+
* @returns Single merged edit, or null if array is empty
|
|
147
|
+
*
|
|
148
|
+
* @example
|
|
149
|
+
* ```typescript
|
|
150
|
+
* const merged = batchEdits([
|
|
151
|
+
* { changeStart: 0, changeEnd: 5, newText: 'HELLO' },
|
|
152
|
+
* { changeStart: 10, changeEnd: 15, newText: 'WORLD' }
|
|
153
|
+
* ])
|
|
154
|
+
* // merged encompasses both edit regions
|
|
155
|
+
* ```
|
|
156
|
+
*/
|
|
157
|
+
export declare function batchEdits(edits: EditDiff[]): EditDiff | null;
|
|
158
|
+
/**
|
|
159
|
+
* Check if an edit is a simple insertion (no deletion)
|
|
160
|
+
*
|
|
161
|
+
* @param edit - Edit to check
|
|
162
|
+
* @returns True if edit only inserts text
|
|
163
|
+
*/
|
|
164
|
+
export declare function isInsertion(edit: EditDiff): boolean;
|
|
165
|
+
/**
|
|
166
|
+
* Check if an edit is a simple deletion (no insertion)
|
|
167
|
+
*
|
|
168
|
+
* @param edit - Edit to check
|
|
169
|
+
* @returns True if edit only deletes text
|
|
170
|
+
*/
|
|
171
|
+
export declare function isDeletion(edit: EditDiff): boolean;
|
|
172
|
+
/**
|
|
173
|
+
* Check if an edit is a replacement (both deletion and insertion)
|
|
174
|
+
*
|
|
175
|
+
* @param edit - Edit to check
|
|
176
|
+
* @returns True if edit replaces text
|
|
177
|
+
*/
|
|
178
|
+
export declare function isReplacement(edit: EditDiff): boolean;
|
|
179
|
+
/**
|
|
180
|
+
* Calculate the size delta of an edit
|
|
181
|
+
*
|
|
182
|
+
* @param edit - Edit to analyze
|
|
183
|
+
* @returns Positive for growth, negative for shrinkage, zero for same size
|
|
184
|
+
*/
|
|
185
|
+
export declare function editSizeDelta(edit: EditDiff): number;
|
|
186
|
+
//# sourceMappingURL=incremental.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incremental.d.ts","sourceRoot":"","sources":["../../../src/analysis/incremental.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;GAIG;AACH,MAAM,WAAW,KAAK;IACpB,6BAA6B;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;;GAKG;AACH,MAAM,WAAW,QAAQ;IACvB,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAA;IAClB,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAA;IACnB,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAA;IACnB,8CAA8C;IAC9C,aAAa,EAAE,KAAK,CAAA;IACpB,uCAAuC;IACvC,cAAc,EAAE,KAAK,CAAA;IACrB,sCAAsC;IACtC,cAAc,EAAE,KAAK,CAAA;CACtB;AAED;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACvB,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAA;IACnB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAA;IACjB,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,aAAa,CAC3B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,QAAQ,CAaV;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAerE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG,MAAM,CAkBxE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CA6BvF;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,QAAQ,GAAG,IAAI,CAoC7D;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAEnD;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAElD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAErD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAGpD"}
|