agent-ide 0.8.2 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/dist/core/change-signature/call-site-updater.d.ts +108 -0
  2. package/dist/core/change-signature/call-site-updater.d.ts.map +1 -0
  3. package/dist/core/change-signature/call-site-updater.js +347 -0
  4. package/dist/core/change-signature/call-site-updater.js.map +1 -0
  5. package/dist/core/change-signature/change-signature-service.d.ts +4 -55
  6. package/dist/core/change-signature/change-signature-service.d.ts.map +1 -1
  7. package/dist/core/change-signature/change-signature-service.js +17 -483
  8. package/dist/core/change-signature/change-signature-service.js.map +1 -1
  9. package/dist/core/change-signature/index.d.ts +4 -0
  10. package/dist/core/change-signature/index.d.ts.map +1 -1
  11. package/dist/core/change-signature/index.js +5 -0
  12. package/dist/core/change-signature/index.js.map +1 -1
  13. package/dist/core/change-signature/signature-transformer.d.ts +20 -0
  14. package/dist/core/change-signature/signature-transformer.d.ts.map +1 -0
  15. package/dist/core/change-signature/signature-transformer.js +91 -0
  16. package/dist/core/change-signature/signature-transformer.js.map +1 -0
  17. package/dist/core/change-signature/signature-validator.d.ts +30 -0
  18. package/dist/core/change-signature/signature-validator.d.ts.map +1 -0
  19. package/dist/core/change-signature/signature-validator.js +152 -0
  20. package/dist/core/change-signature/signature-validator.js.map +1 -0
  21. package/dist/core/change-signature/utils.d.ts +19 -0
  22. package/dist/core/change-signature/utils.d.ts.map +1 -0
  23. package/dist/core/change-signature/utils.js +23 -0
  24. package/dist/core/change-signature/utils.js.map +1 -0
  25. package/dist/core/cycles/cycle-detector.d.ts.map +1 -1
  26. package/dist/core/cycles/cycle-detector.js +16 -8
  27. package/dist/core/cycles/cycle-detector.js.map +1 -1
  28. package/dist/core/cycles/index.d.ts +1 -1
  29. package/dist/core/cycles/index.d.ts.map +1 -1
  30. package/dist/core/cycles/index.js +1 -1
  31. package/dist/core/cycles/index.js.map +1 -1
  32. package/dist/core/cycles/types.d.ts +20 -4
  33. package/dist/core/cycles/types.d.ts.map +1 -1
  34. package/dist/core/cycles/types.js +22 -4
  35. package/dist/core/cycles/types.js.map +1 -1
  36. package/dist/core/deadcode/dead-code-remover.js +4 -4
  37. package/dist/core/deadcode/dead-code-remover.js.map +1 -1
  38. package/dist/core/impact/dependency-extractor.d.ts +25 -0
  39. package/dist/core/impact/dependency-extractor.d.ts.map +1 -0
  40. package/dist/core/impact/dependency-extractor.js +65 -0
  41. package/dist/core/impact/dependency-extractor.js.map +1 -0
  42. package/dist/core/impact/file-scanner.d.ts +52 -0
  43. package/dist/core/impact/file-scanner.d.ts.map +1 -0
  44. package/dist/core/impact/file-scanner.js +131 -0
  45. package/dist/core/impact/file-scanner.js.map +1 -0
  46. package/dist/core/impact/impact-analyzer.d.ts +3 -64
  47. package/dist/core/impact/impact-analyzer.d.ts.map +1 -1
  48. package/dist/core/impact/impact-analyzer.js +13 -312
  49. package/dist/core/impact/impact-analyzer.js.map +1 -1
  50. package/dist/core/impact/index.d.ts +3 -0
  51. package/dist/core/impact/index.d.ts.map +1 -1
  52. package/dist/core/impact/index.js +3 -0
  53. package/dist/core/impact/index.js.map +1 -1
  54. package/dist/core/impact/path-resolver.d.ts +35 -0
  55. package/dist/core/impact/path-resolver.d.ts.map +1 -0
  56. package/dist/core/impact/path-resolver.js +166 -0
  57. package/dist/core/impact/path-resolver.js.map +1 -0
  58. package/dist/core/move/file-scanner.d.ts +48 -0
  59. package/dist/core/move/file-scanner.d.ts.map +1 -0
  60. package/dist/core/move/file-scanner.js +137 -0
  61. package/dist/core/move/file-scanner.js.map +1 -0
  62. package/dist/core/move/import-resolver.d.ts +5 -0
  63. package/dist/core/move/import-resolver.d.ts.map +1 -1
  64. package/dist/core/move/import-resolver.js +24 -6
  65. package/dist/core/move/import-resolver.js.map +1 -1
  66. package/dist/core/move/index.d.ts +7 -3
  67. package/dist/core/move/index.d.ts.map +1 -1
  68. package/dist/core/move/index.js +7 -2
  69. package/dist/core/move/index.js.map +1 -1
  70. package/dist/core/move/move-service.d.ts +11 -60
  71. package/dist/core/move/move-service.d.ts.map +1 -1
  72. package/dist/core/move/move-service.js +16 -352
  73. package/dist/core/move/move-service.js.map +1 -1
  74. package/dist/core/move/path-calculator.d.ts +49 -0
  75. package/dist/core/move/path-calculator.d.ts.map +1 -0
  76. package/dist/core/move/path-calculator.js +158 -0
  77. package/dist/core/move/path-calculator.js.map +1 -0
  78. package/dist/core/move/path-parser.d.ts +33 -0
  79. package/dist/core/move/path-parser.d.ts.map +1 -0
  80. package/dist/core/move/path-parser.js +53 -0
  81. package/dist/core/move/path-parser.js.map +1 -0
  82. package/dist/core/move/path-utils.d.ts +70 -0
  83. package/dist/core/move/path-utils.d.ts.map +1 -0
  84. package/dist/core/move/path-utils.js +201 -0
  85. package/dist/core/move/path-utils.js.map +1 -0
  86. package/dist/core/move/types.d.ts +81 -18
  87. package/dist/core/move/types.d.ts.map +1 -1
  88. package/dist/core/move/types.js +73 -5
  89. package/dist/core/move/types.js.map +1 -1
  90. package/dist/core/move-member/change-applier.d.ts +23 -0
  91. package/dist/core/move-member/change-applier.d.ts.map +1 -0
  92. package/dist/core/move-member/change-applier.js +51 -0
  93. package/dist/core/move-member/change-applier.js.map +1 -0
  94. package/dist/core/move-member/file-change-preparer.d.ts +49 -0
  95. package/dist/core/move-member/file-change-preparer.d.ts.map +1 -0
  96. package/dist/core/move-member/file-change-preparer.js +340 -0
  97. package/dist/core/move-member/file-change-preparer.js.map +1 -0
  98. package/dist/core/move-member/index.d.ts +4 -1
  99. package/dist/core/move-member/index.d.ts.map +1 -1
  100. package/dist/core/move-member/index.js +3 -0
  101. package/dist/core/move-member/index.js.map +1 -1
  102. package/dist/core/move-member/member-extractor.d.ts +11 -0
  103. package/dist/core/move-member/member-extractor.d.ts.map +1 -1
  104. package/dist/core/move-member/member-extractor.js +114 -22
  105. package/dist/core/move-member/member-extractor.js.map +1 -1
  106. package/dist/core/move-member/move-member-service.d.ts +3 -78
  107. package/dist/core/move-member/move-member-service.d.ts.map +1 -1
  108. package/dist/core/move-member/move-member-service.js +35 -419
  109. package/dist/core/move-member/move-member-service.js.map +1 -1
  110. package/dist/core/move-member/reference-updater.d.ts +73 -0
  111. package/dist/core/move-member/reference-updater.d.ts.map +1 -0
  112. package/dist/core/move-member/reference-updater.js +286 -0
  113. package/dist/core/move-member/reference-updater.js.map +1 -0
  114. package/dist/core/move-member/types.d.ts +17 -2
  115. package/dist/core/move-member/types.d.ts.map +1 -1
  116. package/dist/core/move-member/types.js.map +1 -1
  117. package/dist/core/rename/reference-updater.d.ts.map +1 -1
  118. package/dist/core/rename/reference-updater.js +4 -1
  119. package/dist/core/rename/reference-updater.js.map +1 -1
  120. package/dist/core/rename/rename-engine.d.ts +5 -3
  121. package/dist/core/rename/rename-engine.d.ts.map +1 -1
  122. package/dist/core/rename/rename-engine.js +29 -8
  123. package/dist/core/rename/rename-engine.js.map +1 -1
  124. package/dist/core/shared/symbol-finder/symbol-finder.d.ts.map +1 -1
  125. package/dist/core/shared/symbol-finder/symbol-finder.js +9 -1
  126. package/dist/core/shared/symbol-finder/symbol-finder.js.map +1 -1
  127. package/dist/infrastructure/changeset/change-applicator.d.ts +1 -1
  128. package/dist/infrastructure/changeset/change-applicator.d.ts.map +1 -1
  129. package/dist/infrastructure/changeset/change-applicator.js +22 -21
  130. package/dist/infrastructure/changeset/change-applicator.js.map +1 -1
  131. package/dist/infrastructure/changeset/changeset-builder.d.ts +2 -2
  132. package/dist/infrastructure/changeset/changeset-builder.d.ts.map +1 -1
  133. package/dist/infrastructure/changeset/changeset-builder.js +11 -6
  134. package/dist/infrastructure/changeset/changeset-builder.js.map +1 -1
  135. package/dist/infrastructure/changeset/changeset-converter.d.ts +1 -1
  136. package/dist/infrastructure/changeset/changeset-converter.d.ts.map +1 -1
  137. package/dist/infrastructure/changeset/changeset-converter.js +9 -8
  138. package/dist/infrastructure/changeset/changeset-converter.js.map +1 -1
  139. package/dist/infrastructure/changeset/index.d.ts +1 -0
  140. package/dist/infrastructure/changeset/index.d.ts.map +1 -1
  141. package/dist/infrastructure/changeset/index.js +2 -0
  142. package/dist/infrastructure/changeset/index.js.map +1 -1
  143. package/dist/infrastructure/changeset/types.d.ts +41 -4
  144. package/dist/infrastructure/changeset/types.d.ts.map +1 -1
  145. package/dist/infrastructure/changeset/types.js +41 -1
  146. package/dist/infrastructure/changeset/types.js.map +1 -1
  147. package/dist/interfaces/cli/cli.d.ts.map +1 -1
  148. package/dist/interfaces/cli/cli.js +1 -2
  149. package/dist/interfaces/cli/cli.js.map +1 -1
  150. package/dist/interfaces/cli/commands/index.d.ts +0 -1
  151. package/dist/interfaces/cli/commands/index.d.ts.map +1 -1
  152. package/dist/interfaces/cli/commands/index.js +0 -1
  153. package/dist/interfaces/cli/commands/index.js.map +1 -1
  154. package/dist/interfaces/cli/commands/move.command.d.ts +1 -0
  155. package/dist/interfaces/cli/commands/move.command.d.ts.map +1 -1
  156. package/dist/interfaces/cli/commands/move.command.js +127 -11
  157. package/dist/interfaces/cli/commands/move.command.js.map +1 -1
  158. package/dist/interfaces/cli/commands/rename.command.d.ts.map +1 -1
  159. package/dist/interfaces/cli/commands/rename.command.js +114 -6
  160. package/dist/interfaces/cli/commands/rename.command.js.map +1 -1
  161. package/dist/plugins/javascript/declaration-analyzer.d.ts.map +1 -1
  162. package/dist/plugins/javascript/declaration-analyzer.js +9 -0
  163. package/dist/plugins/javascript/declaration-analyzer.js.map +1 -1
  164. package/dist/plugins/typescript/declaration-analyzer.d.ts.map +1 -1
  165. package/dist/plugins/typescript/declaration-analyzer.js +4 -0
  166. package/dist/plugins/typescript/declaration-analyzer.js.map +1 -1
  167. package/dist/plugins/typescript/reference-finder.d.ts.map +1 -1
  168. package/dist/plugins/typescript/reference-finder.js +11 -2
  169. package/dist/plugins/typescript/reference-finder.js.map +1 -1
  170. package/dist/plugins/typescript/symbol-extractor.d.ts.map +1 -1
  171. package/dist/plugins/typescript/symbol-extractor.js +6 -2
  172. package/dist/plugins/typescript/symbol-extractor.js.map +1 -1
  173. package/package.json +1 -1
  174. package/dist/interfaces/cli/commands/move-member.command.d.ts +0 -11
  175. package/dist/interfaces/cli/commands/move-member.command.d.ts.map +0 -1
  176. package/dist/interfaces/cli/commands/move-member.command.js +0 -140
  177. package/dist/interfaces/cli/commands/move-member.command.js.map +0 -1
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Call Site Updater
3
+ * 負責呼叫點更新相關邏輯
4
+ */
5
+ import type { IFileSystem } from '../../infrastructure/storage/file-system.interface.js';
6
+ import type { FunctionSignature, SignatureChange, CallSiteUpdate } from './types.js';
7
+ import type { CallSite } from '../shared/symbol-finder/index.js';
8
+ /**
9
+ * 呼叫風格資訊
10
+ */
11
+ interface CallStyle {
12
+ /** 是否為多行呼叫 */
13
+ readonly multiline: boolean;
14
+ /** 縮排字串 */
15
+ readonly indent: string;
16
+ /** 是否有尾隨逗號 */
17
+ readonly trailingComma: boolean;
18
+ }
19
+ /**
20
+ * 參數映射資訊
21
+ */
22
+ interface ParameterMappingInfo {
23
+ /** 新的索引位置 */
24
+ readonly newIndex: number;
25
+ /** 預設值(新增參數時使用) */
26
+ readonly value?: string;
27
+ }
28
+ /**
29
+ * Call Site Updater
30
+ * 處理呼叫點的參數更新
31
+ */
32
+ export declare class CallSiteUpdater {
33
+ private readonly fileSystem;
34
+ constructor(fileSystem: IFileSystem);
35
+ /**
36
+ * 生成呼叫點更新
37
+ * 效能優化:按檔案分組後批次讀取,避免重複讀取同一檔案
38
+ * 檔案讀取次數從 O(N) 降到 O(M),N = callSites 數量,M = 不重複檔案數
39
+ * 支援多行呼叫點:正確處理跨多行的函式呼叫
40
+ */
41
+ generateCallSiteUpdates(callSites: readonly CallSite[], originalSignature: FunctionSignature, newSignature: FunctionSignature, changes: readonly SignatureChange[]): Promise<CallSiteUpdate[]>;
42
+ /**
43
+ * 處理單一呼叫點
44
+ */
45
+ private processCallSite;
46
+ /**
47
+ * 映射呼叫點參數
48
+ * 處理省略的可選參數:當可選參數被省略時,重排後需要插入 undefined
49
+ */
50
+ mapCallSiteArguments(callSite: CallSite, parameterMapping: Map<number, ParameterMappingInfo>, changes: readonly SignatureChange[], originalSignature: FunctionSignature): string[];
51
+ /**
52
+ * 建立參數映射
53
+ */
54
+ createParameterMapping(originalSignature: FunctionSignature, _newSignature: FunctionSignature, changes: readonly SignatureChange[]): Map<number, ParameterMappingInfo>;
55
+ /**
56
+ * 提取多行程式碼
57
+ */
58
+ extractMultilineCode(lines: readonly string[], startLine: number, endLine: number): string;
59
+ /**
60
+ * 檢測呼叫風格
61
+ *
62
+ * @remarks
63
+ * 限制說明:
64
+ * - trailingComma 檢測使用簡單的 `endsWith(',')` 邏輯
65
+ * - 若參數值本身以逗號結尾(如字串 `"foo,"`),可能產生誤判
66
+ * - 此情況較罕見,目前接受此限制
67
+ */
68
+ detectCallStyle(lines: readonly string[], startLine: number, endLine: number): CallStyle;
69
+ /**
70
+ * 根據風格格式化參數
71
+ */
72
+ formatArgsWithStyle(args: readonly string[], style: CallStyle): string;
73
+ /**
74
+ * 取得結束行的尾隨內容(右括號之後的部分)
75
+ *
76
+ * @param lines - 檔案行陣列
77
+ * @param endLine - 結束行索引
78
+ * @param closeParenColumn - 右括號的列位置(0-based)
79
+ * @returns 右括號之後的字串內容(如分號、鏈式調用等)
80
+ *
81
+ * @remarks
82
+ * 若 closeParenColumn 超出行長度,會返回空字串
83
+ */
84
+ getTrailingContent(lines: readonly string[], endLine: number, closeParenColumn: number): string;
85
+ /**
86
+ * 找到匹配的右括號位置
87
+ *
88
+ * @param line - 要搜尋的行字串
89
+ * @param openIndex - 左括號 '(' 的位置(0-based)
90
+ * @returns 匹配右括號的位置(0-based)
91
+ *
92
+ * @remarks
93
+ * - 使用深度計數處理巢狀括號
94
+ * - 若找不到匹配的右括號(例如多行函式呼叫),返回 `line.length`
95
+ * - 此函式僅處理單行情況,多行呼叫應使用 `extractMultilineCode`
96
+ */
97
+ private findMatchingParen;
98
+ /**
99
+ * 讀取檔案內容
100
+ */
101
+ private readFile;
102
+ }
103
+ /**
104
+ * 建立 CallSiteUpdater 實例
105
+ */
106
+ export declare function createCallSiteUpdater(fileSystem: IFileSystem): CallSiteUpdater;
107
+ export {};
108
+ //# sourceMappingURL=call-site-updater.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-site-updater.d.ts","sourceRoot":"","sources":["../../../src/core/change-signature/call-site-updater.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kDAAkD,CAAC;AACpF,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,cAAc,EACf,MAAM,YAAY,CAAC;AAOpB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAEpE;;GAEG;AACH,UAAU,SAAS;IACjB,cAAc;IACd,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,WAAW;IACX,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,cAAc;IACd,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CACjC;AAED;;GAEG;AACH,UAAU,oBAAoB;IAC5B,aAAa;IACb,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,mBAAmB;IACnB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAAV,UAAU,EAAE,WAAW;IAEpD;;;;;OAKG;IACG,uBAAuB,CAC3B,SAAS,EAAE,SAAS,QAAQ,EAAE,EAC9B,iBAAiB,EAAE,iBAAiB,EACpC,YAAY,EAAE,iBAAiB,EAC/B,OAAO,EAAE,SAAS,eAAe,EAAE,GAClC,OAAO,CAAC,cAAc,EAAE,CAAC;IA2C5B;;OAEG;IACH,OAAO,CAAC,eAAe;IAuEvB;;;OAGG;IACH,oBAAoB,CAClB,QAAQ,EAAE,QAAQ,EAClB,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,EACnD,OAAO,EAAE,SAAS,eAAe,EAAE,EACnC,iBAAiB,EAAE,iBAAiB,GACnC,MAAM,EAAE;IAiFX;;OAEG;IACH,sBAAsB,CACpB,iBAAiB,EAAE,iBAAiB,EACpC,aAAa,EAAE,iBAAiB,EAChC,OAAO,EAAE,SAAS,eAAe,EAAE,GAClC,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC;IAwDpC;;OAEG;IACH,oBAAoB,CAClB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,MAAM;IAYT;;;;;;;;OAQG;IACH,eAAe,CACb,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,SAAS;IAmBZ;;OAEG;IACH,mBAAmB,CACjB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,KAAK,EAAE,SAAS,GACf,MAAM;IAWT;;;;;;;;;;OAUG;IACH,kBAAkB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM;IAM/F;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,iBAAiB;IAYzB;;OAEG;YACW,QAAQ;CAQvB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,WAAW,GAAG,eAAe,CAE9E"}
@@ -0,0 +1,347 @@
1
+ /**
2
+ * Call Site Updater
3
+ * 負責呼叫點更新相關邏輯
4
+ */
5
+ import { isAddParameterChange, isRemoveParameterChange, isReorderParametersChange } from './types.js';
6
+ import { resolveParameterIndex, OMITTED_PARAMETER_MARKER } from './utils.js';
7
+ /**
8
+ * Call Site Updater
9
+ * 處理呼叫點的參數更新
10
+ */
11
+ export class CallSiteUpdater {
12
+ fileSystem;
13
+ constructor(fileSystem) {
14
+ this.fileSystem = fileSystem;
15
+ }
16
+ /**
17
+ * 生成呼叫點更新
18
+ * 效能優化:按檔案分組後批次讀取,避免重複讀取同一檔案
19
+ * 檔案讀取次數從 O(N) 降到 O(M),N = callSites 數量,M = 不重複檔案數
20
+ * 支援多行呼叫點:正確處理跨多行的函式呼叫
21
+ */
22
+ async generateCallSiteUpdates(callSites, originalSignature, newSignature, changes) {
23
+ const updates = [];
24
+ // 建立參數映射
25
+ const parameterMapping = this.createParameterMapping(originalSignature, newSignature, changes);
26
+ // 按檔案分組 callSites,避免重複讀取同一檔案
27
+ const callSitesByFile = new Map();
28
+ for (const callSite of callSites) {
29
+ const filePath = callSite.location.filePath;
30
+ const existing = callSitesByFile.get(filePath);
31
+ if (existing) {
32
+ existing.push(callSite);
33
+ }
34
+ else {
35
+ callSitesByFile.set(filePath, [callSite]);
36
+ }
37
+ }
38
+ // 批次讀取所有不重複的檔案並處理
39
+ for (const [filePath, fileCallSites] of callSitesByFile) {
40
+ const content = await this.readFile(filePath);
41
+ if (!content) {
42
+ continue;
43
+ }
44
+ const lines = content.split('\n');
45
+ // 處理該檔案的所有 callSites
46
+ for (const callSite of fileCallSites) {
47
+ const update = this.processCallSite(callSite, lines, parameterMapping, changes, originalSignature);
48
+ if (update) {
49
+ updates.push(update);
50
+ }
51
+ }
52
+ }
53
+ return updates;
54
+ }
55
+ /**
56
+ * 處理單一呼叫點
57
+ */
58
+ processCallSite(callSite, lines, parameterMapping, changes, originalSignature) {
59
+ const startLineIndex = callSite.location.range.start.line - 1;
60
+ const endLineIndex = callSite.location.range.end.line - 1;
61
+ const isMultiline = startLineIndex !== endLineIndex;
62
+ // 建立新的參數列表
63
+ const newArgs = this.mapCallSiteArguments(callSite, parameterMapping, changes, originalSignature);
64
+ // 找到呼叫的括號位置
65
+ const startLine = lines[startLineIndex];
66
+ const funcNameIndex = startLine.indexOf(callSite.functionName);
67
+ if (funcNameIndex < 0) {
68
+ return null;
69
+ }
70
+ const openParenIndex = startLine.indexOf('(', funcNameIndex);
71
+ if (isMultiline) {
72
+ // 多行呼叫點:提取完整的原始程式碼並替換
73
+ const originalCode = this.extractMultilineCode(lines, startLineIndex, endLineIndex);
74
+ // 檢測原始呼叫的格式風格
75
+ const originalStyle = this.detectCallStyle(lines, startLineIndex, endLineIndex);
76
+ // 生成新的參數字串(保留原始風格)
77
+ const newArgsString = this.formatArgsWithStyle(newArgs, originalStyle);
78
+ // 生成新的程式碼
79
+ const newCode = startLine.substring(0, openParenIndex + 1)
80
+ + newArgsString
81
+ + ')' + this.getTrailingContent(lines, endLineIndex, callSite.location.range.end.column - 1);
82
+ if (newCode !== originalCode) {
83
+ return {
84
+ filePath: callSite.location.filePath,
85
+ originalCode,
86
+ newCode,
87
+ location: callSite.location
88
+ };
89
+ }
90
+ }
91
+ else {
92
+ // 單行呼叫點:保持原有邏輯
93
+ const closeParenIndex = this.findMatchingParen(startLine, openParenIndex);
94
+ const newArgsString = newArgs.join(', ');
95
+ const newLine = startLine.substring(0, openParenIndex + 1)
96
+ + newArgsString
97
+ + startLine.substring(closeParenIndex);
98
+ if (newLine !== startLine) {
99
+ return {
100
+ filePath: callSite.location.filePath,
101
+ originalCode: startLine,
102
+ newCode: newLine,
103
+ location: callSite.location
104
+ };
105
+ }
106
+ }
107
+ return null;
108
+ }
109
+ /**
110
+ * 映射呼叫點參數
111
+ * 處理省略的可選參數:當可選參數被省略時,重排後需要插入 undefined
112
+ */
113
+ mapCallSiteArguments(callSite, parameterMapping, changes, originalSignature) {
114
+ const result = [];
115
+ // 找出新參數的數量
116
+ let maxNewIndex = -1;
117
+ for (const { newIndex } of parameterMapping.values()) {
118
+ maxNewIndex = Math.max(maxNewIndex, newIndex);
119
+ }
120
+ // 初始化結果陣列
121
+ for (let i = 0; i <= maxNewIndex; i++) {
122
+ result.push('');
123
+ }
124
+ // 映射原始參數
125
+ for (const [originalIndex, { newIndex }] of parameterMapping.entries()) {
126
+ if (originalIndex >= 0) {
127
+ if (originalIndex < callSite.arguments.length) {
128
+ // 呼叫點有提供此參數
129
+ result[newIndex] = callSite.arguments[originalIndex].value;
130
+ }
131
+ else {
132
+ // 呼叫點省略了此可選參數
133
+ // 檢查這個位置是否需要填入 undefined(當後面有其他參數時)
134
+ const param = originalSignature.parameters[originalIndex];
135
+ if (param && (param.optional || param.defaultValue)) {
136
+ // 標記為需要填入 undefined(如果後面有非空參數)
137
+ result[newIndex] = OMITTED_PARAMETER_MARKER;
138
+ }
139
+ }
140
+ }
141
+ }
142
+ // 填入新增參數的值
143
+ const addedPositions = new Set();
144
+ for (const change of changes) {
145
+ if (isAddParameterChange(change)) {
146
+ // 使用 callSiteValue 或 defaultValue(驗證階段已確保至少有一個值)
147
+ const value = change.callSiteValue || change.defaultValue;
148
+ const position = change.position < 0 ? result.length - 1 : Math.min(change.position, result.length - 1);
149
+ if (position >= 0 && position < result.length && !result[position]) {
150
+ result[position] = value;
151
+ addedPositions.add(position);
152
+ }
153
+ }
154
+ }
155
+ // 處理省略的可選參數:
156
+ // 如果省略的參數後面有非空參數,則需要填入 undefined
157
+ // 否則可以完全省略
158
+ const processedResult = [];
159
+ let lastNonEmptyIndex = -1;
160
+ // 找到最後一個非空參數的索引
161
+ for (let i = result.length - 1; i >= 0; i--) {
162
+ if (result[i] !== '' && result[i] !== OMITTED_PARAMETER_MARKER) {
163
+ lastNonEmptyIndex = i;
164
+ break;
165
+ }
166
+ }
167
+ // 建立最終結果
168
+ for (let i = 0; i <= lastNonEmptyIndex; i++) {
169
+ if (result[i] === OMITTED_PARAMETER_MARKER) {
170
+ // 省略的可選參數,但後面有其他參數,需要填入 undefined
171
+ processedResult.push('undefined');
172
+ }
173
+ else if (result[i] === '') {
174
+ // 空值,檢查是否是新增的位置
175
+ if (addedPositions.has(i)) {
176
+ processedResult.push('undefined');
177
+ }
178
+ else {
179
+ // 不應該出現的情況,填入 undefined 以避免語法錯誤
180
+ processedResult.push('undefined');
181
+ }
182
+ }
183
+ else {
184
+ processedResult.push(result[i]);
185
+ }
186
+ }
187
+ return processedResult;
188
+ }
189
+ /**
190
+ * 建立參數映射
191
+ */
192
+ createParameterMapping(originalSignature, _newSignature, changes) {
193
+ const mapping = new Map();
194
+ // 初始化:原始索引 -> 新索引
195
+ let currentParams = originalSignature.parameters.map((p, i) => ({ name: p.name, originalIndex: i }));
196
+ // 處理每個變更
197
+ for (const change of changes) {
198
+ if (isRemoveParameterChange(change)) {
199
+ const index = resolveParameterIndex(currentParams.map(p => ({ name: p.name })), change.parameterNameOrIndex);
200
+ if (index >= 0) {
201
+ currentParams.splice(index, 1);
202
+ }
203
+ }
204
+ if (isReorderParametersChange(change)) {
205
+ const newOrder = [];
206
+ for (const nameOrIndex of change.newOrder) {
207
+ const index = resolveParameterIndex(currentParams.map(p => ({ name: p.name })), nameOrIndex);
208
+ if (index >= 0) {
209
+ newOrder.push(currentParams[index]);
210
+ }
211
+ }
212
+ currentParams = newOrder;
213
+ }
214
+ if (isAddParameterChange(change)) {
215
+ const newParam = { name: change.name, originalIndex: -1, value: change.callSiteValue || change.defaultValue };
216
+ if (change.position < 0 || change.position >= currentParams.length) {
217
+ currentParams.push(newParam);
218
+ }
219
+ else {
220
+ currentParams.splice(change.position, 0, newParam);
221
+ }
222
+ }
223
+ }
224
+ // 建立最終映射
225
+ for (let newIndex = 0; newIndex < currentParams.length; newIndex++) {
226
+ const param = currentParams[newIndex];
227
+ if (param.originalIndex >= 0) {
228
+ mapping.set(param.originalIndex, { newIndex });
229
+ }
230
+ else if ('value' in param) {
231
+ // 新增的參數,設定預設值
232
+ mapping.set(-1 - newIndex, { newIndex, value: param.value });
233
+ }
234
+ }
235
+ return mapping;
236
+ }
237
+ /**
238
+ * 提取多行程式碼
239
+ */
240
+ extractMultilineCode(lines, startLine, endLine) {
241
+ if (startLine === endLine) {
242
+ return lines[startLine];
243
+ }
244
+ const result = [];
245
+ for (let i = startLine; i <= endLine; i++) {
246
+ result.push(lines[i]);
247
+ }
248
+ return result.join('\n');
249
+ }
250
+ /**
251
+ * 檢測呼叫風格
252
+ *
253
+ * @remarks
254
+ * 限制說明:
255
+ * - trailingComma 檢測使用簡單的 `endsWith(',')` 邏輯
256
+ * - 若參數值本身以逗號結尾(如字串 `"foo,"`),可能產生誤判
257
+ * - 此情況較罕見,目前接受此限制
258
+ */
259
+ detectCallStyle(lines, startLine, endLine) {
260
+ const isMultiline = startLine !== endLine;
261
+ if (!isMultiline) {
262
+ return { multiline: false, indent: '', trailingComma: false };
263
+ }
264
+ // 檢測縮排(從第二行取得)
265
+ const secondLine = lines[startLine + 1] || '';
266
+ const indentMatch = secondLine.match(/^(\s*)/);
267
+ const indent = indentMatch ? indentMatch[1] : ' ';
268
+ // 檢測是否有尾隨逗號(簡單啟發式,可能誤判字串內容結尾的逗號)
269
+ const lastArgLine = lines[endLine - 1] || lines[endLine];
270
+ const trailingComma = lastArgLine.trimEnd().endsWith(',');
271
+ return { multiline: true, indent, trailingComma };
272
+ }
273
+ /**
274
+ * 根據風格格式化參數
275
+ */
276
+ formatArgsWithStyle(args, style) {
277
+ if (!style.multiline || args.length === 0) {
278
+ return args.join(', ');
279
+ }
280
+ // 多行格式
281
+ const formattedArgs = args.map(arg => `${style.indent}${arg}`);
282
+ const separator = style.trailingComma ? ',\n' : ',\n';
283
+ return '\n' + formattedArgs.join(separator) + (style.trailingComma ? ',' : '') + '\n';
284
+ }
285
+ /**
286
+ * 取得結束行的尾隨內容(右括號之後的部分)
287
+ *
288
+ * @param lines - 檔案行陣列
289
+ * @param endLine - 結束行索引
290
+ * @param closeParenColumn - 右括號的列位置(0-based)
291
+ * @returns 右括號之後的字串內容(如分號、鏈式調用等)
292
+ *
293
+ * @remarks
294
+ * 若 closeParenColumn 超出行長度,會返回空字串
295
+ */
296
+ getTrailingContent(lines, endLine, closeParenColumn) {
297
+ const line = lines[endLine];
298
+ // 找到右括號後的內容
299
+ return line.substring(closeParenColumn + 1);
300
+ }
301
+ /**
302
+ * 找到匹配的右括號位置
303
+ *
304
+ * @param line - 要搜尋的行字串
305
+ * @param openIndex - 左括號 '(' 的位置(0-based)
306
+ * @returns 匹配右括號的位置(0-based)
307
+ *
308
+ * @remarks
309
+ * - 使用深度計數處理巢狀括號
310
+ * - 若找不到匹配的右括號(例如多行函式呼叫),返回 `line.length`
311
+ * - 此函式僅處理單行情況,多行呼叫應使用 `extractMultilineCode`
312
+ */
313
+ findMatchingParen(line, openIndex) {
314
+ let depth = 1;
315
+ for (let i = openIndex + 1; i < line.length; i++) {
316
+ if (line[i] === '(') {
317
+ depth++;
318
+ }
319
+ else if (line[i] === ')') {
320
+ depth--;
321
+ if (depth === 0) {
322
+ return i;
323
+ }
324
+ }
325
+ }
326
+ return line.length;
327
+ }
328
+ /**
329
+ * 讀取檔案內容
330
+ */
331
+ async readFile(filePath) {
332
+ try {
333
+ const content = await this.fileSystem.readFile(filePath, 'utf-8');
334
+ return typeof content === 'string' ? content : content.toString('utf-8');
335
+ }
336
+ catch {
337
+ return null;
338
+ }
339
+ }
340
+ }
341
+ /**
342
+ * 建立 CallSiteUpdater 實例
343
+ */
344
+ export function createCallSiteUpdater(fileSystem) {
345
+ return new CallSiteUpdater(fileSystem);
346
+ }
347
+ //# sourceMappingURL=call-site-updater.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-site-updater.js","sourceRoot":"","sources":["../../../src/core/change-signature/call-site-updater.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@
5
5
  import type { ParserRegistry } from '../../infrastructure/parser/registry.js';
