agent-ide 0.8.1 → 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 (311) 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/parser.d.ts +11 -10
  177. package/dist/plugins/javascript/parser.d.ts.map +1 -1
  178. package/dist/plugins/javascript/parser.js +57 -53
  179. package/dist/plugins/javascript/parser.js.map +1 -1
  180. package/dist/plugins/javascript/pattern-analyzer.d.ts.map +1 -1
  181. package/dist/plugins/javascript/pattern-analyzer.js +4 -3
  182. package/dist/plugins/javascript/pattern-analyzer.js.map +1 -1
  183. package/dist/plugins/javascript/reference-finder.d.ts +21 -0
  184. package/dist/plugins/javascript/reference-finder.d.ts.map +1 -1
  185. package/dist/plugins/javascript/reference-finder.js +119 -76
  186. package/dist/plugins/javascript/reference-finder.js.map +1 -1
  187. package/dist/plugins/javascript/types.d.ts +4 -7
  188. package/dist/plugins/javascript/types.d.ts.map +1 -1
  189. package/dist/plugins/javascript/types.js +9 -9
  190. package/dist/plugins/javascript/types.js.map +1 -1
  191. package/dist/plugins/shared/parser-helpers.js.map +1 -1
  192. package/dist/{shared → plugins/shared}/utils/array.d.ts +6 -1
  193. package/dist/plugins/shared/utils/array.d.ts.map +1 -0
  194. package/dist/plugins/shared/utils/array.js.map +1 -0
  195. package/dist/{shared → plugins/shared}/utils/async.d.ts +1 -1
  196. package/dist/plugins/shared/utils/async.d.ts.map +1 -0
  197. package/dist/{shared → plugins/shared}/utils/async.js +2 -0
  198. package/dist/plugins/shared/utils/async.js.map +1 -0
  199. package/dist/{shared → plugins/shared}/utils/index.d.ts +0 -20
  200. package/dist/plugins/shared/utils/index.d.ts.map +1 -0
  201. package/dist/{shared → plugins/shared}/utils/index.js +0 -20
  202. package/dist/plugins/shared/utils/index.js.map +1 -0
  203. package/dist/plugins/shared/utils/memory-monitor.d.ts.map +1 -0
  204. package/dist/plugins/shared/utils/memory-monitor.js.map +1 -0
  205. package/dist/{shared → plugins/shared}/utils/object.d.ts +6 -6
  206. package/dist/plugins/shared/utils/object.d.ts.map +1 -0
  207. package/dist/{shared → plugins/shared}/utils/object.js +21 -3
  208. package/dist/plugins/shared/utils/object.js.map +1 -0
  209. package/dist/plugins/shared/utils/path.d.ts.map +1 -0
  210. package/dist/plugins/shared/utils/path.js.map +1 -0
  211. package/dist/{shared → plugins/shared}/utils/string.d.ts +1 -1
  212. package/dist/plugins/shared/utils/string.d.ts.map +1 -0
  213. package/dist/{shared → plugins/shared}/utils/string.js +7 -4
  214. package/dist/plugins/shared/utils/string.js.map +1 -0
  215. package/dist/plugins/typescript/declaration-analyzer.d.ts +4 -4
  216. package/dist/plugins/typescript/declaration-analyzer.d.ts.map +1 -1
  217. package/dist/plugins/typescript/declaration-analyzer.js +9 -6
  218. package/dist/plugins/typescript/declaration-analyzer.js.map +1 -1
  219. package/dist/plugins/typescript/language-service.d.ts +1 -1
  220. package/dist/plugins/typescript/language-service.d.ts.map +1 -1
  221. package/dist/plugins/typescript/parser.d.ts +3 -2
  222. package/dist/plugins/typescript/parser.d.ts.map +1 -1
  223. package/dist/plugins/typescript/parser.js +18 -13
  224. package/dist/plugins/typescript/parser.js.map +1 -1
  225. package/dist/plugins/typescript/reference-finder.d.ts +3 -0
  226. package/dist/plugins/typescript/reference-finder.d.ts.map +1 -1
  227. package/dist/plugins/typescript/reference-finder.js +5 -2
  228. package/dist/plugins/typescript/reference-finder.js.map +1 -1
  229. package/dist/plugins/typescript/symbol-extractor.d.ts +4 -0
  230. package/dist/plugins/typescript/symbol-extractor.d.ts.map +1 -1
  231. package/dist/plugins/typescript/symbol-extractor.js +18 -4
  232. package/dist/plugins/typescript/symbol-extractor.js.map +1 -1
  233. package/dist/plugins/typescript/types.d.ts +0 -3
  234. package/dist/plugins/typescript/types.d.ts.map +1 -1
  235. package/dist/plugins/typescript/types.js +6 -9
  236. package/dist/plugins/typescript/types.js.map +1 -1
  237. package/dist/shared/errors/index.d.ts +1 -1
  238. package/dist/shared/errors/index.d.ts.map +1 -1
  239. package/dist/shared/errors/parser-error.js +5 -5
  240. package/dist/shared/errors/parser-error.js.map +1 -1
  241. package/dist/shared/errors/validation-error.d.ts +2 -2
  242. package/dist/shared/errors/validation-error.d.ts.map +1 -1
  243. package/dist/shared/errors/validation-error.js.map +1 -1
  244. package/dist/shared/types/ast.d.ts +4 -4
  245. package/dist/shared/types/ast.d.ts.map +1 -1
  246. package/dist/shared/types/ast.js.map +1 -1
  247. package/dist/shared/types/core.d.ts +1 -1
  248. package/dist/shared/types/core.d.ts.map +1 -1
  249. package/dist/shared/types/index.d.ts +1 -0
  250. package/dist/shared/types/index.d.ts.map +1 -1
  251. package/dist/shared/types/index.js +2 -0
  252. package/dist/shared/types/index.js.map +1 -1
  253. package/dist/shared/types/line-number.d.ts +22 -0
  254. package/dist/shared/types/line-number.d.ts.map +1 -0
  255. package/dist/shared/types/line-number.js +28 -0
  256. package/dist/shared/types/line-number.js.map +1 -0
  257. package/package.json +2 -2
  258. package/dist/application/services/workflow-engine.service.d.ts +0 -76
  259. package/dist/application/services/workflow-engine.service.d.ts.map +0 -1
  260. package/dist/application/services/workflow-engine.service.js +0 -405
  261. package/dist/application/services/workflow-engine.service.js.map +0 -1
  262. package/dist/application/workflows/analysis-workflow.d.ts +0 -239
  263. package/dist/application/workflows/analysis-workflow.d.ts.map +0 -1
  264. package/dist/application/workflows/analysis-workflow.js +0 -395
  265. package/dist/application/workflows/analysis-workflow.js.map +0 -1
  266. package/dist/application/workflows/base-workflow.d.ts +0 -108
  267. package/dist/application/workflows/base-workflow.d.ts.map +0 -1
  268. package/dist/application/workflows/base-workflow.js +0 -236
  269. package/dist/application/workflows/base-workflow.js.map +0 -1
  270. package/dist/application/workflows/index.d.ts +0 -115
  271. package/dist/application/workflows/index.d.ts.map +0 -1
  272. package/dist/application/workflows/index.js +0 -218
  273. package/dist/application/workflows/index.js.map +0 -1
  274. package/dist/application/workflows/refactor-workflow.d.ts +0 -107
  275. package/dist/application/workflows/refactor-workflow.d.ts.map +0 -1
  276. package/dist/application/workflows/refactor-workflow.js +0 -310
  277. package/dist/application/workflows/refactor-workflow.js.map +0 -1
  278. package/dist/core/shared/symbol-finder.d.ts.map +0 -1
  279. package/dist/core/shared/symbol-finder.js +0 -882
  280. package/dist/core/shared/symbol-finder.js.map +0 -1
  281. package/dist/plugins/javascript/code-analyzer.d.ts +0 -68
  282. package/dist/plugins/javascript/code-analyzer.d.ts.map +0 -1
  283. package/dist/plugins/javascript/code-analyzer.js +0 -302
  284. package/dist/plugins/javascript/code-analyzer.js.map +0 -1
  285. package/dist/plugins/javascript/index.d.ts +0 -12
  286. package/dist/plugins/javascript/index.d.ts.map +0 -1
  287. package/dist/plugins/javascript/index.js +0 -16
  288. package/dist/plugins/javascript/index.js.map +0 -1
  289. package/dist/plugins/typescript/index.d.ts +0 -14
  290. package/dist/plugins/typescript/index.d.ts.map +0 -1
  291. package/dist/plugins/typescript/index.js +0 -13
  292. package/dist/plugins/typescript/index.js.map +0 -1
  293. package/dist/shared/utils/array.d.ts.map +0 -1
  294. package/dist/shared/utils/array.js.map +0 -1
  295. package/dist/shared/utils/async.d.ts.map +0 -1
  296. package/dist/shared/utils/async.js.map +0 -1
  297. package/dist/shared/utils/index.d.ts.map +0 -1
  298. package/dist/shared/utils/index.js.map +0 -1
  299. package/dist/shared/utils/memory-monitor.d.ts.map +0 -1
  300. package/dist/shared/utils/memory-monitor.js.map +0 -1
  301. package/dist/shared/utils/object.d.ts.map +0 -1
  302. package/dist/shared/utils/object.js.map +0 -1
  303. package/dist/shared/utils/path.d.ts.map +0 -1
  304. package/dist/shared/utils/path.js.map +0 -1
  305. package/dist/shared/utils/string.d.ts.map +0 -1
  306. package/dist/shared/utils/string.js.map +0 -1
  307. /package/dist/{shared → plugins/shared}/utils/array.js +0 -0
  308. /package/dist/{shared → plugins/shared}/utils/memory-monitor.d.ts +0 -0
  309. /package/dist/{shared → plugins/shared}/utils/memory-monitor.js +0 -0
  310. /package/dist/{shared → plugins/shared}/utils/path.d.ts +0 -0
  311. /package/dist/{shared → plugins/shared}/utils/path.js +0 -0
