@refrakt-md/cli 0.5.1 → 0.6.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.
- package/dist/commands/edit.d.ts.map +1 -1
- package/dist/commands/edit.js +32 -5
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/extract.d.ts.map +1 -1
- package/dist/commands/extract.js +7 -4
- package/dist/commands/extract.js.map +1 -1
- package/dist/extractors/index.d.ts.map +1 -1
- package/dist/extractors/index.js +3 -1
- package/dist/extractors/index.js.map +1 -1
- package/dist/extractors/python-docstring.d.ts +26 -0
- package/dist/extractors/python-docstring.d.ts.map +1 -0
- package/dist/extractors/python-docstring.js +396 -0
- package/dist/extractors/python-docstring.js.map +1 -0
- package/dist/extractors/python.d.ts +17 -2
- package/dist/extractors/python.d.ts.map +1 -1
- package/dist/extractors/python.js +556 -4
- package/dist/extractors/python.js.map +1 -1
- package/dist/lib/symbol-generator.d.ts +2 -0
- package/dist/lib/symbol-generator.d.ts.map +1 -1
- package/dist/lib/symbol-generator.js +7 -6
- package/dist/lib/symbol-generator.js.map +1 -1
- package/package.json +9 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-docstring.js","sourceRoot":"","sources":["../../src/extractors/python-docstring.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
import type { SymbolExtractor, ExtractorResult } from './types.js';
|
|
2
2
|
export declare class PythonExtractor implements SymbolExtractor {
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
private rootDir;
|
|
4
|
+
private sourceUrl?;
|
|
5
|
+
private parser;
|
|
6
|
+
private initialized;
|
|
7
|
+
constructor(rootDir: string, sourceUrl?: string);
|
|
8
|
+
init(): Promise<void>;
|
|
9
|
+
extractFile(filePath: string): ExtractorResult;
|
|
10
|
+
private extractAllList;
|
|
11
|
+
private isExported;
|
|
12
|
+
private extractFunction;
|
|
13
|
+
private extractClass;
|
|
14
|
+
private extractEnumMembers;
|
|
15
|
+
private extractClassMembers;
|
|
16
|
+
private extractMethodMember;
|
|
17
|
+
private extractPropertyMember;
|
|
18
|
+
private mergeParamDocs;
|
|
19
|
+
private buildSourceUrl;
|
|
5
20
|
}
|
|
6
21
|
//# sourceMappingURL=python.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../../src/extractors/python.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../../src/extractors/python.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEsB,eAAe,EAAE,eAAe,EACjE,MAAM,YAAY,CAAC;AA+QpB,qBAAa,eAAgB,YAAW,eAAe;IACtD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;IAKzC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB3B,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe;IA2C9C,OAAO,CAAC,cAAc;IAuBtB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,eAAe;IAoDvB,OAAO,CAAC,YAAY;IAqCpB,OAAO,CAAC,kBAAkB;IA2B1B,OAAO,CAAC,mBAAmB;IA8C3B,OAAO,CAAC,mBAAmB;IAkD3B,OAAO,CAAC,qBAAqB;IAqB7B,OAAO,CAAC,cAAc;IAkBtB,OAAO,CAAC,cAAc;CAKtB"}
|
|
@@ -1,8 +1,560 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { resolve, relative } from 'node:path';
|
|
3
|
+
import { createRequire } from 'node:module';
|
|
4
|
+
import { parseDocstring } from './python-docstring.js';
|
|
5
|
+
// ── Enum / interface base classes ────────────────────────────────────
|
|
6
|
+
const ENUM_BASES = new Set(['Enum', 'IntEnum', 'StrEnum', 'Flag', 'IntFlag']);
|
|
7
|
+
const INTERFACE_BASES = new Set(['Protocol', 'ABC', 'ABCMeta']);
|
|
8
|
+
// ── Helpers ──────────────────────────────────────────────────────────
|
|
9
|
+
function getDocstring(node) {
|
|
10
|
+
// The docstring is the first expression_statement > string in the body
|
|
11
|
+
const body = node.childForFieldName('body');
|
|
12
|
+
if (!body)
|
|
13
|
+
return '';
|
|
14
|
+
for (const child of body.children) {
|
|
15
|
+
if (child.type === 'expression_statement') {
|
|
16
|
+
const strNode = child.children[0];
|
|
17
|
+
if (strNode && strNode.type === 'string') {
|
|
18
|
+
return stripQuotes(strNode.text);
|
|
19
|
+
}
|
|
20
|
+
// concatenated_string is also possible but rare
|
|
21
|
+
if (strNode && strNode.type === 'concatenated_string') {
|
|
22
|
+
return strNode.children
|
|
23
|
+
.filter(c => c.type === 'string')
|
|
24
|
+
.map(c => stripQuotes(c.text))
|
|
25
|
+
.join('');
|
|
26
|
+
}
|
|
27
|
+
break; // first statement isn't a docstring
|
|
28
|
+
}
|
|
29
|
+
// Skip comments, pass statements
|
|
30
|
+
if (child.type === 'comment' || child.type === 'pass_statement')
|
|
31
|
+
continue;
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
return '';
|
|
35
|
+
}
|
|
36
|
+
function stripQuotes(raw) {
|
|
37
|
+
// Triple-quoted strings
|
|
38
|
+
for (const q of ['"""', "'''"]) {
|
|
39
|
+
for (const prefix of ['', 'r', 'u', 'b', 'f', 'rb', 'br', 'fr', 'rf']) {
|
|
40
|
+
const start = prefix + q;
|
|
41
|
+
if (raw.startsWith(start) && raw.endsWith(q)) {
|
|
42
|
+
return raw.slice(start.length, -q.length);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Single-quoted
|
|
47
|
+
for (const q of ['"', "'"]) {
|
|
48
|
+
for (const prefix of ['', 'r', 'u', 'b', 'f', 'rb', 'br', 'fr', 'rf']) {
|
|
49
|
+
const start = prefix + q;
|
|
50
|
+
if (raw.startsWith(start) && raw.endsWith(q)) {
|
|
51
|
+
return raw.slice(start.length, -q.length);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return raw;
|
|
56
|
+
}
|
|
57
|
+
function getDecorators(node) {
|
|
58
|
+
// Decorators appear as siblings before the function/class in a decorated_definition
|
|
59
|
+
const parent = node.parent;
|
|
60
|
+
if (!parent || parent.type !== 'decorated_definition')
|
|
61
|
+
return [];
|
|
62
|
+
const decorators = [];
|
|
63
|
+
for (const child of parent.children) {
|
|
64
|
+
if (child.type === 'decorator') {
|
|
65
|
+
// Decorator text includes the @
|
|
66
|
+
decorators.push(child.text.trim());
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return decorators;
|
|
70
|
+
}
|
|
71
|
+
function hasDecorator(node, name) {
|
|
72
|
+
return getDecorators(node).some(d => d === `@${name}` || d.startsWith(`@${name}(`));
|
|
73
|
+
}
|
|
74
|
+
function getBaseClasses(node) {
|
|
75
|
+
const argList = node.childForFieldName('superclasses');
|
|
76
|
+
if (!argList)
|
|
77
|
+
return [];
|
|
78
|
+
const bases = [];
|
|
79
|
+
for (const child of argList.namedChildren) {
|
|
80
|
+
if (child.type === 'identifier' || child.type === 'attribute') {
|
|
81
|
+
bases.push(child.text);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return bases;
|
|
85
|
+
}
|
|
86
|
+
function classifyClass(node) {
|
|
87
|
+
const bases = getBaseClasses(node);
|
|
88
|
+
// Check direct base names (last segment of dotted names)
|
|
89
|
+
for (const base of bases) {
|
|
90
|
+
const name = base.includes('.') ? base.split('.').pop() : base;
|
|
91
|
+
if (ENUM_BASES.has(name))
|
|
92
|
+
return 'enum';
|
|
93
|
+
if (INTERFACE_BASES.has(name))
|
|
94
|
+
return 'interface';
|
|
95
|
+
}
|
|
96
|
+
return 'class';
|
|
97
|
+
}
|
|
98
|
+
// ── Parameter extraction ─────────────────────────────────────────────
|
|
99
|
+
function extractParams(paramsNode, skipSelfCls) {
|
|
100
|
+
if (!paramsNode)
|
|
101
|
+
return [];
|
|
102
|
+
const params = [];
|
|
103
|
+
for (const child of paramsNode.namedChildren) {
|
|
104
|
+
const param = extractSingleParam(child, skipSelfCls);
|
|
105
|
+
if (param)
|
|
106
|
+
params.push(param);
|
|
107
|
+
}
|
|
108
|
+
return params;
|
|
109
|
+
}
|
|
110
|
+
function extractSingleParam(node, skipSelfCls) {
|
|
111
|
+
switch (node.type) {
|
|
112
|
+
case 'identifier': {
|
|
113
|
+
const name = node.text;
|
|
114
|
+
if (skipSelfCls && (name === 'self' || name === 'cls'))
|
|
115
|
+
return null;
|
|
116
|
+
return { name, type: 'Any', description: '', optional: false };
|
|
117
|
+
}
|
|
118
|
+
case 'typed_parameter': {
|
|
119
|
+
const nameNode = node.children.find(c => c.type === 'identifier' || c.type === 'list_splat_pattern' || c.type === 'dictionary_splat_pattern');
|
|
120
|
+
const typeNode = node.childForFieldName('type');
|
|
121
|
+
if (!nameNode)
|
|
122
|
+
return null;
|
|
123
|
+
let name = nameNode.text;
|
|
124
|
+
let prefix = '';
|
|
125
|
+
if (nameNode.type === 'list_splat_pattern') {
|
|
126
|
+
prefix = '*';
|
|
127
|
+
name = nameNode.children.find(c => c.type === 'identifier')?.text ?? name;
|
|
128
|
+
}
|
|
129
|
+
else if (nameNode.type === 'dictionary_splat_pattern') {
|
|
130
|
+
prefix = '**';
|
|
131
|
+
name = nameNode.children.find(c => c.type === 'identifier')?.text ?? name;
|
|
132
|
+
}
|
|
133
|
+
if (skipSelfCls && !prefix && (name === 'self' || name === 'cls'))
|
|
134
|
+
return null;
|
|
135
|
+
return {
|
|
136
|
+
name: prefix + name,
|
|
137
|
+
type: typeNode?.text ?? 'Any',
|
|
138
|
+
description: '',
|
|
139
|
+
optional: false,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
case 'default_parameter': {
|
|
143
|
+
const nameNode = node.childForFieldName('name');
|
|
144
|
+
const valueNode = node.childForFieldName('value');
|
|
145
|
+
if (!nameNode)
|
|
146
|
+
return null;
|
|
147
|
+
const name = nameNode.text;
|
|
148
|
+
if (skipSelfCls && (name === 'self' || name === 'cls'))
|
|
149
|
+
return null;
|
|
150
|
+
return {
|
|
151
|
+
name,
|
|
152
|
+
type: 'Any',
|
|
153
|
+
description: '',
|
|
154
|
+
optional: true,
|
|
155
|
+
defaultValue: valueNode?.text,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
case 'typed_default_parameter': {
|
|
159
|
+
const nameNode = node.childForFieldName('name');
|
|
160
|
+
const typeNode = node.childForFieldName('type');
|
|
161
|
+
const valueNode = node.childForFieldName('value');
|
|
162
|
+
if (!nameNode)
|
|
163
|
+
return null;
|
|
164
|
+
const name = nameNode.text;
|
|
165
|
+
if (skipSelfCls && (name === 'self' || name === 'cls'))
|
|
166
|
+
return null;
|
|
167
|
+
return {
|
|
168
|
+
name,
|
|
169
|
+
type: typeNode?.text ?? 'Any',
|
|
170
|
+
description: '',
|
|
171
|
+
optional: true,
|
|
172
|
+
defaultValue: valueNode?.text,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
case 'list_splat_pattern': {
|
|
176
|
+
const inner = node.children.find(c => c.type === 'identifier');
|
|
177
|
+
const name = inner?.text ?? node.text.replace(/^\*/, '');
|
|
178
|
+
return { name: `*${name}`, type: 'Any', description: '', optional: true };
|
|
179
|
+
}
|
|
180
|
+
case 'dictionary_splat_pattern': {
|
|
181
|
+
const inner = node.children.find(c => c.type === 'identifier');
|
|
182
|
+
const name = inner?.text ?? node.text.replace(/^\*\*/, '');
|
|
183
|
+
return { name: `**${name}`, type: 'Any', description: '', optional: true };
|
|
184
|
+
}
|
|
185
|
+
case 'tuple_pattern': {
|
|
186
|
+
// Tuple unpacking in params — rare, skip
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
default:
|
|
190
|
+
return null;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// ── Signature reconstruction ─────────────────────────────────────────
|
|
194
|
+
function buildFunctionSignature(node, decorators) {
|
|
195
|
+
const lines = [];
|
|
196
|
+
for (const dec of decorators) {
|
|
197
|
+
lines.push(dec);
|
|
198
|
+
}
|
|
199
|
+
const name = node.childForFieldName('name')?.text ?? '?';
|
|
200
|
+
const paramsNode = node.childForFieldName('parameters');
|
|
201
|
+
const returnType = node.childForFieldName('return_type');
|
|
202
|
+
let sig = `def ${name}(`;
|
|
203
|
+
if (paramsNode) {
|
|
204
|
+
// Reconstruct params text, but simplified
|
|
205
|
+
const paramTexts = [];
|
|
206
|
+
for (const child of paramsNode.namedChildren) {
|
|
207
|
+
paramTexts.push(child.text);
|
|
208
|
+
}
|
|
209
|
+
sig += paramTexts.join(', ');
|
|
210
|
+
}
|
|
211
|
+
sig += ')';
|
|
212
|
+
if (returnType) {
|
|
213
|
+
sig += ` -> ${returnType.text}`;
|
|
214
|
+
}
|
|
215
|
+
sig += ':';
|
|
216
|
+
lines.push(sig);
|
|
217
|
+
return lines.join('\n');
|
|
218
|
+
}
|
|
219
|
+
function buildClassSignature(node, decorators) {
|
|
220
|
+
const lines = [];
|
|
221
|
+
for (const dec of decorators) {
|
|
222
|
+
lines.push(dec);
|
|
223
|
+
}
|
|
224
|
+
const name = node.childForFieldName('name')?.text ?? '?';
|
|
225
|
+
const bases = getBaseClasses(node);
|
|
226
|
+
let sig = `class ${name}`;
|
|
227
|
+
if (bases.length > 0) {
|
|
228
|
+
sig += `(${bases.join(', ')})`;
|
|
229
|
+
}
|
|
230
|
+
sig += ':';
|
|
231
|
+
lines.push(sig);
|
|
232
|
+
return lines.join('\n');
|
|
233
|
+
}
|
|
234
|
+
// ── Main extractor ───────────────────────────────────────────────────
|
|
1
235
|
export class PythonExtractor {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
236
|
+
rootDir;
|
|
237
|
+
sourceUrl;
|
|
238
|
+
parser;
|
|
239
|
+
initialized = false;
|
|
240
|
+
constructor(rootDir, sourceUrl) {
|
|
241
|
+
this.rootDir = resolve(rootDir);
|
|
242
|
+
this.sourceUrl = sourceUrl;
|
|
243
|
+
}
|
|
244
|
+
async init() {
|
|
245
|
+
if (this.initialized)
|
|
246
|
+
return;
|
|
247
|
+
const require = createRequire(import.meta.url);
|
|
248
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
249
|
+
const Parser = (await import('web-tree-sitter')).default;
|
|
250
|
+
await Parser.init();
|
|
251
|
+
const wasmPath = require.resolve('tree-sitter-wasms/out/tree-sitter-python.wasm');
|
|
252
|
+
const Python = await Parser.Language.load(wasmPath);
|
|
253
|
+
this.parser = new Parser();
|
|
254
|
+
this.parser.setLanguage(Python);
|
|
255
|
+
this.initialized = true;
|
|
256
|
+
}
|
|
257
|
+
extractFile(filePath) {
|
|
258
|
+
if (!this.initialized) {
|
|
259
|
+
throw new Error('PythonExtractor.init() must be called before extractFile()');
|
|
260
|
+
}
|
|
261
|
+
const absPath = resolve(filePath);
|
|
262
|
+
const source = readFileSync(absPath, 'utf-8');
|
|
263
|
+
const tree = this.parser.parse(source);
|
|
264
|
+
if (!tree)
|
|
265
|
+
return { symbols: [], filePath: absPath };
|
|
266
|
+
const root = tree.rootNode;
|
|
267
|
+
// Determine exports
|
|
268
|
+
const allExports = this.extractAllList(root);
|
|
269
|
+
const symbols = [];
|
|
270
|
+
// Walk top-level statements
|
|
271
|
+
for (const child of root.children) {
|
|
272
|
+
const node = child.type === 'decorated_definition'
|
|
273
|
+
? child.namedChildren.find(c => c.type === 'function_definition' || c.type === 'class_definition')
|
|
274
|
+
: child;
|
|
275
|
+
if (!node)
|
|
276
|
+
continue;
|
|
277
|
+
if (node.type === 'function_definition') {
|
|
278
|
+
const name = node.childForFieldName('name')?.text;
|
|
279
|
+
if (!name)
|
|
280
|
+
continue;
|
|
281
|
+
if (!this.isExported(name, allExports))
|
|
282
|
+
continue;
|
|
283
|
+
symbols.push(this.extractFunction(node, absPath));
|
|
284
|
+
}
|
|
285
|
+
else if (node.type === 'class_definition') {
|
|
286
|
+
const name = node.childForFieldName('name')?.text;
|
|
287
|
+
if (!name)
|
|
288
|
+
continue;
|
|
289
|
+
if (!this.isExported(name, allExports))
|
|
290
|
+
continue;
|
|
291
|
+
symbols.push(this.extractClass(node, absPath));
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
return { symbols, filePath: absPath };
|
|
295
|
+
}
|
|
296
|
+
// ── Export resolution ────────────────────────────────────────
|
|
297
|
+
extractAllList(root) {
|
|
298
|
+
for (const child of root.children) {
|
|
299
|
+
if (child.type !== 'expression_statement')
|
|
300
|
+
continue;
|
|
301
|
+
const expr = child.children[0];
|
|
302
|
+
if (!expr || expr.type !== 'assignment')
|
|
303
|
+
continue;
|
|
304
|
+
const left = expr.childForFieldName('left');
|
|
305
|
+
if (!left || left.type !== 'identifier' || left.text !== '__all__')
|
|
306
|
+
continue;
|
|
307
|
+
const right = expr.childForFieldName('right');
|
|
308
|
+
if (!right || right.type !== 'list')
|
|
309
|
+
continue;
|
|
310
|
+
const names = new Set();
|
|
311
|
+
for (const elem of right.namedChildren) {
|
|
312
|
+
if (elem.type === 'string') {
|
|
313
|
+
names.add(stripQuotes(elem.text));
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
return names;
|
|
317
|
+
}
|
|
318
|
+
return null;
|
|
319
|
+
}
|
|
320
|
+
isExported(name, allExports) {
|
|
321
|
+
if (allExports)
|
|
322
|
+
return allExports.has(name);
|
|
323
|
+
return !name.startsWith('_');
|
|
324
|
+
}
|
|
325
|
+
// ── Function extraction ─────────────────────────────────────
|
|
326
|
+
extractFunction(node, filePath) {
|
|
327
|
+
const name = node.childForFieldName('name').text;
|
|
328
|
+
const decorators = getDecorators(node);
|
|
329
|
+
const rawDocstring = getDocstring(node);
|
|
330
|
+
const docInfo = rawDocstring ? parseDocstring(rawDocstring) : null;
|
|
331
|
+
const paramsNode = node.childForFieldName('parameters');
|
|
332
|
+
let parameters = paramsNode ? extractParams(paramsNode, false) : [];
|
|
333
|
+
// Enrich params from docstring
|
|
334
|
+
if (docInfo) {
|
|
335
|
+
parameters = this.mergeParamDocs(parameters, docInfo.params);
|
|
336
|
+
}
|
|
337
|
+
const signature = buildFunctionSignature(node, decorators);
|
|
338
|
+
let returns;
|
|
339
|
+
const returnType = node.childForFieldName('return_type');
|
|
340
|
+
if (docInfo?.returns) {
|
|
341
|
+
returns = {
|
|
342
|
+
type: returnType?.text ?? docInfo.returns.type,
|
|
343
|
+
description: docInfo.returns.description,
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
else if (returnType) {
|
|
347
|
+
returns = { type: returnType.text, description: '' };
|
|
348
|
+
}
|
|
349
|
+
let throws;
|
|
350
|
+
if (docInfo?.raises && docInfo.raises.length > 0) {
|
|
351
|
+
throws = docInfo.raises;
|
|
352
|
+
}
|
|
353
|
+
const line = node.startPosition.row + 1;
|
|
354
|
+
return {
|
|
355
|
+
name,
|
|
356
|
+
kind: 'function',
|
|
357
|
+
signature,
|
|
358
|
+
description: docInfo?.description ?? '',
|
|
359
|
+
parameters: parameters.length > 0 ? parameters : undefined,
|
|
360
|
+
returns: returns?.type === 'None' && !returns.description ? undefined : returns,
|
|
361
|
+
throws,
|
|
362
|
+
since: docInfo?.since,
|
|
363
|
+
deprecated: docInfo?.deprecated,
|
|
364
|
+
source: this.buildSourceUrl(filePath, line),
|
|
365
|
+
filePath,
|
|
366
|
+
line,
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
// ── Class extraction ────────────────────────────────────────
|
|
370
|
+
extractClass(node, filePath) {
|
|
371
|
+
const name = node.childForFieldName('name').text;
|
|
372
|
+
const decorators = getDecorators(node);
|
|
373
|
+
const rawDocstring = getDocstring(node);
|
|
374
|
+
const docInfo = rawDocstring ? parseDocstring(rawDocstring) : null;
|
|
375
|
+
const kind = classifyClass(node);
|
|
376
|
+
const signature = buildClassSignature(node, decorators);
|
|
377
|
+
const line = node.startPosition.row + 1;
|
|
378
|
+
// For enum classes, extract members as parameters
|
|
379
|
+
if (kind === 'enum') {
|
|
380
|
+
const parameters = this.extractEnumMembers(node);
|
|
381
|
+
return {
|
|
382
|
+
name, kind, signature,
|
|
383
|
+
description: docInfo?.description ?? '',
|
|
384
|
+
parameters: parameters.length > 0 ? parameters : undefined,
|
|
385
|
+
since: docInfo?.since,
|
|
386
|
+
deprecated: docInfo?.deprecated,
|
|
387
|
+
source: this.buildSourceUrl(filePath, line),
|
|
388
|
+
filePath, line,
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
const groups = this.extractClassMembers(node, filePath);
|
|
392
|
+
return {
|
|
393
|
+
name, kind, signature,
|
|
394
|
+
description: docInfo?.description ?? '',
|
|
395
|
+
groups: groups.length > 0 ? groups : undefined,
|
|
396
|
+
since: docInfo?.since,
|
|
397
|
+
deprecated: docInfo?.deprecated,
|
|
398
|
+
source: this.buildSourceUrl(filePath, line),
|
|
399
|
+
filePath, line,
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
extractEnumMembers(classNode) {
|
|
403
|
+
const body = classNode.childForFieldName('body');
|
|
404
|
+
if (!body)
|
|
405
|
+
return [];
|
|
406
|
+
const members = [];
|
|
407
|
+
for (const child of body.children) {
|
|
408
|
+
if (child.type !== 'expression_statement')
|
|
409
|
+
continue;
|
|
410
|
+
const expr = child.children[0];
|
|
411
|
+
if (!expr || expr.type !== 'assignment')
|
|
412
|
+
continue;
|
|
413
|
+
const left = expr.childForFieldName('left');
|
|
414
|
+
const right = expr.childForFieldName('right');
|
|
415
|
+
if (!left || left.type !== 'identifier')
|
|
416
|
+
continue;
|
|
417
|
+
const name = left.text;
|
|
418
|
+
if (name.startsWith('_'))
|
|
419
|
+
continue;
|
|
420
|
+
members.push({
|
|
421
|
+
name,
|
|
422
|
+
type: right?.text ?? '',
|
|
423
|
+
description: '',
|
|
424
|
+
optional: false,
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
return members;
|
|
428
|
+
}
|
|
429
|
+
extractClassMembers(classNode, filePath) {
|
|
430
|
+
const body = classNode.childForFieldName('body');
|
|
431
|
+
if (!body)
|
|
432
|
+
return [];
|
|
433
|
+
const constructors = [];
|
|
434
|
+
const properties = [];
|
|
435
|
+
const methods = [];
|
|
436
|
+
const staticMethods = [];
|
|
437
|
+
const classMethods = [];
|
|
438
|
+
for (const child of body.children) {
|
|
439
|
+
const funcNode = child.type === 'decorated_definition'
|
|
440
|
+
? child.namedChildren.find(c => c.type === 'function_definition')
|
|
441
|
+
: child.type === 'function_definition' ? child : null;
|
|
442
|
+
if (!funcNode)
|
|
443
|
+
continue;
|
|
444
|
+
const name = funcNode.childForFieldName('name')?.text;
|
|
445
|
+
if (!name)
|
|
446
|
+
continue;
|
|
447
|
+
// Skip private methods (except __init__)
|
|
448
|
+
if (name !== '__init__' && name.startsWith('_'))
|
|
449
|
+
continue;
|
|
450
|
+
if (name === '__init__') {
|
|
451
|
+
constructors.push(this.extractMethodMember(funcNode, 'constructor'));
|
|
452
|
+
}
|
|
453
|
+
else if (hasDecorator(funcNode, 'property')) {
|
|
454
|
+
properties.push(this.extractPropertyMember(funcNode));
|
|
455
|
+
}
|
|
456
|
+
else if (hasDecorator(funcNode, 'staticmethod')) {
|
|
457
|
+
staticMethods.push(this.extractMethodMember(funcNode, 'method'));
|
|
458
|
+
}
|
|
459
|
+
else if (hasDecorator(funcNode, 'classmethod')) {
|
|
460
|
+
classMethods.push(this.extractMethodMember(funcNode, 'method'));
|
|
461
|
+
}
|
|
462
|
+
else {
|
|
463
|
+
methods.push(this.extractMethodMember(funcNode, 'method'));
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
const groups = [];
|
|
467
|
+
if (constructors.length > 0)
|
|
468
|
+
groups.push({ label: 'Constructor', members: constructors });
|
|
469
|
+
if (properties.length > 0)
|
|
470
|
+
groups.push({ label: 'Properties', members: properties });
|
|
471
|
+
if (methods.length > 0)
|
|
472
|
+
groups.push({ label: 'Methods', members: methods });
|
|
473
|
+
if (staticMethods.length > 0)
|
|
474
|
+
groups.push({ label: 'Static Methods', members: staticMethods });
|
|
475
|
+
if (classMethods.length > 0)
|
|
476
|
+
groups.push({ label: 'Class Methods', members: classMethods });
|
|
477
|
+
return groups;
|
|
478
|
+
}
|
|
479
|
+
extractMethodMember(node, kind) {
|
|
480
|
+
const name = node.childForFieldName('name').text;
|
|
481
|
+
const decorators = getDecorators(node);
|
|
482
|
+
const rawDocstring = getDocstring(node);
|
|
483
|
+
const docInfo = rawDocstring ? parseDocstring(rawDocstring) : null;
|
|
484
|
+
const isConstructor = name === '__init__';
|
|
485
|
+
const isStatic = hasDecorator(node, 'staticmethod');
|
|
486
|
+
const skipSelfCls = !isStatic; // skip self/cls unless it's a static method
|
|
487
|
+
const paramsNode = node.childForFieldName('parameters');
|
|
488
|
+
let parameters = paramsNode ? extractParams(paramsNode, skipSelfCls) : [];
|
|
489
|
+
if (docInfo) {
|
|
490
|
+
parameters = this.mergeParamDocs(parameters, docInfo.params);
|
|
491
|
+
}
|
|
492
|
+
const signature = buildFunctionSignature(node, decorators);
|
|
493
|
+
let returns;
|
|
494
|
+
const returnType = node.childForFieldName('return_type');
|
|
495
|
+
if (!isConstructor) {
|
|
496
|
+
if (docInfo?.returns) {
|
|
497
|
+
returns = {
|
|
498
|
+
type: returnType?.text ?? docInfo.returns.type,
|
|
499
|
+
description: docInfo.returns.description,
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
else if (returnType && returnType.text !== 'None') {
|
|
503
|
+
returns = { type: returnType.text, description: '' };
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
let throws;
|
|
507
|
+
if (docInfo?.raises && docInfo.raises.length > 0) {
|
|
508
|
+
throws = docInfo.raises;
|
|
509
|
+
}
|
|
510
|
+
return {
|
|
511
|
+
name: isConstructor ? 'constructor' : name,
|
|
512
|
+
kind,
|
|
513
|
+
signature,
|
|
514
|
+
description: docInfo?.description ?? '',
|
|
515
|
+
parameters: parameters.length > 0 ? parameters : undefined,
|
|
516
|
+
returns,
|
|
517
|
+
throws,
|
|
518
|
+
since: docInfo?.since,
|
|
519
|
+
deprecated: docInfo?.deprecated,
|
|
520
|
+
};
|
|
521
|
+
}
|
|
522
|
+
extractPropertyMember(node) {
|
|
523
|
+
const name = node.childForFieldName('name').text;
|
|
524
|
+
const rawDocstring = getDocstring(node);
|
|
525
|
+
const docInfo = rawDocstring ? parseDocstring(rawDocstring) : null;
|
|
526
|
+
const returnType = node.childForFieldName('return_type');
|
|
527
|
+
const typeStr = returnType?.text ?? 'Any';
|
|
528
|
+
const signature = `${name}: ${typeStr}`;
|
|
529
|
+
return {
|
|
530
|
+
name,
|
|
531
|
+
kind: 'property',
|
|
532
|
+
signature,
|
|
533
|
+
description: docInfo?.description ?? '',
|
|
534
|
+
since: docInfo?.since,
|
|
535
|
+
deprecated: docInfo?.deprecated,
|
|
536
|
+
};
|
|
537
|
+
}
|
|
538
|
+
// ── Docstring merging ───────────────────────────────────────
|
|
539
|
+
mergeParamDocs(params, docParams) {
|
|
540
|
+
return params.map(p => {
|
|
541
|
+
const cleanName = p.name.replace(/^\*{1,2}/, '');
|
|
542
|
+
const docParam = docParams.get(cleanName);
|
|
543
|
+
if (!docParam)
|
|
544
|
+
return p;
|
|
545
|
+
return {
|
|
546
|
+
...p,
|
|
547
|
+
type: p.type === 'Any' && docParam.type !== 'Any' ? docParam.type : p.type,
|
|
548
|
+
description: docParam.description || p.description,
|
|
549
|
+
};
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
// ── Source URL ───────────────────────────────────────────────
|
|
553
|
+
buildSourceUrl(filePath, line) {
|
|
554
|
+
if (!this.sourceUrl)
|
|
555
|
+
return undefined;
|
|
556
|
+
const rel = relative(this.rootDir, filePath).replace(/\\/g, '/');
|
|
557
|
+
return `${this.sourceUrl.replace(/\/$/, '')}/${rel}#L${line}`;
|
|
6
558
|
}
|
|
7
559
|
}
|
|
8
560
|
//# sourceMappingURL=python.js.map
|