agent-ide 0.8.0 → 0.8.2

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 (314) hide show
  1. package/dist/application/index.d.ts +1 -12
  2. package/dist/application/index.d.ts.map +1 -1
  3. package/dist/application/index.js +0 -16
  4. package/dist/application/index.js.map +1 -1
  5. package/dist/application/services/cache-coordinator.service.d.ts.map +1 -1
  6. package/dist/application/services/cache-coordinator.service.js.map +1 -1
  7. package/dist/application/services/module-coordinator.service.d.ts +3 -8
  8. package/dist/application/services/module-coordinator.service.d.ts.map +1 -1
  9. package/dist/application/services/module-coordinator.service.js +5 -139
  10. package/dist/application/services/module-coordinator.service.js.map +1 -1
  11. package/dist/application/types.d.ts +0 -63
  12. package/dist/application/types.d.ts.map +1 -1
  13. package/dist/application/types.js +1 -9
  14. package/dist/application/types.js.map +1 -1
  15. package/dist/core/call-hierarchy/call-hierarchy-analyzer.d.ts.map +1 -1
  16. package/dist/core/call-hierarchy/call-hierarchy-analyzer.js +3 -5
  17. package/dist/core/call-hierarchy/call-hierarchy-analyzer.js.map +1 -1
  18. package/dist/core/change-signature/change-signature-service.d.ts +9 -0
  19. package/dist/core/change-signature/change-signature-service.d.ts.map +1 -1
  20. package/dist/core/change-signature/change-signature-service.js +86 -4
  21. package/dist/core/change-signature/change-signature-service.js.map +1 -1
  22. package/dist/core/change-signature/signature-parser.d.ts +46 -4
  23. package/dist/core/change-signature/signature-parser.d.ts.map +1 -1
  24. package/dist/core/change-signature/signature-parser.js +180 -9
  25. package/dist/core/change-signature/signature-parser.js.map +1 -1
  26. package/dist/core/deadcode/dead-code-detector.d.ts +22 -1
  27. package/dist/core/deadcode/dead-code-detector.d.ts.map +1 -1
  28. package/dist/core/deadcode/dead-code-detector.js +134 -61
  29. package/dist/core/deadcode/dead-code-detector.js.map +1 -1
  30. package/dist/core/deadcode/dead-code-remover.d.ts +11 -93
  31. package/dist/core/deadcode/dead-code-remover.d.ts.map +1 -1
  32. package/dist/core/deadcode/dead-code-remover.js +71 -690
  33. package/dist/core/deadcode/dead-code-remover.js.map +1 -1
  34. package/dist/core/deadcode/file-operations.d.ts +85 -0
  35. package/dist/core/deadcode/file-operations.d.ts.map +1 -0
  36. package/dist/core/deadcode/file-operations.js +263 -0
  37. package/dist/core/deadcode/file-operations.js.map +1 -0
  38. package/dist/core/deadcode/import-cleaner.d.ts +63 -0
  39. package/dist/core/deadcode/import-cleaner.d.ts.map +1 -0
  40. package/dist/core/deadcode/import-cleaner.js +229 -0
  41. package/dist/core/deadcode/import-cleaner.js.map +1 -0
  42. package/dist/core/deadcode/import-parser.d.ts +79 -0
  43. package/dist/core/deadcode/import-parser.d.ts.map +1 -0
  44. package/dist/core/deadcode/import-parser.js +229 -0
  45. package/dist/core/deadcode/import-parser.js.map +1 -0
  46. package/dist/core/deadcode/range-expander.d.ts +38 -0
  47. package/dist/core/deadcode/range-expander.d.ts.map +1 -0
  48. package/dist/core/deadcode/range-expander.js +175 -0
  49. package/dist/core/deadcode/range-expander.js.map +1 -0
  50. package/dist/core/deadcode/types.d.ts +2 -0
  51. package/dist/core/deadcode/types.d.ts.map +1 -1
  52. package/dist/core/deadcode/types.js.map +1 -1
  53. package/dist/core/find-references/index.d.ts +2 -2
  54. package/dist/core/find-references/index.d.ts.map +1 -1
  55. package/dist/core/find-references/index.js +1 -1
  56. package/dist/core/find-references/index.js.map +1 -1
  57. package/dist/core/move/import-resolver.d.ts +5 -0
  58. package/dist/core/move/import-resolver.d.ts.map +1 -1
  59. package/dist/core/move/import-resolver.js +7 -0
  60. package/dist/core/move/import-resolver.js.map +1 -1
  61. package/dist/core/move/move-service.d.ts +39 -1
  62. package/dist/core/move/move-service.d.ts.map +1 -1
  63. package/dist/core/move/move-service.js +230 -63
  64. package/dist/core/move/move-service.js.map +1 -1
  65. package/dist/core/move/types.d.ts.map +1 -1
  66. package/dist/core/move-member/member-extractor.d.ts.map +1 -1
  67. package/dist/core/move-member/member-extractor.js +2 -2
  68. package/dist/core/move-member/member-extractor.js.map +1 -1
  69. package/dist/core/move-member/move-member-service.d.ts +6 -0
  70. package/dist/core/move-member/move-member-service.d.ts.map +1 -1
  71. package/dist/core/move-member/move-member-service.js +60 -3
  72. package/dist/core/move-member/move-member-service.js.map +1 -1
  73. package/dist/core/move-member/types.d.ts.map +1 -1
  74. package/dist/core/rename/reference-updater.d.ts +1 -35
  75. package/dist/core/rename/reference-updater.d.ts.map +1 -1
  76. package/dist/core/rename/reference-updater.js +4 -250
  77. package/dist/core/rename/reference-updater.js.map +1 -1
  78. package/dist/core/rename/rename-engine.d.ts +14 -22
  79. package/dist/core/rename/rename-engine.d.ts.map +1 -1
  80. package/dist/core/rename/rename-engine.js +37 -207
  81. package/dist/core/rename/rename-engine.js.map +1 -1
  82. package/dist/core/rename/scope-analyzer.d.ts.map +1 -1
  83. package/dist/core/shared/index.d.ts +1 -1
  84. package/dist/core/shared/index.d.ts.map +1 -1
  85. package/dist/core/shared/index.js +1 -1
  86. package/dist/core/shared/index.js.map +1 -1
  87. package/dist/core/shared/indexing/index-engine.d.ts +1 -1
  88. package/dist/core/shared/indexing/index-engine.d.ts.map +1 -1
  89. package/dist/core/shared/indexing/index-engine.js +1 -1
  90. package/dist/core/shared/indexing/index-engine.js.map +1 -1
  91. package/dist/core/shared/symbol-finder/call-site-parser.d.ts +71 -0
  92. package/dist/core/shared/symbol-finder/call-site-parser.d.ts.map +1 -0
  93. package/dist/core/shared/symbol-finder/call-site-parser.js +369 -0
  94. package/dist/core/shared/symbol-finder/call-site-parser.js.map +1 -0
  95. package/dist/core/shared/symbol-finder/index.d.ts +9 -0
  96. package/dist/core/shared/symbol-finder/index.d.ts.map +1 -0
  97. package/dist/core/shared/symbol-finder/index.js +12 -0
  98. package/dist/core/shared/symbol-finder/index.js.map +1 -0
  99. package/dist/core/shared/{symbol-finder.d.ts → symbol-finder/symbol-finder.d.ts} +27 -133
  100. package/dist/core/shared/symbol-finder/symbol-finder.d.ts.map +1 -0
  101. package/dist/core/shared/symbol-finder/symbol-finder.js +544 -0
  102. package/dist/core/shared/symbol-finder/symbol-finder.js.map +1 -0
  103. package/dist/core/shared/symbol-finder/text-matcher.d.ts +45 -0
  104. package/dist/core/shared/symbol-finder/text-matcher.d.ts.map +1 -0
  105. package/dist/core/shared/symbol-finder/text-matcher.js +195 -0
  106. package/dist/core/shared/symbol-finder/text-matcher.js.map +1 -0
  107. package/dist/core/shared/symbol-finder/types.d.ts +108 -0
  108. package/dist/core/shared/symbol-finder/types.d.ts.map +1 -0
  109. package/dist/core/shared/symbol-finder/types.js +71 -0
  110. package/dist/core/shared/symbol-finder/types.js.map +1 -0
  111. package/dist/core/snapshot/snapshot-generator.d.ts +16 -4
  112. package/dist/core/snapshot/snapshot-generator.d.ts.map +1 -1
  113. package/dist/core/snapshot/snapshot-generator.js +91 -18
  114. package/dist/core/snapshot/snapshot-generator.js.map +1 -1
  115. package/dist/infrastructure/cache/cache-manager.d.ts.map +1 -1
  116. package/dist/infrastructure/cache/cache-manager.js +4 -0
  117. package/dist/infrastructure/cache/cache-manager.js.map +1 -1
  118. package/dist/infrastructure/cache/index.d.ts +15 -9
  119. package/dist/infrastructure/cache/index.d.ts.map +1 -1
  120. package/dist/infrastructure/cache/index.js +5 -5
  121. package/dist/infrastructure/cache/index.js.map +1 -1
  122. package/dist/infrastructure/cache/memory-cache.d.ts.map +1 -1
  123. package/dist/infrastructure/cache/memory-cache.js.map +1 -1
  124. package/dist/infrastructure/cache/strategies.d.ts.map +1 -1
  125. package/dist/infrastructure/cache/strategies.js +2 -1
  126. package/dist/infrastructure/cache/strategies.js.map +1 -1
  127. package/dist/infrastructure/cache/types.d.ts +4 -4
  128. package/dist/infrastructure/cache/types.d.ts.map +1 -1
  129. package/dist/infrastructure/changeset/change-applicator.d.ts +95 -0
  130. package/dist/infrastructure/changeset/change-applicator.d.ts.map +1 -0
  131. package/dist/infrastructure/changeset/change-applicator.js +466 -0
  132. package/dist/infrastructure/changeset/change-applicator.js.map +1 -0
  133. package/dist/infrastructure/changeset/changeset-builder.d.ts +107 -0
  134. package/dist/infrastructure/changeset/changeset-builder.d.ts.map +1 -0
  135. package/dist/infrastructure/changeset/changeset-builder.js +183 -0
  136. package/dist/infrastructure/changeset/changeset-builder.js.map +1 -0
  137. package/dist/infrastructure/changeset/changeset-converter.d.ts +15 -0
  138. package/dist/infrastructure/changeset/changeset-converter.d.ts.map +1 -0
  139. package/dist/infrastructure/changeset/changeset-converter.js +369 -0
  140. package/dist/infrastructure/changeset/changeset-converter.js.map +1 -0
  141. package/dist/infrastructure/changeset/index.d.ts +9 -0
  142. package/dist/infrastructure/changeset/index.d.ts.map +1 -0
  143. package/dist/infrastructure/changeset/index.js +11 -0
  144. package/dist/infrastructure/changeset/index.js.map +1 -0
  145. package/dist/infrastructure/changeset/types.d.ts +110 -0
  146. package/dist/infrastructure/changeset/types.d.ts.map +1 -0
  147. package/dist/infrastructure/changeset/types.js +6 -0
  148. package/dist/infrastructure/changeset/types.js.map +1 -0
  149. package/dist/infrastructure/parser/base.d.ts.map +1 -1
  150. package/dist/infrastructure/parser/base.js +4 -3
  151. package/dist/infrastructure/parser/base.js.map +1 -1
  152. package/dist/infrastructure/parser/interface.d.ts +4 -2
  153. package/dist/infrastructure/parser/interface.d.ts.map +1 -1
  154. package/dist/infrastructure/parser/interface.js.map +1 -1
  155. package/dist/infrastructure/storage/file-system.d.ts.map +1 -1
  156. package/dist/infrastructure/storage/file-system.js +61 -54
  157. package/dist/infrastructure/storage/file-system.js.map +1 -1
  158. package/dist/interfaces/cli/commands/change-signature.command.d.ts.map +1 -1
  159. package/dist/interfaces/cli/commands/change-signature.command.js +31 -107
  160. package/dist/interfaces/cli/commands/change-signature.command.js.map +1 -1
  161. package/dist/interfaces/cli/commands/deadcode.command.js +51 -46
  162. package/dist/interfaces/cli/commands/deadcode.command.js.map +1 -1
  163. package/dist/interfaces/cli/commands/find-references.command.d.ts.map +1 -1
  164. package/dist/interfaces/cli/commands/find-references.command.js +18 -3
  165. package/dist/interfaces/cli/commands/find-references.command.js.map +1 -1
  166. package/dist/interfaces/cli/commands/move-member.command.d.ts.map +1 -1
  167. package/dist/interfaces/cli/commands/move-member.command.js +32 -103
  168. package/dist/interfaces/cli/commands/move-member.command.js.map +1 -1
  169. package/dist/interfaces/cli/commands/move.command.js +43 -54
  170. package/dist/interfaces/cli/commands/move.command.js.map +1 -1
  171. package/dist/interfaces/cli/commands/rename.command.js +27 -61
  172. package/dist/interfaces/cli/commands/rename.command.js.map +1 -1
  173. package/dist/interfaces/cli/output-formatter.d.ts +2 -2
  174. package/dist/interfaces/cli/output-formatter.d.ts.map +1 -1
  175. package/dist/interfaces/cli/output-formatter.js.map +1 -1
  176. package/dist/plugins/javascript/declaration-analyzer.d.ts.map +1 -1
  177. package/dist/plugins/javascript/declaration-analyzer.js +7 -0
  178. package/dist/plugins/javascript/declaration-analyzer.js.map +1 -1
  179. package/dist/plugins/javascript/parser.d.ts +11 -10
  180. package/dist/plugins/javascript/parser.d.ts.map +1 -1
  181. package/dist/plugins/javascript/parser.js +57 -53
  182. package/dist/plugins/javascript/parser.js.map +1 -1
  183. package/dist/plugins/javascript/pattern-analyzer.d.ts.map +1 -1
  184. package/dist/plugins/javascript/pattern-analyzer.js +4 -3
  185. package/dist/plugins/javascript/pattern-analyzer.js.map +1 -1
  186. package/dist/plugins/javascript/reference-finder.d.ts +21 -0
  187. package/dist/plugins/javascript/reference-finder.d.ts.map +1 -1
  188. package/dist/plugins/javascript/reference-finder.js +119 -76
  189. package/dist/plugins/javascript/reference-finder.js.map +1 -1
  190. package/dist/plugins/javascript/types.d.ts +4 -7
  191. package/dist/plugins/javascript/types.d.ts.map +1 -1
  192. package/dist/plugins/javascript/types.js +9 -9
  193. package/dist/plugins/javascript/types.js.map +1 -1
  194. package/dist/plugins/shared/parser-helpers.js.map +1 -1
  195. package/dist/{shared → plugins/shared}/utils/array.d.ts +6 -1
  196. package/dist/plugins/shared/utils/array.d.ts.map +1 -0
  197. package/dist/plugins/shared/utils/array.js.map +1 -0
  198. package/dist/{shared → plugins/shared}/utils/async.d.ts +1 -1
  199. package/dist/plugins/shared/utils/async.d.ts.map +1 -0
  200. package/dist/{shared → plugins/shared}/utils/async.js +2 -0
  201. package/dist/plugins/shared/utils/async.js.map +1 -0
  202. package/dist/{shared → plugins/shared}/utils/index.d.ts +0 -20
  203. package/dist/plugins/shared/utils/index.d.ts.map +1 -0
  204. package/dist/{shared → plugins/shared}/utils/index.js +0 -20
  205. package/dist/plugins/shared/utils/index.js.map +1 -0
  206. package/dist/plugins/shared/utils/memory-monitor.d.ts.map +1 -0
  207. package/dist/plugins/shared/utils/memory-monitor.js.map +1 -0
  208. package/dist/{shared → plugins/shared}/utils/object.d.ts +6 -6
  209. package/dist/plugins/shared/utils/object.d.ts.map +1 -0
  210. package/dist/{shared → plugins/shared}/utils/object.js +21 -3
  211. package/dist/plugins/shared/utils/object.js.map +1 -0
  212. package/dist/plugins/shared/utils/path.d.ts.map +1 -0
  213. package/dist/plugins/shared/utils/path.js.map +1 -0
  214. package/dist/{shared → plugins/shared}/utils/string.d.ts +1 -1
  215. package/dist/plugins/shared/utils/string.d.ts.map +1 -0
  216. package/dist/{shared → plugins/shared}/utils/string.js +7 -4
  217. package/dist/plugins/shared/utils/string.js.map +1 -0
  218. package/dist/plugins/typescript/declaration-analyzer.d.ts +4 -4
  219. package/dist/plugins/typescript/declaration-analyzer.d.ts.map +1 -1
  220. package/dist/plugins/typescript/declaration-analyzer.js +21 -8
  221. package/dist/plugins/typescript/declaration-analyzer.js.map +1 -1
  222. package/dist/plugins/typescript/language-service.d.ts +1 -1
  223. package/dist/plugins/typescript/language-service.d.ts.map +1 -1
  224. package/dist/plugins/typescript/parser.d.ts +3 -2
  225. package/dist/plugins/typescript/parser.d.ts.map +1 -1
  226. package/dist/plugins/typescript/parser.js +18 -13
  227. package/dist/plugins/typescript/parser.js.map +1 -1
  228. package/dist/plugins/typescript/reference-finder.d.ts +3 -0
  229. package/dist/plugins/typescript/reference-finder.d.ts.map +1 -1
  230. package/dist/plugins/typescript/reference-finder.js +5 -2
  231. package/dist/plugins/typescript/reference-finder.js.map +1 -1
  232. package/dist/plugins/typescript/symbol-extractor.d.ts +4 -0
  233. package/dist/plugins/typescript/symbol-extractor.d.ts.map +1 -1
  234. package/dist/plugins/typescript/symbol-extractor.js +18 -4
  235. package/dist/plugins/typescript/symbol-extractor.js.map +1 -1
  236. package/dist/plugins/typescript/types.d.ts +0 -3
  237. package/dist/plugins/typescript/types.d.ts.map +1 -1
  238. package/dist/plugins/typescript/types.js +6 -9
  239. package/dist/plugins/typescript/types.js.map +1 -1
  240. package/dist/shared/errors/index.d.ts +1 -1
  241. package/dist/shared/errors/index.d.ts.map +1 -1
  242. package/dist/shared/errors/parser-error.js +5 -5
  243. package/dist/shared/errors/parser-error.js.map +1 -1
  244. package/dist/shared/errors/validation-error.d.ts +2 -2
  245. package/dist/shared/errors/validation-error.d.ts.map +1 -1
  246. package/dist/shared/errors/validation-error.js.map +1 -1
  247. package/dist/shared/types/ast.d.ts +4 -4
  248. package/dist/shared/types/ast.d.ts.map +1 -1
  249. package/dist/shared/types/ast.js.map +1 -1
  250. package/dist/shared/types/core.d.ts +1 -1
  251. package/dist/shared/types/core.d.ts.map +1 -1
  252. package/dist/shared/types/index.d.ts +1 -0
  253. package/dist/shared/types/index.d.ts.map +1 -1
  254. package/dist/shared/types/index.js +2 -0
  255. package/dist/shared/types/index.js.map +1 -1
  256. package/dist/shared/types/line-number.d.ts +22 -0
  257. package/dist/shared/types/line-number.d.ts.map +1 -0
  258. package/dist/shared/types/line-number.js +28 -0
  259. package/dist/shared/types/line-number.js.map +1 -0
  260. package/package.json +2 -2
  261. package/dist/application/services/workflow-engine.service.d.ts +0 -76
  262. package/dist/application/services/workflow-engine.service.d.ts.map +0 -1
  263. package/dist/application/services/workflow-engine.service.js +0 -405
  264. package/dist/application/services/workflow-engine.service.js.map +0 -1
  265. package/dist/application/workflows/analysis-workflow.d.ts +0 -239
  266. package/dist/application/workflows/analysis-workflow.d.ts.map +0 -1
  267. package/dist/application/workflows/analysis-workflow.js +0 -395
  268. package/dist/application/workflows/analysis-workflow.js.map +0 -1
  269. package/dist/application/workflows/base-workflow.d.ts +0 -108
  270. package/dist/application/workflows/base-workflow.d.ts.map +0 -1
  271. package/dist/application/workflows/base-workflow.js +0 -236
  272. package/dist/application/workflows/base-workflow.js.map +0 -1
  273. package/dist/application/workflows/index.d.ts +0 -115
  274. package/dist/application/workflows/index.d.ts.map +0 -1
  275. package/dist/application/workflows/index.js +0 -218
  276. package/dist/application/workflows/index.js.map +0 -1
  277. package/dist/application/workflows/refactor-workflow.d.ts +0 -107
  278. package/dist/application/workflows/refactor-workflow.d.ts.map +0 -1
  279. package/dist/application/workflows/refactor-workflow.js +0 -310
  280. package/dist/application/workflows/refactor-workflow.js.map +0 -1
  281. package/dist/core/shared/symbol-finder.d.ts.map +0 -1
  282. package/dist/core/shared/symbol-finder.js +0 -882
  283. package/dist/core/shared/symbol-finder.js.map +0 -1
  284. package/dist/plugins/javascript/code-analyzer.d.ts +0 -68
  285. package/dist/plugins/javascript/code-analyzer.d.ts.map +0 -1
  286. package/dist/plugins/javascript/code-analyzer.js +0 -302
  287. package/dist/plugins/javascript/code-analyzer.js.map +0 -1
  288. package/dist/plugins/javascript/index.d.ts +0 -12
  289. package/dist/plugins/javascript/index.d.ts.map +0 -1
  290. package/dist/plugins/javascript/index.js +0 -16
  291. package/dist/plugins/javascript/index.js.map +0 -1
  292. package/dist/plugins/typescript/index.d.ts +0 -14
  293. package/dist/plugins/typescript/index.d.ts.map +0 -1
  294. package/dist/plugins/typescript/index.js +0 -13
  295. package/dist/plugins/typescript/index.js.map +0 -1
  296. package/dist/shared/utils/array.d.ts.map +0 -1
  297. package/dist/shared/utils/array.js.map +0 -1
  298. package/dist/shared/utils/async.d.ts.map +0 -1
  299. package/dist/shared/utils/async.js.map +0 -1
  300. package/dist/shared/utils/index.d.ts.map +0 -1
  301. package/dist/shared/utils/index.js.map +0 -1
  302. package/dist/shared/utils/memory-monitor.d.ts.map +0 -1
  303. package/dist/shared/utils/memory-monitor.js.map +0 -1
  304. package/dist/shared/utils/object.d.ts.map +0 -1
  305. package/dist/shared/utils/object.js.map +0 -1
  306. package/dist/shared/utils/path.d.ts.map +0 -1
  307. package/dist/shared/utils/path.js.map +0 -1
  308. package/dist/shared/utils/string.d.ts.map +0 -1
  309. package/dist/shared/utils/string.js.map +0 -1
  310. /package/dist/{shared → plugins/shared}/utils/array.js +0 -0
  311. /package/dist/{shared → plugins/shared}/utils/memory-monitor.d.ts +0 -0
  312. /package/dist/{shared → plugins/shared}/utils/memory-monitor.js +0 -0
  313. /package/dist/{shared → plugins/shared}/utils/path.d.ts +0 -0
  314. /package/dist/{shared → plugins/shared}/utils/path.js +0 -0