@@ -1,6 +1,11 @@
1
1
  /**
2
2
  * 簽名解析器
3
3
  * 從程式碼中提取函式簽名
4
+ *
5
+ * 此模組使用 Parser AST 精確解析函數簽章,正確處理:
6
+ * - 字串中的逗號/括號(如 `fn(a = "(", b)`)
7
+ * - 模板字面值中的特殊字元
8
+ * - 複雜泛型巢狀(如 `Map<K, Fn<V>>`)
4
9
  */
5
10
  /**
6
11
  * 簽名解析器
@@ -34,8 +39,162 @@ export class SignatureParser {
34
39
  }
35
40
  /**
36
41
  * 解析 TypeScript 函式簽名
42
+ * 優先使用 Parser AST 精確解析,fallback 到正則表達式
37
43
  */
38
44
  parseTypeScriptSignature(content, filePath, functionName) {
45
+ // 優先嘗試 AST 解析
46
+ const astResult = this.parseWithAST(content, filePath, functionName);
47
+ if (astResult) {
48
+ return astResult;
49
+ }
50
+ // Fallback 到正則表達式解析
51
+ return this.parseWithRegex(content, filePath, functionName);
52
+ }
53
+ /**
54
+ * 使用 Parser AST 精確解析函數簽章
55
+ * 正確處理字串中的逗號/括號、複雜泛型巢狀
56
+ *
57
+ * 效能優化:直接使用 AST 查找函數,不再先用正則找行號
58
+ */
59
+ parseWithAST(content, filePath, functionName) {
60
+ const extension = this.getFileExtension(filePath);
61
+ const parser = this.parserRegistry.getParser(extension);
62
+ if (!parser?.formatSignature) {
63
+ return null;
64
+ }
65
+ // 直接用 AST 解析,不需要先用正則找行號(效能優化)
66
+ const signature = parser.formatSignature(content, functionName);
67
+ if (!signature || signature.startLine === undefined) {
68
+ return null;
69
+ }
70
+ const lineNumber = signature.startLine;
71
+ const lines = content.split('\n');
72
+ // 從 AST 簽章轉換為 ParameterDefinition
73
+ const parameters = signature.parameters.map((param, index) => ({
74
+ name: param.name,
75
+ type: param.type !== 'any' ? param.type : undefined,
76
+ defaultValue: param.defaultValue,
77
+ optional: param.optional,
78
+ rest: param.name.startsWith('...'),
79
+ range: {
80
+ start: { line: lineNumber, column: index * 10 },
81
+ end: { line: lineNumber, column: index * 10 + param.name.length }
82
+ }
83
+ }));
84
+ // 計算結束位置
85
+ const endLine = this.findFunctionEndLineWithAST(content, filePath, functionName, lineNumber)
86
+ ?? this.findFunctionEndLine(lines, lineNumber - 1);
87
+ // 解析函數元資訊(修飾符、是否方法)
88
+ const { modifiers, isMethod, matchIndex, column } = this.extractFunctionMetadata(content, functionName);
89
+ return {
90
+ name: functionName,
91
+ parameters,
92
+ returnType: signature.returnType !== 'void' ? signature.returnType : undefined,
93
+ location: {
94
+ filePath,
95
+ range: {
96
+ start: { line: lineNumber, column: column + 1, offset: matchIndex },
97
+ end: { line: endLine + 1, column: 1 }
98
+ }
99
+ },
100
+ isMethod,
101
+ className: isMethod ? this.findEnclosingClass(content, matchIndex) : undefined,
102
+ modifiers
103
+ };
104
+ }
105
+ /**
106
+ * 使用 Parser AST 找到函數結束行
107
+ */
108
+ findFunctionEndLineWithAST(content, filePath, functionName, _startLine) {
109
+ const extension = this.getFileExtension(filePath);
110
+ const parser = this.parserRegistry.getParser(extension);
111
+ if (!parser?.getFullDeclarationRange) {
112
+ return null;
113
+ }
114
+ const range = parser.getFullDeclarationRange(content, functionName, 'function', _startLine);
115
+ return range ? range.end.line : null;
116
+ }
117
+ /**
118
+ * 找到函數的行號(用於 AST 解析)
119
+ */
120
+ findFunctionLineNumber(content, functionName) {
121
+ const patterns = [
122
+ // function 宣告
123
+ new RegExp(`^(\\s*)(export\\s+)?(async\\s+)?function\\s+${this.escapeRegex(functionName)}\\s*`, 'm'),
124
+ // 箭頭函式
125
+ new RegExp(`^(\\s*)(export\\s+)?(const|let|var)\\s+${this.escapeRegex(functionName)}\\s*`, 'm'),
126
+ // class 方法
127
+ new RegExp(`^(\\s*)(public|private|protected)?\\s*(static)?\\s*(async)?\\s*${this.escapeRegex(functionName)}\\s*[(<]`, 'm'),
128
+ ];
129
+ for (const pattern of patterns) {
130
+ const match = content.match(pattern);
131
+ if (match) {
132
+ const matchIndex = content.indexOf(match[0]);
133
+ const newlinesInMatch = (match[1] || '').split('\n').length - 1;
134
+ return content.substring(0, matchIndex).split('\n').length + newlinesInMatch;
135
+ }
136
+ }
137
+ return null;
138
+ }
139
+ /**
140
+ * 提取函數元資訊(修飾符、是否方法等)
141
+ */
142
+ extractFunctionMetadata(content, functionName) {
143
+ const patterns = [
144
+ // function 宣告
145
+ { pattern: new RegExp(`^(\\s*)(export\\s+)?(async\\s+)?function\\s+${this.escapeRegex(functionName)}`, 'm'), type: 'function' },
146
+ // 箭頭函式
147
+ { pattern: new RegExp(`^(\\s*)(export\\s+)?(const|let|var)\\s+${this.escapeRegex(functionName)}\\s*(?::\\s*[^=]+)?\\s*=\\s*(async\\s+)?`, 'm'), type: 'arrow' },
148
+ // class 方法
149
+ { pattern: new RegExp(`^(\\s*)(public|private|protected)?\\s*(static)?\\s*(async)?\\s*${this.escapeRegex(functionName)}`, 'm'), type: 'method' },
150
+ ];
151
+ for (const { pattern, type } of patterns) {
152
+ const match = content.match(pattern);
153
+ if (match) {
154
+ const matchIndex = content.indexOf(match[0]);
155
+ const column = (match[1] || '').replace(/^[\s\S]*\n/, '').length;
156
+ const modifiers = [];
157
+ let isMethod = false;
158
+ switch (type) {
159
+ case 'function':
160
+ if (match[2]) {
161
+ modifiers.push('export');
162
+ }
163
+ if (match[3]) {
164
+ modifiers.push('async');
165
+ }
166
+ break;
167
+ case 'arrow':
168
+ if (match[2]) {
169
+ modifiers.push('export');
170
+ }
171
+ if (match[4]) {
172
+ modifiers.push('async');
173
+ }
174
+ break;
175
+ case 'method':
176
+ isMethod = true;
177
+ if (match[2]) {
178
+ modifiers.push(match[2]);
179
+ }
180
+ if (match[3]) {
181
+ modifiers.push('static');
182
+ }
183
+ if (match[4]) {
184
+ modifiers.push('async');
185
+ }
186
+ break;
187
+ }
188
+ return { modifiers, isMethod, matchIndex, column };
189
+ }
190
+ }
191
+ return { modifiers: [], isMethod: false, matchIndex: 0, column: 0 };
192
+ }
193
+ /**
194
+ * 使用正則表達式解析函數簽章(Fallback)
195
+ * 當 AST 解析不可用時使用
196
+ */
197
+ parseWithRegex(content, filePath, functionName) {
39
198
  const lines = content.split('\n');
40
199
  // 匹配各種函式定義模式
41
200
  const patterns = [
@@ -120,8 +279,8 @@ export class SignatureParser {
120
279
  paramsString = match[6] || '';
121
280
  returnType = match[7]?.trim();
122
281
  }
123
- // 解析參數
124
- const parameters = this.parseTypeScriptParameters(paramsString, lineNumber, column + match[0].indexOf('(') + 1);
282
+ // 解析參數(使用 fallback 方法)
283
+ const parameters = this.parseParametersWithRegex(paramsString, lineNumber, column + match[0].indexOf('(') + 1);
125
284
  // 計算結束位置
126
285
  const endLine = this.findFunctionEndLine(lines, lineNumber - 1);
127
286
  return {
@@ -132,7 +291,7 @@ export class SignatureParser {
132
291
  filePath,
133
292
  range: {
134
293
  start: { line: lineNumber, column: column + 1, offset: matchIndex },
135
- end: { line: endLine + 1, column: 1, offset: undefined }
294
+ end: { line: endLine + 1, column: 1 }
136
295
  }
137
296
  },
138
297
  isMethod,
@@ -163,9 +322,11 @@ export class SignatureParser {
163
322
  return null;
164
323
  }
165
324
  /**
166
- * 解析 TypeScript 參數列表
325
+ * 使用正則表達式解析參數列表(Fallback)
326
+ * 注意:此方法無法正確處理字串中的逗號/括號
327
+ * 如:`fn(a = "(", b)` 會被錯誤分割
167
328
  */
168
- parseTypeScriptParameters(paramsString, baseLine, baseColumn) {
329
+ parseParametersWithRegex(paramsString, baseLine, baseColumn) {
169
330
  if (!paramsString.trim()) {
170
331
  return [];
171
332
  }
@@ -195,8 +356,8 @@ export class SignatureParser {
195
356
  optional,
196
357
  rest: restMatch,
197
358
  range: {
198
- start: { line: baseLine, column: currentColumn, offset: undefined },
199
- end: { line: baseLine, column: currentColumn + param.length, offset: undefined }
359
+ start: { line: baseLine, column: currentColumn },
360
+ end: { line: baseLine, column: currentColumn + param.length }
200
361
  }
201
362
  });
202
363
  }
@@ -205,7 +366,14 @@ export class SignatureParser {
205
366
  return parameters;
206
367
  }
207
368
  /**
208
- * 分割參數字串(考慮泛型和巢狀)
369
+ * 分割參數字串(Fallback 方法)
370
+ * 使用括號計數分割,僅考慮泛型和巢狀
371
+ *
372
+ * 警告:此方法無法正確處理:
373
+ * - 字串中的逗號/括號(如 `fn(a = "(", b)`)
374
+ * - 模板字面值中的特殊字元
375
+ *
376
+ * 優先使用 AST 解析(parseWithAST)
209
377
  */
210
378
  splitParameters(paramsString) {
211
379
  const result = [];
@@ -234,7 +402,10 @@ export class SignatureParser {
234
402
  return result;
235
403
  }
236
404
  /**
237
- * 找到函式結束行
405
+ * 找到函式結束行(Fallback 方法)
406
+ * 使用大括號計數法,無法處理字串/註解中的括號
407
+ *
408
+ * 優先使用 findFunctionEndLineWithAST
238
409
  */
239
410
  findFunctionEndLine(lines, startLine) {
240
411
  let depth = 0;
@@ -1 +1 @@
1
- {"version":3,"file":"signature-parser.js","sourceRoot":"","sources":["../../../src/core/change-signature/signature-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"signature-parser.js","sourceRoot":"","sources":["../../../src/core/change-signature/signature-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH;;GAEG;AACH,MAAM,OAAO,eAAe;IAEP;IACA;IAFnB,YACmB,cAA8B,EAC9B,UAAuB;QADvB,mBAAc,GAAd,cAAc,CAAgB;QAC9B,eAAU,GAAV,UAAU,CAAa;IACvC,CAAC;IAEJ;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,QAAgB,EAAE,YAAoB;QACzD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAElD,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,KAAK,CAAC;YACX,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,wBAAwB,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;YACxE,KAAK,KAAK,CAAC;YACX,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,wBAAwB,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;YACxE;gBACE,OAAO,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,wBAAwB,CAAC,OAAe,EAAE,QAAgB,EAAE,YAAoB;QACtF,cAAc;QACd,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QACrE,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,oBAAoB;QACpB,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IAC9D,CAAC;IAED;;;;;OAKG;IACK,YAAY,CAAC,OAAe,EAAE,QAAgB,EAAE,YAAoB;QAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAExD,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,8BAA8B;QAC9B,MAAM,SAAS,GAAG,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAChE,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACpD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC;QACvC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,kCAAkC;QAClC,MAAM,UAAU,GAA0B,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YACpF,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YACnD,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;YAClC,KAAK,EAAE;gBACL,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,GAAG,EAAE,EAAE;gBAC/C,GAAG,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,GAAG,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE;aAClE;SACF,CAAC,CAAC,CAAC;QAEJ,SAAS;QACT,MAAM,OAAO,GAAG,IAAI,CAAC,0BAA0B,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC;eACvF,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;QAErD,oBAAoB;QACpB,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAExG,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,UAAU;YACV,UAAU,EAAE,SAAS,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;YAC9E,QAAQ,EAAE;gBACR,QAAQ;gBACR,KAAK,EAAE;oBACL,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE;oBACnE,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;iBACtC;aACF;YACD,QAAQ;YACR,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;YAC9E,SAAS;SACV,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,0BAA0B,CAChC,OAAe,EACf,QAAgB,EAChB,YAAoB,EACpB,UAAkB;QAElB,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAExD,IAAI,CAAC,MAAM,EAAE,uBAAuB,EAAE,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,uBAAuB,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QAC5F,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,CAAC;IAED;;OAEG;IACK,sBAAsB,CAAC,OAAe,EAAE,YAAoB;QAClE,MAAM,QAAQ,GAAG;YACf,cAAc;YACd,IAAI,MAAM,CAAC,+CAA+C,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC;YACpG,OAAO;YACP,IAAI,MAAM,CAAC,0CAA0C,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC;YAC/F,WAAW;YACX,IAAI,MAAM,CAAC,kEAAkE,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC;SAC5H,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7C,MAAM,eAAe,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;gBAChE,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,eAAe,CAAC;YAC/E,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,uBAAuB,CAAC,OAAe,EAAE,YAAoB;QAMnE,MAAM,QAAQ,GAAG;YACf,cAAc;YACd,EAAE,OAAO,EAAE,IAAI,MAAM,CAAC,+CAA+C,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE;YAC/H,OAAO;YACP,EAAE,OAAO,EAAE,IAAI,MAAM,CAAC,0CAA0C,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,0CAA0C,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE;YAC/J,WAAW;YACX,EAAE,OAAO,EAAE,IAAI,MAAM,CAAC,kEAAkE,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE;SACjJ,CAAC;QAEF,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,QAAQ,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7C,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;gBACjE,MAAM,SAAS,GAAa,EAAE,CAAC;gBAC/B,IAAI,QAAQ,GAAG,KAAK,CAAC;gBAErB,QAAQ,IAAI,EAAE,CAAC;oBACb,KAAK,UAAU;wBACb,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;4BAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;wBAAC,CAAC;wBAC3C,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;4BAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;wBAAC,CAAC;wBAC1C,MAAM;oBACR,KAAK,OAAO;wBACV,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;4BAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;wBAAC,CAAC;wBAC3C,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;4BAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;wBAAC,CAAC;wBAC1C,MAAM;oBACR,KAAK,QAAQ;wBACX,QAAQ,GAAG,IAAI,CAAC;wBAChB,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;4BAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;wBAAC,CAAC;wBAC3C,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;4BAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;wBAAC,CAAC;wBAC3C,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;4BAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;wBAAC,CAAC;wBAC1C,MAAM;gBACV,CAAC;gBAED,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;YACrD,CAAC;QACH,CAAC;QAED,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACtE,CAAC;IAED;;;OAGG;IACK,cAAc,CAAC,OAAe,EAAE,QAAgB,EAAE,YAAoB;QAC5E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,aAAa;QACb,MAAM,QAAQ,GAAG;YACf,oCAAoC;YACpC,IAAI,MAAM,CAAC,+CAA+C,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,8DAA8D,EAAE,GAAG,CAAC;YAC5J,uCAAuC;YACvC,IAAI,MAAM,CAAC,0CAA0C,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,kFAAkF,EAAE,GAAG,CAAC;YAC3K,yCAAyC;YACzC,IAAI,MAAM,CAAC,kEAAkE,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,8DAA8D,EAAE,GAAG,CAAC;SAChL,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE7C;;;;;;;;;;;;;;;;;;;;;;;mBAuBG;gBACH,MAAM,eAAe,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;gBAChE,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,eAAe,CAAC;gBAEzF,wCAAwC;gBACxC,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;gBAEjE,iBAAiB;gBACjB,IAAI,YAAoB,CAAC;gBACzB,IAAI,UAA8B,CAAC;gBACnC,MAAM,SAAS,GAAa,EAAE,CAAC;gBAC/B,IAAI,QAAQ,GAAG,KAAK,CAAC;gBAErB,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;oBAClC,cAAc;oBACd,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;wBAAA,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAAA,CAAC;oBACzC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;wBAAA,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAAA,CAAC;oBACxC,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAC9B,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;gBAChC,CAAC;qBAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBACnC,OAAO;oBACP,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;wBAAA,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAAA,CAAC;oBACzC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;wBAAA,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAAA,CAAC;oBACxC,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAC9B,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;gBAChC,CAAC;qBAAM,CAAC;oBACN,OAAO;oBACP,QAAQ,GAAG,IAAI,CAAC;oBAChB,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;wBAAA,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;oBAAA,CAAC;oBACzC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;wBAAA,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAAA,CAAC;oBACzC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;wBAAA,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAAA,CAAC;oBACxC,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAC9B,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;gBAChC,CAAC;gBAED,uBAAuB;gBACvB,MAAM,UAAU,GAAG,IAAI,CAAC,wBAAwB,CAAC,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBAE/G,SAAS;gBACT,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;gBAEhE,OAAO;oBACL,IAAI,EAAE,YAAY;oBAClB,UAAU;oBACV,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;oBACjD,QAAQ,EAAE;wBACR,QAAQ;wBACR,KAAK,EAAE;4BACL,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE;4BACnE,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;yBACtC;qBACF;oBACD,QAAQ;oBACR,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;oBAC9E,SAAS;iBACV,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,wBAAwB,CAAC,OAAe,EAAE,QAAgB,EAAE,YAAoB;QACtF,yCAAyC;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,wBAAwB,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QAEjF,IAAI,SAAS,EAAE,CAAC;YACd,SAAS;YACT,OAAO;gBACL,GAAG,SAAS;gBACZ,UAAU,EAAE,SAAS;gBACrB,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBACzC,GAAG,CAAC;oBACJ,IAAI,EAAE,SAAS;iBAChB,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACK,wBAAwB,CAAC,YAAoB,EAAE,QAAgB,EAAE,UAAkB;QACzF,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;YACzB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,UAAU,GAA0B,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QAElD,IAAI,aAAa,GAAG,UAAU,CAAC;QAE/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;gBAAA,SAAS;YAAA,CAAC;YAEzB,oDAAoD;YACpD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAC5C,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAEhE,wBAAwB;YACxB,MAAM,YAAY,GAAG,iDAAiD,CAAC;YACvE,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAE/C,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtB,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc;gBACzD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;gBAC9B,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;gBAEtC,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI;oBACJ,IAAI;oBACJ,YAAY;oBACZ,QAAQ;oBACR,IAAI,EAAE,SAAS;oBACf,KAAK,EAAE;wBACL,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE;wBAChD,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,GAAG,KAAK,CAAC,MAAM,EAAE;qBAC9D;iBACF,CAAC,CAAC;YACL,CAAC;YAED,aAAa,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,cAAc;QACnD,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;;;;;;;;OASG;IACK,eAAe,CAAC,YAAoB;QAC1C,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjE,KAAK,EAAE,CAAC;gBACR,OAAO,IAAI,IAAI,CAAC;YAClB,CAAC;iBAAM,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACxE,KAAK,EAAE,CAAC;gBACR,OAAO,IAAI,IAAI,CAAC;YAClB,CAAC;iBAAM,IAAI,IAAI,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBACvC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACrB,OAAO,GAAG,EAAE,CAAC;YACf,CAAC;iBAAM,CAAC;gBACN,OAAO,IAAI,IAAI,CAAC;YAClB,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACK,mBAAmB,CAAC,KAAe,EAAE,SAAiB;QAC5D,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,UAAU,GAAG,KAAK,CAAC;QAEvB,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAEtB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;gBACxB,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;oBACjB,KAAK,EAAE,CAAC;oBACR,UAAU,GAAG,IAAI,CAAC;gBACpB,CAAC;qBAAM,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;oBACxB,KAAK,EAAE,CAAC;oBACR,IAAI,UAAU,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;wBAC9B,OAAO,CAAC,CAAC;oBACX,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,OAAe,EAAE,QAAgB;QAC1D,MAAM,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAE1D,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,MAAM,SAAS,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpD,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YACnD,OAAO,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,QAAQ,CAAC,QAAgB;QACrC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAClE,OAAO,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC3E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,QAAgB;QACvC,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1C,OAAO,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzD,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,GAAW;QAC7B,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,cAA8B,EAAE,UAAuB;IAC3F,OAAO,IAAI,eAAe,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;AACzD,CAAC"}
@@ -20,13 +20,21 @@ export declare class DeadCodeDetector {
20
20
  */
21
21
  detect(): Promise<DeadCodeDetectionResult>;
22
22
  /**
23
- * 收集所有符號
23
+ * 收集所有符號(優先使用 IndexEngine 快取)
24
24
  */
25
25
  private collectAllSymbols;
26
26
  /**
27
27
  * 判斷是否應排除
28
28
  */
29
29
  private shouldExclude;
30
+ /**
31
+ * 判斷符號是否為函式內部的變數或參數
32
+ * 函式參數、arrow function 回呼參數、for 迴圈變數等不應被 deadcode 檢測
33
+ *
34
+ * 注意:此方法遍歷 scope 鏈確認變數是否在 function scope 內,
35
+ * 避免誤過濾模組層級的 block scope 變數(如 if 區塊內的變數)
36
+ */
37
+ private isFunctionLocalVariable;
30
38
  /**
31
39
  * 判斷符號是否為 interface 或 type 的屬性
32
40
  * Interface/Type 的屬性是型別定義的一部分,不應被獨立檢測為 dead code
@@ -65,6 +73,19 @@ export declare class DeadCodeDetector {
65
73
  * 檢查 class 是否有任何成員被使用
66
74
  */
67
75
  private hasAnyUsedMember;
76
+ /**
77
+ * 判斷符號是否為 class member(方法或屬性)
78
+ * - 方法:scope.parent.type === 'class'
79
+ * - 屬性:scope.type === 'class' && symbol.type !== 'class'
80
+ *
81
+ * 注意:class 本身不算 "class member",只有 method/property 才算
82
+ */
83
+ private isClassMember;
84
+ /**
85
+ * 取得 class member 的父 class 名稱
86
+ * @returns 父 class 名稱,若不是 class member 則返回 null
87
+ */
88
+ private getParentClassName;
68
89
  }
69
90
  /**
70
91
  * 建立 DeadCodeDetector 實例
@@ -1 +1 @@
1
- {"version":3,"file":"dead-code-detector.d.ts","sourceRoot":"","sources":["../../../src/core/deadcode/dead-code-detector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAElE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kDAAkD,CAAC;AACpF,OAAO,KAAK,EAEV,uBAAuB,EACvB,uBAAuB,EAExB,MAAM,YAAY,CAAC;AAgBpB;;GAEG;AACH,qBAAa,gBAAgB;IAIzB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAL7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;gBAGzC,WAAW,EAAE,WAAW,EACxB,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,WAAW,EACxC,OAAO,CAAC,EAAE,uBAAuB;IAKnC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,uBAAuB,CAAC;IA4IlD;;SAEK;YACW,iBAAiB;IA2B/B;;OAEG;IACH,OAAO,CAAC,aAAa;IA6BrB;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IAMjC;;OAEG;IACH,OAAO,CAAC,cAAc;IActB;;OAEG;IACH,OAAO,CAAC,YAAY;IAepB;;OAEG;IACH,OAAO,CAAC,cAAc;IAwBtB;;OAEG;IACH,OAAO,CAAC,SAAS;IAKjB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;YACW,QAAQ;IAStB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA6B5B;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAazB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,WAAW,EACxB,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,WAAW,EACvB,OAAO,CAAC,EAAE,uBAAuB,GAChC,gBAAgB,CAElB"}
1
+ {"version":3,"file":"dead-code-detector.d.ts","sourceRoot":"","sources":["../../../src/core/deadcode/dead-code-detector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAOlE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kDAAkD,CAAC;AACpF,OAAO,KAAK,EAEV,uBAAuB,EACvB,uBAAuB,EAExB,MAAM,YAAY,CAAC;AAmCpB;;GAEG;AACH,qBAAa,gBAAgB;IAIzB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAL7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;gBAGzC,WAAW,EAAE,WAAW,EACxB,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,WAAW,EACxC,OAAO,CAAC,EAAE,uBAAuB;IAKnC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,uBAAuB,CAAC;IAsIlD;;SAEK;YACW,iBAAiB;IA2D/B;;OAEG;IACH,OAAO,CAAC,aAAa;IAoCrB;;;;;;OAMG;IACH,OAAO,CAAC,uBAAuB;IAwB/B;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IAMjC;;OAEG;IACH,OAAO,CAAC,cAAc;IActB;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACH,OAAO,CAAC,cAAc;IAwBtB;;OAEG;IACH,OAAO,CAAC,SAAS;IAKjB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;YACW,QAAQ;IAStB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAqB5B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAcxB;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IAOrB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;CAS3B;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,WAAW,EACxB,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,WAAW,EACvB,OAAO,CAAC,EAAE,uBAAuB,GAChC,gBAAgB,CAElB"}
@@ -2,8 +2,28 @@
2
2
  * Dead Code 檢測器
3
3
  * 使用 find-references 判斷未使用的符號
4
4
  */
5
- import { createSymbolFinder, SymbolReferenceType } from '../shared/symbol-finder.js';
5
+ import { SymbolType } from '../../shared/types/symbol.js';
6
+ import { isSameLine } from '../../shared/types/index.js';
7
+ import { createSymbolFinder, SymbolReferenceType, symbolToKey, serializeSymbolKey } from '../shared/symbol-finder/index.js';
6
8
  import { DEFAULT_DEAD_CODE_OPTIONS } from './types.js';
9
+ /**
10
+ * SymbolType 對應的中文標籤
11
+ * 使用 Record<SymbolType, string> 確保型別安全
12
+ */
13
+ const SYMBOL_TYPE_LABELS = {
14
+ [SymbolType.Function]: '函式',
15
+ [SymbolType.Class]: '類別',
16
+ [SymbolType.Variable]: '變數',
17
+ [SymbolType.Interface]: '介面',
18
+ [SymbolType.Type]: '型別',
19
+ [SymbolType.Property]: '屬性',
20
+ [SymbolType.Enum]: '列舉',
21
+ [SymbolType.Constant]: '常數',
22
+ [SymbolType.Protocol]: '協定',
23
+ [SymbolType.Struct]: '結構',
24
+ [SymbolType.Module]: '模組',
25
+ [SymbolType.Namespace]: '命名空間'
26
+ };
7
27
  /**
8
28
  * Dead Code 檢測器
9
29
  */
@@ -28,37 +48,33 @@ export class DeadCodeDetector {
28
48
  const indexedFiles = this.indexEngine.getAllIndexedFiles();
29
49
  const filePaths = indexedFiles.map(f => f.filePath);
30
50
  // 收集所有符號
31
- const { symbols: allSymbols, skippedFiles } = await this.collectAllSymbols(filePaths);
51
+ const { symbols: allSymbols, skippedFiles, warnings } = await this.collectAllSymbols(filePaths);
32
52
  // 過濾要檢測的符號類型
33
53
  const targetSymbols = allSymbols.filter(s => this.options.symbolTypes.includes(s.type));
34
54
  // 建立 SymbolFinder
35
55
  const symbolFinder = createSymbolFinder(this.parserRegistry, this.fileSystem);
36
56
  // 過濾要檢測的符號(排除不需要的)
37
57
  const symbolsToCheck = targetSymbols.filter(s => !this.shouldExclude(s));
38
- // 收集所有符號名稱
39
- const symbolNames = new Set(symbolsToCheck.map(s => s.name));
40
- // 批次查找所有符號的引用
58
+ // 批次查找所有符號的引用(使用完整 Symbol 資訊,可區分同名符號)
41
59
  // 優化:M 次檔案讀取(一次遍歷 M 檔查找 N 符號),而非 N×M 次(N 符號各遍歷 M 檔)
42
- const allReferences = await symbolFinder.findReferencesMultiple(symbolNames, filePaths);
60
+ const allReferences = await symbolFinder.findReferencesMultiple(symbolsToCheck, filePaths);
43
61
  // 建立 class → members 映射,用於判斷 class 是否有成員被使用
44
62
  const classMembersMap = this.buildClassMembersMap(symbolsToCheck);
45
63
  // 第一輪:分析每個符號的使用情況
46
64
  const symbolUsageMap = new Map();
47
65
  for (const symbol of symbolsToCheck) {
48
- const references = allReferences.get(symbol.name) ?? [];
66
+ // 使用 SymbolKey 作為鍵,確保同名符號(如 Dog.bark vs Car.bark)不會合併
67
+ const symbolKey = serializeSymbolKey(symbolToKey(symbol));
68
+ const references = allReferences.get(symbolKey) ?? [];
49
69
  // 分析引用:過濾掉定義位置本身
50
70
  const symbolLine = symbol.location.range.start.line;
51
71
  const symbolFile = symbol.location.filePath;
52
72
  const usageRefs = references.filter(ref => {
53
73
  // 排除定義位置
54
- // 注意:symbol 使用 0-indexed 行號,但文字匹配降級方法可能使用 1-indexed
55
- // 因此同時檢查精確匹配和 +1 偏移
56
74
  const refLine = ref.location.range.start.line;
57
- // 定義位置過濾:同檔案、同行(考慮 0/1-indexed 差異)
58
- // 由於 symbol 位置指向宣告起點,而 reference 位置指向識別符,
59
- // 我們不比對 column,只比對行號
75
+ // 定義位置過濾:同檔案、同行(使用 isSameLine 處理 0/1-indexed 差異)
60
76
  const isDefinitionLine = ref.location.filePath === symbolFile
61
- && (refLine === symbolLine || refLine === symbolLine + 1);
77
+ && isSameLine(refLine, symbolLine);
62
78
  if (isDefinitionLine) {
63
79
  return false;
64
80
  }
@@ -71,14 +87,13 @@ export class DeadCodeDetector {
71
87
  // 第二輪:檢測每個符號是否為 dead code
72
88
  const deadItems = [];
73
89
  for (const symbol of symbolsToCheck) {
74
- const { usageRefs, hasExport } = symbolUsageMap.get(symbol);
90
+ const usageInfo = symbolUsageMap.get(symbol);
91
+ if (!usageInfo) {
92
+ continue;
93
+ }
94
+ const { usageRefs, hasExport } = usageInfo;
75
95
  // 判斷是否為 public class member(class 內的非 private/protected 成員)
76
- // 注意:class 本身不算 "class member",只有 method/property 才算
77
- // - 方法:scope.type === 'function' && scope.parent.type === 'class'
78
- // - 屬性:scope.type === 'class' && symbol.type !== 'class'(屬性在 class scope 內,但符號類型不是 class)
79
- const isClassMember = (symbol.scope?.parent?.type === 'class'
80
- || (symbol.scope?.type === 'class' && symbol.type !== 'class'));
81
- const isPublicClassMember = isClassMember
96
+ const isPublicClassMember = this.isClassMember(symbol)
82
97
  && !symbol.modifiers.includes('private')
83
98
  && !symbol.modifiers.includes('protected');
84
99
  // 判斷是否為 dead code
@@ -100,7 +115,8 @@ export class DeadCodeDetector {
100
115
  continue;
101
116
  }
102
117
  }
103
- const references = allReferences.get(symbol.name) ?? [];
118
+ const deadSymbolKey = serializeSymbolKey(symbolToKey(symbol));
119
+ const references = allReferences.get(deadSymbolKey) ?? [];
104
120
  deadItems.push({
105
121
  name: symbol.name,
106
122
  type: symbol.type,
@@ -114,7 +130,8 @@ export class DeadCodeDetector {
114
130
  return {
115
131
  success: true,
116
132
  items: deadItems,
117
- stats
133
+ stats,
134
+ warnings: warnings.length > 0 ? warnings : undefined
118
135
  };
119
136
  }
120
137
  catch (error) {
@@ -134,34 +151,52 @@ export class DeadCodeDetector {
134
151
  }
135
152
  }
136
153
  /**
137
- * 收集所有符號
154
+ * 收集所有符號(優先使用 IndexEngine 快取)
138
155
  */
139
156
  async collectAllSymbols(filePaths) {
140
- const allSymbols = [];
141
- let skippedFiles = 0;
142
- for (const filePath of filePaths) {
143
- const parser = this.getParser(filePath);
144
- if (!parser) {
145
- continue;
146
- }
157
+ const warnings = [];
158
+ // 平行處理所有檔案,收集符號或記錄錯誤
159
+ const results = await Promise.all(filePaths.map(async (filePath) => {
147
160
  try {
161
+ // 優先從 IndexEngine 的 symbolIndex 讀取(已在 indexProject 時建立)
162
+ const cachedSymbols = await this.indexEngine.getFileSymbols(filePath);
163
+ if (cachedSymbols.length > 0) {
164
+ return { symbols: [...cachedSymbols], error: false };
165
+ }
166
+ // Fallback:重新解析(用於 IndexEngine 無資料時)
167
+ const parser = this.getParser(filePath);
168
+ if (!parser) {
169
+ return { symbols: [], error: false };
170
+ }
148
171
  const content = await this.readFile(filePath);
149
172
  if (!content) {
150
- continue;
173
+ return { symbols: [], error: false };
151
174
  }
152
175
  const ast = await parser.parse(content, filePath);
153
176
  const symbols = await parser.extractSymbols(ast);
154
- allSymbols.push(...symbols);
177
+ return { symbols, error: false };
155
178
  }
156
179
  catch (error) {
157
- skippedFiles++;
158
- if (this.options.verbose) {
159
- const errorMessage = error instanceof Error ? error.message : String(error);
160
- console.warn(`⚠️ 跳過檔案 ${filePath}: ${errorMessage}`);
180
+ const errorMessage = error instanceof Error ? error.message : String(error);
181
+ return {
182
+ symbols: [],
183
+ error: true,
184
+ warning: `跳過檔案 ${filePath}: ${errorMessage}`
185
+ };
186
+ }
187
+ }));
188
+ // 聚合結果
189
+ const allSymbols = results.flatMap(r => r.symbols);
190
+ const skippedFiles = results.filter(r => r.error).length;
191
+ // 收集警告訊息(僅在 verbose 模式下記錄)
192
+ if (this.options.verbose) {
193
+ for (const result of results) {
194
+ if (result.warning) {
195
+ warnings.push(result.warning);
161
196
  }
162
197
  }
163
198
  }
164
- return { symbols: allSymbols, skippedFiles };
199
+ return { symbols: allSymbols, skippedFiles, warnings };
165
200
  }
166
201
  /**
167
202
  * 判斷是否應排除
@@ -176,6 +211,12 @@ export class DeadCodeDetector {
176
211
  if (this.isInterfaceOrTypeProperty(symbol)) {
177
212
  return true;
178
213
  }
214
+ // 排除函式內部的變數和參數
215
+ // 這些是局部變數,不應被 deadcode 檢測(可能是函式參數、arrow function 回呼參數、
216
+ // for 迴圈變數等)。它們的 scope.type 會是 'function' 或 'block'
217
+ if (this.isFunctionLocalVariable(symbol)) {
218
+ return true;
219
+ }
179
220
  // 排除名稱模式
180
221
  for (const pattern of this.options.excludePatterns) {
181
222
  if (symbol.name === pattern || symbol.name.toLowerCase() === pattern.toLowerCase()) {
@@ -191,6 +232,34 @@ export class DeadCodeDetector {
191
232
  }
192
233
  return false;
193
234
  }
235
+ /**
236
+ * 判斷符號是否為函式內部的變數或參數
237
+ * 函式參數、arrow function 回呼參數、for 迴圈變數等不應被 deadcode 檢測
238
+ *
239
+ * 注意:此方法遍歷 scope 鏈確認變數是否在 function scope 內,
240
+ * 避免誤過濾模組層級的 block scope 變數(如 if 區塊內的變數)
241
+ */
242
+ isFunctionLocalVariable(symbol) {
243
+ // 只處理變數類型
244
+ if (symbol.type !== 'variable' && symbol.type !== 'constant') {
245
+ return false;
246
+ }
247
+ // 遍歷 scope 鏈,確認是否有 function scope
248
+ // 只有在 scope 鏈中找到 function 時,才認定為函式內部變數
249
+ let scope = symbol.scope;
250
+ while (scope) {
251
+ if (scope.type === 'function') {
252
+ return true;
253
+ }
254
+ // 遇到 module, namespace, global, class 則停止,表示不在函式內
255
+ if (scope.type === 'module' || scope.type === 'namespace' ||
256
+ scope.type === 'global' || scope.type === 'class') {
257
+ return false;
258
+ }
259
+ scope = scope.parent;
260
+ }
261
+ return false;
262
+ }
194
263
  /**
195
264
  * 判斷符號是否為 interface 或 type 的屬性
196
265
  * Interface/Type 的屬性是型別定義的一部分,不應被獨立檢測為 dead code
@@ -217,27 +286,14 @@ export class DeadCodeDetector {
217
286
  * 取得類型標籤
218
287
  */
219
288
  getTypeLabel(type) {
220
- const labels = {
221
- function: '函式',
222
- class: '類別',
223
- variable: '變數',
224
- interface: '介面',
225
- type: '型別',
226
- property: '屬性',
227
- method: '方法',
228
- enum: '列舉',
229
- constant: '常數'
230
- };
231
- return labels[type] || type;
289
+ return SYMBOL_TYPE_LABELS[type] || type;
232
290
  }
233
291
  /**
234
292
  * 計算統計
235
293
  */
236
294
  calculateStats(totalSymbols, deadItems, startTime, skippedFiles) {
237
- const byType = {};
238
- for (const item of deadItems) {
239
- byType[item.type] = (byType[item.type] || 0) + 1;
240
- }
295
+ // 使用 reduce 聲明式計算各類型數量
296
+ const byType = deadItems.reduce((acc, item) => ({ ...acc, [item.type]: (acc[item.type] || 0) + 1 }), {});
241
297
  const filesAffected = new Set(deadItems.map(item => item.location.filePath)).size;
242
298
  return {
243
299
  totalSymbols,
@@ -288,14 +344,7 @@ export class DeadCodeDetector {
288
344
  }, new Map());
289
345
  // 第二步:將成員分配到對應的 class
290
346
  symbols.forEach(symbol => {
291
- // 判斷 parent class 名稱
292
- // - 方法:scope.parent.type === 'class'
293
- // - 屬性:scope.type === 'class' && symbol.type !== 'class'
294
- const parentClassName = symbol.scope?.parent?.type === 'class'
295
- ? symbol.scope.parent.name
296
- : (symbol.scope?.type === 'class' && symbol.type !== 'class')
297
- ? symbol.scope.name
298
- : null;
347
+ const parentClassName = this.getParentClassName(symbol);
299
348
  if (parentClassName) {
300
349
  const key = `${symbol.location.filePath}:${parentClassName}`;
301
350
  classMap.get(key)?.push(symbol);
@@ -314,6 +363,30 @@ export class DeadCodeDetector {
314
363
  return usageInfo && usageInfo.usageRefs.length > 0;
315
364
  });
316
365
  }
366
+ /**
367
+ * 判斷符號是否為 class member(方法或屬性)
368
+ * - 方法:scope.parent.type === 'class'
369
+ * - 屬性:scope.type === 'class' && symbol.type !== 'class'
370
+ *
371
+ * 注意:class 本身不算 "class member",只有 method/property 才算
372
+ */
373
+ isClassMember(symbol) {
374
+ return (symbol.scope?.parent?.type === 'class'
375
+ || (symbol.scope?.type === 'class' && symbol.type !== SymbolType.Class));
376
+ }
377
+ /**
378
+ * 取得 class member 的父 class 名稱
379
+ * @returns 父 class 名稱,若不是 class member 則返回 null
380
+ */
381
+ getParentClassName(symbol) {
382
+ if (symbol.scope?.parent?.type === 'class') {
383
+ return symbol.scope.parent.name ?? null;
384
+ }
385
+ if (symbol.scope?.type === 'class' && symbol.type !== SymbolType.Class) {
386
+ return symbol.scope.name ?? null;
387
+ }
388
+ return null;
389
+ }
317
390
  }
318
391
  /**
319
392
  * 建立 DeadCodeDetector 實例