mcp-code-context 2.6.0 → 3.0.6

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 (128) hide show
  1. package/CHANGELOG.md +92 -260
  2. package/README.md +304 -298
  3. package/dist/src/core/engine.d.ts +21 -0
  4. package/dist/src/core/engine.js +68 -0
  5. package/dist/src/core/engine.js.map +1 -0
  6. package/dist/src/core/validator.d.ts +15 -0
  7. package/dist/src/core/validator.js +44 -0
  8. package/dist/src/core/validator.js.map +1 -0
  9. package/dist/src/index.d.ts +7 -11
  10. package/dist/src/index.js +182 -397
  11. package/dist/src/index.js.map +1 -1
  12. package/dist/src/operations/write.d.ts +51 -0
  13. package/dist/src/operations/write.js +169 -0
  14. package/dist/src/operations/write.js.map +1 -0
  15. package/dist/src/parsers/base.d.ts +28 -0
  16. package/dist/src/parsers/base.js +27 -0
  17. package/dist/src/parsers/base.js.map +1 -0
  18. package/dist/src/parsers/dartTreeSitter.d.ts +13 -0
  19. package/dist/src/parsers/dartTreeSitter.js +91 -0
  20. package/dist/src/parsers/dartTreeSitter.js.map +1 -0
  21. package/dist/src/parsers/php.d.ts +12 -0
  22. package/dist/src/parsers/php.js +86 -0
  23. package/dist/src/parsers/php.js.map +1 -0
  24. package/dist/src/parsers/python.d.ts +12 -0
  25. package/dist/src/parsers/python.js +86 -0
  26. package/dist/src/parsers/python.js.map +1 -0
  27. package/dist/src/parsers/registry.d.ts +15 -0
  28. package/dist/src/parsers/registry.js +70 -0
  29. package/dist/src/parsers/registry.js.map +1 -0
  30. package/dist/src/parsers/typescript.d.ts +13 -0
  31. package/dist/src/parsers/typescript.js +98 -0
  32. package/dist/src/parsers/typescript.js.map +1 -0
  33. package/llms.txt +246 -236
  34. package/mcp-code-context-3.0.2.tgz +0 -0
  35. package/package.json +59 -57
  36. package/tsconfig.tests.json +27 -0
  37. package/.io/RULES.md +0 -12
  38. package/CONTRIBUTING.md +0 -243
  39. package/TROUBLESHOOTING.md +0 -38
  40. package/dist/src/ast/dartCompressor.d.ts +0 -27
  41. package/dist/src/ast/dartCompressor.js +0 -859
  42. package/dist/src/ast/dartCompressor.js.map +0 -1
  43. package/dist/src/ast/phpCompressor.d.ts +0 -24
  44. package/dist/src/ast/phpCompressor.js +0 -634
  45. package/dist/src/ast/phpCompressor.js.map +0 -1
  46. package/dist/src/ast/semanticCompressor.d.ts +0 -22
  47. package/dist/src/ast/semanticCompressor.js +0 -677
  48. package/dist/src/ast/semanticCompressor.js.map +0 -1
  49. package/dist/src/ast/writers/dartWriter.d.ts +0 -37
  50. package/dist/src/ast/writers/dartWriter.js +0 -544
  51. package/dist/src/ast/writers/dartWriter.js.map +0 -1
  52. package/dist/src/ast/writers/phpWriter.d.ts +0 -37
  53. package/dist/src/ast/writers/phpWriter.js +0 -411
  54. package/dist/src/ast/writers/phpWriter.js.map +0 -1
  55. package/dist/src/ast/writers/pyWriter.d.ts +0 -37
  56. package/dist/src/ast/writers/pyWriter.js +0 -355
  57. package/dist/src/ast/writers/pyWriter.js.map +0 -1
  58. package/dist/src/ast/writers/safeRename.d.ts +0 -14
  59. package/dist/src/ast/writers/safeRename.js +0 -258
  60. package/dist/src/ast/writers/safeRename.js.map +0 -1
  61. package/dist/src/ast/writers/symbolWriter.d.ts +0 -64
  62. package/dist/src/ast/writers/symbolWriter.js +0 -174
  63. package/dist/src/ast/writers/symbolWriter.js.map +0 -1
  64. package/dist/src/ast/writers/tsWriter.d.ts +0 -38
  65. package/dist/src/ast/writers/tsWriter.js +0 -344
  66. package/dist/src/ast/writers/tsWriter.js.map +0 -1
  67. package/dist/src/cache/astCache.d.ts +0 -39
  68. package/dist/src/cache/astCache.js +0 -169
  69. package/dist/src/cache/astCache.js.map +0 -1
  70. package/dist/src/handlers/readHandlers.d.ts +0 -70
  71. package/dist/src/handlers/readHandlers.js +0 -455
  72. package/dist/src/handlers/readHandlers.js.map +0 -1
  73. package/dist/src/handlers/utilHandlers.d.ts +0 -31
  74. package/dist/src/handlers/utilHandlers.js +0 -69
  75. package/dist/src/handlers/utilHandlers.js.map +0 -1
  76. package/dist/src/handlers/writeHandlers.d.ts +0 -57
  77. package/dist/src/handlers/writeHandlers.js +0 -499
  78. package/dist/src/handlers/writeHandlers.js.map +0 -1
  79. package/dist/src/tools/readFileLines.d.ts +0 -26
  80. package/dist/src/tools/readFileLines.js +0 -77
  81. package/dist/src/tools/readFileLines.js.map +0 -1
  82. package/dist/src/tools/searchCodePattern.d.ts +0 -37
  83. package/dist/src/tools/searchCodePattern.js +0 -144
  84. package/dist/src/tools/searchCodePattern.js.map +0 -1
  85. package/dist/src/utils/arrayUtils.d.ts +0 -12
  86. package/dist/src/utils/arrayUtils.js +0 -27
  87. package/dist/src/utils/arrayUtils.js.map +0 -1
  88. package/dist/src/utils/backupManager.d.ts +0 -31
  89. package/dist/src/utils/backupManager.js +0 -124
  90. package/dist/src/utils/backupManager.js.map +0 -1
  91. package/dist/src/utils/confirmationCache.d.ts +0 -16
  92. package/dist/src/utils/confirmationCache.js +0 -40
  93. package/dist/src/utils/confirmationCache.js.map +0 -1
  94. package/dist/src/utils/constants.d.ts +0 -46
  95. package/dist/src/utils/constants.js +0 -112
  96. package/dist/src/utils/constants.js.map +0 -1
  97. package/dist/src/utils/dependencyChecker.d.ts +0 -1
  98. package/dist/src/utils/dependencyChecker.js +0 -55
  99. package/dist/src/utils/dependencyChecker.js.map +0 -1
  100. package/dist/src/utils/diffEngine.d.ts +0 -21
  101. package/dist/src/utils/diffEngine.js +0 -163
  102. package/dist/src/utils/diffEngine.js.map +0 -1
  103. package/dist/src/utils/fuzzyMatch.d.ts +0 -8
  104. package/dist/src/utils/fuzzyMatch.js +0 -70
  105. package/dist/src/utils/fuzzyMatch.js.map +0 -1
  106. package/dist/src/utils/ignoreManager.d.ts +0 -29
  107. package/dist/src/utils/ignoreManager.js +0 -144
  108. package/dist/src/utils/ignoreManager.js.map +0 -1
  109. package/dist/src/utils/normalization.d.ts +0 -49
  110. package/dist/src/utils/normalization.js +0 -173
  111. package/dist/src/utils/normalization.js.map +0 -1
  112. package/dist/src/utils/projectRoot.d.ts +0 -17
  113. package/dist/src/utils/projectRoot.js +0 -42
  114. package/dist/src/utils/projectRoot.js.map +0 -1
  115. package/dist/src/utils/secureValidation.d.ts +0 -15
  116. package/dist/src/utils/secureValidation.js +0 -41
  117. package/dist/src/utils/secureValidation.js.map +0 -1
  118. package/dist/src/utils/syntaxValidator.d.ts +0 -15
  119. package/dist/src/utils/syntaxValidator.js +0 -218
  120. package/dist/src/utils/syntaxValidator.js.map +0 -1
  121. package/dist/src/utils/transactionManager.d.ts +0 -46
  122. package/dist/src/utils/transactionManager.js +0 -123
  123. package/dist/src/utils/transactionManager.js.map +0 -1
  124. package/dist/src/utils/validation.d.ts +0 -87
  125. package/dist/src/utils/validation.js +0 -231
  126. package/dist/src/utils/validation.js.map +0 -1
  127. package/docs/ARCHITECTURE.md +0 -300
  128. package/docs/architecture/ADR-001-modular-handlers.md +0 -119
