@boristype/bt-ir 0.1.0-alpha.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/LICENSE +21 -0
- package/README.md +338 -0
- package/build/analyzer/index.d.ts +7 -0
- package/build/analyzer/index.d.ts.map +1 -0
- package/build/analyzer/index.js +7 -0
- package/build/analyzer/index.js.map +1 -0
- package/build/analyzer/scope-analyzer.d.ts +88 -0
- package/build/analyzer/scope-analyzer.d.ts.map +1 -0
- package/build/analyzer/scope-analyzer.js +565 -0
- package/build/analyzer/scope-analyzer.js.map +1 -0
- package/build/cli.d.ts +10 -0
- package/build/cli.d.ts.map +1 -0
- package/build/cli.js +96 -0
- package/build/cli.js.map +1 -0
- package/build/emitter/bt-emitter.d.ts +31 -0
- package/build/emitter/bt-emitter.d.ts.map +1 -0
- package/build/emitter/bt-emitter.js +919 -0
- package/build/emitter/bt-emitter.js.map +1 -0
- package/build/emitter/index.d.ts +7 -0
- package/build/emitter/index.d.ts.map +1 -0
- package/build/emitter/index.js +7 -0
- package/build/emitter/index.js.map +1 -0
- package/build/index.d.ts +25 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +24 -0
- package/build/index.js.map +1 -0
- package/build/ir/builders.d.ts +235 -0
- package/build/ir/builders.d.ts.map +1 -0
- package/build/ir/builders.js +387 -0
- package/build/ir/builders.js.map +1 -0
- package/build/ir/index.d.ts +8 -0
- package/build/ir/index.d.ts.map +1 -0
- package/build/ir/index.js +8 -0
- package/build/ir/index.js.map +1 -0
- package/build/ir/nodes.d.ts +596 -0
- package/build/ir/nodes.d.ts.map +1 -0
- package/build/ir/nodes.js +16 -0
- package/build/ir/nodes.js.map +1 -0
- package/build/lowering/bare-visitors.d.ts +72 -0
- package/build/lowering/bare-visitors.d.ts.map +1 -0
- package/build/lowering/bare-visitors.js +287 -0
- package/build/lowering/bare-visitors.js.map +1 -0
- package/build/lowering/binding.d.ts +127 -0
- package/build/lowering/binding.d.ts.map +1 -0
- package/build/lowering/binding.js +194 -0
- package/build/lowering/binding.js.map +1 -0
- package/build/lowering/expressions.d.ts +106 -0
- package/build/lowering/expressions.d.ts.map +1 -0
- package/build/lowering/expressions.js +1172 -0
- package/build/lowering/expressions.js.map +1 -0
- package/build/lowering/function-builder.d.ts +111 -0
- package/build/lowering/function-builder.d.ts.map +1 -0
- package/build/lowering/function-builder.js +111 -0
- package/build/lowering/function-builder.js.map +1 -0
- package/build/lowering/helpers.d.ts +88 -0
- package/build/lowering/helpers.d.ts.map +1 -0
- package/build/lowering/helpers.js +347 -0
- package/build/lowering/helpers.js.map +1 -0
- package/build/lowering/index.d.ts +21 -0
- package/build/lowering/index.d.ts.map +1 -0
- package/build/lowering/index.js +28 -0
- package/build/lowering/index.js.map +1 -0
- package/build/lowering/precedence.d.ts +18 -0
- package/build/lowering/precedence.d.ts.map +1 -0
- package/build/lowering/precedence.js +104 -0
- package/build/lowering/precedence.js.map +1 -0
- package/build/lowering/spread-helpers.d.ts +12 -0
- package/build/lowering/spread-helpers.d.ts.map +1 -0
- package/build/lowering/spread-helpers.js +32 -0
- package/build/lowering/spread-helpers.js.map +1 -0
- package/build/lowering/statements.d.ts +85 -0
- package/build/lowering/statements.d.ts.map +1 -0
- package/build/lowering/statements.js +713 -0
- package/build/lowering/statements.js.map +1 -0
- package/build/lowering/visitor.d.ts +121 -0
- package/build/lowering/visitor.d.ts.map +1 -0
- package/build/lowering/visitor.js +165 -0
- package/build/lowering/visitor.js.map +1 -0
- package/build/pipeline/index.d.ts +84 -0
- package/build/pipeline/index.d.ts.map +1 -0
- package/build/pipeline/index.js +224 -0
- package/build/pipeline/index.js.map +1 -0
- package/build/polyfill-spec.d.ts +18 -0
- package/build/polyfill-spec.d.ts.map +1 -0
- package/build/polyfill-spec.js +26 -0
- package/build/polyfill-spec.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bare Mode Visitors — упрощённые visitors для режима bare
|
|
3
|
+
*
|
|
4
|
+
* В bare mode транспиляция почти 1:1:
|
|
5
|
+
* - let/const → var
|
|
6
|
+
* - Типы и импорты вырезаются
|
|
7
|
+
* - Функции остаются с оригинальной сигнатурой (без __env/__this/__args)
|
|
8
|
+
* - Нет captured variables, env/desc, bt.getProperty/bt.setProperty
|
|
9
|
+
* - export namespace X { ... } → "META:NAMESPACE:X"; + содержимое наружу
|
|
10
|
+
*
|
|
11
|
+
* @module lowering/bare-visitors
|
|
12
|
+
*/
|
|
13
|
+
import * as ts from "typescript";
|
|
14
|
+
import { type IRStatement, type IRExpression } from "../ir/index.ts";
|
|
15
|
+
import type { VisitorContext } from "./visitor.ts";
|
|
16
|
+
/**
|
|
17
|
+
* Обрабатывает объявление функции в bare mode.
|
|
18
|
+
* Генерирует plain function с оригинальными параметрами, без env/desc.
|
|
19
|
+
*
|
|
20
|
+
* @param node - TypeScript FunctionDeclaration
|
|
21
|
+
* @param ctx - VisitorContext (mode === "bare")
|
|
22
|
+
* @returns IR statements (одно объявление функции)
|
|
23
|
+
*/
|
|
24
|
+
export declare function visitBareFunctionDeclaration(node: ts.FunctionDeclaration, ctx: VisitorContext): IRStatement[] | null;
|
|
25
|
+
/**
|
|
26
|
+
* Обрабатывает объявление переменной в bare mode.
|
|
27
|
+
* Просто генерирует var name = init; без captured/env логики.
|
|
28
|
+
*
|
|
29
|
+
* @param node - TypeScript VariableStatement
|
|
30
|
+
* @param ctx - VisitorContext (mode === "bare")
|
|
31
|
+
* @returns IR statements
|
|
32
|
+
*/
|
|
33
|
+
export declare function visitBareVariableStatement(node: ts.VariableStatement, ctx: VisitorContext): IRStatement | IRStatement[] | null;
|
|
34
|
+
/**
|
|
35
|
+
* Обрабатывает export namespace X { ... } в bare mode.
|
|
36
|
+
* Генерирует "META:NAMESPACE:X"; + все statements из тела namespace.
|
|
37
|
+
*
|
|
38
|
+
* @param node - TypeScript ModuleDeclaration
|
|
39
|
+
* @param ctx - VisitorContext (mode === "bare")
|
|
40
|
+
* @returns IR statements
|
|
41
|
+
*/
|
|
42
|
+
export declare function visitBareNamespaceDeclaration(node: ts.ModuleDeclaration, ctx: VisitorContext): IRStatement[] | null;
|
|
43
|
+
/**
|
|
44
|
+
* Обрабатывает arrow function в bare mode.
|
|
45
|
+
* Генерирует plain function с оригинальными параметрами.
|
|
46
|
+
* Arrow → именованная функция, hoisted в pendingStatements.
|
|
47
|
+
*
|
|
48
|
+
* @param node - TypeScript ArrowFunction
|
|
49
|
+
* @param ctx - VisitorContext (mode === "bare")
|
|
50
|
+
* @returns IR expression (ссылка на имя функции)
|
|
51
|
+
*/
|
|
52
|
+
export declare function visitBareArrowFunction(node: ts.ArrowFunction, ctx: VisitorContext): IRExpression;
|
|
53
|
+
/**
|
|
54
|
+
* Обрабатывает function expression в bare mode.
|
|
55
|
+
* Генерирует plain function, hoisted в pendingStatements.
|
|
56
|
+
*
|
|
57
|
+
* @param node - TypeScript FunctionExpression
|
|
58
|
+
* @param ctx - VisitorContext (mode === "bare")
|
|
59
|
+
* @returns IR expression (ссылка на имя функции)
|
|
60
|
+
*/
|
|
61
|
+
export declare function visitBareFunctionExpression(node: ts.FunctionExpression, ctx: VisitorContext): IRExpression;
|
|
62
|
+
/**
|
|
63
|
+
* Обрабатывает метод объекта в bare mode.
|
|
64
|
+
* Генерирует plain function, hoisted в pendingStatements.
|
|
65
|
+
* Возвращает имя функции для использования в свойстве объекта.
|
|
66
|
+
*
|
|
67
|
+
* @param prop - TypeScript MethodDeclaration
|
|
68
|
+
* @param ctx - VisitorContext (mode === "bare")
|
|
69
|
+
* @returns имя сгенерированной функции
|
|
70
|
+
*/
|
|
71
|
+
export declare function visitBareObjectMethod(prop: ts.MethodDeclaration, ctx: VisitorContext): string;
|
|
72
|
+
//# sourceMappingURL=bare-visitors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bare-visitors.d.ts","sourceRoot":"","sources":["../../src/lowering/bare-visitors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,YAAY,EAElB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AASnD;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,EAAE,CAAC,mBAAmB,EAC5B,GAAG,EAAE,cAAc,GAClB,WAAW,EAAE,GAAG,IAAI,CA0BtB;AAMD;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,EAAE,CAAC,iBAAiB,EAC1B,GAAG,EAAE,cAAc,GAClB,WAAW,GAAG,WAAW,EAAE,GAAG,IAAI,CAgEpC;AAMD;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,EAAE,CAAC,iBAAiB,EAC1B,GAAG,EAAE,cAAc,GAClB,WAAW,EAAE,GAAG,IAAI,CAsBtB;AAMD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,EAAE,CAAC,aAAa,EACtB,GAAG,EAAE,cAAc,GAClB,YAAY,CA0Bd;AAMD;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,EAAE,CAAC,kBAAkB,EAC3B,GAAG,EAAE,cAAc,GAClB,YAAY,CAoBd;AAMD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,EAAE,CAAC,iBAAiB,EAC1B,GAAG,EAAE,cAAc,GAClB,MAAM,CAqBR"}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bare Mode Visitors — упрощённые visitors для режима bare
|
|
3
|
+
*
|
|
4
|
+
* В bare mode транспиляция почти 1:1:
|
|
5
|
+
* - let/const → var
|
|
6
|
+
* - Типы и импорты вырезаются
|
|
7
|
+
* - Функции остаются с оригинальной сигнатурой (без __env/__this/__args)
|
|
8
|
+
* - Нет captured variables, env/desc, bt.getProperty/bt.setProperty
|
|
9
|
+
* - export namespace X { ... } → "META:NAMESPACE:X"; + содержимое наружу
|
|
10
|
+
*
|
|
11
|
+
* @module lowering/bare-visitors
|
|
12
|
+
*/
|
|
13
|
+
import * as ts from "typescript";
|
|
14
|
+
import { IR, } from "../ir/index.js";
|
|
15
|
+
import { visitExpression } from "./expressions.js";
|
|
16
|
+
import { visitStatementList, visitStatement } from "./statements.js";
|
|
17
|
+
import { getLoc } from "./helpers.js";
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// Bare Function Declaration
|
|
20
|
+
// ============================================================================
|
|
21
|
+
/**
|
|
22
|
+
* Обрабатывает объявление функции в bare mode.
|
|
23
|
+
* Генерирует plain function с оригинальными параметрами, без env/desc.
|
|
24
|
+
*
|
|
25
|
+
* @param node - TypeScript FunctionDeclaration
|
|
26
|
+
* @param ctx - VisitorContext (mode === "bare")
|
|
27
|
+
* @returns IR statements (одно объявление функции)
|
|
28
|
+
*/
|
|
29
|
+
export function visitBareFunctionDeclaration(node, ctx) {
|
|
30
|
+
if (!node.name || !node.body) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
const name = node.name.text;
|
|
34
|
+
const params = collectBareParams(node.parameters, ctx);
|
|
35
|
+
// Создаём дочерний контекст без captured/env логики
|
|
36
|
+
const fnCtx = createBareFnCtx(node, ctx);
|
|
37
|
+
// Регистрируем параметры для дочернего контекста (не используется в bare,
|
|
38
|
+
// но нужно чтобы visitIdentifier не ломался)
|
|
39
|
+
node.parameters.forEach((param, index) => {
|
|
40
|
+
if (ts.isIdentifier(param.name)) {
|
|
41
|
+
fnCtx.functionParams.set(param.name.text, index);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
const body = visitStatementList(node.body.statements, fnCtx);
|
|
45
|
+
// pending statements из тела (вложенные функции и т.п.)
|
|
46
|
+
const fullBody = fnCtx.pendingStatements.length > 0
|
|
47
|
+
? [...fnCtx.pendingStatements, ...body]
|
|
48
|
+
: body;
|
|
49
|
+
return [IR.functionDecl(name, params, fullBody, getLoc(node, ctx), true)];
|
|
50
|
+
}
|
|
51
|
+
// ============================================================================
|
|
52
|
+
// Bare Variable Statement
|
|
53
|
+
// ============================================================================
|
|
54
|
+
/**
|
|
55
|
+
* Обрабатывает объявление переменной в bare mode.
|
|
56
|
+
* Просто генерирует var name = init; без captured/env логики.
|
|
57
|
+
*
|
|
58
|
+
* @param node - TypeScript VariableStatement
|
|
59
|
+
* @param ctx - VisitorContext (mode === "bare")
|
|
60
|
+
* @returns IR statements
|
|
61
|
+
*/
|
|
62
|
+
export function visitBareVariableStatement(node, ctx) {
|
|
63
|
+
// Ambient declarations (declare var/let/const) — strip completely
|
|
64
|
+
if (node.modifiers?.some(m => m.kind === ts.SyntaxKind.DeclareKeyword)) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
const results = [];
|
|
68
|
+
for (const decl of node.declarationList.declarations) {
|
|
69
|
+
if (ts.isIdentifier(decl.name)) {
|
|
70
|
+
const varName = decl.name.text;
|
|
71
|
+
const init = decl.initializer ? visitExpression(decl.initializer, ctx) : null;
|
|
72
|
+
results.push(IR.varDecl(varName, init, getLoc(decl, ctx)));
|
|
73
|
+
}
|
|
74
|
+
// Деструктуризация объекта: const { a, b } = obj
|
|
75
|
+
else if (ts.isObjectBindingPattern(decl.name) && decl.initializer) {
|
|
76
|
+
const init = visitExpression(decl.initializer, ctx);
|
|
77
|
+
for (const element of decl.name.elements) {
|
|
78
|
+
if (ts.isBindingElement(element) && ts.isIdentifier(element.name)) {
|
|
79
|
+
if (element.dotDotDotToken) {
|
|
80
|
+
// rest не поддерживается в bare
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
const propertyName = element.propertyName
|
|
84
|
+
? element.propertyName.text
|
|
85
|
+
: element.name.text;
|
|
86
|
+
const variableName = element.name.text;
|
|
87
|
+
const val = IR.dot(init, propertyName, getLoc(decl, ctx));
|
|
88
|
+
const initExpr = element.initializer
|
|
89
|
+
? IR.conditional(IR.binary("!==", val, IR.id("undefined")), val, visitExpression(element.initializer, ctx), getLoc(decl, ctx))
|
|
90
|
+
: val;
|
|
91
|
+
results.push(IR.varDecl(variableName, initExpr, getLoc(decl, ctx)));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Деструктуризация массива: const [a, b] = arr
|
|
96
|
+
else if (ts.isArrayBindingPattern(decl.name) && decl.initializer) {
|
|
97
|
+
const init = visitExpression(decl.initializer, ctx);
|
|
98
|
+
let index = 0;
|
|
99
|
+
for (const element of decl.name.elements) {
|
|
100
|
+
if (ts.isOmittedExpression(element)) {
|
|
101
|
+
index++;
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (ts.isBindingElement(element) && ts.isIdentifier(element.name)) {
|
|
105
|
+
if (element.dotDotDotToken) {
|
|
106
|
+
// rest не поддерживается в bare
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
const variableName = element.name.text;
|
|
110
|
+
const val = IR.member(IR.id("__arr"), IR.number(index), true, getLoc(decl, ctx));
|
|
111
|
+
results.push(IR.varDecl(variableName, val, getLoc(decl, ctx)));
|
|
112
|
+
index++;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return results.length === 1 ? results[0] : results;
|
|
118
|
+
}
|
|
119
|
+
// ============================================================================
|
|
120
|
+
// Bare Namespace Declaration
|
|
121
|
+
// ============================================================================
|
|
122
|
+
/**
|
|
123
|
+
* Обрабатывает export namespace X { ... } в bare mode.
|
|
124
|
+
* Генерирует "META:NAMESPACE:X"; + все statements из тела namespace.
|
|
125
|
+
*
|
|
126
|
+
* @param node - TypeScript ModuleDeclaration
|
|
127
|
+
* @param ctx - VisitorContext (mode === "bare")
|
|
128
|
+
* @returns IR statements
|
|
129
|
+
*/
|
|
130
|
+
export function visitBareNamespaceDeclaration(node, ctx) {
|
|
131
|
+
const name = node.name.text;
|
|
132
|
+
const results = [];
|
|
133
|
+
// "META:NAMESPACE:<name>";
|
|
134
|
+
results.push(IR.exprStmt(IR.string(`META:NAMESPACE:${name}`)));
|
|
135
|
+
// Извлекаем содержимое тела namespace
|
|
136
|
+
if (node.body && ts.isModuleBlock(node.body)) {
|
|
137
|
+
for (const statement of node.body.statements) {
|
|
138
|
+
const irNodes = visitStatement(statement, ctx);
|
|
139
|
+
if (irNodes) {
|
|
140
|
+
if (Array.isArray(irNodes)) {
|
|
141
|
+
results.push(...irNodes);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
results.push(irNodes);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return results;
|
|
150
|
+
}
|
|
151
|
+
// ============================================================================
|
|
152
|
+
// Bare Arrow Function
|
|
153
|
+
// ============================================================================
|
|
154
|
+
/**
|
|
155
|
+
* Обрабатывает arrow function в bare mode.
|
|
156
|
+
* Генерирует plain function с оригинальными параметрами.
|
|
157
|
+
* Arrow → именованная функция, hoisted в pendingStatements.
|
|
158
|
+
*
|
|
159
|
+
* @param node - TypeScript ArrowFunction
|
|
160
|
+
* @param ctx - VisitorContext (mode === "bare")
|
|
161
|
+
* @returns IR expression (ссылка на имя функции)
|
|
162
|
+
*/
|
|
163
|
+
export function visitBareArrowFunction(node, ctx) {
|
|
164
|
+
const params = collectBareParams(node.parameters, ctx);
|
|
165
|
+
const funcName = ctx.bindings.create("arrow");
|
|
166
|
+
const fnCtx = createBareFnCtx(node, ctx);
|
|
167
|
+
node.parameters.forEach((param, index) => {
|
|
168
|
+
if (ts.isIdentifier(param.name)) {
|
|
169
|
+
fnCtx.functionParams.set(param.name.text, index);
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
let body;
|
|
173
|
+
if (ts.isBlock(node.body)) {
|
|
174
|
+
body = visitStatementList(node.body.statements, fnCtx);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
body = [IR.return(visitExpression(node.body, fnCtx))];
|
|
178
|
+
}
|
|
179
|
+
if (fnCtx.pendingStatements.length > 0) {
|
|
180
|
+
body = [...fnCtx.pendingStatements, ...body];
|
|
181
|
+
}
|
|
182
|
+
const funcDecl = IR.functionDecl(funcName, params, body, getLoc(node, ctx), true);
|
|
183
|
+
ctx.pendingStatements.push(funcDecl);
|
|
184
|
+
return IR.id(funcName, getLoc(node, ctx));
|
|
185
|
+
}
|
|
186
|
+
// ============================================================================
|
|
187
|
+
// Bare Function Expression
|
|
188
|
+
// ============================================================================
|
|
189
|
+
/**
|
|
190
|
+
* Обрабатывает function expression в bare mode.
|
|
191
|
+
* Генерирует plain function, hoisted в pendingStatements.
|
|
192
|
+
*
|
|
193
|
+
* @param node - TypeScript FunctionExpression
|
|
194
|
+
* @param ctx - VisitorContext (mode === "bare")
|
|
195
|
+
* @returns IR expression (ссылка на имя функции)
|
|
196
|
+
*/
|
|
197
|
+
export function visitBareFunctionExpression(node, ctx) {
|
|
198
|
+
const name = node.name?.text ?? ctx.bindings.create("func");
|
|
199
|
+
const params = collectBareParams(node.parameters, ctx);
|
|
200
|
+
const fnCtx = createBareFnCtx(node, ctx);
|
|
201
|
+
node.parameters.forEach((param, index) => {
|
|
202
|
+
if (ts.isIdentifier(param.name)) {
|
|
203
|
+
fnCtx.functionParams.set(param.name.text, index);
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
let body = node.body ? visitStatementList(node.body.statements, fnCtx) : [];
|
|
207
|
+
if (fnCtx.pendingStatements.length > 0) {
|
|
208
|
+
body = [...fnCtx.pendingStatements, ...body];
|
|
209
|
+
}
|
|
210
|
+
const funcDecl = IR.functionDecl(name, params, body, getLoc(node, ctx), true);
|
|
211
|
+
ctx.pendingStatements.push(funcDecl);
|
|
212
|
+
return IR.id(name, getLoc(node, ctx));
|
|
213
|
+
}
|
|
214
|
+
// ============================================================================
|
|
215
|
+
// Bare Object Method
|
|
216
|
+
// ============================================================================
|
|
217
|
+
/**
|
|
218
|
+
* Обрабатывает метод объекта в bare mode.
|
|
219
|
+
* Генерирует plain function, hoisted в pendingStatements.
|
|
220
|
+
* Возвращает имя функции для использования в свойстве объекта.
|
|
221
|
+
*
|
|
222
|
+
* @param prop - TypeScript MethodDeclaration
|
|
223
|
+
* @param ctx - VisitorContext (mode === "bare")
|
|
224
|
+
* @returns имя сгенерированной функции
|
|
225
|
+
*/
|
|
226
|
+
export function visitBareObjectMethod(prop, ctx) {
|
|
227
|
+
const methodName = prop.name.text;
|
|
228
|
+
const funcName = ctx.bindings.create(`${methodName}__method`);
|
|
229
|
+
const params = collectBareParams(prop.parameters, ctx);
|
|
230
|
+
const fnCtx = createBareFnCtx(prop, ctx);
|
|
231
|
+
prop.parameters.forEach((param, index) => {
|
|
232
|
+
if (ts.isIdentifier(param.name)) {
|
|
233
|
+
fnCtx.functionParams.set(param.name.text, index);
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
let body = prop.body ? visitStatementList(prop.body.statements, fnCtx) : [];
|
|
237
|
+
if (fnCtx.pendingStatements.length > 0) {
|
|
238
|
+
body = [...fnCtx.pendingStatements, ...body];
|
|
239
|
+
}
|
|
240
|
+
const funcDecl = IR.functionDecl(funcName, params, body, getLoc(prop, ctx), true);
|
|
241
|
+
ctx.pendingStatements.push(funcDecl);
|
|
242
|
+
return funcName;
|
|
243
|
+
}
|
|
244
|
+
// ============================================================================
|
|
245
|
+
// Helpers
|
|
246
|
+
// ============================================================================
|
|
247
|
+
/**
|
|
248
|
+
* Собирает параметры функции для bare mode (оригинальные имена, без __env/__this/__args)
|
|
249
|
+
*/
|
|
250
|
+
function collectBareParams(parameters, ctx) {
|
|
251
|
+
const params = [];
|
|
252
|
+
for (const param of parameters) {
|
|
253
|
+
if (ts.isIdentifier(param.name)) {
|
|
254
|
+
const defaultValue = param.initializer
|
|
255
|
+
? visitExpression(param.initializer, ctx)
|
|
256
|
+
: undefined;
|
|
257
|
+
const isRest = !!param.dotDotDotToken;
|
|
258
|
+
params.push(IR.param(param.name.text, defaultValue, isRest));
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return params;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Создаёт дочерний VisitorContext для bare mode функции.
|
|
265
|
+
* Без captured variables, env/desc и прочей логики script/module режимов.
|
|
266
|
+
*/
|
|
267
|
+
function createBareFnCtx(node, ctx) {
|
|
268
|
+
const funcScope = ctx.scopeAnalysis.nodeToScope.get(node) || ctx.currentScope;
|
|
269
|
+
return {
|
|
270
|
+
mode: ctx.mode,
|
|
271
|
+
functionParams: new Map(),
|
|
272
|
+
hoistedFunctions: [],
|
|
273
|
+
typeChecker: ctx.typeChecker,
|
|
274
|
+
sourceFile: ctx.sourceFile,
|
|
275
|
+
bindings: ctx.bindings,
|
|
276
|
+
scopeAnalysis: ctx.scopeAnalysis,
|
|
277
|
+
currentScope: funcScope,
|
|
278
|
+
pendingStatements: [],
|
|
279
|
+
currentEnvRef: "__env",
|
|
280
|
+
currentEnvScope: funcScope,
|
|
281
|
+
xmlDocumentSymbol: ctx.xmlDocumentSymbol,
|
|
282
|
+
xmlElemSymbol: ctx.xmlElemSymbol,
|
|
283
|
+
importBindings: ctx.importBindings,
|
|
284
|
+
helperFlags: ctx.helperFlags,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=bare-visitors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bare-visitors.js","sourceRoot":"","sources":["../../src/lowering/bare-visitors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Binding Manager - централизованная генерация уникальных имён
|
|
3
|
+
*
|
|
4
|
+
* Обеспечивает единый механизм для:
|
|
5
|
+
* - Генерации имён для временных переменных (__tmp0, __arr1, ...)
|
|
6
|
+
* - Генерации имён для анонимных функций (__arrow0, __func1, ...)
|
|
7
|
+
* - Переименования shadowed переменных (a → a__0, a__1, ...)
|
|
8
|
+
* - Защиты от коллизий с именами из исходного кода
|
|
9
|
+
*
|
|
10
|
+
* @module lowering/binding
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Менеджер генерации уникальных имён
|
|
14
|
+
*
|
|
15
|
+
* Все сгенерированные имена гарантированно уникальны в пределах
|
|
16
|
+
* одного экземпляра менеджера и не конфликтуют с именами из исходного кода.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const bindings = new BindingManager();
|
|
21
|
+
* bindings.registerSourceNames(["__item", "foo", "bar"]);
|
|
22
|
+
*
|
|
23
|
+
* bindings.create("item"); // "__item0" (если __item0 не занято)
|
|
24
|
+
* bindings.create("arrow"); // "__arrow0"
|
|
25
|
+
* bindings.create("arrow"); // "__arrow1"
|
|
26
|
+
* bindings.temp(); // "__tmp0"
|
|
27
|
+
* bindings.shadow("x"); // "x__0"
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare class BindingManager {
|
|
31
|
+
/** Счётчики для каждого префикса */
|
|
32
|
+
private counters;
|
|
33
|
+
/** Имена из исходного кода (для проверки коллизий) */
|
|
34
|
+
private sourceNames;
|
|
35
|
+
/** Все сгенерированные имена (для проверки коллизий) */
|
|
36
|
+
private generatedNames;
|
|
37
|
+
/**
|
|
38
|
+
* Регистрирует имена из исходного кода для проверки коллизий
|
|
39
|
+
*
|
|
40
|
+
* @param names - Массив имён переменных/функций из исходного файла
|
|
41
|
+
*/
|
|
42
|
+
registerSourceNames(names: Iterable<string>): void;
|
|
43
|
+
/**
|
|
44
|
+
* Проверяет, занято ли имя (в исходнике или уже сгенерировано)
|
|
45
|
+
*/
|
|
46
|
+
private isNameTaken;
|
|
47
|
+
/**
|
|
48
|
+
* Создаёт уникальное имя с заданным префиксом
|
|
49
|
+
*
|
|
50
|
+
* Гарантирует что имя не конфликтует с:
|
|
51
|
+
* - Именами из исходного кода
|
|
52
|
+
* - Ранее сгенерированными именами
|
|
53
|
+
*
|
|
54
|
+
* @param prefix - Префикс имени (без __)
|
|
55
|
+
* @returns Уникальное имя вида __prefix0, __prefix1, ...
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* bindings.create("arrow") // "__arrow0"
|
|
59
|
+
* bindings.create("obj") // "__obj0"
|
|
60
|
+
*/
|
|
61
|
+
create(prefix: string): string;
|
|
62
|
+
/**
|
|
63
|
+
* Создаёт уникальное имя для временной переменной
|
|
64
|
+
*
|
|
65
|
+
* @returns Уникальное имя вида __tmp0, __tmp1, ...
|
|
66
|
+
*/
|
|
67
|
+
temp(): string;
|
|
68
|
+
/**
|
|
69
|
+
* Создаёт уникальное имя для shadowed переменной
|
|
70
|
+
*
|
|
71
|
+
* Используется когда let/const во вложенном блоке перекрывает
|
|
72
|
+
* переменную из внешнего scope.
|
|
73
|
+
*
|
|
74
|
+
* @param original - Оригинальное имя переменной
|
|
75
|
+
* @returns Уникальное имя вида original__0, original__1, ...
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* bindings.shadow("a") // "a__0"
|
|
79
|
+
* bindings.shadow("a") // "a__1"
|
|
80
|
+
* bindings.shadow("b") // "b__0"
|
|
81
|
+
*/
|
|
82
|
+
shadow(original: string): string;
|
|
83
|
+
/**
|
|
84
|
+
* Создаёт уникальное имя для env переменной функции
|
|
85
|
+
*
|
|
86
|
+
* @param funcName - Имя функции
|
|
87
|
+
* @returns Имя env вида funcName_env
|
|
88
|
+
*/
|
|
89
|
+
envName(funcName: string): string;
|
|
90
|
+
/**
|
|
91
|
+
* Создаёт уникальное имя для descriptor функции
|
|
92
|
+
*
|
|
93
|
+
* @param funcName - Имя функции
|
|
94
|
+
* @returns Имя descriptor вида funcName_desc
|
|
95
|
+
*/
|
|
96
|
+
descName(funcName: string): string;
|
|
97
|
+
/**
|
|
98
|
+
* Создаёт уникальное имя для hoisted вложенной функции (module mode)
|
|
99
|
+
*
|
|
100
|
+
* @param originalName - Оригинальное имя функции
|
|
101
|
+
* @returns Уникальное имя вида __hoisted_originalName_N
|
|
102
|
+
*/
|
|
103
|
+
hoistedName(originalName: string): string;
|
|
104
|
+
/**
|
|
105
|
+
* Сбрасывает все счётчики и имена (для тестирования)
|
|
106
|
+
*/
|
|
107
|
+
reset(): void;
|
|
108
|
+
/**
|
|
109
|
+
* Получает текущее значение счётчика (для отладки)
|
|
110
|
+
*/
|
|
111
|
+
getCount(prefix: string): number;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Получает текущий BindingManager
|
|
115
|
+
* @throws Если менеджер не инициализирован
|
|
116
|
+
*/
|
|
117
|
+
export declare function getBindings(): BindingManager;
|
|
118
|
+
/**
|
|
119
|
+
* Инициализирует новый BindingManager для компиляции
|
|
120
|
+
* @returns Созданный менеджер
|
|
121
|
+
*/
|
|
122
|
+
export declare function initBindings(): BindingManager;
|
|
123
|
+
/**
|
|
124
|
+
* Создаёт изолированный BindingManager (для тестов)
|
|
125
|
+
*/
|
|
126
|
+
export declare function createBindings(): BindingManager;
|
|
127
|
+
//# sourceMappingURL=binding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binding.d.ts","sourceRoot":"","sources":["../../src/lowering/binding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,cAAc;IACzB,oCAAoC;IACpC,OAAO,CAAC,QAAQ,CAAkC;IAElD,sDAAsD;IACtD,OAAO,CAAC,WAAW,CAA0B;IAE7C,wDAAwD;IACxD,OAAO,CAAC,cAAc,CAA0B;IAEhD;;;;OAIG;IACH,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI;IAMlD;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAe9B;;;;OAIG;IACH,IAAI,IAAI,MAAM;IAId;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAgBhC;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAIjC;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAIlC;;;;;OAKG;IACH,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAazC;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;CAGjC;AAQD;;;GAGG;AACH,wBAAgB,WAAW,IAAI,cAAc,CAK5C;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,cAAc,CAG7C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,cAAc,CAE/C"}
|