agent-ide 0.5.1 → 0.7.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/core/change-signature/change-signature-service.d.ts.map +1 -1
- package/dist/core/change-signature/change-signature-service.js +21 -14
- package/dist/core/change-signature/change-signature-service.js.map +1 -1
- package/dist/core/change-signature/signature-parser.d.ts +0 -16
- package/dist/core/change-signature/signature-parser.d.ts.map +1 -1
- package/dist/core/change-signature/signature-parser.js +28 -111
- package/dist/core/change-signature/signature-parser.js.map +1 -1
- package/dist/core/change-signature/types.d.ts +2 -0
- package/dist/core/change-signature/types.d.ts.map +1 -1
- package/dist/core/change-signature/types.js +2 -0
- package/dist/core/change-signature/types.js.map +1 -1
- package/dist/core/dead-code/dead-code-detector.d.ts +63 -0
- package/dist/core/dead-code/dead-code-detector.d.ts.map +1 -0
- package/dist/core/dead-code/dead-code-detector.js +256 -0
- package/dist/core/dead-code/dead-code-detector.js.map +1 -0
- package/dist/core/dead-code/dead-code-remover.d.ts +133 -0
- package/dist/core/dead-code/dead-code-remover.d.ts.map +1 -0
- package/dist/core/dead-code/dead-code-remover.js +803 -0
- package/dist/core/dead-code/dead-code-remover.js.map +1 -0
- package/dist/core/dead-code/index.d.ts +9 -0
- package/dist/core/dead-code/index.d.ts.map +1 -0
- package/dist/core/dead-code/index.js +8 -0
- package/dist/core/dead-code/index.js.map +1 -0
- package/dist/core/dead-code/types.d.ts +185 -0
- package/dist/core/dead-code/types.d.ts.map +1 -0
- package/dist/core/dead-code/types.js +53 -0
- package/dist/core/dead-code/types.js.map +1 -0
- package/dist/core/dependency/dependency-analyzer.d.ts.map +1 -1
- package/dist/core/dependency/dependency-analyzer.js +2 -15
- package/dist/core/dependency/dependency-analyzer.js.map +1 -1
- package/dist/core/indexing/index-engine.d.ts.map +1 -1
- package/dist/core/indexing/index-engine.js +0 -12
- package/dist/core/indexing/index-engine.js.map +1 -1
- package/dist/core/indexing/types.d.ts +1 -1
- package/dist/core/indexing/types.js +1 -1
- package/dist/core/indexing/types.js.map +1 -1
- package/dist/core/move-file/import-resolver.d.ts +1 -1
- package/dist/core/move-file/import-resolver.d.ts.map +1 -1
- package/dist/core/move-file/import-resolver.js +1 -9
- package/dist/core/move-file/import-resolver.js.map +1 -1
- package/dist/core/move-file/move-service.d.ts +8 -0
- package/dist/core/move-file/move-service.d.ts.map +1 -1
- package/dist/core/move-file/move-service.js +102 -21
- package/dist/core/move-file/move-service.js.map +1 -1
- package/dist/core/move-member/member-extractor.d.ts +0 -8
- package/dist/core/move-member/member-extractor.d.ts.map +1 -1
- package/dist/core/move-member/member-extractor.js +0 -49
- package/dist/core/move-member/member-extractor.js.map +1 -1
- package/dist/core/move-member/move-member-service.js +1 -1
- package/dist/core/move-member/move-member-service.js.map +1 -1
- package/dist/core/shared/symbol-finder.d.ts +4 -0
- package/dist/core/shared/symbol-finder.d.ts.map +1 -1
- package/dist/core/shared/symbol-finder.js +41 -0
- package/dist/core/shared/symbol-finder.js.map +1 -1
- package/dist/core/snapshot/index.d.ts +2 -0
- package/dist/core/snapshot/index.d.ts.map +1 -1
- package/dist/core/snapshot/index.js +1 -0
- package/dist/core/snapshot/index.js.map +1 -1
- package/dist/core/snapshot/snapshot-cache.d.ts +103 -0
- package/dist/core/snapshot/snapshot-cache.d.ts.map +1 -0
- package/dist/core/snapshot/snapshot-cache.js +249 -0
- package/dist/core/snapshot/snapshot-cache.js.map +1 -0
- package/dist/core/snapshot/snapshot-generator.d.ts +12 -0
- package/dist/core/snapshot/snapshot-generator.d.ts.map +1 -1
- package/dist/core/snapshot/snapshot-generator.js +61 -3
- package/dist/core/snapshot/snapshot-generator.js.map +1 -1
- package/dist/infrastructure/formatters/index.d.ts +1 -1
- package/dist/infrastructure/formatters/index.d.ts.map +1 -1
- package/dist/infrastructure/formatters/index.js.map +1 -1
- package/dist/infrastructure/formatters/preview-converter.d.ts +62 -0
- package/dist/infrastructure/formatters/preview-converter.d.ts.map +1 -1
- package/dist/infrastructure/formatters/preview-converter.js +82 -0
- package/dist/infrastructure/formatters/preview-converter.js.map +1 -1
- package/dist/infrastructure/formatters/query-formatter.d.ts +16 -0
- package/dist/infrastructure/formatters/query-formatter.d.ts.map +1 -1
- package/dist/infrastructure/formatters/query-formatter.js +155 -3
- package/dist/infrastructure/formatters/query-formatter.js.map +1 -1
- package/dist/infrastructure/formatters/query-types.d.ts +73 -2
- package/dist/infrastructure/formatters/query-types.d.ts.map +1 -1
- package/dist/infrastructure/formatters/types.d.ts +2 -1
- package/dist/infrastructure/formatters/types.d.ts.map +1 -1
- package/dist/infrastructure/formatters/types.js +1 -0
- package/dist/infrastructure/formatters/types.js.map +1 -1
- package/dist/interfaces/cli/cli.d.ts.map +1 -1
- package/dist/interfaces/cli/cli.js +2 -29
- package/dist/interfaces/cli/cli.js.map +1 -1
- package/dist/interfaces/cli/commands/change-signature.command.js +3 -3
- package/dist/interfaces/cli/commands/change-signature.command.js.map +1 -1
- package/dist/interfaces/cli/commands/deadcode.command.d.ts +11 -0
- package/dist/interfaces/cli/commands/deadcode.command.d.ts.map +1 -0
- package/dist/interfaces/cli/commands/deadcode.command.js +164 -0
- package/dist/interfaces/cli/commands/deadcode.command.js.map +1 -0
- package/dist/interfaces/cli/commands/index.d.ts +1 -0
- package/dist/interfaces/cli/commands/index.d.ts.map +1 -1
- package/dist/interfaces/cli/commands/index.js +1 -0
- package/dist/interfaces/cli/commands/index.js.map +1 -1
- package/dist/interfaces/cli/commands/move.command.js +1 -1
- package/dist/interfaces/cli/commands/move.command.js.map +1 -1
- package/dist/interfaces/cli/commands/rename.command.js +2 -3
- package/dist/interfaces/cli/commands/rename.command.js.map +1 -1
- package/dist/interfaces/cli/commands/snapshot.command.d.ts.map +1 -1
- package/dist/interfaces/cli/commands/snapshot.command.js +20 -0
- package/dist/interfaces/cli/commands/snapshot.command.js.map +1 -1
- package/package.json +10 -12
- package/dist/plugins/python/dependency-analyzer.d.ts +0 -86
- package/dist/plugins/python/dependency-analyzer.d.ts.map +0 -1
- package/dist/plugins/python/dependency-analyzer.js +0 -252
- package/dist/plugins/python/dependency-analyzer.js.map +0 -1
- package/dist/plugins/python/index.d.ts +0 -9
- package/dist/plugins/python/index.d.ts.map +0 -1
- package/dist/plugins/python/index.js +0 -14
- package/dist/plugins/python/index.js.map +0 -1
- package/dist/plugins/python/parser.d.ts +0 -117
- package/dist/plugins/python/parser.d.ts.map +0 -1
- package/dist/plugins/python/parser.js +0 -414
- package/dist/plugins/python/parser.js.map +0 -1
- package/dist/plugins/python/symbol-extractor.d.ts +0 -108
- package/dist/plugins/python/symbol-extractor.d.ts.map +0 -1
- package/dist/plugins/python/symbol-extractor.js +0 -389
- package/dist/plugins/python/symbol-extractor.js.map +0 -1
- package/dist/plugins/python/tree-sitter-bridge.d.ts +0 -57
- package/dist/plugins/python/tree-sitter-bridge.d.ts.map +0 -1
- package/dist/plugins/python/tree-sitter-bridge.js +0 -269
- package/dist/plugins/python/tree-sitter-bridge.js.map +0 -1
- package/dist/plugins/python/types.d.ts +0 -191
- package/dist/plugins/python/types.d.ts.map +0 -1
- package/dist/plugins/python/types.js +0 -279
- package/dist/plugins/python/types.js.map +0 -1
- package/dist/plugins/swift/dependency-analyzer.d.ts +0 -33
- package/dist/plugins/swift/dependency-analyzer.d.ts.map +0 -1
- package/dist/plugins/swift/dependency-analyzer.js +0 -95
- package/dist/plugins/swift/dependency-analyzer.js.map +0 -1
- package/dist/plugins/swift/index.d.ts +0 -14
- package/dist/plugins/swift/index.d.ts.map +0 -1
- package/dist/plugins/swift/index.js +0 -19
- package/dist/plugins/swift/index.js.map +0 -1
- package/dist/plugins/swift/parser.d.ts +0 -164
- package/dist/plugins/swift/parser.d.ts.map +0 -1
- package/dist/plugins/swift/parser.js +0 -688
- package/dist/plugins/swift/parser.js.map +0 -1
- package/dist/plugins/swift/swift-bridge/swift-parser +0 -0
- package/dist/plugins/swift/symbol-extractor.d.ts +0 -46
- package/dist/plugins/swift/symbol-extractor.d.ts.map +0 -1
- package/dist/plugins/swift/symbol-extractor.js +0 -187
- package/dist/plugins/swift/symbol-extractor.js.map +0 -1
- package/dist/plugins/swift/types.d.ts +0 -149
- package/dist/plugins/swift/types.d.ts.map +0 -1
- package/dist/plugins/swift/types.js +0 -251
- package/dist/plugins/swift/types.js.map +0 -1
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dead Code 檢測器
|
|
3
|
+
* 使用 find-references 判斷未使用的符號
|
|
4
|
+
*/
|
|
5
|
+
import { createSymbolFinder, SymbolReferenceType } from '../shared/symbol-finder.js';
|
|
6
|
+
import { DEFAULT_DEAD_CODE_OPTIONS } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Dead Code 檢測器
|
|
9
|
+
*/
|
|
10
|
+
export class DeadCodeDetector {
|
|
11
|
+
indexEngine;
|
|
12
|
+
parserRegistry;
|
|
13
|
+
fileSystem;
|
|
14
|
+
options;
|
|
15
|
+
constructor(indexEngine, parserRegistry, fileSystem, options) {
|
|
16
|
+
this.indexEngine = indexEngine;
|
|
17
|
+
this.parserRegistry = parserRegistry;
|
|
18
|
+
this.fileSystem = fileSystem;
|
|
19
|
+
this.options = { ...DEFAULT_DEAD_CODE_OPTIONS, ...options };
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 執行 Dead Code 檢測
|
|
23
|
+
*/
|
|
24
|
+
async detect() {
|
|
25
|
+
const startTime = Date.now();
|
|
26
|
+
try {
|
|
27
|
+
// 取得所有已索引檔案
|
|
28
|
+
const indexedFiles = this.indexEngine.getAllIndexedFiles();
|
|
29
|
+
const filePaths = indexedFiles.map(f => f.filePath);
|
|
30
|
+
// 收集所有符號
|
|
31
|
+
const { symbols: allSymbols, skippedFiles } = await this.collectAllSymbols(filePaths);
|
|
32
|
+
// 過濾要檢測的符號類型
|
|
33
|
+
const targetSymbols = allSymbols.filter(s => this.options.symbolTypes.includes(s.type));
|
|
34
|
+
// 建立 SymbolFinder
|
|
35
|
+
const symbolFinder = createSymbolFinder(this.parserRegistry, this.fileSystem);
|
|
36
|
+
// 檢測每個符號的引用
|
|
37
|
+
const deadItems = [];
|
|
38
|
+
for (const symbol of targetSymbols) {
|
|
39
|
+
// 排除模式檢查
|
|
40
|
+
if (this.shouldExclude(symbol)) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
// 查找引用
|
|
44
|
+
const references = await symbolFinder.findReferences(symbol.name, filePaths);
|
|
45
|
+
// 分析引用:過濾掉定義位置本身
|
|
46
|
+
const symbolLine = symbol.location.range.start.line;
|
|
47
|
+
const symbolFile = symbol.location.filePath;
|
|
48
|
+
const usageRefs = references.filter(ref => {
|
|
49
|
+
// 排除定義位置(同檔案,±1 行容錯)
|
|
50
|
+
const isSameLocation = ref.location.filePath === symbolFile
|
|
51
|
+
&& Math.abs(ref.location.range.start.line - symbolLine) <= 1;
|
|
52
|
+
if (isSameLocation) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
// 只計算 usage 類型
|
|
56
|
+
return ref.type === SymbolReferenceType.Usage;
|
|
57
|
+
});
|
|
58
|
+
const hasExport = symbol.modifiers.includes('export');
|
|
59
|
+
// 判斷是否為 dead code
|
|
60
|
+
if (usageRefs.length === 0) {
|
|
61
|
+
// 沒有使用引用
|
|
62
|
+
if (hasExport && !this.options.includeExports) {
|
|
63
|
+
// export 的符號,可能被外部使用,跳過
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
const confidence = this.calculateConfidence(symbol, references.length, hasExport);
|
|
67
|
+
if (confidence >= this.options.minConfidence) {
|
|
68
|
+
deadItems.push({
|
|
69
|
+
name: symbol.name,
|
|
70
|
+
type: symbol.type,
|
|
71
|
+
location: symbol.location,
|
|
72
|
+
confidence,
|
|
73
|
+
reason: this.generateReason(symbol, hasExport, references.length)
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// 計算統計
|
|
79
|
+
const stats = this.calculateStats(targetSymbols.length, deadItems, startTime, skippedFiles);
|
|
80
|
+
return {
|
|
81
|
+
success: true,
|
|
82
|
+
items: deadItems,
|
|
83
|
+
stats
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
return {
|
|
88
|
+
success: false,
|
|
89
|
+
items: [],
|
|
90
|
+
stats: {
|
|
91
|
+
totalSymbols: 0,
|
|
92
|
+
deadCodeCount: 0,
|
|
93
|
+
byType: {},
|
|
94
|
+
filesAffected: 0,
|
|
95
|
+
scanTime: Date.now() - startTime,
|
|
96
|
+
skippedFiles: 0
|
|
97
|
+
},
|
|
98
|
+
error: error instanceof Error ? error.message : String(error)
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 收集所有符號
|
|
104
|
+
*/
|
|
105
|
+
async collectAllSymbols(filePaths) {
|
|
106
|
+
const allSymbols = [];
|
|
107
|
+
let skippedFiles = 0;
|
|
108
|
+
for (const filePath of filePaths) {
|
|
109
|
+
const parser = this.getParser(filePath);
|
|
110
|
+
if (!parser) {
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
const content = await this.readFile(filePath);
|
|
115
|
+
if (!content) {
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
const ast = await parser.parse(content, filePath);
|
|
119
|
+
const symbols = await parser.extractSymbols(ast);
|
|
120
|
+
allSymbols.push(...symbols);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
skippedFiles++;
|
|
124
|
+
// 非測試環境記錄警告
|
|
125
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
126
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
127
|
+
console.warn(`⚠️ 跳過檔案 ${filePath}: ${errorMessage}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return { symbols: allSymbols, skippedFiles };
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* 判斷是否應排除
|
|
135
|
+
*/
|
|
136
|
+
shouldExclude(symbol) {
|
|
137
|
+
// 排除建構子
|
|
138
|
+
if (symbol.name === 'constructor') {
|
|
139
|
+
return true;
|
|
140
|
+
}
|
|
141
|
+
// 排除名稱模式
|
|
142
|
+
for (const pattern of this.options.excludePatterns) {
|
|
143
|
+
if (symbol.name === pattern || symbol.name.toLowerCase() === pattern.toLowerCase()) {
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
// 支援 glob 模式
|
|
147
|
+
if (pattern.includes('*')) {
|
|
148
|
+
const regex = new RegExp('^' + pattern.replace(/\*/g, '.*') + '$');
|
|
149
|
+
if (regex.test(symbol.name)) {
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* 計算信心程度
|
|
158
|
+
*/
|
|
159
|
+
calculateConfidence(symbol, totalRefs, hasExport) {
|
|
160
|
+
let confidence = 1.0;
|
|
161
|
+
// 有定義引用但無使用引用,信心較高
|
|
162
|
+
if (totalRefs > 0) {
|
|
163
|
+
confidence = 0.95;
|
|
164
|
+
}
|
|
165
|
+
// export 的符號信心較低(可能被外部使用)
|
|
166
|
+
if (hasExport) {
|
|
167
|
+
confidence *= 0.7;
|
|
168
|
+
}
|
|
169
|
+
// 私有符號信心較高
|
|
170
|
+
if (symbol.modifiers.includes('private')) {
|
|
171
|
+
confidence = Math.min(confidence * 1.1, 1.0);
|
|
172
|
+
}
|
|
173
|
+
return Math.round(confidence * 100) / 100;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* 產生原因說明
|
|
177
|
+
*/
|
|
178
|
+
generateReason(symbol, hasExport, totalRefs) {
|
|
179
|
+
const typeLabel = this.getTypeLabel(symbol.type);
|
|
180
|
+
if (totalRefs === 0) {
|
|
181
|
+
return `${typeLabel} '${symbol.name}' 沒有任何引用`;
|
|
182
|
+
}
|
|
183
|
+
if (hasExport) {
|
|
184
|
+
return `${typeLabel} '${symbol.name}' 已 export 但在專案內無使用引用`;
|
|
185
|
+
}
|
|
186
|
+
return `${typeLabel} '${symbol.name}' 只有定義,無使用引用`;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* 取得類型標籤
|
|
190
|
+
*/
|
|
191
|
+
getTypeLabel(type) {
|
|
192
|
+
const labels = {
|
|
193
|
+
function: '函式',
|
|
194
|
+
class: '類別',
|
|
195
|
+
variable: '變數',
|
|
196
|
+
interface: '介面',
|
|
197
|
+
type: '型別',
|
|
198
|
+
property: '屬性',
|
|
199
|
+
method: '方法',
|
|
200
|
+
enum: '列舉',
|
|
201
|
+
constant: '常數'
|
|
202
|
+
};
|
|
203
|
+
return labels[type] || type;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* 計算統計
|
|
207
|
+
*/
|
|
208
|
+
calculateStats(totalSymbols, deadItems, startTime, skippedFiles) {
|
|
209
|
+
const byType = {};
|
|
210
|
+
for (const item of deadItems) {
|
|
211
|
+
byType[item.type] = (byType[item.type] || 0) + 1;
|
|
212
|
+
}
|
|
213
|
+
const filesAffected = new Set(deadItems.map(item => item.location.filePath)).size;
|
|
214
|
+
return {
|
|
215
|
+
totalSymbols,
|
|
216
|
+
deadCodeCount: deadItems.length,
|
|
217
|
+
byType,
|
|
218
|
+
filesAffected,
|
|
219
|
+
scanTime: Date.now() - startTime,
|
|
220
|
+
skippedFiles
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* 取得 Parser
|
|
225
|
+
*/
|
|
226
|
+
getParser(filePath) {
|
|
227
|
+
const extension = this.getFileExtension(filePath);
|
|
228
|
+
return this.parserRegistry.getParser(extension);
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* 取得副檔名
|
|
232
|
+
*/
|
|
233
|
+
getFileExtension(filePath) {
|
|
234
|
+
const lastDot = filePath.lastIndexOf('.');
|
|
235
|
+
return lastDot >= 0 ? filePath.substring(lastDot) : '';
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* 讀取檔案
|
|
239
|
+
*/
|
|
240
|
+
async readFile(filePath) {
|
|
241
|
+
try {
|
|
242
|
+
const content = await this.fileSystem.readFile(filePath, 'utf-8');
|
|
243
|
+
return typeof content === 'string' ? content : content.toString('utf-8');
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
return null;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* 建立 DeadCodeDetector 實例
|
|
252
|
+
*/
|
|
253
|
+
export function createDeadCodeDetector(indexEngine, parserRegistry, fileSystem, options) {
|
|
254
|
+
return new DeadCodeDetector(indexEngine, parserRegistry, fileSystem, options);
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=dead-code-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dead-code-detector.js","sourceRoot":"","sources":["../../../src/core/dead-code/dead-code-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dead Code 刪除器
|
|
3
|
+
* 負責刪除未使用的程式碼並清理相關 import
|
|
4
|
+
*/
|
|
5
|
+
import type { IFileSystem } from '../../infrastructure/storage/file-system.interface.js';
|
|
6
|
+
import type { ParserRegistry } from '../../infrastructure/parser/registry.js';
|
|
7
|
+
import type { DeadCodeItem, DeadCodeRemovalOptions, DeadCodeRemovalPreview, DeadCodeRemovalResult } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Dead Code 刪除器
|
|
10
|
+
*/
|
|
11
|
+
export declare class DeadCodeRemover {
|
|
12
|
+
private readonly fileSystem;
|
|
13
|
+
private readonly parserRegistry;
|
|
14
|
+
private readonly options;
|
|
15
|
+
private readonly fileCache;
|
|
16
|
+
private readonly symbolFinder;
|
|
17
|
+
constructor(fileSystem: IFileSystem, parserRegistry: ParserRegistry, options?: DeadCodeRemovalOptions);
|
|
18
|
+
/**
|
|
19
|
+
* 預覽刪除操作
|
|
20
|
+
*/
|
|
21
|
+
preview(deadCodeItems: readonly DeadCodeItem[]): Promise<DeadCodeRemovalPreview>;
|
|
22
|
+
/**
|
|
23
|
+
* 執行刪除(非 dry-run 時)
|
|
24
|
+
*/
|
|
25
|
+
execute(preview: DeadCodeRemovalPreview): Promise<DeadCodeRemovalResult>;
|
|
26
|
+
/**
|
|
27
|
+
* 過濾符合刪除條件的項目
|
|
28
|
+
*/
|
|
29
|
+
private filterItems;
|
|
30
|
+
/**
|
|
31
|
+
* 產生刪除操作
|
|
32
|
+
*/
|
|
33
|
+
private generateRemovalOperations;
|
|
34
|
+
/**
|
|
35
|
+
* 分析需要清理的 import
|
|
36
|
+
* 支援部分清理:當 import { A, B, C } 中只有部分符號未使用時,保留其他符號
|
|
37
|
+
*/
|
|
38
|
+
private analyzeImportCleanups;
|
|
39
|
+
/**
|
|
40
|
+
* 產生部分清理後的 import 語句
|
|
41
|
+
* 支援:純 named import、混合 default + named import
|
|
42
|
+
*/
|
|
43
|
+
private generatePartialImport;
|
|
44
|
+
/**
|
|
45
|
+
* 解析 import 語句(以語句為單位)
|
|
46
|
+
* 支援 named import, default import, namespace import, 多行 import
|
|
47
|
+
*/
|
|
48
|
+
private parseImportStatements;
|
|
49
|
+
/**
|
|
50
|
+
* 解析單行或合併後的 import 語句
|
|
51
|
+
*/
|
|
52
|
+
private parseImportStatementLine;
|
|
53
|
+
/**
|
|
54
|
+
* 解析 named import 中的符號
|
|
55
|
+
*/
|
|
56
|
+
private parseNamedSymbols;
|
|
57
|
+
/**
|
|
58
|
+
* 檢查 import 是否仍被使用
|
|
59
|
+
* 使用 SymbolFinder.findReferencesInFile 進行語義分析
|
|
60
|
+
*/
|
|
61
|
+
private isImportStillUsed;
|
|
62
|
+
/**
|
|
63
|
+
* 移除註解和字串,用於準確檢測符號使用
|
|
64
|
+
*/
|
|
65
|
+
private removeCommentsAndStrings;
|
|
66
|
+
/**
|
|
67
|
+
* 擴展範圍至完整宣告(包含前導註解和空行)
|
|
68
|
+
* 使用清理後的內容進行括號匹配,避免字串/註解中的括號干擾
|
|
69
|
+
*/
|
|
70
|
+
private expandRangeToFullDeclaration;
|
|
71
|
+
/**
|
|
72
|
+
* 移除單行中的註解和字串(用於括號匹配)
|
|
73
|
+
*/
|
|
74
|
+
private removeCommentsAndStringsFromLine;
|
|
75
|
+
/**
|
|
76
|
+
* 提取程式碼
|
|
77
|
+
*/
|
|
78
|
+
private extractCode;
|
|
79
|
+
/**
|
|
80
|
+
* 按檔案分組操作(去重相同 range)
|
|
81
|
+
*/
|
|
82
|
+
private groupOperationsByFile;
|
|
83
|
+
/**
|
|
84
|
+
* 套用檔案操作
|
|
85
|
+
*/
|
|
86
|
+
private applyFileOperations;
|
|
87
|
+
/**
|
|
88
|
+
* 清理連續空行
|
|
89
|
+
*/
|
|
90
|
+
private cleanupEmptyLines;
|
|
91
|
+
/**
|
|
92
|
+
* 計算統計摘要
|
|
93
|
+
*/
|
|
94
|
+
private calculateSummary;
|
|
95
|
+
/**
|
|
96
|
+
* 收集影響的檔案
|
|
97
|
+
*/
|
|
98
|
+
private collectAffectedFiles;
|
|
99
|
+
/**
|
|
100
|
+
* 建立空的預覽結果
|
|
101
|
+
*/
|
|
102
|
+
private createEmptyPreview;
|
|
103
|
+
/**
|
|
104
|
+
* 建立空的統計摘要
|
|
105
|
+
*/
|
|
106
|
+
private createEmptySummary;
|
|
107
|
+
/**
|
|
108
|
+
* 讀取檔案
|
|
109
|
+
*/
|
|
110
|
+
private readFile;
|
|
111
|
+
/**
|
|
112
|
+
* 寫入檔案
|
|
113
|
+
*/
|
|
114
|
+
private writeFile;
|
|
115
|
+
/**
|
|
116
|
+
* 檢查檔案路徑是否匹配排除模式
|
|
117
|
+
* 支援 glob 模式(如 *.test.ts、**\/__tests__/**)和簡單字串匹配
|
|
118
|
+
*/
|
|
119
|
+
private matchesExcludePattern;
|
|
120
|
+
/**
|
|
121
|
+
* 逸出正則表達式特殊字符
|
|
122
|
+
*/
|
|
123
|
+
private escapeRegex;
|
|
124
|
+
/**
|
|
125
|
+
* 清除快取
|
|
126
|
+
*/
|
|
127
|
+
clearCache(): void;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* 建立 DeadCodeRemover 實例
|
|
131
|
+
*/
|
|
132
|
+
export declare function createDeadCodeRemover(fileSystem: IFileSystem, parserRegistry: ParserRegistry, options?: DeadCodeRemovalOptions): DeadCodeRemover;
|
|
133
|
+
//# sourceMappingURL=dead-code-remover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dead-code-remover.d.ts","sourceRoot":"","sources":["../../../src/core/dead-code/dead-code-remover.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kDAAkD,CAAC;AACpF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,OAAO,KAAK,EACV,YAAY,EACZ,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EAKtB,MAAM,YAAY,CAAC;AA6CpB;;GAEG;AACH,qBAAa,eAAe;IAMxB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc;IANjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAC3D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IACvD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;gBAGzB,UAAU,EAAE,WAAW,EACvB,cAAc,EAAE,cAAc,EAC/C,OAAO,CAAC,EAAE,sBAAsB;IAMlC;;OAEG;IACG,OAAO,CAAC,aAAa,EAAE,SAAS,YAAY,EAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC;IA+CtF;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAkC9E;;OAEG;IACH,OAAO,CAAC,WAAW;IAkCnB;;OAEG;YACW,yBAAyB;IAmCvC;;;OAGG;YACW,qBAAqB;IAyEnC;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAkD7B;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAuD7B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAgEhC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAqBzB;;;OAGG;YACW,iBAAiB;IA2B/B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAqBhC;;;OAGG;IACH,OAAO,CAAC,4BAA4B;IA2FpC;;OAEG;IACH,OAAO,CAAC,gCAAgC;IAsBxC;;OAEG;IACH,OAAO,CAAC,WAAW;IA0BnB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA4C7B;;OAEG;YACW,mBAAmB;IAyEjC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmBzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiCxB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAgB5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAW1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;OAEG;YACW,QAAQ;IAiBtB;;OAEG;YACW,SAAS;IAKvB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAS7B;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,UAAU,IAAI,IAAI;CAGnB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,WAAW,EACvB,cAAc,EAAE,cAAc,EAC9B,OAAO,CAAC,EAAE,sBAAsB,GAC/B,eAAe,CAEjB"}
|