6
6
  import type { IFileSystem } from '../../infrastructure/storage/file-system.interface.js';
7
7
  import type { Changeset } from '../../infrastructure/changeset/index.js';
8
- import { type ChangeSignatureOptions, type ChangeSignatureResult } from './types.js';
8
+ import type { ChangeSignatureOptions, ChangeSignatureResult } from './types.js';
9
9
  /**
10
10
  * Change Signature Service
11
11
  */
@@ -14,6 +14,9 @@ export declare class ChangeSignatureService {
14
14
  private readonly fileSystem;
15
15
  private readonly signatureParser;
16
16
  private readonly symbolFinder;
17
+ private readonly validator;
18
+ private readonly transformer;
19
+ private readonly callSiteUpdater;
17
20
  constructor(parserRegistry: ParserRegistry, fileSystem: IFileSystem);
18
21
  /**
19
22
  * 執行 Change Signature
@@ -27,50 +30,10 @@ export declare class ChangeSignatureService {
27
30
  * @returns Changeset 物件
28
31
  */
29
32
  generateChangeset(options: ChangeSignatureOptions): Promise<Changeset>;
30
- /**
31
- * 驗證變更
32
- */
33
- private validateChanges;
34
- /**
35
- * 套用變更到簽名
36
- */
37
- private applyChangesToSignature;
38
33
  /**
39
34
  * 生成定義更新
40
35
  */
41
36
  private generateDefinitionUpdate;
42
- /**
43
- * 生成呼叫點更新
44
- * 效能優化:按檔案分組後批次讀取,避免重複讀取同一檔案
45
- * 檔案讀取次數從 O(N) 降到 O(M),N = callSites 數量,M = 不重複檔案數
46
- * 支援多行呼叫點:正確處理跨多行的函式呼叫
47
- */
48
- private generateCallSiteUpdates;
49
- /**
50
- * 提取多行程式碼
51
- */
52
- private extractMultilineCode;
53
- /**
54
- * 檢測呼叫風格
55
- */
56
- private detectCallStyle;
57
- /**
58
- * 根據風格格式化參數
59
- */
60
- private formatArgsWithStyle;
61
- /**
62
- * 取得結束行的尾隨內容(右括號之後的部分)
63
- */
64
- private getTrailingContent;
65
- /**
66
- * 建立參數映射
67
- */
68
- private createParameterMapping;
69
- /**
70
- * 映射呼叫點參數
71
- * 處理省略的可選參數:當可選參數被省略時,重排後需要插入 undefined
72
- */
73
- private mapCallSiteArguments;
74
37
  /**
75
38
  * 執行變更
76
39
  */
@@ -83,20 +46,6 @@ export declare class ChangeSignatureService {
83
46
  * 找到匹配的括號
84
47
  */
85
48
  private findMatchingParen;
86
- /**
87
- * 解析參數名稱
88
- */
89
- private resolveParameterName;
90
- /**
91
- * 解析參數索引
92
- */
93
- private resolveParameterIndex;
94
- /**
95
- * 驗證可選參數順序
96
- * TypeScript 規則:可選參數必須在所有必選參數之後
97
- * 例外:有預設值的參數視為可選,rest 參數必須在最後
98
- */
99
- private validateOptionalParameterOrder;
100
49
  /**
101
50
  * 取得專案檔案
102
51
  */
@@ -1 +1 @@
1
- {"version":3,"file":"change-signature-service.d.ts","sourceRoot":"","sources":["../../../src/core/change-signature/change-signature-service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kDAAkD,CAAC;AACpF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAGpE,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAc3B,MAAM,YAAY,CAAC;AAGpB;;GAEG;AACH,qBAAa,sBAAsB;IAK/B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAL7B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;gBAGzB,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,WAAW;IAM1C;;OAEG;IACG,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAuEtF;;;;;;OAMG;IACG,iBAAiB,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,SAAS,CAAC;IA4E5E;;OAEG;IACH,OAAO,CAAC,eAAe;IA4FvB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA8E/B;;OAEG;YACW,wBAAwB;IAkCtC;;;;;OAKG;YACW,uBAAuB;IAkGrC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAgB5B;;OAEG;IACH,OAAO,CAAC,eAAe;IAuBvB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAc3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAM1B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA4D9B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAsF5B;;OAEG;YACW,YAAY;IA6C1B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA6B/B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAYzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAO5B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAO7B;;;;OAIG;IACH,OAAO,CAAC,8BAA8B;IAuCtC;;OAEG;YACW,eAAe;IAM7B;;OAEG;YACW,YAAY;IAmB1B;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;YACW,QAAQ;IAStB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAyB1B;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,WAAW,GACtB,sBAAsB,CAExB"}
1
+ {"version":3,"file":"change-signature-service.d.ts","sourceRoot":"","sources":["../../../src/core/change-signature/change-signature-service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kDAAkD,CAAC;AACpF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAMpE,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EAGtB,MAAM,YAAY,CAAC;AAIpB;;GAEG;AACH,qBAAa,sBAAsB;IAQ/B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAR7B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuB;IACnD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;gBAG/B,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,WAAW;IAS1C;;OAEG;IACG,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAuEtF;;;;;;OAMG;IACG,iBAAiB,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,SAAS,CAAC;IA4E5E;;OAEG;YACW,wBAAwB;IAkCtC;;OAEG;YACW,YAAY;IA6C1B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA6B/B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAYzB;;OAEG;YACW,eAAe;IAM7B;;OAEG;YACW,YAAY;IAmB1B;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;YACW,QAAQ;IAStB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAyB1B;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,WAAW,GACtB,sBAAsB,CAExB"}