@@ -1,355 +0,0 @@
1
- /**
2
- * pyWriter.ts — Python Surgical Writer
3
- *
4
- * Uses indentation-based block detection to locate symbol boundaries
5
- * in Python files. Python's significant whitespace makes this different
6
- * from brace-delimited languages — we detect block ends by watching
7
- * for dedentation back to the original level.
8
- *
9
- * Supports: .py, .pyi
10
- */
11
- // ─── Replace Symbol ─────────────────────────────────────────────────
12
- /**
13
- * Replace the full text of a named symbol in a Python file.
14
- * The newContent should include the def/class signature and body.
15
- * When className is provided, scopes the search to within that class only.
16
- */
17
- export function replacePySymbol(content, symbolName, newContent, className) {
18
- const lines = content.split("\n");
19
- const range = findSymbolRange(lines, symbolName, className);
20
- if (!range) {
21
- return {
22
- success: false,
23
- newContent: content,
24
- symbolsAffected: [],
25
- error: className
26
- ? `Symbol "${symbolName}" not found in class "${className}" in Python file`
27
- : `Symbol "${symbolName}" not found in Python file`,
28
- };
29
- }
30
- const { start, end } = range;
31
- // Detect indentation of original
32
- const originalIndent = getIndent(lines[start]);
33
- const reindented = reindentPython(newContent.trim(), originalIndent);
34
- // Splice
35
- const before = lines.slice(0, start);
36
- const after = lines.slice(end + 1);
37
- const result = [...before, reindented, ...after].join("\n");
38
- return {
39
- success: true,
40
- newContent: result,
41
- symbolsAffected: [symbolName],
42
- };
43
- }
44
- // ─── Insert Code ────────────────────────────────────────────────────
45
- /**
46
- * Insert new code at a precise location relative to an anchor symbol.
47
- * When className is provided, scopes the anchor search to within that class only.
48
- */
49
- export function insertPyCode(content, code, anchorSymbol, position, className) {
50
- const lines = content.split("\n");
51
- if (!anchorSymbol) {
52
- // No anchor — append at end of file
53
- lines.push("", "", code.trim(), "");
54
- return {
55
- success: true,
56
- newContent: lines.join("\n"),
57
- symbolsAffected: [],
58
- };
59
- }
60
- const range = findSymbolRange(lines, anchorSymbol, className);
61
- if (!range) {
62
- return {
63
- success: false,
64
- newContent: content,
65
- symbolsAffected: [],
66
- error: className
67
- ? `Anchor symbol "${anchorSymbol}" not found in class "${className}"`
68
- : `Anchor symbol "${anchorSymbol}" not found`,
69
- };
70
- }
71
- const { start, end } = range;
72
- const indent = getIndent(lines[start]);
73
- switch (position) {
74
- case "before": {
75
- const reindented = reindentPython(code.trim(), indent);
76
- // Add proper spacing (PEP 8: two blank lines before top-level, one inside class)
77
- const spacing = indent === "" ? "\n\n" : "\n";
78
- lines.splice(start, 0, reindented + spacing);
79
- break;
80
- }
81
- case "after": {
82
- const reindented = reindentPython(code.trim(), indent);
83
- const spacing = indent === "" ? "\n\n" : "\n";
84
- lines.splice(end + 1, 0, spacing + reindented);
85
- break;
86
- }
87
- case "inside_start": {
88
- // Find the colon line (class Foo:) and insert after it
89
- const colonLine = findColonLine(lines, start);
90
- if (colonLine === -1) {
91
- return {
92
- success: false,
93
- newContent: content,
94
- symbolsAffected: [],
95
- error: `Cannot find class body start for "${anchorSymbol}"`,
96
- };
97
- }
98
- // Check if there's a docstring, insert after it
99
- const insertAt = skipDocstring(lines, colonLine + 1);
100
- const innerIndent = indent + " "; // Python convention: 4-space indent
101
- const innerCode = reindentPython(code.trim(), innerIndent);
102
- lines.splice(insertAt, 0, innerCode, "");
103
- break;
104
- }
105
- case "inside_end": {
106
- const innerIndent = indent + " ";
107
- const innerCode = reindentPython(code.trim(), innerIndent);
108
- lines.splice(end + 1, 0, "", innerCode);
109
- break;
110
- }
111
- }
112
- return {
113
- success: true,
114
- newContent: lines.join("\n"),
115
- symbolsAffected: [anchorSymbol],
116
- };
117
- }
118
- // ─── Rename Symbol ──────────────────────────────────────────────────
119
- /**
120
- * Rename all occurrences of a symbol within a Python file.
121
- */
122
- export function renamePySymbol(content, oldName, newName) {
123
- const lines = content.split("\n");
124
- const range = findSymbolRange(lines, oldName);
125
- if (!range) {
126
- return {
127
- success: false,
128
- newContent: content,
129
- symbolsAffected: [],
130
- error: `Symbol "${oldName}" not found for renaming`,
131
- };
132
- }
133
- // Whole-word replacement
134
- const escaped = oldName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
135
- const regex = new RegExp(`\\b${escaped}\\b`, "g");
136
- const result = content.replace(regex, newName);
137
- return {
138
- success: true,
139
- newContent: result,
140
- symbolsAffected: [oldName],
141
- };
142
- }
143
- // ─── Remove Symbol ──────────────────────────────────────────────────
144
- /**
145
- * Remove a named symbol from a Python file.
146
- * When className is provided, scopes the search to within that class only.
147
- */
148
- export function removePySymbol(content, symbolName, className) {
149
- const lines = content.split("\n");
150
- const range = findSymbolRange(lines, symbolName, className);
151
- if (!range) {
152
- return {
153
- success: false,
154
- newContent: content,
155
- symbolsAffected: [],
156
- error: className
157
- ? `Symbol "${symbolName}" not found in class "${className}" for removal`
158
- : `Symbol "${symbolName}" not found for removal`,
159
- };
160
- }
161
- // Also remove leading decorators
162
- let actualStart = range.start;
163
- while (actualStart > 0 && lines[actualStart - 1].trim().startsWith("@")) {
164
- actualStart--;
165
- }
166
- lines.splice(actualStart, range.end - actualStart + 1);
167
- let result = lines.join("\n");
168
- result = result.replace(/\n{3,}/g, "\n\n");
169
- return {
170
- success: true,
171
- newContent: result,
172
- symbolsAffected: [symbolName],
173
- };
174
- }
175
- /**
176
- * Find the start and end line indices of a named symbol in a Python file.
177
- * Uses indentation to detect block boundaries (Python's significant whitespace).
178
- * When className is provided, scopes the search to within that class only.
179
- */
180
- function findSymbolRange(lines, symbolName, className) {
181
- const escaped = symbolName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
182
- // If className is provided, find the class first, then search within it
183
- if (className) {
184
- const escapedClass = className.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
185
- for (let i = 0; i < lines.length; i++) {
186
- const trimmed = lines[i].trim();
187
- if (!new RegExp(`^class\\s+${escapedClass}[\\s(:]`).test(trimmed))
188
- continue;
189
- // Found the class — search for the method within it
190
- const classIndent = measureIndent(lines[i]);
191
- let j = i + 1;
192
- while (j < lines.length) {
193
- const bodyLine = lines[j];
194
- if (bodyLine.trim() === "") {
195
- j++;
196
- continue;
197
- }
198
- if (measureIndent(bodyLine) <= classIndent && bodyLine.trim() !== "")
199
- break;
200
- const bodyTrimmed = bodyLine.trim();
201
- const isFunc = new RegExp(`^(?:async\\s+)?def\\s+${escaped}\\s*\\(`).test(bodyTrimmed);
202
- if (isFunc) {
203
- const startLine = j;
204
- const baseIndent = measureIndent(bodyLine);
205
- // Check for decorators above
206
- let decoratorStart = startLine;
207
- while (decoratorStart > 0 &&
208
- lines[decoratorStart - 1].trim().startsWith("@")) {
209
- decoratorStart--;
210
- }
211
- // Find end of block
212
- let endLine = startLine;
213
- let k = startLine + 1;
214
- while (k < lines.length) {
215
- const innerLine = lines[k];
216
- if (innerLine.trim() === "") {
217
- k++;
218
- continue;
219
- }
220
- if (measureIndent(innerLine) > baseIndent) {
221
- endLine = k;
222
- k++;
223
- }
224
- else
225
- break;
226
- }
227
- while (endLine > startLine && lines[endLine].trim() === "") {
228
- endLine--;
229
- }
230
- return { start: decoratorStart, end: endLine };
231
- }
232
- j++;
233
- }
234
- return null; // Method not found within class
235
- }
236
- return null; // Class not found
237
- }
238
- // Original behavior when no className is provided
239
- for (let i = 0; i < lines.length; i++) {
240
- const line = lines[i];
241
- const trimmed = line.trim();
242
- const isClass = new RegExp(`^class\\s+${escaped}[\\s(:]`).test(trimmed);
243
- const isFunc = new RegExp(`^(?:async\\s+)?def\\s+${escaped}\\s*\\(`).test(trimmed);
244
- if (!isClass && !isFunc)
245
- continue;
246
- const startLine = i;
247
- const baseIndent = measureIndent(line);
248
- // Also check for decorators above
249
- let decoratorStart = startLine;
250
- while (decoratorStart > 0 &&
251
- lines[decoratorStart - 1].trim().startsWith("@")) {
252
- decoratorStart--;
253
- }
254
- // Find the end of the block
255
- let endLine = startLine;
256
- let j = startLine + 1;
257
- while (j < lines.length) {
258
- const bodyLine = lines[j];
259
- if (bodyLine.trim() === "") {
260
- j++;
261
- continue;
262
- }
263
- if (measureIndent(bodyLine) > baseIndent) {
264
- endLine = j;
265
- j++;
266
- }
267
- else {
268
- break;
269
- }
270
- }
271
- // Trim trailing blank lines from the block
272
- while (endLine > startLine && lines[endLine].trim() === "") {
273
- endLine--;
274
- }
275
- return { start: decoratorStart, end: endLine };
276
- }
277
- return null;
278
- }
279
- // ─── Utility Functions ──────────────────────────────────────────────
280
- function measureIndent(line) {
281
- const match = line.match(/^(\s*)/);
282
- return match ? match[1].length : 0;
283
- }
284
- function getIndent(line) {
285
- const match = line.match(/^(\s*)/);
286
- return match ? match[1] : "";
287
- }
288
- /**
289
- * Re-indent a block of Python code to match a target indentation level.
290
- * Preserves relative indentation within the block.
291
- */
292
- function reindentPython(code, targetIndent) {
293
- const lines = code.split("\n");
294
- if (lines.length === 0)
295
- return code;
296
- // Find minimum non-empty indentation
297
- let minIndent = Infinity;
298
- for (const line of lines) {
299
- if (line.trim() === "")
300
- continue;
301
- const indent = measureIndent(line);
302
- if (indent < minIndent)
303
- minIndent = indent;
304
- }
305
- if (minIndent === Infinity)
306
- minIndent = 0;
307
- return lines
308
- .map((line) => {
309
- if (line.trim() === "")
310
- return "";
311
- return targetIndent + line.slice(minIndent);
312
- })
313
- .join("\n");
314
- }
315
- /**
316
- * Find the line containing the colon that starts a class/function body.
317
- */
318
- function findColonLine(lines, startIdx) {
319
- for (let i = startIdx; i < lines.length; i++) {
320
- if (lines[i].includes(":"))
321
- return i;
322
- }
323
- return -1;
324
- }
325
- /**
326
- * Skip past a docstring (if present) to find the first line of actual code.
327
- */
328
- function skipDocstring(lines, startIdx) {
329
- let i = startIdx;
330
- // Skip blank lines
331
- while (i < lines.length && lines[i].trim() === "")
332
- i++;
333
- if (i >= lines.length)
334
- return startIdx;
335
- const trimmed = lines[i].trim();
336
- // Look for triple-quoted docstring
337
- if (trimmed.startsWith('"""') ||
338
- trimmed.startsWith("'''")) {
339
- const quote = trimmed.slice(0, 3);
340
- // Single-line docstring
341
- if (trimmed.endsWith(quote) && trimmed.length > 3) {
342
- return i + 1;
343
- }
344
- // Multi-line docstring
345
- i++;
346
- while (i < lines.length) {
347
- if (lines[i].trim().endsWith(quote)) {
348
- return i + 1;
349
- }
350
- i++;
351
- }
352
- }
353
- return startIdx;
354
- }
355
- //# sourceMappingURL=pyWriter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pyWriter.js","sourceRoot":"","sources":["../../../../src/ast/writers/pyWriter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAaH,uEAAuE;AAEvE;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAe,EACf,UAAkB,EAClB,UAAkB,EAClB,SAAkB;IAElB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAE5D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,OAAO;YACnB,eAAe,EAAE,EAAE;YACnB,KAAK,EAAE,SAAS;gBACd,CAAC,CAAC,WAAW,UAAU,yBAAyB,SAAS,kBAAkB;gBAC3E,CAAC,CAAC,WAAW,UAAU,4BAA4B;SACtD,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;IAE7B,iCAAiC;IACjC,MAAM,cAAc,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,cAAc,CAAC,CAAC;IAErE,SAAS;IACT,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE5D,OAAO;QACL,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,MAAM;QAClB,eAAe,EAAE,CAAC,UAAU,CAAC;KAC9B,CAAC;AACJ,CAAC;AAED,uEAAuE;AAEvE;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAe,EACf,IAAY,EACZ,YAA2B,EAC3B,QAAwB,EACxB,SAAkB;IAElB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,oCAAoC;QACpC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACpC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5B,eAAe,EAAE,EAAE;SACpB,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;IAC9D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,OAAO;YACnB,eAAe,EAAE,EAAE;YACnB,KAAK,EAAE,SAAS;gBACd,CAAC,CAAC,kBAAkB,YAAY,yBAAyB,SAAS,GAAG;gBACrE,CAAC,CAAC,kBAAkB,YAAY,aAAa;SAChD,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;IAC7B,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAEvC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;YACvD,iFAAiF;YACjF,MAAM,OAAO,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;YAC9C,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC;YAC7C,MAAM;QACR,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;YACvD,MAAM,OAAO,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;YAC9C,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC,CAAC;YAC/C,MAAM;QACR,CAAC;QACD,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,uDAAuD;YACvD,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC9C,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;gBACrB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,UAAU,EAAE,OAAO;oBACnB,eAAe,EAAE,EAAE;oBACnB,KAAK,EAAE,qCAAqC,YAAY,GAAG;iBAC5D,CAAC;YACJ,CAAC;YACD,gDAAgD;YAChD,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;YACrD,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC,oCAAoC;YACzE,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,WAAW,CAAC,CAAC;YAC3D,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;YACzC,MAAM;QACR,CAAC;QACD,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;YACpC,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,WAAW,CAAC,CAAC;YAC3D,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;YACxC,MAAM;QACR,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,eAAe,EAAE,CAAC,YAAY,CAAC;KAChC,CAAC;AACJ,CAAC;AAED,uEAAuE;AAEvE;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,OAAe,EACf,OAAe;IAEf,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAE9C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,OAAO;YACnB,eAAe,EAAE,EAAE;YACnB,KAAK,EAAE,WAAW,OAAO,0BAA0B;SACpD,CAAC;IACJ,CAAC;IAED,yBAAyB;IACzB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,OAAO,KAAK,EAAE,GAAG,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAE/C,OAAO;QACL,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,MAAM;QAClB,eAAe,EAAE,CAAC,OAAO,CAAC;KAC3B,CAAC;AACJ,CAAC;AAED,uEAAuE;AAEvE;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,UAAkB,EAClB,SAAkB;IAElB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAE5D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,OAAO;YACnB,eAAe,EAAE,EAAE;YACnB,KAAK,EAAE,SAAS;gBACd,CAAC,CAAC,WAAW,UAAU,yBAAyB,SAAS,eAAe;gBACxE,CAAC,CAAC,WAAW,UAAU,yBAAyB;SACnD,CAAC;IACJ,CAAC;IAED,iCAAiC;IACjC,IAAI,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC;IAC9B,OAAO,WAAW,GAAG,CAAC,IAAI,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxE,WAAW,EAAE,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC;IAEvD,IAAI,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAE3C,OAAO;QACL,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,MAAM;QAClB,eAAe,EAAE,CAAC,UAAU,CAAC;KAC9B,CAAC;AACJ,CAAC;AASD;;;;GAIG;AACH,SAAS,eAAe,CACtB,KAAe,EACf,UAAkB,EAClB,SAAkB;IAElB,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IAElE,wEAAwE;IACxE,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;QAEtE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,MAAM,CAAC,aAAa,YAAY,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,SAAS;YAE5E,oDAAoD;YACpD,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAEd,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;gBACxB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC1B,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;oBAAC,CAAC,EAAE,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBAC9C,IAAI,aAAa,CAAC,QAAQ,CAAC,IAAI,WAAW,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE;oBAAE,MAAM;gBAE5E,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACpC,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,yBAAyB,OAAO,SAAS,CAC1C,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAEpB,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,SAAS,GAAG,CAAC,CAAC;oBACpB,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;oBAE3C,6BAA6B;oBAC7B,IAAI,cAAc,GAAG,SAAS,CAAC;oBAC/B,OACE,cAAc,GAAG,CAAC;wBAClB,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAChD,CAAC;wBACD,cAAc,EAAE,CAAC;oBACnB,CAAC;oBAED,oBAAoB;oBACpB,IAAI,OAAO,GAAG,SAAS,CAAC;oBACxB,IAAI,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC;oBACtB,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;wBACxB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;wBAC3B,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;4BAAC,CAAC,EAAE,CAAC;4BAAC,SAAS;wBAAC,CAAC;wBAC/C,IAAI,aAAa,CAAC,SAAS,CAAC,GAAG,UAAU,EAAE,CAAC;4BAAC,OAAO,GAAG,CAAC,CAAC;4BAAC,CAAC,EAAE,CAAC;wBAAC,CAAC;;4BAC3D,MAAM;oBACb,CAAC;oBAED,OAAO,OAAO,GAAG,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;wBAC3D,OAAO,EAAE,CAAC;oBACZ,CAAC;oBAED,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;gBACjD,CAAC;gBACD,CAAC,EAAE,CAAC;YACN,CAAC;YACD,OAAO,IAAI,CAAC,CAAC,gCAAgC;QAC/C,CAAC;QACD,OAAO,IAAI,CAAC,CAAC,kBAAkB;IACjC,CAAC;IAED,kDAAkD;IAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,aAAa,OAAO,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxE,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,yBAAyB,OAAO,SAAS,CAC1C,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEhB,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM;YAAE,SAAS;QAElC,MAAM,SAAS,GAAG,CAAC,CAAC;QACpB,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAEvC,kCAAkC;QAClC,IAAI,cAAc,GAAG,SAAS,CAAC;QAC/B,OACE,cAAc,GAAG,CAAC;YAClB,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAChD,CAAC;YACD,cAAc,EAAE,CAAC;QACnB,CAAC;QAED,4BAA4B;QAC5B,IAAI,OAAO,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC;QAEtB,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC3B,CAAC,EAAE,CAAC;gBACJ,SAAS;YACX,CAAC;YACD,IAAI,aAAa,CAAC,QAAQ,CAAC,GAAG,UAAU,EAAE,CAAC;gBACzC,OAAO,GAAG,CAAC,CAAC;gBACZ,CAAC,EAAE,CAAC;YACN,CAAC;iBAAM,CAAC;gBACN,MAAM;YACR,CAAC;QACH,CAAC;QAED,2CAA2C;QAC3C,OAAO,OAAO,GAAG,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC3D,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;IACjD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,uEAAuE;AAEvE,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACnC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACnC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,IAAY,EAAE,YAAoB;IACxD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpC,qCAAqC;IACrC,IAAI,SAAS,GAAG,QAAQ,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,SAAS;QACjC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,MAAM,GAAG,SAAS;YAAE,SAAS,GAAG,MAAM,CAAC;IAC7C,CAAC;IAED,IAAI,SAAS,KAAK,QAAQ;QAAE,SAAS,GAAG,CAAC,CAAC;IAE1C,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,EAAE,CAAC;QAClC,OAAO,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,KAAe,EAAE,QAAgB;IACtD,KAAK,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,KAAe,EAAE,QAAgB;IACtD,IAAI,CAAC,GAAG,QAAQ,CAAC;IAEjB,mBAAmB;IACnB,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,CAAC,EAAE,CAAC;IAEvD,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC;IAEvC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAEhC,mCAAmC;IACnC,IACE,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC;QACzB,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EACzB,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAElC,wBAAwB;QACxB,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,CAAC;QACf,CAAC;QAED,uBAAuB;QACvB,CAAC,EAAE,CAAC;QACJ,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACxB,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,CAAC;YACf,CAAC;YACD,CAAC,EAAE,CAAC;QACN,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -1,14 +0,0 @@
1
- /**
2
- * AST-Aware Safe Rename Module
3
- * Replaces dangerous regex-based renaming with language-specific AST/tokenizer approaches
4
- */
5
- export interface SafeRenameResult {
6
- success: boolean;
7
- newContent: string;
8
- symbolsAffected: string[];
9
- error?: string;
10
- }
11
- /**
12
- * Main entry point for safe renaming across all supported languages
13
- */
14
- export declare function safeRenameReferences(filePath: string, content: string, oldName: string, newName: string): SafeRenameResult;
@@ -1,258 +0,0 @@
1
- /**
2
- * AST-Aware Safe Rename Module
3
- * Replaces dangerous regex-based renaming with language-specific AST/tokenizer approaches
4
- */
5
- import * as ts from "typescript";
6
- import * as path from "path";
7
- import { createRequire } from "module";
8
- /**
9
- * Main entry point for safe renaming across all supported languages
10
- */
11
- export function safeRenameReferences(filePath, content, oldName, newName) {
12
- const ext = path.extname(filePath).toLowerCase();
13
- try {
14
- switch (ext) {
15
- case ".ts":
16
- case ".tsx":
17
- case ".js":
18
- case ".jsx":
19
- case ".mjs":
20
- case ".cjs":
21
- return renameTypeScript(content, oldName, newName);
22
- case ".php":
23
- return renamePHP(content, oldName, newName);
24
- case ".dart":
25
- return renameDart(content, oldName, newName);
26
- case ".py":
27
- return renamePython(content, oldName, newName);
28
- default:
29
- // Fallback to conservative token-based approach
30
- return renameGeneric(content, oldName, newName);
31
- }
32
- }
33
- catch (error) {
34
- return {
35
- success: false,
36
- newContent: content,
37
- symbolsAffected: [],
38
- error: error instanceof Error ? error.message : String(error)
39
- };
40
- }
41
- }
42
- /**
43
- * TypeScript/JavaScript: Use TypeScript compiler API
44
- */
45
- function renameTypeScript(content, oldName, newName) {
46
- const sourceFile = ts.createSourceFile("temp.ts", content, ts.ScriptTarget.Latest, true);
47
- const replacements = [];
48
- function visit(node) {
49
- // Only rename identifiers that are actual references (not in strings/comments)
50
- if (ts.isIdentifier(node) && node.text === oldName) {
51
- // Verify it's not part of a string literal or comment
52
- const parent = node.parent;
53
- if (!ts.isStringLiteral(parent) &&
54
- !ts.isNoSubstitutionTemplateLiteral(parent) &&
55
- !ts.isTemplateHead(parent) &&
56
- !ts.isTemplateMiddle(parent) &&
57
- !ts.isTemplateTail(parent)) {
58
- replacements.push({ start: node.getStart(), end: node.getEnd() });
59
- }
60
- }
61
- ts.forEachChild(node, visit);
62
- }
63
- visit(sourceFile);
64
- if (replacements.length === 0) {
65
- return { success: true, newContent: content, symbolsAffected: [] };
66
- }
67
- // Apply replacements in reverse order to maintain positions
68
- let result = content;
69
- for (let i = replacements.length - 1; i >= 0; i--) {
70
- const { start, end } = replacements[i];
71
- result = result.slice(0, start) + newName + result.slice(end);
72
- }
73
- return {
74
- success: true,
75
- newContent: result,
76
- symbolsAffected: [oldName]
77
- };
78
- }
79
- /**
80
- * PHP: Use php-parser AST
81
- */
82
- function renamePHP(content, oldName, newName) {
83
- try {
84
- const require = createRequire(import.meta.url);
85
- const phpParser = require("php-parser");
86
- const parser = new phpParser.Engine({
87
- parser: { extractDoc: true, php7: true, locations: true },
88
- ast: { withPositions: true }
89
- });
90
- const ast = parser.parseCode(content);
91
- const replacements = [];
92
- function traverse(node) {
93
- if (!node || typeof node !== "object")
94
- return;
95
- // Rename identifiers (variables, functions, classes)
96
- if (node.kind === "identifier" && node.name === oldName) {
97
- if (node.loc) {
98
- replacements.push({
99
- start: node.loc.start.offset,
100
- end: node.loc.end.offset
101
- });
102
- }
103
- }
104
- // Traverse children
105
- for (const key in node) {
106
- if (key === "loc" || key === "kind")
107
- continue;
108
- const child = node[key];
109
- if (Array.isArray(child)) {
110
- child.forEach(traverse);
111
- }
112
- else if (typeof child === "object") {
113
- traverse(child);
114
- }
115
- }
116
- }
117
- traverse(ast);
118
- if (replacements.length === 0) {
119
- return { success: true, newContent: content, symbolsAffected: [] };
120
- }
121
- // Apply replacements in reverse
122
- let result = content;
123
- for (let i = replacements.length - 1; i >= 0; i--) {
124
- const { start, end } = replacements[i];
125
- result = result.slice(0, start) + newName + result.slice(end);
126
- }
127
- return {
128
- success: true,
129
- newContent: result,
130
- symbolsAffected: [oldName]
131
- };
132
- }
133
- catch (error) {
134
- // Fallback to generic if PHP parsing fails
135
- return renameGeneric(content, oldName, newName);
136
- }
137
- }
138
- /**
139
- * Dart: Token-based approach (no full AST parser available)
140
- * Skips strings and comments
141
- *
142
- * LIMITATION: This is a best-effort approach. For production use,
143
- * consider using dart_style or analyzer package via subprocess.
144
- */
145
- function renameDart(content, oldName, newName) {
146
- // FALLBACK: Return unchanged to avoid corruption
147
- // Real implementation requires dart analyzer
148
- return {
149
- success: false,
150
- newContent: content,
151
- symbolsAffected: [],
152
- error: "Dart rename requires manual review. Use IDE refactoring tools."
153
- };
154
- }
155
- /**
156
- * Python: Token-based approach
157
- * Skips strings, comments, and respects indentation
158
- *
159
- * LIMITATION: This is a best-effort approach. For production use,
160
- * consider using libcst or rope library via subprocess.
161
- */
162
- function renamePython(content, oldName, newName) {
163
- // FALLBACK: Return unchanged to avoid corruption
164
- // Real implementation requires libcst or rope
165
- return {
166
- success: false,
167
- newContent: content,
168
- symbolsAffected: [],
169
- error: "Python rename requires manual review. Use IDE refactoring tools."
170
- };
171
- }
172
- /**
173
- * Generic fallback: Conservative token-based renaming
174
- */
175
- function renameGeneric(content, oldName, newName) {
176
- return renameTokenBased(content, oldName, newName, {
177
- singleLineComment: "//",
178
- multiLineCommentStart: "/*",
179
- multiLineCommentEnd: "*/",
180
- stringDelimiters: ['"', "'", "`"],
181
- identifierPattern: /[a-zA-Z_$][a-zA-Z0-9_$]*/g
182
- });
183
- }
184
- function renameTokenBased(content, oldName, newName, config) {
185
- const lines = content.split("\n");
186
- const result = [];
187
- let inMultiLineComment = false;
188
- let changed = false;
189
- for (let line of lines) {
190
- let processedLine = "";
191
- let i = 0;
192
- while (i < line.length) {
193
- // Check for multi-line comment start
194
- if (!inMultiLineComment && line.slice(i).startsWith(config.multiLineCommentStart)) {
195
- inMultiLineComment = true;
196
- processedLine += config.multiLineCommentStart;
197
- i += config.multiLineCommentStart.length;
198
- continue;
199
- }
200
- // Check for multi-line comment end
201
- if (inMultiLineComment && line.slice(i).startsWith(config.multiLineCommentEnd)) {
202
- inMultiLineComment = false;
203
- processedLine += config.multiLineCommentEnd;
204
- i += config.multiLineCommentEnd.length;
205
- continue;
206
- }
207
- // Skip if inside multi-line comment
208
- if (inMultiLineComment) {
209
- processedLine += line[i];
210
- i++;
211
- continue;
212
- }
213
- // Check for single-line comment
214
- if (line.slice(i).startsWith(config.singleLineComment)) {
215
- processedLine += line.slice(i);
216
- break;
217
- }
218
- // Check for string literals
219
- let inString = false;
220
- for (const delim of config.stringDelimiters) {
221
- if (line.slice(i).startsWith(delim)) {
222
- const endIndex = line.indexOf(delim, i + delim.length);
223
- if (endIndex !== -1) {
224
- processedLine += line.slice(i, endIndex + delim.length);
225
- i = endIndex + delim.length;
226
- inString = true;
227
- break;
228
- }
229
- }
230
- }
231
- if (inString)
232
- continue;
233
- // Check for identifier match
234
- const remaining = line.slice(i);
235
- const match = remaining.match(config.identifierPattern);
236
- if (match && match.index === 0 && match[0] === oldName) {
237
- // Verify word boundaries
238
- const before = i > 0 ? line[i - 1] : " ";
239
- const after = i + oldName.length < line.length ? line[i + oldName.length] : " ";
240
- if (!/[a-zA-Z0-9_$]/.test(before) && !/[a-zA-Z0-9_$]/.test(after)) {
241
- processedLine += newName;
242
- i += oldName.length;
243
- changed = true;
244
- continue;
245
- }
246
- }
247
- processedLine += line[i];
248
- i++;
249
- }
250
- result.push(processedLine);
251
- }
252
- return {
253
- success: true,
254
- newContent: result.join("\n"),
255
- symbolsAffected: changed ? [oldName] : []
256
- };
257
- }
258
- //# sourceMappingURL=safeRename.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"safeRename.js","sourceRoot":"","sources":["../../../../src/ast/writers/safeRename.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AASvC;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAgB,EAChB,OAAe,EACf,OAAe,EACf,OAAe;IAEf,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IAEjD,IAAI,CAAC;QACH,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,KAAK,CAAC;YACX,KAAK,MAAM,CAAC;YACZ,KAAK,KAAK,CAAC;YACX,KAAK,MAAM,CAAC;YACZ,KAAK,MAAM,CAAC;YACZ,KAAK,MAAM;gBACT,OAAO,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAErD,KAAK,MAAM;gBACT,OAAO,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAE9C,KAAK,OAAO;gBACV,OAAO,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAE/C,KAAK,KAAK;gBACR,OAAO,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAEjD;gBACE,gDAAgD;gBAChD,OAAO,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,OAAO;YACnB,eAAe,EAAE,EAAE;YACnB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CACvB,OAAe,EACf,OAAe,EACf,OAAe;IAEf,MAAM,UAAU,GAAG,EAAE,CAAC,gBAAgB,CACpC,SAAS,EACT,OAAO,EACP,EAAE,CAAC,YAAY,CAAC,MAAM,EACtB,IAAI,CACL,CAAC;IAEF,MAAM,YAAY,GAA0C,EAAE,CAAC;IAE/D,SAAS,KAAK,CAAC,IAAa;QAC1B,+EAA+E;QAC/E,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACnD,sDAAsD;YACtD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,IACE,CAAC,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC;gBAC3B,CAAC,EAAE,CAAC,+BAA+B,CAAC,MAAM,CAAC;gBAC3C,CAAC,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC;gBAC1B,CAAC,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC;gBAC5B,CAAC,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,EAC1B,CAAC;gBACD,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;QACD,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,CAAC;IAElB,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;IACrE,CAAC;IAED,4DAA4D;IAC5D,IAAI,MAAM,GAAG,OAAO,CAAC;IACrB,KAAK,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAClD,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChE,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,MAAM;QAClB,eAAe,EAAE,CAAC,OAAO,CAAC;KAC3B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAChB,OAAe,EACf,OAAe,EACf,OAAe;IAEf,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC;YAClC,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;YACzD,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE;SAC7B,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,YAAY,GAA0C,EAAE,CAAC;QAE/D,SAAS,QAAQ,CAAC,IAAS;YACzB,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,OAAO;YAE9C,qDAAqD;YACrD,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACxD,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;oBACb,YAAY,CAAC,IAAI,CAAC;wBAChB,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM;wBAC5B,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM;qBACzB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,oBAAoB;YACpB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM;oBAAE,SAAS;gBAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;gBACxB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzB,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAC1B,CAAC;qBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBACrC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;QACH,CAAC;QAED,QAAQ,CAAC,GAAG,CAAC,CAAC;QAEd,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;QACrE,CAAC;QAED,gCAAgC;QAChC,IAAI,MAAM,GAAG,OAAO,CAAC;QACrB,KAAK,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAClD,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChE,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,MAAM;YAClB,eAAe,EAAE,CAAC,OAAO,CAAC;SAC3B,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,2CAA2C;QAC3C,OAAO,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,UAAU,CACjB,OAAe,EACf,OAAe,EACf,OAAe;IAEf,iDAAiD;IACjD,6CAA6C;IAC7C,OAAO;QACL,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,OAAO;QACnB,eAAe,EAAE,EAAE;QACnB,KAAK,EAAE,gEAAgE;KACxE,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,YAAY,CACnB,OAAe,EACf,OAAe,EACf,OAAe;IAEf,iDAAiD;IACjD,8CAA8C;IAC9C,OAAO;QACL,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,OAAO;QACnB,eAAe,EAAE,EAAE;QACnB,KAAK,EAAE,kEAAkE;KAC1E,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CACpB,OAAe,EACf,OAAe,EACf,OAAe;IAEf,OAAO,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE;QACjD,iBAAiB,EAAE,IAAI;QACvB,qBAAqB,EAAE,IAAI;QAC3B,mBAAmB,EAAE,IAAI;QACzB,gBAAgB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;QACjC,iBAAiB,EAAE,2BAA2B;KAC/C,CAAC,CAAC;AACL,CAAC;AAaD,SAAS,gBAAgB,CACvB,OAAe,EACf,OAAe,EACf,OAAe,EACf,MAAmB;IAEnB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAC/B,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,aAAa,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,CAAC;QAEV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACvB,qCAAqC;YACrC,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,qBAAqB,CAAC,EAAE,CAAC;gBAClF,kBAAkB,GAAG,IAAI,CAAC;gBAC1B,aAAa,IAAI,MAAM,CAAC,qBAAqB,CAAC;gBAC9C,CAAC,IAAI,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC;gBACzC,SAAS;YACX,CAAC;YAED,mCAAmC;YACnC,IAAI,kBAAkB,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAC/E,kBAAkB,GAAG,KAAK,CAAC;gBAC3B,aAAa,IAAI,MAAM,CAAC,mBAAmB,CAAC;gBAC5C,CAAC,IAAI,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC;gBACvC,SAAS;YACX,CAAC;YAED,oCAAoC;YACpC,IAAI,kBAAkB,EAAE,CAAC;gBACvB,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;gBACzB,CAAC,EAAE,CAAC;gBACJ,SAAS;YACX,CAAC;YAED,gCAAgC;YAChC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACvD,aAAa,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC/B,MAAM;YACR,CAAC;YAED,4BAA4B;YAC5B,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBAC5C,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;oBACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;oBACvD,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;wBACpB,aAAa,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;wBACxD,CAAC,GAAG,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC;wBAC5B,QAAQ,GAAG,IAAI,CAAC;wBAChB,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,QAAQ;gBAAE,SAAS;YAEvB,6BAA6B;YAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;YAExD,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;gBACvD,yBAAyB;gBACzB,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;gBACzC,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;gBAEhF,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBAClE,aAAa,IAAI,OAAO,CAAC;oBACzB,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC;oBACpB,OAAO,GAAG,IAAI,CAAC;oBACf,SAAS;gBACX,CAAC;YACH,CAAC;YAED,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,CAAC,EAAE,CAAC;QACN,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QAC7B,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;KAC1C,CAAC;AACJ,CAAC"}