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.
Files changed (132) hide show
  1. package/LANGUAGE_GUIDE.md +511 -0
  2. package/LICENSE +21 -0
  3. package/README.md +336 -0
  4. package/dist/api/execution.d.ts +9 -0
  5. package/dist/api/execution.d.ts.map +1 -0
  6. package/dist/api/execution.js +17 -0
  7. package/dist/api/execution.js.map +1 -0
  8. package/dist/api/serviceState.d.ts +24 -0
  9. package/dist/api/serviceState.d.ts.map +1 -0
  10. package/dist/api/serviceState.js +53 -0
  11. package/dist/api/serviceState.js.map +1 -0
  12. package/dist/api/services/completions.d.ts +15 -0
  13. package/dist/api/services/completions.d.ts.map +1 -0
  14. package/dist/api/services/completions.js +48 -0
  15. package/dist/api/services/completions.js.map +1 -0
  16. package/dist/api/services/diagnostics.d.ts +9 -0
  17. package/dist/api/services/diagnostics.d.ts.map +1 -0
  18. package/dist/api/services/diagnostics.js +5 -0
  19. package/dist/api/services/diagnostics.js.map +1 -0
  20. package/dist/api/services/formatting.d.ts +2 -0
  21. package/dist/api/services/formatting.d.ts.map +1 -0
  22. package/dist/api/services/formatting.js +223 -0
  23. package/dist/api/services/formatting.js.map +1 -0
  24. package/dist/api/services/highlight.d.ts +14 -0
  25. package/dist/api/services/highlight.d.ts.map +1 -0
  26. package/dist/api/services/highlight.js +58 -0
  27. package/dist/api/services/highlight.js.map +1 -0
  28. package/dist/api/services/inlayHints.d.ts +22 -0
  29. package/dist/api/services/inlayHints.d.ts.map +1 -0
  30. package/dist/api/services/inlayHints.js +100 -0
  31. package/dist/api/services/inlayHints.js.map +1 -0
  32. package/dist/api/services/search.d.ts +17 -0
  33. package/dist/api/services/search.d.ts.map +1 -0
  34. package/dist/api/services/search.js +35 -0
  35. package/dist/api/services/search.js.map +1 -0
  36. package/dist/api/utils/astUtils.d.ts +11 -0
  37. package/dist/api/utils/astUtils.d.ts.map +1 -0
  38. package/dist/api/utils/astUtils.js +106 -0
  39. package/dist/api/utils/astUtils.js.map +1 -0
  40. package/dist/api/utils/lspUtils.d.ts +16 -0
  41. package/dist/api/utils/lspUtils.d.ts.map +1 -0
  42. package/dist/api/utils/lspUtils.js +5 -0
  43. package/dist/api/utils/lspUtils.js.map +1 -0
  44. package/dist/api/utils/symbolAnalyzer.d.ts +37 -0
  45. package/dist/api/utils/symbolAnalyzer.d.ts.map +1 -0
  46. package/dist/api/utils/symbolAnalyzer.js +440 -0
  47. package/dist/api/utils/symbolAnalyzer.js.map +1 -0
  48. package/dist/api/utils/symbolTable.d.ts +28 -0
  49. package/dist/api/utils/symbolTable.d.ts.map +1 -0
  50. package/dist/api/utils/symbolTable.js +3 -0
  51. package/dist/api/utils/symbolTable.js.map +1 -0
  52. package/dist/cli/main.d.ts +3 -0
  53. package/dist/cli/main.d.ts.map +1 -0
  54. package/dist/cli/main.js +92 -0
  55. package/dist/cli/main.js.map +1 -0
  56. package/dist/cli/tools/completer.d.ts +2 -0
  57. package/dist/cli/tools/completer.d.ts.map +1 -0
  58. package/dist/cli/tools/completer.js +24 -0
  59. package/dist/cli/tools/completer.js.map +1 -0
  60. package/dist/cli/tools/diagnoser.d.ts +2 -0
  61. package/dist/cli/tools/diagnoser.d.ts.map +1 -0
  62. package/dist/cli/tools/diagnoser.js +29 -0
  63. package/dist/cli/tools/diagnoser.js.map +1 -0
  64. package/dist/cli/tools/formatter.d.ts +2 -0
  65. package/dist/cli/tools/formatter.d.ts.map +1 -0
  66. package/dist/cli/tools/formatter.js +27 -0
  67. package/dist/cli/tools/formatter.js.map +1 -0
  68. package/dist/cli/tools/searcher.d.ts +4 -0
  69. package/dist/cli/tools/searcher.d.ts.map +1 -0
  70. package/dist/cli/tools/searcher.js +30 -0
  71. package/dist/cli/tools/searcher.js.map +1 -0
  72. package/dist/cli/tools/starter.d.ts +3 -0
  73. package/dist/cli/tools/starter.d.ts.map +1 -0
  74. package/dist/cli/tools/starter.js +23 -0
  75. package/dist/cli/tools/starter.js.map +1 -0
  76. package/dist/cli/tools/toolUtils.d.ts +8 -0
  77. package/dist/cli/tools/toolUtils.d.ts.map +1 -0
  78. package/dist/cli/tools/toolUtils.js +52 -0
  79. package/dist/cli/tools/toolUtils.js.map +1 -0
  80. package/dist/core/ast.d.ts +140 -0
  81. package/dist/core/ast.d.ts.map +1 -0
  82. package/dist/core/ast.js +3 -0
  83. package/dist/core/ast.js.map +1 -0
  84. package/dist/core/builtIns.d.ts +15 -0
  85. package/dist/core/builtIns.d.ts.map +1 -0
  86. package/dist/core/builtIns.js +175 -0
  87. package/dist/core/builtIns.js.map +1 -0
  88. package/dist/core/error.d.ts +41 -0
  89. package/dist/core/error.d.ts.map +1 -0
  90. package/dist/core/error.js +63 -0
  91. package/dist/core/error.js.map +1 -0
  92. package/dist/core/parser.d.ts +89 -0
  93. package/dist/core/parser.d.ts.map +1 -0
  94. package/dist/core/parser.js +578 -0
  95. package/dist/core/parser.js.map +1 -0
  96. package/dist/core/preprocessor.d.ts +2 -0
  97. package/dist/core/preprocessor.d.ts.map +1 -0
  98. package/dist/core/preprocessor.js +187 -0
  99. package/dist/core/preprocessor.js.map +1 -0
  100. package/dist/core/run/environment.d.ts +43 -0
  101. package/dist/core/run/environment.d.ts.map +1 -0
  102. package/dist/core/run/environment.js +192 -0
  103. package/dist/core/run/environment.js.map +1 -0
  104. package/dist/core/run/interpreter.d.ts +13 -0
  105. package/dist/core/run/interpreter.d.ts.map +1 -0
  106. package/dist/core/run/interpreter.js +415 -0
  107. package/dist/core/run/interpreter.js.map +1 -0
  108. package/dist/core/run/io.d.ts +18 -0
  109. package/dist/core/run/io.d.ts.map +1 -0
  110. package/dist/core/run/io.js +34 -0
  111. package/dist/core/run/io.js.map +1 -0
  112. package/dist/core/run/logger.d.ts +12 -0
  113. package/dist/core/run/logger.d.ts.map +1 -0
  114. package/dist/core/run/logger.js +17 -0
  115. package/dist/core/run/logger.js.map +1 -0
  116. package/dist/core/run/value.d.ts +41 -0
  117. package/dist/core/run/value.d.ts.map +1 -0
  118. package/dist/core/run/value.js +37 -0
  119. package/dist/core/run/value.js.map +1 -0
  120. package/dist/core/tokenizer.d.ts +82 -0
  121. package/dist/core/tokenizer.d.ts.map +1 -0
  122. package/dist/core/tokenizer.js +277 -0
  123. package/dist/core/tokenizer.js.map +1 -0
  124. package/dist/core/typedef.d.ts +32 -0
  125. package/dist/core/typedef.d.ts.map +1 -0
  126. package/dist/core/typedef.js +67 -0
  127. package/dist/core/typedef.js.map +1 -0
  128. package/dist/index.d.ts +12 -0
  129. package/dist/index.d.ts.map +1 -0
  130. package/dist/index.js +13 -0
  131. package/dist/index.js.map +1 -0
  132. 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":"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"}
@@ -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