mcp-code-context 2.6.0 → 3.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +92 -260
- package/README.md +304 -298
- package/dist/src/core/engine.d.ts +21 -0
- package/dist/src/core/engine.js +68 -0
- package/dist/src/core/engine.js.map +1 -0
- package/dist/src/core/validator.d.ts +15 -0
- package/dist/src/core/validator.js +44 -0
- package/dist/src/core/validator.js.map +1 -0
- package/dist/src/index.d.ts +7 -11
- package/dist/src/index.js +182 -397
- package/dist/src/index.js.map +1 -1
- package/dist/src/operations/write.d.ts +51 -0
- package/dist/src/operations/write.js +169 -0
- package/dist/src/operations/write.js.map +1 -0
- package/dist/src/parsers/base.d.ts +28 -0
- package/dist/src/parsers/base.js +27 -0
- package/dist/src/parsers/base.js.map +1 -0
- package/dist/src/parsers/dartTreeSitter.d.ts +13 -0
- package/dist/src/parsers/dartTreeSitter.js +91 -0
- package/dist/src/parsers/dartTreeSitter.js.map +1 -0
- package/dist/src/parsers/php.d.ts +12 -0
- package/dist/src/parsers/php.js +86 -0
- package/dist/src/parsers/php.js.map +1 -0
- package/dist/src/parsers/python.d.ts +12 -0
- package/dist/src/parsers/python.js +86 -0
- package/dist/src/parsers/python.js.map +1 -0
- package/dist/src/parsers/registry.d.ts +15 -0
- package/dist/src/parsers/registry.js +70 -0
- package/dist/src/parsers/registry.js.map +1 -0
- package/dist/src/parsers/typescript.d.ts +13 -0
- package/dist/src/parsers/typescript.js +98 -0
- package/dist/src/parsers/typescript.js.map +1 -0
- package/llms.txt +246 -236
- package/mcp-code-context-3.0.2.tgz +0 -0
- package/package.json +59 -57
- package/tsconfig.tests.json +27 -0
- package/.io/RULES.md +0 -12
- package/CONTRIBUTING.md +0 -243
- package/TROUBLESHOOTING.md +0 -38
- package/dist/src/ast/dartCompressor.d.ts +0 -27
- package/dist/src/ast/dartCompressor.js +0 -859
- package/dist/src/ast/dartCompressor.js.map +0 -1
- package/dist/src/ast/phpCompressor.d.ts +0 -24
- package/dist/src/ast/phpCompressor.js +0 -634
- package/dist/src/ast/phpCompressor.js.map +0 -1
- package/dist/src/ast/semanticCompressor.d.ts +0 -22
- package/dist/src/ast/semanticCompressor.js +0 -677
- package/dist/src/ast/semanticCompressor.js.map +0 -1
- package/dist/src/ast/writers/dartWriter.d.ts +0 -37
- package/dist/src/ast/writers/dartWriter.js +0 -544
- package/dist/src/ast/writers/dartWriter.js.map +0 -1
- package/dist/src/ast/writers/phpWriter.d.ts +0 -37
- package/dist/src/ast/writers/phpWriter.js +0 -411
- package/dist/src/ast/writers/phpWriter.js.map +0 -1
- package/dist/src/ast/writers/pyWriter.d.ts +0 -37
- package/dist/src/ast/writers/pyWriter.js +0 -355
- package/dist/src/ast/writers/pyWriter.js.map +0 -1
- package/dist/src/ast/writers/safeRename.d.ts +0 -14
- package/dist/src/ast/writers/safeRename.js +0 -258
- package/dist/src/ast/writers/safeRename.js.map +0 -1
- package/dist/src/ast/writers/symbolWriter.d.ts +0 -64
- package/dist/src/ast/writers/symbolWriter.js +0 -174
- package/dist/src/ast/writers/symbolWriter.js.map +0 -1
- package/dist/src/ast/writers/tsWriter.d.ts +0 -38
- package/dist/src/ast/writers/tsWriter.js +0 -344
- package/dist/src/ast/writers/tsWriter.js.map +0 -1
- package/dist/src/cache/astCache.d.ts +0 -39
- package/dist/src/cache/astCache.js +0 -169
- package/dist/src/cache/astCache.js.map +0 -1
- package/dist/src/handlers/readHandlers.d.ts +0 -70
- package/dist/src/handlers/readHandlers.js +0 -455
- package/dist/src/handlers/readHandlers.js.map +0 -1
- package/dist/src/handlers/utilHandlers.d.ts +0 -31
- package/dist/src/handlers/utilHandlers.js +0 -69
- package/dist/src/handlers/utilHandlers.js.map +0 -1
- package/dist/src/handlers/writeHandlers.d.ts +0 -57
- package/dist/src/handlers/writeHandlers.js +0 -499
- package/dist/src/handlers/writeHandlers.js.map +0 -1
- package/dist/src/tools/readFileLines.d.ts +0 -26
- package/dist/src/tools/readFileLines.js +0 -77
- package/dist/src/tools/readFileLines.js.map +0 -1
- package/dist/src/tools/searchCodePattern.d.ts +0 -37
- package/dist/src/tools/searchCodePattern.js +0 -144
- package/dist/src/tools/searchCodePattern.js.map +0 -1
- package/dist/src/utils/arrayUtils.d.ts +0 -12
- package/dist/src/utils/arrayUtils.js +0 -27
- package/dist/src/utils/arrayUtils.js.map +0 -1
- package/dist/src/utils/backupManager.d.ts +0 -31
- package/dist/src/utils/backupManager.js +0 -124
- package/dist/src/utils/backupManager.js.map +0 -1
- package/dist/src/utils/confirmationCache.d.ts +0 -16
- package/dist/src/utils/confirmationCache.js +0 -40
- package/dist/src/utils/confirmationCache.js.map +0 -1
- package/dist/src/utils/constants.d.ts +0 -46
- package/dist/src/utils/constants.js +0 -112
- package/dist/src/utils/constants.js.map +0 -1
- package/dist/src/utils/dependencyChecker.d.ts +0 -1
- package/dist/src/utils/dependencyChecker.js +0 -55
- package/dist/src/utils/dependencyChecker.js.map +0 -1
- package/dist/src/utils/diffEngine.d.ts +0 -21
- package/dist/src/utils/diffEngine.js +0 -163
- package/dist/src/utils/diffEngine.js.map +0 -1
- package/dist/src/utils/fuzzyMatch.d.ts +0 -8
- package/dist/src/utils/fuzzyMatch.js +0 -70
- package/dist/src/utils/fuzzyMatch.js.map +0 -1
- package/dist/src/utils/ignoreManager.d.ts +0 -29
- package/dist/src/utils/ignoreManager.js +0 -144
- package/dist/src/utils/ignoreManager.js.map +0 -1
- package/dist/src/utils/normalization.d.ts +0 -49
- package/dist/src/utils/normalization.js +0 -173
- package/dist/src/utils/normalization.js.map +0 -1
- package/dist/src/utils/projectRoot.d.ts +0 -17
- package/dist/src/utils/projectRoot.js +0 -42
- package/dist/src/utils/projectRoot.js.map +0 -1
- package/dist/src/utils/secureValidation.d.ts +0 -15
- package/dist/src/utils/secureValidation.js +0 -41
- package/dist/src/utils/secureValidation.js.map +0 -1
- package/dist/src/utils/syntaxValidator.d.ts +0 -15
- package/dist/src/utils/syntaxValidator.js +0 -218
- package/dist/src/utils/syntaxValidator.js.map +0 -1
- package/dist/src/utils/transactionManager.d.ts +0 -46
- package/dist/src/utils/transactionManager.js +0 -123
- package/dist/src/utils/transactionManager.js.map +0 -1
- package/dist/src/utils/validation.d.ts +0 -87
- package/dist/src/utils/validation.js +0 -231
- package/dist/src/utils/validation.js.map +0 -1
- package/docs/ARCHITECTURE.md +0 -300
- 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":"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"}
|
|
@@ -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":"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"}
|