meaoiu 0.1.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/LANGUAGE_GUIDE.md +511 -0
- package/LICENSE +21 -0
- package/README.md +336 -0
- package/dist/api/execution.d.ts +9 -0
- package/dist/api/execution.d.ts.map +1 -0
- package/dist/api/execution.js +17 -0
- package/dist/api/execution.js.map +1 -0
- package/dist/api/serviceState.d.ts +24 -0
- package/dist/api/serviceState.d.ts.map +1 -0
- package/dist/api/serviceState.js +53 -0
- package/dist/api/serviceState.js.map +1 -0
- package/dist/api/services/completions.d.ts +15 -0
- package/dist/api/services/completions.d.ts.map +1 -0
- package/dist/api/services/completions.js +48 -0
- package/dist/api/services/completions.js.map +1 -0
- package/dist/api/services/diagnostics.d.ts +9 -0
- package/dist/api/services/diagnostics.d.ts.map +1 -0
- package/dist/api/services/diagnostics.js +5 -0
- package/dist/api/services/diagnostics.js.map +1 -0
- package/dist/api/services/formatting.d.ts +2 -0
- package/dist/api/services/formatting.d.ts.map +1 -0
- package/dist/api/services/formatting.js +223 -0
- package/dist/api/services/formatting.js.map +1 -0
- package/dist/api/services/highlight.d.ts +14 -0
- package/dist/api/services/highlight.d.ts.map +1 -0
- package/dist/api/services/highlight.js +58 -0
- package/dist/api/services/highlight.js.map +1 -0
- package/dist/api/services/inlayHints.d.ts +22 -0
- package/dist/api/services/inlayHints.d.ts.map +1 -0
- package/dist/api/services/inlayHints.js +100 -0
- package/dist/api/services/inlayHints.js.map +1 -0
- package/dist/api/services/search.d.ts +17 -0
- package/dist/api/services/search.d.ts.map +1 -0
- package/dist/api/services/search.js +35 -0
- package/dist/api/services/search.js.map +1 -0
- package/dist/api/utils/astUtils.d.ts +11 -0
- package/dist/api/utils/astUtils.d.ts.map +1 -0
- package/dist/api/utils/astUtils.js +106 -0
- package/dist/api/utils/astUtils.js.map +1 -0
- package/dist/api/utils/lspUtils.d.ts +16 -0
- package/dist/api/utils/lspUtils.d.ts.map +1 -0
- package/dist/api/utils/lspUtils.js +5 -0
- package/dist/api/utils/lspUtils.js.map +1 -0
- package/dist/api/utils/symbolAnalyzer.d.ts +37 -0
- package/dist/api/utils/symbolAnalyzer.d.ts.map +1 -0
- package/dist/api/utils/symbolAnalyzer.js +440 -0
- package/dist/api/utils/symbolAnalyzer.js.map +1 -0
- package/dist/api/utils/symbolTable.d.ts +28 -0
- package/dist/api/utils/symbolTable.d.ts.map +1 -0
- package/dist/api/utils/symbolTable.js +3 -0
- package/dist/api/utils/symbolTable.js.map +1 -0
- package/dist/cli/main.d.ts +3 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +92 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/tools/completer.d.ts +2 -0
- package/dist/cli/tools/completer.d.ts.map +1 -0
- package/dist/cli/tools/completer.js +24 -0
- package/dist/cli/tools/completer.js.map +1 -0
- package/dist/cli/tools/diagnoser.d.ts +2 -0
- package/dist/cli/tools/diagnoser.d.ts.map +1 -0
- package/dist/cli/tools/diagnoser.js +29 -0
- package/dist/cli/tools/diagnoser.js.map +1 -0
- package/dist/cli/tools/formatter.d.ts +2 -0
- package/dist/cli/tools/formatter.d.ts.map +1 -0
- package/dist/cli/tools/formatter.js +27 -0
- package/dist/cli/tools/formatter.js.map +1 -0
- package/dist/cli/tools/searcher.d.ts +4 -0
- package/dist/cli/tools/searcher.d.ts.map +1 -0
- package/dist/cli/tools/searcher.js +30 -0
- package/dist/cli/tools/searcher.js.map +1 -0
- package/dist/cli/tools/starter.d.ts +3 -0
- package/dist/cli/tools/starter.d.ts.map +1 -0
- package/dist/cli/tools/starter.js +23 -0
- package/dist/cli/tools/starter.js.map +1 -0
- package/dist/cli/tools/toolUtils.d.ts +8 -0
- package/dist/cli/tools/toolUtils.d.ts.map +1 -0
- package/dist/cli/tools/toolUtils.js +52 -0
- package/dist/cli/tools/toolUtils.js.map +1 -0
- package/dist/core/ast.d.ts +140 -0
- package/dist/core/ast.d.ts.map +1 -0
- package/dist/core/ast.js +3 -0
- package/dist/core/ast.js.map +1 -0
- package/dist/core/builtIns.d.ts +15 -0
- package/dist/core/builtIns.d.ts.map +1 -0
- package/dist/core/builtIns.js +175 -0
- package/dist/core/builtIns.js.map +1 -0
- package/dist/core/error.d.ts +41 -0
- package/dist/core/error.d.ts.map +1 -0
- package/dist/core/error.js +63 -0
- package/dist/core/error.js.map +1 -0
- package/dist/core/parser.d.ts +89 -0
- package/dist/core/parser.d.ts.map +1 -0
- package/dist/core/parser.js +578 -0
- package/dist/core/parser.js.map +1 -0
- package/dist/core/preprocessor.d.ts +2 -0
- package/dist/core/preprocessor.d.ts.map +1 -0
- package/dist/core/preprocessor.js +187 -0
- package/dist/core/preprocessor.js.map +1 -0
- package/dist/core/run/environment.d.ts +43 -0
- package/dist/core/run/environment.d.ts.map +1 -0
- package/dist/core/run/environment.js +192 -0
- package/dist/core/run/environment.js.map +1 -0
- package/dist/core/run/interpreter.d.ts +13 -0
- package/dist/core/run/interpreter.d.ts.map +1 -0
- package/dist/core/run/interpreter.js +415 -0
- package/dist/core/run/interpreter.js.map +1 -0
- package/dist/core/run/io.d.ts +18 -0
- package/dist/core/run/io.d.ts.map +1 -0
- package/dist/core/run/io.js +34 -0
- package/dist/core/run/io.js.map +1 -0
- package/dist/core/run/logger.d.ts +12 -0
- package/dist/core/run/logger.d.ts.map +1 -0
- package/dist/core/run/logger.js +17 -0
- package/dist/core/run/logger.js.map +1 -0
- package/dist/core/run/value.d.ts +41 -0
- package/dist/core/run/value.d.ts.map +1 -0
- package/dist/core/run/value.js +37 -0
- package/dist/core/run/value.js.map +1 -0
- package/dist/core/tokenizer.d.ts +82 -0
- package/dist/core/tokenizer.d.ts.map +1 -0
- package/dist/core/tokenizer.js +277 -0
- package/dist/core/tokenizer.js.map +1 -0
- package/dist/core/typedef.d.ts +32 -0
- package/dist/core/typedef.d.ts.map +1 -0
- package/dist/core/typedef.js +67 -0
- package/dist/core/typedef.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
// src/api/services/formatting.ts
|
|
2
|
+
import { Parser } from '../../core/parser.js';
|
|
3
|
+
import { isKeyword, tokenize } from '../../core/tokenizer.js';
|
|
4
|
+
function indent(options) {
|
|
5
|
+
return options.indentChar.repeat(options.level);
|
|
6
|
+
}
|
|
7
|
+
function printLeadingComments(node, options) {
|
|
8
|
+
const comments = node.leadingComments;
|
|
9
|
+
if (!comments?.length)
|
|
10
|
+
return '';
|
|
11
|
+
return comments.map(c => `${indent(options)}(${c.value})`).join('\n') + '\n';
|
|
12
|
+
}
|
|
13
|
+
function printTrailingComments(node) {
|
|
14
|
+
const comments = node.trailingComments;
|
|
15
|
+
if (!comments?.length)
|
|
16
|
+
return '';
|
|
17
|
+
return ' ' + comments.map(c => `(${c.value})`).join(' ');
|
|
18
|
+
}
|
|
19
|
+
function printIdentifier(node) {
|
|
20
|
+
const symbol = node.symbol;
|
|
21
|
+
if (isKeyword(symbol))
|
|
22
|
+
return `{${symbol}}`;
|
|
23
|
+
return symbol;
|
|
24
|
+
}
|
|
25
|
+
function printNodeContent(node, options) {
|
|
26
|
+
if (!node)
|
|
27
|
+
return '';
|
|
28
|
+
const nextLevelOptions = { ...options, level: options.level + 1 };
|
|
29
|
+
const leading = printLeadingComments(node, options);
|
|
30
|
+
let content = '';
|
|
31
|
+
switch (node.kind) {
|
|
32
|
+
case 1 /* NodeKind.Program */: {
|
|
33
|
+
const body = node.body;
|
|
34
|
+
const parts = [];
|
|
35
|
+
for (let i = 0; i < body.length; i++) {
|
|
36
|
+
const stmt = body[i];
|
|
37
|
+
const stmtString = printNodeContent(stmt, options) + '~' + printTrailingComments(stmt);
|
|
38
|
+
parts.push(stmtString);
|
|
39
|
+
const nextStmt = body[i + 1];
|
|
40
|
+
if (!nextStmt)
|
|
41
|
+
continue;
|
|
42
|
+
const gap = nextStmt.line - stmt.endLine - 1;
|
|
43
|
+
const commentCount = nextStmt.leadingComments?.length ?? 0;
|
|
44
|
+
const hasFunction = stmt.kind === 4 /* NodeKind.FunctionDeclaration */ || nextStmt.kind === 4 /* NodeKind.FunctionDeclaration */;
|
|
45
|
+
const eL = Math.max(gap - commentCount, +hasFunction);
|
|
46
|
+
if (eL > 0)
|
|
47
|
+
parts.push(...Array(eL).fill(''));
|
|
48
|
+
}
|
|
49
|
+
return parts.join('\n');
|
|
50
|
+
}
|
|
51
|
+
case 14 /* NodeKind.BlockExpression */: {
|
|
52
|
+
const { isCollection, body } = node;
|
|
53
|
+
if (isCollection) {
|
|
54
|
+
// 是纸箱 [= ... =]
|
|
55
|
+
if (body.length === 0) {
|
|
56
|
+
content = '[==]';
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
// 纸箱元素用逗号+空格连接
|
|
60
|
+
const blockContent = body.map(stmt => printNodeContent(stmt, nextLevelOptions)).join(', ');
|
|
61
|
+
content = `[= ${blockContent} =]`;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
// 是普通块 [# ... #]
|
|
65
|
+
if (body.length === 0) {
|
|
66
|
+
content = '[##]';
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
// 语句用~和换行连接
|
|
70
|
+
const blockContent = body
|
|
71
|
+
.map(stmt => printNodeContent(stmt, nextLevelOptions) + '~' + printTrailingComments(stmt))
|
|
72
|
+
.join('\n');
|
|
73
|
+
content = `[#\n${blockContent}\n${indent(options)}#]`;
|
|
74
|
+
}
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
case 2 /* NodeKind.VariableDeclaration */: {
|
|
78
|
+
const { initialization, identifier } = node;
|
|
79
|
+
if (initialization) {
|
|
80
|
+
const assignContent = printNodeContent(initialization, { ...options, level: 0 }).trim();
|
|
81
|
+
content = `${indent(options)}蹭 ${assignContent}`;
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
content = `${indent(options)}蹭 ${printIdentifier(identifier)}`;
|
|
85
|
+
}
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
case 3 /* NodeKind.AssignmentStatement */: {
|
|
89
|
+
const { operator, assignee, value } = node;
|
|
90
|
+
const o = operator === 2 /* AssignmentOperator.MOVE */ ? '才是' : operator === 1 /* AssignmentOperator.COPY */ ? '就像' : '就是';
|
|
91
|
+
content = `${indent(options)}${printNodeContent(assignee, options)} ${o} ${printNodeContent(value, options)}`;
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
case 18 /* NodeKind.CallExpression */: {
|
|
95
|
+
const { args, callee } = node;
|
|
96
|
+
const argsExpr = printNodeContent(args, { ...options, level: 0 });
|
|
97
|
+
const p = options.level > 0 ? indent(options) : '';
|
|
98
|
+
content = `${p}扒 ${argsExpr} ${printIdentifier(callee)}`;
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
case 15 /* NodeKind.IfExpression */: {
|
|
102
|
+
const { consequent, condition, alternate } = node;
|
|
103
|
+
let r = `${printNodeContent(consequent, options)} 好不好? ${printNodeContent(condition, { ...options, level: 0 })}`;
|
|
104
|
+
if (alternate)
|
|
105
|
+
r += `\n${indent(options)}不然 ${printNodeContent(alternate, options)}`;
|
|
106
|
+
content = `${indent(options)}${r}`;
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
case 4 /* NodeKind.FunctionDeclaration */: {
|
|
110
|
+
const { parameters, name, body } = node;
|
|
111
|
+
const paramsBlock = printNodeContent(parameters, options);
|
|
112
|
+
content = `${indent(options)}想要 ${paramsBlock} ${printIdentifier(name)} ${printNodeContent(body, options)}`;
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
case 16 /* NodeKind.LoopExpression */: {
|
|
116
|
+
content = `${indent(options)}玩耍 ${printNodeContent(node.body, options)}`;
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
case 5 /* NodeKind.ReturnStatement */: {
|
|
120
|
+
const a = node.argument;
|
|
121
|
+
content = `${indent(options)}叼回来${a ? ` ${printNodeContent(a, options)}` : ''}`;
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
case 6 /* NodeKind.AmbushStatement */: {
|
|
125
|
+
const a = node.argument;
|
|
126
|
+
content = `${indent(options)}偷袭${a ? ` ${printNodeContent(a, options)}` : ''}`;
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
case 7 /* NodeKind.BreakStatement */: {
|
|
130
|
+
content = `${indent(options)}累了`;
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
case 22 /* NodeKind.MemberAccessExpression */: {
|
|
134
|
+
const { object, property } = node;
|
|
135
|
+
// 打印 a@b
|
|
136
|
+
content = `${printNodeContent(object, options)}@${printNodeContent(property, options)}`;
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
case 23 /* NodeKind.UnaryExpression */: {
|
|
140
|
+
const { operator, argument } = node;
|
|
141
|
+
const op = operator === 1 /* AssignmentOperator.COPY */ ? '高仿' : '抢走';
|
|
142
|
+
content = `${op} ${printNodeContent(argument, options)}`;
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
case 17 /* NodeKind.ArithmeticExpression */: {
|
|
146
|
+
const { left, operator, right } = node;
|
|
147
|
+
content = `${printNodeContent(left, options)} ${operator} ${printNodeContent(right, options)}`;
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
case 21 /* NodeKind.ComparisonExpression */: {
|
|
151
|
+
const { expressions, operators } = node;
|
|
152
|
+
const parts = [];
|
|
153
|
+
for (let i = 0; i < expressions.length; i++) {
|
|
154
|
+
parts.push(printNodeContent(expressions[i], options));
|
|
155
|
+
if (i < operators.length)
|
|
156
|
+
parts.push(operators[i].value);
|
|
157
|
+
}
|
|
158
|
+
content = parts.join(' ');
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
case 20 /* NodeKind.LogicalExpression */: {
|
|
162
|
+
const { left, operator, right } = node;
|
|
163
|
+
const o = {
|
|
164
|
+
[0 /* LogicalOperator.AND */]: '和',
|
|
165
|
+
[1 /* LogicalOperator.OR */]: '或',
|
|
166
|
+
[3 /* LogicalOperator.NOR */]: '和',
|
|
167
|
+
[2 /* LogicalOperator.NAND */]: '或',
|
|
168
|
+
};
|
|
169
|
+
const c = {
|
|
170
|
+
[0 /* LogicalOperator.AND */]: '都好',
|
|
171
|
+
[1 /* LogicalOperator.OR */]: '不坏',
|
|
172
|
+
[3 /* LogicalOperator.NOR */]: '都坏',
|
|
173
|
+
[2 /* LogicalOperator.NAND */]: '不好',
|
|
174
|
+
};
|
|
175
|
+
content = `${printNodeContent(left, options)} ${o[operator]} ${printNodeContent(right, options)} ${c[operator]}`;
|
|
176
|
+
break;
|
|
177
|
+
}
|
|
178
|
+
case 19 /* NodeKind.SequenceExpression */: {
|
|
179
|
+
const { sections, operators } = node;
|
|
180
|
+
let s = printNodeContent(sections[0], options);
|
|
181
|
+
for (let i = 0; i < operators.length; i++) {
|
|
182
|
+
s += ` ${operators[i].value}, ${printNodeContent(sections[i + 1], options)}`;
|
|
183
|
+
}
|
|
184
|
+
content = s;
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
case 13 /* NodeKind.Identifier */:
|
|
188
|
+
content = printIdentifier(node);
|
|
189
|
+
break;
|
|
190
|
+
case 9 /* NodeKind.NumericLiteral */:
|
|
191
|
+
content = String(node.value);
|
|
192
|
+
break;
|
|
193
|
+
case 10 /* NodeKind.StringLiteral */: {
|
|
194
|
+
const v = node.value;
|
|
195
|
+
content = v.includes("'") ? `"${v}"` : `'${v}'`;
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
case 11 /* NodeKind.BooleanLiteral */:
|
|
199
|
+
content = node.value ? '好喵' : '坏喵';
|
|
200
|
+
break;
|
|
201
|
+
case 12 /* NodeKind.NullLiteral */:
|
|
202
|
+
content = '空碗';
|
|
203
|
+
break;
|
|
204
|
+
case 0 /* NodeKind.ErrorNode */:
|
|
205
|
+
content = `(喵!解析错误: ${node.message})`;
|
|
206
|
+
break;
|
|
207
|
+
case 8 /* NodeKind.ExpressionStatement */: {
|
|
208
|
+
content = printNodeContent(node.expression, options);
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
default: // 此处已推断为不可达
|
|
212
|
+
const _n = node;
|
|
213
|
+
console.warn(`[格式化器] 目前无法整理此类节点 `, _n);
|
|
214
|
+
}
|
|
215
|
+
return leading + content;
|
|
216
|
+
}
|
|
217
|
+
export function getFormattedCode(sourceCode) {
|
|
218
|
+
const parser = new Parser(tokenize(sourceCode, { ignoreComments: false }), 1 /* ParseMode.TOLERANT */);
|
|
219
|
+
const ast = parser.parse().program;
|
|
220
|
+
const options = { indentChar: '\t', level: 0 };
|
|
221
|
+
return printNodeContent(ast, options);
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=formatting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../../src/api/services/formatting.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ServiceState } from '../serviceState.js';
|
|
2
|
+
export type HighlightToken = {
|
|
3
|
+
line: number;
|
|
4
|
+
col: number;
|
|
5
|
+
length: number;
|
|
6
|
+
tokenType: number;
|
|
7
|
+
tokenModifiers: number;
|
|
8
|
+
};
|
|
9
|
+
export declare const legend: {
|
|
10
|
+
tokenTypes: string[];
|
|
11
|
+
tokenModifiers: string[];
|
|
12
|
+
};
|
|
13
|
+
export declare function getHighlightTokens(serviceState: ServiceState): HighlightToken[];
|
|
14
|
+
//# sourceMappingURL=highlight.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"highlight.d.ts","sourceRoot":"","sources":["../../../src/api/services/highlight.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD,MAAM,MAAM,cAAc,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC;AAKtH,eAAO,MAAM,MAAM;;;CAAiC,CAAC;AAQrD,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,YAAY,GAAG,cAAc,EAAE,CA+C/E"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// src/api/services/highlight.ts
|
|
2
|
+
import { buildParentMap } from '../utils/astUtils.js';
|
|
3
|
+
// 定义语义 Token 图例
|
|
4
|
+
const tokenTypes = ['variable', 'parameter', 'function'];
|
|
5
|
+
const tokenModifiers = ['declaration', 'modification', 'defaultLibrary', 'deprecated'];
|
|
6
|
+
export const legend = { tokenTypes, tokenModifiers };
|
|
7
|
+
const tokenTypeIndexMap = {
|
|
8
|
+
[13 /* SymbolKind.VARIABLE */]: 0,
|
|
9
|
+
[20 /* SymbolKind.PARAMETER */]: 1,
|
|
10
|
+
[12 /* SymbolKind.FUNCTION */]: 2,
|
|
11
|
+
};
|
|
12
|
+
export function getHighlightTokens(serviceState) {
|
|
13
|
+
const highlightTokens = [];
|
|
14
|
+
const parentMap = buildParentMap(serviceState.parseResult.program);
|
|
15
|
+
const { symbolMap } = serviceState.analyzeResult;
|
|
16
|
+
symbolMap.forEach(({ kind: symbolKind, tag: symbolTag, name: symbolName, isBuiltIn, declarations, references }) => {
|
|
17
|
+
const tokenTypeIndex = tokenTypeIndexMap[symbolKind];
|
|
18
|
+
// 收集声明
|
|
19
|
+
for (const dec of declarations) {
|
|
20
|
+
const modifiers = [tokenModifiers.indexOf('declaration')];
|
|
21
|
+
if (isBuiltIn)
|
|
22
|
+
modifiers.push(tokenModifiers.indexOf('defaultLibrary'));
|
|
23
|
+
const modBitmask = modifiers.reduce((a, b) => a | (1 << b), 0);
|
|
24
|
+
highlightTokens.push({
|
|
25
|
+
line: dec.line,
|
|
26
|
+
col: dec.col,
|
|
27
|
+
length: symbolName.length,
|
|
28
|
+
tokenType: tokenTypeIndex,
|
|
29
|
+
tokenModifiers: modBitmask,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
// 收集引用
|
|
33
|
+
for (const ref of references) {
|
|
34
|
+
const modifiers = [];
|
|
35
|
+
if (isBuiltIn)
|
|
36
|
+
modifiers.push(tokenModifiers.indexOf('defaultLibrary'));
|
|
37
|
+
if (symbolTag === 2 /* SymbolTag.DECAYED */)
|
|
38
|
+
modifiers.push(tokenModifiers.indexOf('deprecated'));
|
|
39
|
+
const parent = parentMap.get(ref);
|
|
40
|
+
if (parent?.kind === 3 /* NodeKind.AssignmentStatement */ && parent.assignee === ref) {
|
|
41
|
+
modifiers.push(tokenModifiers.indexOf('modification'));
|
|
42
|
+
}
|
|
43
|
+
const modBitmask = modifiers.reduce((a, b) => a | (1 << b), 0);
|
|
44
|
+
highlightTokens.push({
|
|
45
|
+
line: ref.line,
|
|
46
|
+
col: ref.col,
|
|
47
|
+
length: ref.symbol.length,
|
|
48
|
+
tokenType: tokenTypeIndex,
|
|
49
|
+
tokenModifiers: modBitmask,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
// 严格按照行列顺序,将收集到的 token 排序!
|
|
54
|
+
return highlightTokens.sort((a, b) => {
|
|
55
|
+
return a.line !== b.line ? a.line - b.line : a.col - b.col;
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=highlight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"highlight.js","sourceRoot":"","sources":["../../../src/api/services/highlight.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAIhC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAKtD,gBAAgB;AAChB,MAAM,UAAU,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;AACzD,MAAM,cAAc,GAAG,CAAC,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;AACvF,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC;AAErD,MAAM,iBAAiB,GAAG;IACzB,8BAAqB,EAAE,CAAC;IACxB,+BAAsB,EAAE,CAAC;IACzB,8BAAqB,EAAE,CAAC;CACsB,CAAC;AAEhD,MAAM,UAAU,kBAAkB,CAAC,YAA0B;IAC5D,MAAM,eAAe,GAAqB,EAAE,CAAC;IAE7C,MAAM,SAAS,GAAG,cAAc,CAAC,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACnE,MAAM,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC,aAAa,CAAC;IAEjD,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,EAAE;QACjH,MAAM,cAAc,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAErD,OAAO;QACP,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAChC,MAAM,SAAS,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;YAC1D,IAAI,SAAS;gBAAE,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;YACxE,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/D,eAAe,CAAC,IAAI,CAAC;gBACpB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,GAAG,EAAE,GAAG,CAAC,GAAG;gBACZ,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,SAAS,EAAE,cAAc;gBACzB,cAAc,EAAE,UAAU;aAC1B,CAAC,CAAC;QACJ,CAAC;QAED,OAAO;QACP,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAa,EAAE,CAAC;YAC/B,IAAI,SAAS;gBAAE,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;YACxE,IAAI,SAAS,8BAAsB;gBAAE,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;YAC1F,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,MAAM,EAAE,IAAI,yCAAiC,IAAI,MAAM,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;gBAC9E,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;YACxD,CAAC;YACD,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/D,eAAe,CAAC,IAAI,CAAC;gBACpB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,GAAG,EAAE,GAAG,CAAC,GAAG;gBACZ,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM;gBACzB,SAAS,EAAE,cAAc;gBACzB,cAAc,EAAE,UAAU;aAC1B,CAAC,CAAC;QACJ,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,2BAA2B;IAC3B,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACpC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;IAC5D,CAAC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ServiceState } from '../serviceState.js';
|
|
2
|
+
import type { Position } from '../utils/lspUtils.js';
|
|
3
|
+
declare const enum InlayHintKind {
|
|
4
|
+
Type = 1,
|
|
5
|
+
Parameter = 2
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* 内联提示信息结构
|
|
9
|
+
*/
|
|
10
|
+
export interface InlayHint {
|
|
11
|
+
position: Position;
|
|
12
|
+
label: string;
|
|
13
|
+
kind: InlayHintKind;
|
|
14
|
+
paddingLeft?: boolean;
|
|
15
|
+
paddingRight?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 主函数:获取源代码的内联提示
|
|
19
|
+
*/
|
|
20
|
+
export declare function getInlayHints(serviceState: ServiceState): InlayHint[];
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=inlayHints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inlayHints.d.ts","sourceRoot":"","sources":["../../../src/api/services/inlayHints.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD,mBAAW,aAAa;IACvB,IAAI,IAAI;IACR,SAAS,IAAI;CACb;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,aAAa,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;CACvB;AAgCD;;GAEG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,YAAY,GAAG,SAAS,EAAE,CAsErE"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// src/api/services/inlayHints.ts
|
|
2
|
+
import { typeNames } from '../../core/typedef.js';
|
|
3
|
+
import { buildParentMap, forEachChild } from '../utils/astUtils.js';
|
|
4
|
+
/**
|
|
5
|
+
* 辅助函数:追踪引用链找到最终的符号
|
|
6
|
+
*/
|
|
7
|
+
function findUltimateSource(symbol) {
|
|
8
|
+
while (symbol.valueRef)
|
|
9
|
+
symbol = symbol.valueRef;
|
|
10
|
+
return symbol;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* 辅助函数:从函数定义的参数块中提取参数名
|
|
14
|
+
*/
|
|
15
|
+
function extractParamNames(paramsBlock) {
|
|
16
|
+
const names = [];
|
|
17
|
+
for (const paramStmt of paramsBlock.body) {
|
|
18
|
+
if (paramStmt.kind === 2 /* NodeKind.VariableDeclaration */) {
|
|
19
|
+
names.push(paramStmt.identifier.symbol);
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
if (paramStmt.kind !== 8 /* NodeKind.ExpressionStatement */)
|
|
23
|
+
continue;
|
|
24
|
+
const expr = paramStmt.expression;
|
|
25
|
+
if (expr.kind === 13 /* NodeKind.Identifier */) {
|
|
26
|
+
names.push(expr.symbol);
|
|
27
|
+
}
|
|
28
|
+
else if (expr.kind === 23 /* NodeKind.UnaryExpression */ && expr.argument.kind === 13 /* NodeKind.Identifier */) {
|
|
29
|
+
names.push(expr.argument.symbol);
|
|
30
|
+
}
|
|
31
|
+
// 其他类型的表达式作为参数时没有名字
|
|
32
|
+
}
|
|
33
|
+
return names;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 主函数:获取源代码的内联提示
|
|
37
|
+
*/
|
|
38
|
+
export function getInlayHints(serviceState) {
|
|
39
|
+
const hints = [];
|
|
40
|
+
const ast = serviceState.parseResult.program;
|
|
41
|
+
const parentMap = buildParentMap(ast); // 构建父节点映射
|
|
42
|
+
const { symbolMap } = serviceState.analyzeResult;
|
|
43
|
+
const moveMarks = ['_' /*MOVED*/, '' /*NORMAL*/, '!' /*DECAYED*/];
|
|
44
|
+
// 生成变量类型和引用源提示
|
|
45
|
+
symbolMap.forEach((symbolInfo, node) => {
|
|
46
|
+
if (node.kind !== 13 /* NodeKind.Identifier */ || symbolInfo.kind === 12 /* SymbolKind.FUNCTION */)
|
|
47
|
+
return;
|
|
48
|
+
const { name, type, valueRef } = symbolInfo;
|
|
49
|
+
const isUnknown = type === 6 /* MeaoiuType.UNKNOWN */;
|
|
50
|
+
const isReference = !!valueRef;
|
|
51
|
+
if (isUnknown && !isReference)
|
|
52
|
+
return;
|
|
53
|
+
const { name: ultimateName, tag: ultimateTag } = findUltimateSource(symbolInfo);
|
|
54
|
+
const isUltimateNormal = ultimateTag === 0 /* SymbolTag.NORMAL */;
|
|
55
|
+
const isUltimateDecayed = ultimateTag === 2 /* SymbolTag.DECAYED */;
|
|
56
|
+
const moveMark = moveMarks[+isUltimateNormal | (+isUltimateDecayed << 1)];
|
|
57
|
+
const sourceName = ultimateName === name ? '' : `${!isUltimateNormal ? '' : '*'}${ultimateName}`;
|
|
58
|
+
const symbolType = isReference || isUnknown || isUltimateDecayed ? '' : `:${typeNames[type]}`;
|
|
59
|
+
hints.push({
|
|
60
|
+
position: { line: node.line, character: node.endCol },
|
|
61
|
+
label: `${moveMark}${sourceName}${symbolType}`,
|
|
62
|
+
kind: 1 /* InlayHintKind.Type */,
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
// 生成函数参数名提示
|
|
66
|
+
function walk(node) {
|
|
67
|
+
makeHint: if (node.kind === 18 /* NodeKind.CallExpression */ &&
|
|
68
|
+
node.args.kind === 14 /* NodeKind.BlockExpression */ &&
|
|
69
|
+
node.args.isCollection) {
|
|
70
|
+
const calleeInfo = symbolMap.get(node.callee);
|
|
71
|
+
if (calleeInfo?.kind !== 12 /* SymbolKind.FUNCTION */ || calleeInfo.isBuiltIn || !calleeInfo.declarations[0])
|
|
72
|
+
break makeHint;
|
|
73
|
+
// 从父节点映射找到 FunctionDeclaration
|
|
74
|
+
const funcDecNode = parentMap.get(calleeInfo.declarations[0]);
|
|
75
|
+
if (funcDecNode?.kind !== 4 /* NodeKind.FunctionDeclaration */)
|
|
76
|
+
break makeHint;
|
|
77
|
+
const paramNames = extractParamNames(funcDecNode.parameters);
|
|
78
|
+
const limit = Math.min(node.args.body.length, paramNames.length);
|
|
79
|
+
for (let i = 0; i < limit; i++) {
|
|
80
|
+
const { line, col: character } = node.args.body[i];
|
|
81
|
+
hints.push({
|
|
82
|
+
position: { line, character },
|
|
83
|
+
label: `${paramNames[i]}:`,
|
|
84
|
+
kind: 2 /* InlayHintKind.Parameter */,
|
|
85
|
+
paddingRight: true,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// 递归遍历子节点
|
|
90
|
+
forEachChild(node, walk);
|
|
91
|
+
}
|
|
92
|
+
walk(ast);
|
|
93
|
+
// 按位置排序,确保编辑器能正确显示
|
|
94
|
+
return hints.sort((a, b) => {
|
|
95
|
+
return a.position.line !== b.position.line
|
|
96
|
+
? a.position.line - b.position.line
|
|
97
|
+
: a.position.character - b.position.character;
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=inlayHints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inlayHints.js","sourceRoot":"","sources":["../../../src/api/services/inlayHints.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type * as AST from '../../core/ast.js';
|
|
2
|
+
import type { ServiceState } from '../serviceState.js';
|
|
3
|
+
import { type Position, type Range } from '../utils/lspUtils.js';
|
|
4
|
+
import { type SymbolInfo } from '../utils/symbolTable.js';
|
|
5
|
+
type MarkupKind = 'plaintext' | 'markdown';
|
|
6
|
+
type HoverInfo = {
|
|
7
|
+
contents: {
|
|
8
|
+
kind: MarkupKind;
|
|
9
|
+
value: string;
|
|
10
|
+
};
|
|
11
|
+
range: Range;
|
|
12
|
+
};
|
|
13
|
+
export declare function getHoverInfo(serviceState: ServiceState, { line, character: col }: Position, contentsKind?: MarkupKind): HoverInfo | undefined;
|
|
14
|
+
export declare function findDefinition(serviceState: ServiceState, { line, character: col }: Position): SymbolInfo | undefined;
|
|
15
|
+
export declare function findReferences(serviceState: ServiceState, position: Position): AST.Identifier[];
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/api/services/search.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,GAAG,MAAM,mBAAmB,CAAC;AAE9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAgC,KAAK,QAAQ,EAAE,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC/F,OAAO,EAAyB,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGjF,KAAK,UAAU,GAAG,WAAW,GAAG,UAAU,CAAC;AAC3C,KAAK,SAAS,GAAG;IAChB,QAAQ,EAAE;QACT,IAAI,EAAE,UAAU,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACd,CAAC;IACF,KAAK,EAAE,KAAK,CAAC;CACb,CAAC;AAYF,wBAAgB,YAAY,CAC3B,YAAY,EAAE,YAAY,EAC1B,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,QAAQ,EAClC,YAAY,GAAE,UAAuB,GACnC,SAAS,GAAG,SAAS,CAcvB;AAGD,wBAAgB,cAAc,CAAC,YAAY,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAGrH;AAGD,wBAAgB,cAAc,CAAC,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,GAAG,GAAG,CAAC,UAAU,EAAE,CAG/F"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// src/api/services/search.ts
|
|
2
|
+
import { typeNames } from '../../core/typedef.js';
|
|
3
|
+
import { findIdentifierAt } from '../utils/astUtils.js';
|
|
4
|
+
import { rangeOf } from '../utils/lspUtils.js';
|
|
5
|
+
function HoverInfoFrom(location, value, kind) {
|
|
6
|
+
return { contents: { kind, value }, range: rangeOf(location) };
|
|
7
|
+
}
|
|
8
|
+
const kindMap = {
|
|
9
|
+
[12 /* SymbolKind.FUNCTION */]: 'function',
|
|
10
|
+
[13 /* SymbolKind.VARIABLE */]: 'variable',
|
|
11
|
+
[20 /* SymbolKind.PARAMETER */]: 'parameter',
|
|
12
|
+
};
|
|
13
|
+
export function getHoverInfo(serviceState, { line, character: col }, contentsKind = 'markdown') {
|
|
14
|
+
const identifierNode = findIdentifierAt(serviceState.parseResult.program, line, col);
|
|
15
|
+
if (!identifierNode)
|
|
16
|
+
return undefined;
|
|
17
|
+
const symbolInfo = serviceState.analyzeResult.symbolMap.get(identifierNode);
|
|
18
|
+
if (!symbolInfo)
|
|
19
|
+
return undefined;
|
|
20
|
+
const { name, kind, type, tag, declarations } = symbolInfo;
|
|
21
|
+
const declaration = declarations[0];
|
|
22
|
+
const text = `**(${kindMap[kind] ?? 'unknown'}) ${name} : ${typeNames[type]}**${tag === 1 /* SymbolTag.MOVED */ ? '\n\n(被标记为已移动)' : tag === 2 /* SymbolTag.DECAYED */ ? '\n\n(源已被移走,不可用)' : ''}\n\n${declaration ? `在 L${declaration.line}:${declaration.col} 处声明` : `(这是一个内置计谋)`}`;
|
|
23
|
+
return HoverInfoFrom(identifierNode, text, contentsKind);
|
|
24
|
+
}
|
|
25
|
+
// 查找定义
|
|
26
|
+
export function findDefinition(serviceState, { line, character: col }) {
|
|
27
|
+
const identifierNode = findIdentifierAt(serviceState.parseResult.program, line, col);
|
|
28
|
+
return identifierNode ? serviceState.analyzeResult.symbolMap.get(identifierNode) : undefined;
|
|
29
|
+
}
|
|
30
|
+
// 查找引用
|
|
31
|
+
export function findReferences(serviceState, position) {
|
|
32
|
+
const symbolInfo = findDefinition(serviceState, position);
|
|
33
|
+
return symbolInfo ? [...symbolInfo.declarations, ...symbolInfo.references] : [];
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/api/services/search.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAG7B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,OAAO,EAAkD,MAAM,sBAAsB,CAAC;AAa/F,SAAS,aAAa,CAAC,QAAwB,EAAE,KAAa,EAAE,IAAgB;IAC/E,OAAO,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,OAAO,GAAG;IACf,8BAAqB,EAAE,UAAU;IACjC,8BAAqB,EAAE,UAAU;IACjC,+BAAsB,EAAE,WAAW;CACW,CAAC;AAEhD,MAAM,UAAU,YAAY,CAC3B,YAA0B,EAC1B,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAY,EAClC,eAA2B,UAAU;IAErC,MAAM,cAAc,GAAG,gBAAgB,CAAC,YAAY,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IACrF,IAAI,CAAC,cAAc;QAAE,OAAO,SAAS,CAAC;IACtC,MAAM,UAAU,GAAG,YAAY,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5E,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAElC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC;IAC3D,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAEpC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,SAAS,KAAK,IAAI,MAAM,SAAS,CAAC,IAAI,CAAC,KAC1E,GAAG,4BAAoB,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,8BAAsB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAC7F,OAAO,WAAW,CAAC,CAAC,CAAC,MAAM,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC;IAEtF,OAAO,aAAa,CAAC,cAAc,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;AAC1D,CAAC;AAED,OAAO;AACP,MAAM,UAAU,cAAc,CAAC,YAA0B,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAY;IAC5F,MAAM,cAAc,GAAG,gBAAgB,CAAC,YAAY,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IACrF,OAAO,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9F,CAAC;AAED,OAAO;AACP,MAAM,UAAU,cAAc,CAAC,YAA0B,EAAE,QAAkB;IAC5E,MAAM,UAAU,GAAG,cAAc,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC1D,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,YAAY,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACjF,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type * as AST from '../../core/ast.js';
|
|
2
|
+
export declare function forEachChild(node: AST.Node, action: (child: AST.Node) => void): void;
|
|
3
|
+
/**
|
|
4
|
+
* 在 AST 中,根据给定的行和列,查找对应的标识符节点
|
|
5
|
+
* @param ast 要遍历的 AST 根节点
|
|
6
|
+
* @param line 行号
|
|
7
|
+
* @param col 列号
|
|
8
|
+
*/
|
|
9
|
+
export declare function findIdentifierAt(ast: AST.Node, line: number, col: number): AST.Identifier | undefined;
|
|
10
|
+
export declare function buildParentMap(node: AST.Node): WeakMap<AST.Node, AST.Node>;
|
|
11
|
+
//# sourceMappingURL=astUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"astUtils.d.ts","sourceRoot":"","sources":["../../../src/api/utils/astUtils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,GAAG,MAAM,mBAAmB,CAAC;AAG9C,wBAAgB,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,KAAK,IAAI,GAAG,IAAI,CAqEpF;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,UAAU,GAAG,SAAS,CAiBrG;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAS1E"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// src/api/utils/astUtils.ts
|
|
2
|
+
export function forEachChild(node, action) {
|
|
3
|
+
switch (node.kind) {
|
|
4
|
+
case 1 /* NodeKind.Program */:
|
|
5
|
+
case 14 /* NodeKind.BlockExpression */:
|
|
6
|
+
node.body.forEach(action);
|
|
7
|
+
break;
|
|
8
|
+
case 2 /* NodeKind.VariableDeclaration */:
|
|
9
|
+
action(node.identifier);
|
|
10
|
+
if (node.initialization)
|
|
11
|
+
action(node.initialization);
|
|
12
|
+
break;
|
|
13
|
+
case 3 /* NodeKind.AssignmentStatement */:
|
|
14
|
+
action(node.assignee);
|
|
15
|
+
action(node.value);
|
|
16
|
+
break;
|
|
17
|
+
case 4 /* NodeKind.FunctionDeclaration */:
|
|
18
|
+
action(node.name);
|
|
19
|
+
action(node.parameters);
|
|
20
|
+
action(node.body);
|
|
21
|
+
break;
|
|
22
|
+
case 5 /* NodeKind.ReturnStatement */:
|
|
23
|
+
case 6 /* NodeKind.AmbushStatement */:
|
|
24
|
+
if (node.argument)
|
|
25
|
+
action(node.argument);
|
|
26
|
+
break;
|
|
27
|
+
case 8 /* NodeKind.ExpressionStatement */:
|
|
28
|
+
action(node.expression);
|
|
29
|
+
break;
|
|
30
|
+
case 15 /* NodeKind.IfExpression */:
|
|
31
|
+
action(node.condition);
|
|
32
|
+
action(node.consequent);
|
|
33
|
+
if (node.alternate)
|
|
34
|
+
action(node.alternate);
|
|
35
|
+
break;
|
|
36
|
+
case 16 /* NodeKind.LoopExpression */:
|
|
37
|
+
action(node.body);
|
|
38
|
+
break;
|
|
39
|
+
case 18 /* NodeKind.CallExpression */:
|
|
40
|
+
action(node.callee);
|
|
41
|
+
action(node.args);
|
|
42
|
+
break;
|
|
43
|
+
case 22 /* NodeKind.MemberAccessExpression */:
|
|
44
|
+
action(node.object);
|
|
45
|
+
action(node.property);
|
|
46
|
+
break;
|
|
47
|
+
case 23 /* NodeKind.UnaryExpression */:
|
|
48
|
+
action(node.argument);
|
|
49
|
+
break;
|
|
50
|
+
case 17 /* NodeKind.ArithmeticExpression */:
|
|
51
|
+
case 20 /* NodeKind.LogicalExpression */:
|
|
52
|
+
action(node.left);
|
|
53
|
+
action(node.right);
|
|
54
|
+
break;
|
|
55
|
+
case 21 /* NodeKind.ComparisonExpression */:
|
|
56
|
+
node.expressions.forEach(action);
|
|
57
|
+
break;
|
|
58
|
+
case 19 /* NodeKind.SequenceExpression */:
|
|
59
|
+
node.sections.forEach(action);
|
|
60
|
+
break;
|
|
61
|
+
case 7 /* NodeKind.BreakStatement */:
|
|
62
|
+
case 9 /* NodeKind.NumericLiteral */:
|
|
63
|
+
case 10 /* NodeKind.StringLiteral */:
|
|
64
|
+
case 11 /* NodeKind.BooleanLiteral */:
|
|
65
|
+
case 12 /* NodeKind.NullLiteral */:
|
|
66
|
+
case 13 /* NodeKind.Identifier */:
|
|
67
|
+
case 0 /* NodeKind.ErrorNode */:
|
|
68
|
+
break;
|
|
69
|
+
default: {
|
|
70
|
+
const _n = node;
|
|
71
|
+
console.error(`未识别的节点: ${_n}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* 在 AST 中,根据给定的行和列,查找对应的标识符节点
|
|
77
|
+
* @param ast 要遍历的 AST 根节点
|
|
78
|
+
* @param line 行号
|
|
79
|
+
* @param col 列号
|
|
80
|
+
*/
|
|
81
|
+
export function findIdentifierAt(ast, line, col) {
|
|
82
|
+
let found;
|
|
83
|
+
function walk(node) {
|
|
84
|
+
if (found)
|
|
85
|
+
return;
|
|
86
|
+
if (node.kind === 13 /* NodeKind.Identifier */ && node.line === line && node.col <= col && col < node.endCol) {
|
|
87
|
+
found = node;
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
// 递归遍历所有子节点
|
|
91
|
+
forEachChild(node, walk);
|
|
92
|
+
}
|
|
93
|
+
walk(ast);
|
|
94
|
+
return found;
|
|
95
|
+
}
|
|
96
|
+
export function buildParentMap(node) {
|
|
97
|
+
const parentMap = new WeakMap();
|
|
98
|
+
function build(node, parent) {
|
|
99
|
+
if (parent)
|
|
100
|
+
parentMap.set(node, parent);
|
|
101
|
+
forEachChild(node, child => build(child, node));
|
|
102
|
+
}
|
|
103
|
+
build(node);
|
|
104
|
+
return parentMap;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=astUtils.js.map
|