@@ -0,0 +1,229 @@
1
+ /**
2
+ * Import 清理器
3
+ * 負責分析和清理未使用的 import
4
+ */
5
+ import { createSymbolFinder, SymbolReferenceType } from '../shared/symbol-finder/index.js';
6
+ import { ImportParser } from './import-parser.js';
7
+ /**
8
+ * Import 清理器
9
+ */
10
+ export class ImportCleaner {
11
+ fileSystem;
12
+ importParser;
13
+ symbolFinder;
14
+ fileCache = new Map();
15
+ /** 符號引用快取:key = `${filePath}:${symbolName}` */
16
+ referenceCache = new Map();
17
+ constructor(fileSystem, parserRegistry) {
18
+ this.fileSystem = fileSystem;
19
+ this.importParser = new ImportParser(parserRegistry);
20
+ this.symbolFinder = createSymbolFinder(parserRegistry, fileSystem);
21
+ }
22
+ /**
23
+ * 分析需要清理的 import
24
+ * 支援部分清理:當 import { A, B, C } 中只有部分符號未使用時,保留其他符號
25
+ */
26
+ async analyzeImportCleanups(removals) {
27
+ const cleanups = [];
28
+ const warnings = [];
29
+ const affectedFiles = new Set(removals.map(r => r.filePath));
30
+ const removedSymbols = new Set(removals.map(r => r.symbolName));
31
+ for (const filePath of affectedFiles) {
32
+ const content = await this.readFile(filePath);
33
+ if (!content) {
34
+ warnings.push(`跳過 import 清理:無法讀取檔案 ${filePath}`);
35
+ continue;
36
+ }
37
+ // 解析 import 語句(以語句為單位)
38
+ const importStatements = this.importParser.parseImportStatements(content, filePath);
39
+ const fileRemovals = removals.filter(r => r.filePath === filePath);
40
+ for (const stmt of importStatements) {
41
+ // 找出此 import 中需要清理的符號
42
+ const unusedSymbols = [];
43
+ const usedSymbols = [];
44
+ for (const symbol of stmt.symbols) {
45
+ // 符號是否在被刪除的列表中,且刪除後不再使用
46
+ if (removedSymbols.has(symbol.name)) {
47
+ const stillUsed = await this.isImportStillUsed(filePath, symbol.name, fileRemovals);
48
+ if (!stillUsed) {
49
+ unusedSymbols.push(symbol.name);
50
+ }
51
+ else {
52
+ usedSymbols.push(symbol.name);
53
+ }
54
+ }
55
+ else {
56
+ usedSymbols.push(symbol.name);
57
+ }
58
+ }
59
+ // 沒有需要清理的符號,跳過
60
+ if (unusedSymbols.length === 0) {
61
+ continue;
62
+ }
63
+ // 判斷清理類型
64
+ if (usedSymbols.length === 0) {
65
+ // 所有符號都未使用,刪除整行
66
+ cleanups.push({
67
+ filePath,
68
+ range: stmt.range,
69
+ originalImport: stmt.statement,
70
+ unusedSymbols,
71
+ cleanupType: 'delete'
72
+ });
73
+ }
74
+ else {
75
+ // 部分符號仍在使用,產生新的 import 語句
76
+ const newImport = this.generatePartialImport(stmt, usedSymbols);
77
+ if (newImport) {
78
+ cleanups.push({
79
+ filePath,
80
+ range: stmt.range,
81
+ originalImport: stmt.statement,
82
+ unusedSymbols,
83
+ cleanupType: 'partial',
84
+ newImport
85
+ });
86
+ }
87
+ }
88
+ }
89
+ }
90
+ return { cleanups, warnings };
91
+ }
92
+ /**
93
+ * 產生部分清理後的 import 語句
94
+ * 支援:純 named import、混合 default + named import
95
+ */
96
+ generatePartialImport(stmt, usedSymbols) {
97
+ // Namespace import 不支援部分清理(整體使用)
98
+ if (stmt.isNamespace) {
99
+ return null;
100
+ }
101
+ // 從原始語句中提取 from 路徑
102
+ const fromMatch = stmt.statement.match(/from\s+(['"])(.+?)\1/);
103
+ if (!fromMatch) {
104
+ return null;
105
+ }
106
+ const fromPath = fromMatch[2];
107
+ const quote = fromMatch[1];
108
+ // 分離 default 和 named symbols
109
+ const defaultSymbol = stmt.symbols.find(s => s.isDefault);
110
+ const namedSymbols = stmt.symbols.filter(s => !s.isDefault);
111
+ // 檢查 default import 是否仍需保留
112
+ const keepDefault = defaultSymbol && usedSymbols.includes(defaultSymbol.name);
113
+ // 過濾出需要保留的 named symbols,並保留別名資訊
114
+ // 同時檢查 name 和 alias,因為 usedSymbols 可能包含別名
115
+ const keptNamedSymbols = namedSymbols
116
+ .filter(s => usedSymbols.includes(s.name) || (s.alias && usedSymbols.includes(s.alias)))
117
+ .map(s => s.alias ? `${s.name} as ${s.alias}` : s.name);
118
+ // 判斷是否需要 type 關鍵字(僅對純 named import)
119
+ const isTypeImport = stmt.statement.match(/import\s+type\s*\{/);
120
+ const typePrefix = isTypeImport ? 'type ' : '';
121
+ // 建構新的 import 語句
122
+ if (keepDefault && keptNamedSymbols.length > 0) {
123
+ // 混合格式:import X, { Y, Z } from '...'
124
+ return `import ${defaultSymbol.name}, { ${keptNamedSymbols.join(', ')} } from ${quote}${fromPath}${quote};`;
125
+ }
126
+ else if (keepDefault) {
127
+ // 只有 default:import X from '...'
128
+ return `import ${defaultSymbol.name} from ${quote}${fromPath}${quote};`;
129
+ }
130
+ else if (keptNamedSymbols.length > 0) {
131
+ // 只有 named:import { Y, Z } from '...'
132
+ return `import ${typePrefix}{ ${keptNamedSymbols.join(', ')} } from ${quote}${fromPath}${quote};`;
133
+ }
134
+ // 沒有任何符號需要保留
135
+ return null;
136
+ }
137
+ /**
138
+ * 檢查 import 是否仍被使用
139
+ * 使用快取的引用結果進行語義分析,避免重複查詢
140
+ */
141
+ async isImportStillUsed(filePath, symbolName, removalsInFile) {
142
+ // 使用快取查詢引用,避免 N+1 問題
143
+ const references = await this.findReferencesWithCache(filePath, symbolName);
144
+ // 過濾掉 import 類型的引用(import 語句本身)
145
+ const usageRefs = references.filter(ref => ref.type === SymbolReferenceType.Usage);
146
+ // 過濾掉被刪除程式碼區塊內的引用(使用二分搜尋優化)
147
+ const sortedRemovals = this.getSortedRemovalRanges(removalsInFile);
148
+ const remainingRefs = usageRefs.filter(ref => {
149
+ const refLine = ref.location.range.start.line;
150
+ return !this.isLineInRemovalRange(refLine, sortedRemovals);
151
+ });
152
+ // 如果還有剩餘的使用引用,表示 import 仍需要
153
+ return remainingRefs.length > 0;
154
+ }
155
+ /**
156
+ * 使用快取查詢符號引用
157
+ * 確保每個 (filePath, symbolName) 組合只查詢一次
158
+ */
159
+ async findReferencesWithCache(filePath, symbolName) {
160
+ const cacheKey = `${filePath}:${symbolName}`;
161
+ if (this.referenceCache.has(cacheKey)) {
162
+ return this.referenceCache.get(cacheKey);
163
+ }
164
+ const references = await this.symbolFinder.findReferencesInFile(filePath, symbolName);
165
+ this.referenceCache.set(cacheKey, references);
166
+ return references;
167
+ }
168
+ /**
169
+ * 取得排序後的刪除範圍(用於二分搜尋)
170
+ */
171
+ getSortedRemovalRanges(removals) {
172
+ return removals
173
+ .map(r => ({ start: r.range.start.line, end: r.range.end.line }))
174
+ .sort((a, b) => a.start - b.start);
175
+ }
176
+ /**
177
+ * 使用二分搜尋檢查行號是否在刪除範圍內
178
+ */
179
+ isLineInRemovalRange(line, sortedRanges) {
180
+ let left = 0;
181
+ let right = sortedRanges.length - 1;
182
+ while (left <= right) {
183
+ const mid = Math.floor((left + right) / 2);
184
+ const range = sortedRanges[mid];
185
+ if (line >= range.start && line <= range.end) {
186
+ return true;
187
+ }
188
+ else if (line < range.start) {
189
+ right = mid - 1;
190
+ }
191
+ else {
192
+ left = mid + 1;
193
+ }
194
+ }
195
+ return false;
196
+ }
197
+ /**
198
+ * 讀取檔案
199
+ */
200
+ async readFile(filePath) {
201
+ if (this.fileCache.has(filePath)) {
202
+ return this.fileCache.get(filePath);
203
+ }
204
+ try {
205
+ const content = await this.fileSystem.readFile(filePath, 'utf-8');
206
+ const contentStr = typeof content === 'string' ? content : content.toString('utf-8');
207
+ this.fileCache.set(filePath, contentStr);
208
+ return contentStr;
209
+ }
210
+ catch {
211
+ this.fileCache.delete(filePath);
212
+ return null;
213
+ }
214
+ }
215
+ /**
216
+ * 清除快取
217
+ */
218
+ clearCache() {
219
+ this.fileCache.clear();
220
+ this.referenceCache.clear();
221
+ }
222
+ }
223
+ /**
224
+ * 建立 ImportCleaner 實例
225
+ */
226
+ export function createImportCleaner(fileSystem, parserRegistry) {
227
+ return new ImportCleaner(fileSystem, parserRegistry);
228
+ }
229
+ //# sourceMappingURL=import-cleaner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-cleaner.js","sourceRoot":"","sources":["../../../src/core/deadcode/import-cleaner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Import 語句解析器
3
+ * 負責解析 TypeScript/JavaScript 的 import 語句
4
+ */
5
+ import type { Range } from '../../shared/types/core.js';
6
+ import type { ParserRegistry } from '../../infrastructure/parser/registry.js';
7
+ /**
8
+ * Import 語句中的符號資訊
9
+ */
10
+ export interface ImportSymbolInfo {
11
+ /** 符號名稱 */
12
+ name: string;
13
+ /** 別名(如果有 as) */
14
+ alias?: string;
15
+ /** 是否為 default import */
16
+ isDefault?: boolean;
17
+ /** 是否為 namespace import */
18
+ isNamespace?: boolean;
19
+ }
20
+ /**
21
+ * Import 語句資訊
22
+ */
23
+ export interface ImportStatementInfo {
24
+ /** 完整的 import 語句 */
25
+ statement: string;
26
+ /** 語句範圍 */
27
+ range: Range;
28
+ /** 包含的所有符號 */
29
+ symbols: ImportSymbolInfo[];
30
+ /** 是否有 default import */
31
+ hasDefault: boolean;
32
+ /** 是否為 namespace import */
33
+ isNamespace: boolean;
34
+ }
35
+ /**
36
+ * Import 語句解析器
37
+ */
38
+ export declare class ImportParser {
39
+ private readonly parserRegistry;
40
+ constructor(parserRegistry: ParserRegistry);
41
+ /**
42
+ * 解析 import 語句(以語句為單位)
43
+ * 優先使用 Parser 的 AST 解析(精確),fallback 到字串解析(向後相容)
44
+ * @param content 檔案內容
45
+ * @param filePath 檔案路徑(用於取得對應的 Parser)
46
+ */
47
+ parseImportStatements(content: string, filePath: string): ImportStatementInfo[];
48
+ /**
49
+ * 使用 Parser AST 解析 import 語句
50
+ * @returns ImportStatementInfo[] 如果成功,null 如果 Parser 不支援或解析失敗
51
+ */
52
+ private parseImportStatementsWithParser;
53
+ /**
54
+ * 將 Parser 的 ImportDeclaration 轉換為內部的 ImportStatementInfo
55
+ */
56
+ private convertImportDeclaration;
57
+ /**
58
+ * Fallback:使用字串解析 import 語句
59
+ * 保留原有邏輯以確保向後相容
60
+ */
61
+ private parseImportStatementsFallback;
62
+ /**
63
+ * 解析單行或合併後的 import 語句
64
+ */
65
+ private parseImportStatementLine;
66
+ /**
67
+ * 解析 named import 中的符號
68
+ */
69
+ private parseNamedSymbols;
70
+ /**
71
+ * 從檔案路徑取得副檔名
72
+ */
73
+ private getFileExtension;
74
+ }
75
+ /**
76
+ * 建立 ImportParser 實例
77
+ */
78
+ export declare function createImportParser(parserRegistry: ParserRegistry): ImportParser;
79
+ //# sourceMappingURL=import-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-parser.d.ts","sourceRoot":"","sources":["../../../src/core/deadcode/import-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAwBzE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,2BAA2B;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,oBAAoB;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW;IACX,KAAK,EAAE,KAAK,CAAC;IACb,cAAc;IACd,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,yBAAyB;IACzB,UAAU,EAAE,OAAO,CAAC;IACpB,2BAA2B;IAC3B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAAd,cAAc,EAAE,cAAc;IAE3D;;;;;OAKG;IACH,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,mBAAmB,EAAE;IAW/E;;;OAGG;IACH,OAAO,CAAC,+BAA+B;IAevC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA8BhC;;;OAGG;IACH,OAAO,CAAC,6BAA6B;IAsDrC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAgEhC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAqBzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAIzB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,cAAc,GAAG,YAAY,CAE/E"}
@@ -0,0 +1,229 @@
1
+ /**
2
+ * Import 語句解析器
3
+ * 負責解析 TypeScript/JavaScript 的 import 語句
4
+ */
5
+ /** 多行 import 的最大行數限制 */
6
+ const MAX_MULTILINE_IMPORT = 20;
7
+ /**
8
+ * Import 語句匹配 Regex 常數
9
+ */
10
+ const IMPORT_PATTERNS = {
11
+ /** Namespace import: import * as X from '...' */
12
+ NAMESPACE: /import\s+\*\s+as\s+(\w+)\s+from/,
13
+ /** Default import with named: import X, { Y, Z } from '...' */
14
+ DEFAULT_WITH_NAMED: /import\s+(\w+)\s*,\s*\{([^}]+)\}\s*from/,
15
+ /** Default import only: import X from '...' */
16
+ DEFAULT_ONLY: /import\s+(\w+)\s+from\s+['"]/,
17
+ /** Named import: import { X, Y } from '...' or import type { X } from '...' */
18
+ NAMED: /import\s+(?:type\s*)?\{([^}]+)\}\s*from/,
19
+ /** Side-effect import: import '...' */
20
+ SIDE_EFFECT: /^import\s+['"][^'"]+['"]/,
21
+ /** As alias: X as Y */
22
+ AS_ALIAS: /^(\w+)\s+as\s+(\w+)$/
23
+ };
24
+ /**
25
+ * Import 語句解析器
26
+ */
27
+ export class ImportParser {
28
+ parserRegistry;
29
+ constructor(parserRegistry) {
30
+ this.parserRegistry = parserRegistry;
31
+ }
32
+ /**
33
+ * 解析 import 語句(以語句為單位)
34
+ * 優先使用 Parser 的 AST 解析(精確),fallback 到字串解析(向後相容)
35
+ * @param content 檔案內容
36
+ * @param filePath 檔案路徑(用於取得對應的 Parser)
37
+ */
38
+ parseImportStatements(content, filePath) {
39
+ // 1. 優先嘗試使用 Parser 的 getImportDeclarations 方法
40
+ const parserResult = this.parseImportStatementsWithParser(content, filePath);
41
+ if (parserResult) {
42
+ return parserResult;
43
+ }
44
+ // 2. Fallback:使用原有的字串解析邏輯
45
+ return this.parseImportStatementsFallback(content);
46
+ }
47
+ /**
48
+ * 使用 Parser AST 解析 import 語句
49
+ * @returns ImportStatementInfo[] 如果成功,null 如果 Parser 不支援或解析失敗
50
+ */
51
+ parseImportStatementsWithParser(content, filePath) {
52
+ const parser = this.parserRegistry.getParser(this.getFileExtension(filePath));
53
+ if (!parser?.getImportDeclarations) {
54
+ return null;
55
+ }
56
+ const declarations = parser.getImportDeclarations(content);
57
+ if (!declarations) {
58
+ return null;
59
+ }
60
+ // 將 Parser 的 ImportDeclaration 轉換為內部的 ImportStatementInfo
61
+ return declarations.map(decl => this.convertImportDeclaration(decl));
62
+ }
63
+ /**
64
+ * 將 Parser 的 ImportDeclaration 轉換為內部的 ImportStatementInfo
65
+ */
66
+ convertImportDeclaration(decl) {
67
+ const symbols = [];
68
+ // 處理 default import
69
+ if (decl.defaultImport) {
70
+ symbols.push({ name: decl.defaultImport, isDefault: true });
71
+ }
72
+ // 處理 namespace import
73
+ if (decl.namespaceImport) {
74
+ symbols.push({ name: decl.namespaceImport, isNamespace: true });
75
+ }
76
+ // 處理 named imports
77
+ for (const named of decl.namedImports) {
78
+ symbols.push({
79
+ name: named.name,
80
+ alias: named.alias
81
+ });
82
+ }
83
+ return {
84
+ statement: decl.rawStatement,
85
+ range: decl.range,
86
+ symbols,
87
+ hasDefault: !!decl.defaultImport,
88
+ isNamespace: !!decl.namespaceImport
89
+ };
90
+ }
91
+ /**
92
+ * Fallback:使用字串解析 import 語句
93
+ * 保留原有邏輯以確保向後相容
94
+ */
95
+ parseImportStatementsFallback(content) {
96
+ const statements = [];
97
+ const lines = content.split('\n');
98
+ // 用於處理多行 import
99
+ let multiLineImport = '';
100
+ let multiLineStartLine = -1;
101
+ let multiLineCount = 0;
102
+ for (let i = 0; i < lines.length; i++) {
103
+ const line = lines[i];
104
+ const lineNumber = i + 1;
105
+ // 處理多行 import
106
+ if (multiLineImport) {
107
+ multiLineImport += '\n' + line;
108
+ multiLineCount++;
109
+ // 檢測結束條件:有 from 和 引號,或超過安全限制
110
+ const cleanLine = line.replace(/\/\/.*/, '').replace(/\/\*[\s\S]*?\*\//g, '');
111
+ const isComplete = cleanLine.includes('from') && /['"]/.test(cleanLine);
112
+ const isOverLimit = multiLineCount > MAX_MULTILINE_IMPORT;
113
+ if (isComplete || isOverLimit) {
114
+ // 多行 import 結束
115
+ const stmt = this.parseImportStatementLine(multiLineImport, multiLineStartLine, lineNumber, lines);
116
+ if (stmt) {
117
+ statements.push(stmt);
118
+ }
119
+ multiLineImport = '';
120
+ multiLineStartLine = -1;
121
+ multiLineCount = 0;
122
+ }
123
+ continue;
124
+ }
125
+ // 檢查是否為多行 import 開始(有 { 但沒有 } 或沒有 from)
126
+ if (line.match(/^\s*import\s+(?:type\s*)?\{/) && !line.includes('}')) {
127
+ multiLineImport = line;
128
+ multiLineStartLine = lineNumber;
129
+ multiLineCount = 1;
130
+ continue;
131
+ }
132
+ // 單行處理
133
+ const stmt = this.parseImportStatementLine(line, lineNumber, lineNumber, lines);
134
+ if (stmt) {
135
+ statements.push(stmt);
136
+ }
137
+ }
138
+ return statements;
139
+ }
140
+ /**
141
+ * 解析單行或合併後的 import 語句
142
+ */
143
+ parseImportStatementLine(line, startLine, endLine, lines) {
144
+ const trimmedLine = line.replace(/\s+/g, ' ').trim();
145
+ // 不是 import 語句
146
+ if (!trimmedLine.startsWith('import ')) {
147
+ return null;
148
+ }
149
+ // Side-effect import: import '...' (沒有符號)
150
+ if (IMPORT_PATTERNS.SIDE_EFFECT.test(trimmedLine)) {
151
+ return null;
152
+ }
153
+ const range = {
154
+ start: { line: startLine, column: 1 },
155
+ end: { line: endLine, column: (lines[endLine - 1] || '').length + 1 }
156
+ };
157
+ const symbols = [];
158
+ let hasDefault = false;
159
+ let isNamespace = false;
160
+ // 1. Namespace import: import * as X from '...'
161
+ const namespaceMatch = trimmedLine.match(IMPORT_PATTERNS.NAMESPACE);
162
+ if (namespaceMatch) {
163
+ symbols.push({ name: namespaceMatch[1], isNamespace: true });
164
+ isNamespace = true;
165
+ return { statement: trimmedLine, range, symbols, hasDefault, isNamespace };
166
+ }
167
+ // 2. Default import with named: import X, { Y, Z } from '...'
168
+ const defaultWithNamedMatch = trimmedLine.match(IMPORT_PATTERNS.DEFAULT_WITH_NAMED);
169
+ if (defaultWithNamedMatch) {
170
+ hasDefault = true;
171
+ symbols.push({ name: defaultWithNamedMatch[1], isDefault: true });
172
+ this.parseNamedSymbols(defaultWithNamedMatch[2], symbols);
173
+ return { statement: trimmedLine, range, symbols, hasDefault, isNamespace };
174
+ }
175
+ // 3. Default import only: import X from '...'
176
+ const defaultMatch = trimmedLine.match(IMPORT_PATTERNS.DEFAULT_ONLY);
177
+ if (defaultMatch && !trimmedLine.includes('{')) {
178
+ hasDefault = true;
179
+ symbols.push({ name: defaultMatch[1], isDefault: true });
180
+ return { statement: trimmedLine, range, symbols, hasDefault, isNamespace };
181
+ }
182
+ // 4. Named import: import { X, Y } from '...' or import type { X } from '...'
183
+ const namedImportMatch = trimmedLine.match(IMPORT_PATTERNS.NAMED);
184
+ if (namedImportMatch) {
185
+ this.parseNamedSymbols(namedImportMatch[1], symbols);
186
+ if (symbols.length > 0) {
187
+ return { statement: trimmedLine, range, symbols, hasDefault, isNamespace };
188
+ }
189
+ }
190
+ return null;
191
+ }
192
+ /**
193
+ * 解析 named import 中的符號
194
+ */
195
+ parseNamedSymbols(symbolsStr, symbols) {
196
+ const parts = symbolsStr.split(',').map(s => s.trim());
197
+ for (const part of parts) {
198
+ // 跳過空字串和 type-only imports
199
+ if (!part || part.startsWith('type ')) {
200
+ continue;
201
+ }
202
+ // 處理 as 別名: X as Y
203
+ const asMatch = part.match(IMPORT_PATTERNS.AS_ALIAS);
204
+ if (asMatch) {
205
+ symbols.push({ name: asMatch[1], alias: asMatch[2] });
206
+ }
207
+ else {
208
+ const cleanSymbol = part.trim();
209
+ if (cleanSymbol) {
210
+ symbols.push({ name: cleanSymbol });
211
+ }
212
+ }
213
+ }
214
+ }
215
+ /**
216
+ * 從檔案路徑取得副檔名
217
+ */
218
+ getFileExtension(filePath) {
219
+ const lastDot = filePath.lastIndexOf('.');
220
+ return lastDot === -1 ? '' : filePath.substring(lastDot);
221
+ }
222
+ }
223
+ /**
224
+ * 建立 ImportParser 實例
225
+ */
226
+ export function createImportParser(parserRegistry) {
227
+ return new ImportParser(parserRegistry);
228
+ }
229
+ //# sourceMappingURL=import-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-parser.js","sourceRoot":"","sources":["../../../src/core/deadcode/import-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,wBAAwB;AACxB,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC;;GAEG;AACH,MAAM,eAAe,GAAG;IACtB,iDAAiD;IACjD,SAAS,EAAE,iCAAiC;IAC5C,+DAA+D;IAC/D,kBAAkB,EAAE,yCAAyC;IAC7D,+CAA+C;IAC/C,YAAY,EAAE,8BAA8B;IAC5C,+EAA+E;IAC/E,KAAK,EAAE,yCAAyC;IAChD,uCAAuC;IACvC,WAAW,EAAE,0BAA0B;IACvC,uBAAuB;IACvB,QAAQ,EAAE,sBAAsB;CACxB,CAAC;AAgCX;;GAEG;AACH,MAAM,OAAO,YAAY;IACM;IAA7B,YAA6B,cAA8B;QAA9B,mBAAc,GAAd,cAAc,CAAgB;IAAG,CAAC;IAE/D;;;;;OAKG;IACH,qBAAqB,CAAC,OAAe,EAAE,QAAgB;QACrD,8CAA8C;QAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,+BAA+B,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC7E,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,0BAA0B;QAC1B,OAAO,IAAI,CAAC,6BAA6B,CAAC,OAAO,CAAC,CAAC;IACrD,CAAC;IAED;;;OAGG;IACK,+BAA+B,CAAC,OAAe,EAAE,QAAgB;QACvE,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9E,IAAI,CAAC,MAAM,EAAE,qBAAqB,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAC3D,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,0DAA0D;QAC1D,OAAO,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC;IACvE,CAAC;IAED;;OAEG;IACK,wBAAwB,CAAC,IAAuB;QACtD,MAAM,OAAO,GAAuB,EAAE,CAAC;QAEvC,oBAAoB;QACpB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,sBAAsB;QACtB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,mBAAmB;QACnB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,KAAK,EAAE,KAAK,CAAC,KAAK;aACnB,CAAC,CAAC;QACL,CAAC;QAED,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,YAAY;YAC5B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO;YACP,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa;YAChC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe;SACpC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,6BAA6B,CAAC,OAAe;QACnD,MAAM,UAAU,GAA0B,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,gBAAgB;QAChB,IAAI,eAAe,GAAG,EAAE,CAAC;QACzB,IAAI,kBAAkB,GAAG,CAAC,CAAC,CAAC;QAC5B,IAAI,cAAc,GAAG,CAAC,CAAC;QAEvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;YAEzB,cAAc;YACd,IAAI,eAAe,EAAE,CAAC;gBACpB,eAAe,IAAI,IAAI,GAAG,IAAI,CAAC;gBAC/B,cAAc,EAAE,CAAC;gBAEjB,6BAA6B;gBAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;gBAC9E,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACxE,MAAM,WAAW,GAAG,cAAc,GAAG,oBAAoB,CAAC;gBAE1D,IAAI,UAAU,IAAI,WAAW,EAAE,CAAC;oBAC9B,eAAe;oBACf,MAAM,IAAI,GAAG,IAAI,CAAC,wBAAwB,CAAC,eAAe,EAAE,kBAAkB,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;oBACnG,IAAI,IAAI,EAAE,CAAC;wBACT,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACxB,CAAC;oBACD,eAAe,GAAG,EAAE,CAAC;oBACrB,kBAAkB,GAAG,CAAC,CAAC,CAAC;oBACxB,cAAc,GAAG,CAAC,CAAC;gBACrB,CAAC;gBACD,SAAS;YACX,CAAC;YAED,wCAAwC;YACxC,IAAI,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrE,eAAe,GAAG,IAAI,CAAC;gBACvB,kBAAkB,GAAG,UAAU,CAAC;gBAChC,cAAc,GAAG,CAAC,CAAC;gBACnB,SAAS;YACX,CAAC;YAED,OAAO;YACP,MAAM,IAAI,GAAG,IAAI,CAAC,wBAAwB,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;YAChF,IAAI,IAAI,EAAE,CAAC;gBACT,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;OAEG;IACK,wBAAwB,CAC9B,IAAY,EACZ,SAAiB,EACjB,OAAe,EACf,KAAe;QAEf,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAErD,eAAe;QACf,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,0CAA0C;QAC1C,IAAI,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAClD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAU;YACnB,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE;YACrC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;SACtE,CAAC;QAEF,MAAM,OAAO,GAAuB,EAAE,CAAC;QACvC,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,WAAW,GAAG,KAAK,CAAC;QAExB,gDAAgD;QAChD,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QACpE,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7D,WAAW,GAAG,IAAI,CAAC;YACnB,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;QAC7E,CAAC;QAED,8DAA8D;QAC9D,MAAM,qBAAqB,GAAG,WAAW,CAAC,KAAK,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC;QACpF,IAAI,qBAAqB,EAAE,CAAC;YAC1B,UAAU,GAAG,IAAI,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,qBAAqB,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAClE,IAAI,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC1D,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;QAC7E,CAAC;QAED,8CAA8C;QAC9C,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QACrE,IAAI,YAAY,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,UAAU,GAAG,IAAI,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;QAC7E,CAAC;QAED,8EAA8E;QAC9E,MAAM,gBAAgB,GAAG,WAAW,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAClE,IAAI,gBAAgB,EAAE,CAAC;YACrB,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACrD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;YAC7E,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,UAAkB,EAAE,OAA2B;QACvE,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACvD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,2BAA2B;YAC3B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtC,SAAS;YACX,CAAC;YAED,mBAAmB;YACnB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YACrD,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACN,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAChC,IAAI,WAAW,EAAE,CAAC;oBAChB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,QAAgB;QACvC,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1C,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC3D,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,cAA8B;IAC/D,OAAO,IAAI,YAAY,CAAC,cAAc,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * 範圍擴展器
3
+ * 負責將符號範圍擴展至完整宣告(含前導註解)
4
+ */
5
+ import type { Range } from '../../shared/types/core.js';
6
+ import type { SymbolType } from '../../shared/types/symbol.js';
7
+ import type { ParserRegistry } from '../../infrastructure/parser/registry.js';
8
+ /**
9
+ * 範圍擴展器
10
+ */
11
+ export declare class RangeExpander {
12
+ private readonly parserRegistry;
13
+ constructor(parserRegistry: ParserRegistry);
14
+ /**
15
+ * 擴展範圍至完整宣告(包含前導註解和空行)
16
+ * 優先使用 Parser 的 getFullDeclarationRange 方法(AST 精確解析)
17
+ * 若 Parser 不支援或回傳 null,fallback 到字串匹配邏輯
18
+ */
19
+ expandRangeToFullDeclaration(content: string, range: Range, symbolType: SymbolType, symbolName: string, filePath: string): Range;
20
+ /**
21
+ * 使用字串匹配邏輯擴展範圍(fallback 方法)
22
+ * 使用清理後的內容進行括號匹配,避免字串/註解中的括號干擾
23
+ */
24
+ private expandRangeByStringMatching;
25
+ /**
26
+ * 移除單行中的註解和字串(用於括號匹配)
27
+ */
28
+ private removeCommentsAndStringsFromLine;
29
+ /**
30
+ * 從檔案路徑取得副檔名
31
+ */
32
+ private getFileExtension;
33
+ }
34
+ /**
35
+ * 建立 RangeExpander 實例
36
+ */
37
+ export declare function createRangeExpander(parserRegistry: ParserRegistry): RangeExpander;
38
+ //# sourceMappingURL=range-expander.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"range-expander.d.ts","sourceRoot":"","sources":["../../../src/core/deadcode/range-expander.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE;;GAEG;AACH,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAAd,cAAc,EAAE,cAAc;IAE3D;;;;OAIG;IACH,4BAA4B,CAC1B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,KAAK;IAgCR;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IA+GnC;;OAEG;IACH,OAAO,CAAC,gCAAgC;IAsBxC;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAIzB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,cAAc,GAAG,aAAa,CAEjF"}