@justscale/typescript 0.1.1
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 +128 -0
- package/dist/api.d.ts +144 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +380 -0
- package/dist/api.js.map +1 -0
- package/dist/compiler/analyzer.d.ts +247 -0
- package/dist/compiler/analyzer.d.ts.map +1 -0
- package/dist/compiler/analyzer.js +3201 -0
- package/dist/compiler/analyzer.js.map +1 -0
- package/dist/compiler/cli.d.ts +12 -0
- package/dist/compiler/cli.d.ts.map +1 -0
- package/dist/compiler/cli.js +209 -0
- package/dist/compiler/cli.js.map +1 -0
- package/dist/compiler/compile.d.ts +26 -0
- package/dist/compiler/compile.d.ts.map +1 -0
- package/dist/compiler/compile.js +121 -0
- package/dist/compiler/compile.js.map +1 -0
- package/dist/compiler/errors.d.ts +336 -0
- package/dist/compiler/errors.d.ts.map +1 -0
- package/dist/compiler/errors.js +466 -0
- package/dist/compiler/errors.js.map +1 -0
- package/dist/compiler/exports-prepass.d.ts +31 -0
- package/dist/compiler/exports-prepass.d.ts.map +1 -0
- package/dist/compiler/exports-prepass.js +249 -0
- package/dist/compiler/exports-prepass.js.map +1 -0
- package/dist/compiler/hmr-change-detector.d.ts +47 -0
- package/dist/compiler/hmr-change-detector.d.ts.map +1 -0
- package/dist/compiler/hmr-change-detector.js +395 -0
- package/dist/compiler/hmr-change-detector.js.map +1 -0
- package/dist/compiler/hmr-transformer.d.ts +54 -0
- package/dist/compiler/hmr-transformer.d.ts.map +1 -0
- package/dist/compiler/hmr-transformer.js +535 -0
- package/dist/compiler/hmr-transformer.js.map +1 -0
- package/dist/compiler/index.d.ts +19 -0
- package/dist/compiler/index.d.ts.map +1 -0
- package/dist/compiler/index.js +16 -0
- package/dist/compiler/index.js.map +1 -0
- package/dist/compiler/primitive-detector.d.ts +70 -0
- package/dist/compiler/primitive-detector.d.ts.map +1 -0
- package/dist/compiler/primitive-detector.js +338 -0
- package/dist/compiler/primitive-detector.js.map +1 -0
- package/dist/compiler/ptsc.d.ts +40 -0
- package/dist/compiler/ptsc.d.ts.map +1 -0
- package/dist/compiler/ptsc.js +462 -0
- package/dist/compiler/ptsc.js.map +1 -0
- package/dist/compiler/rewriter.d.ts +96 -0
- package/dist/compiler/rewriter.d.ts.map +1 -0
- package/dist/compiler/rewriter.js +418 -0
- package/dist/compiler/rewriter.js.map +1 -0
- package/dist/compiler/step-hash.d.ts +43 -0
- package/dist/compiler/step-hash.d.ts.map +1 -0
- package/dist/compiler/step-hash.js +83 -0
- package/dist/compiler/step-hash.js.map +1 -0
- package/dist/compiler/switch-codegen.d.ts +84 -0
- package/dist/compiler/switch-codegen.d.ts.map +1 -0
- package/dist/compiler/switch-codegen.js +1540 -0
- package/dist/compiler/switch-codegen.js.map +1 -0
- package/dist/compiler/transformer.d.ts +29 -0
- package/dist/compiler/transformer.d.ts.map +1 -0
- package/dist/compiler/transformer.js +216 -0
- package/dist/compiler/transformer.js.map +1 -0
- package/dist/config/index.d.ts +122 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +215 -0
- package/dist/config/index.js.map +1 -0
- package/dist/di-errors/formatter.d.ts +126 -0
- package/dist/di-errors/formatter.d.ts.map +1 -0
- package/dist/di-errors/formatter.js +384 -0
- package/dist/di-errors/formatter.js.map +1 -0
- package/dist/di-errors/index.d.ts +5 -0
- package/dist/di-errors/index.d.ts.map +1 -0
- package/dist/di-errors/index.js +13 -0
- package/dist/di-errors/index.js.map +1 -0
- package/dist/editor.d.ts +11 -0
- package/dist/editor.d.ts.map +1 -0
- package/dist/editor.js +2 -0
- package/dist/editor.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/language-service/index.d.ts +52 -0
- package/dist/language-service/index.d.ts.map +1 -0
- package/dist/language-service/index.js +366 -0
- package/dist/language-service/index.js.map +1 -0
- package/dist/language-service/process-quick-fixes.d.ts +20 -0
- package/dist/language-service/process-quick-fixes.d.ts.map +1 -0
- package/dist/language-service/process-quick-fixes.js +114 -0
- package/dist/language-service/process-quick-fixes.js.map +1 -0
- package/dist/language-service/quick-fix-discovery.d.ts +39 -0
- package/dist/language-service/quick-fix-discovery.d.ts.map +1 -0
- package/dist/language-service/quick-fix-discovery.js +124 -0
- package/dist/language-service/quick-fix-discovery.js.map +1 -0
- package/dist/loader/incremental.d.ts +50 -0
- package/dist/loader/incremental.d.ts.map +1 -0
- package/dist/loader/incremental.js +151 -0
- package/dist/loader/incremental.js.map +1 -0
- package/dist/loader/index.d.ts +25 -0
- package/dist/loader/index.d.ts.map +1 -0
- package/dist/loader/index.js +24 -0
- package/dist/loader/index.js.map +1 -0
- package/dist/loader/loader.d.ts +52 -0
- package/dist/loader/loader.d.ts.map +1 -0
- package/dist/loader/loader.js +248 -0
- package/dist/loader/loader.js.map +1 -0
- package/dist/loader/register.d.ts +14 -0
- package/dist/loader/register.d.ts.map +1 -0
- package/dist/loader/register.js +20 -0
- package/dist/loader/register.js.map +1 -0
- package/dist/plugins/index.d.ts +13 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +13 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/index.public.d.ts +13 -0
- package/dist/plugins/index.public.d.ts.map +1 -0
- package/dist/plugins/index.public.js +13 -0
- package/dist/plugins/index.public.js.map +1 -0
- package/dist/plugins/types.d.ts +83 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +24 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/server/index.d.ts +33 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +42 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/tsserver.d.ts +28 -0
- package/dist/server/tsserver.d.ts.map +1 -0
- package/dist/server/tsserver.js +126 -0
- package/dist/server/tsserver.js.map +1 -0
- package/lib/lib.d.ts +20 -0
- package/lib/lib.decorators.d.ts +382 -0
- package/lib/lib.decorators.legacy.d.ts +20 -0
- package/lib/lib.dom.asynciterable.d.ts +18 -0
- package/lib/lib.dom.d.ts +45125 -0
- package/lib/lib.dom.iterable.d.ts +18 -0
- package/lib/lib.es2015.collection.d.ts +150 -0
- package/lib/lib.es2015.core.d.ts +595 -0
- package/lib/lib.es2015.d.ts +26 -0
- package/lib/lib.es2015.generator.d.ts +75 -0
- package/lib/lib.es2015.iterable.d.ts +603 -0
- package/lib/lib.es2015.promise.d.ts +79 -0
- package/lib/lib.es2015.proxy.d.ts +126 -0
- package/lib/lib.es2015.reflect.d.ts +142 -0
- package/lib/lib.es2015.symbol.d.ts +44 -0
- package/lib/lib.es2015.symbol.wellknown.d.ts +324 -0
- package/lib/lib.es2016.array.include.d.ts +114 -0
- package/lib/lib.es2016.d.ts +19 -0
- package/lib/lib.es2016.full.d.ts +21 -0
- package/lib/lib.es2016.intl.d.ts +29 -0
- package/lib/lib.es2017.arraybuffer.d.ts +19 -0
- package/lib/lib.es2017.d.ts +24 -0
- package/lib/lib.es2017.date.d.ts +29 -0
- package/lib/lib.es2017.full.d.ts +21 -0
- package/lib/lib.es2017.intl.d.ts +42 -0
- package/lib/lib.es2017.object.d.ts +47 -0
- package/lib/lib.es2017.sharedmemory.d.ts +133 -0
- package/lib/lib.es2017.string.d.ts +43 -0
- package/lib/lib.es2017.typedarrays.d.ts +51 -0
- package/lib/lib.es2018.asyncgenerator.d.ts +75 -0
- package/lib/lib.es2018.asynciterable.d.ts +51 -0
- package/lib/lib.es2018.d.ts +22 -0
- package/lib/lib.es2018.full.d.ts +22 -0
- package/lib/lib.es2018.intl.d.ts +81 -0
- package/lib/lib.es2018.promise.d.ts +28 -0
- package/lib/lib.es2018.regexp.d.ts +35 -0
- package/lib/lib.es2019.array.d.ts +77 -0
- package/lib/lib.es2019.d.ts +22 -0
- package/lib/lib.es2019.full.d.ts +22 -0
- package/lib/lib.es2019.intl.d.ts +21 -0
- package/lib/lib.es2019.object.d.ts +31 -0
- package/lib/lib.es2019.string.d.ts +35 -0
- package/lib/lib.es2019.symbol.d.ts +22 -0
- package/lib/lib.es2020.bigint.d.ts +763 -0
- package/lib/lib.es2020.d.ts +25 -0
- package/lib/lib.es2020.date.d.ts +40 -0
- package/lib/lib.es2020.full.d.ts +22 -0
- package/lib/lib.es2020.intl.d.ts +472 -0
- package/lib/lib.es2020.number.d.ts +26 -0
- package/lib/lib.es2020.promise.d.ts +45 -0
- package/lib/lib.es2020.sharedmemory.d.ts +97 -0
- package/lib/lib.es2020.string.d.ts +42 -0
- package/lib/lib.es2020.symbol.wellknown.d.ts +39 -0
- package/lib/lib.es2021.d.ts +21 -0
- package/lib/lib.es2021.full.d.ts +22 -0
- package/lib/lib.es2021.intl.d.ts +164 -0
- package/lib/lib.es2021.promise.d.ts +46 -0
- package/lib/lib.es2021.string.d.ts +31 -0
- package/lib/lib.es2021.weakref.d.ts +76 -0
- package/lib/lib.es2022.array.d.ts +119 -0
- package/lib/lib.es2022.d.ts +23 -0
- package/lib/lib.es2022.error.d.ts +73 -0
- package/lib/lib.es2022.full.d.ts +22 -0
- package/lib/lib.es2022.intl.d.ts +143 -0
- package/lib/lib.es2022.object.d.ts +24 -0
- package/lib/lib.es2022.regexp.d.ts +37 -0
- package/lib/lib.es2022.string.d.ts +23 -0
- package/lib/lib.es2023.array.d.ts +922 -0
- package/lib/lib.es2023.collection.d.ts +19 -0
- package/lib/lib.es2023.d.ts +20 -0
- package/lib/lib.es2023.full.d.ts +22 -0
- package/lib/lib.es2023.intl.d.ts +62 -0
- package/lib/lib.es2024.arraybuffer.d.ts +63 -0
- package/lib/lib.es2024.collection.d.ts +27 -0
- package/lib/lib.es2024.d.ts +24 -0
- package/lib/lib.es2024.full.d.ts +22 -0
- package/lib/lib.es2024.object.d.ts +27 -0
- package/lib/lib.es2024.promise.d.ts +33 -0
- package/lib/lib.es2024.regexp.d.ts +23 -0
- package/lib/lib.es2024.sharedmemory.d.ts +66 -0
- package/lib/lib.es2024.string.d.ts +27 -0
- package/lib/lib.es2025.collection.d.ts +94 -0
- package/lib/lib.es2025.d.ts +23 -0
- package/lib/lib.es2025.float16.d.ts +443 -0
- package/lib/lib.es2025.full.d.ts +22 -0
- package/lib/lib.es2025.intl.d.ts +200 -0
- package/lib/lib.es2025.iterator.d.ts +146 -0
- package/lib/lib.es2025.promise.d.ts +32 -0
- package/lib/lib.es2025.regexp.d.ts +30 -0
- package/lib/lib.es5.d.ts +4599 -0
- package/lib/lib.es6.d.ts +21 -0
- package/lib/lib.esnext.array.d.ts +33 -0
- package/lib/lib.esnext.collection.d.ts +47 -0
- package/lib/lib.esnext.d.ts +27 -0
- package/lib/lib.esnext.date.d.ts +21 -0
- package/lib/lib.esnext.decorators.d.ts +26 -0
- package/lib/lib.esnext.disposable.d.ts +191 -0
- package/lib/lib.esnext.error.d.ts +22 -0
- package/lib/lib.esnext.full.d.ts +22 -0
- package/lib/lib.esnext.intl.d.ts +107 -0
- package/lib/lib.esnext.sharedmemory.d.ts +23 -0
- package/lib/lib.esnext.temporal.d.ts +485 -0
- package/lib/lib.esnext.typedarrays.d.ts +90 -0
- package/lib/lib.scripthost.d.ts +320 -0
- package/lib/lib.webworker.asynciterable.d.ts +18 -0
- package/lib/lib.webworker.d.ts +15606 -0
- package/lib/lib.webworker.importscripts.d.ts +21 -0
- package/lib/lib.webworker.iterable.d.ts +18 -0
- package/lib/logger.js +144 -0
- package/lib/package.json +7 -0
- package/lib/tsserver.js +57 -0
- package/lib/tsserverlibrary.js +171 -0
- package/lib/typesMap.json +497 -0
- package/lib/typescript.js +373 -0
- package/package.json +115 -0
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @justscale/core/process - AST Rewriter
|
|
3
|
+
*
|
|
4
|
+
* Rewrites variable references in block bodies to use state.vars and services.
|
|
5
|
+
*
|
|
6
|
+
* Transforms:
|
|
7
|
+
* - Handler params (orderId) -> state.vars.orderId
|
|
8
|
+
* - Injected services (payments) -> services.payments
|
|
9
|
+
* - Local variables (payment) -> state.vars.payment
|
|
10
|
+
* - Using variables (order) -> state.vars.order (rehydrated before block)
|
|
11
|
+
*/
|
|
12
|
+
import ts from 'typescript';
|
|
13
|
+
/**
|
|
14
|
+
* Rewrite a statement to use state.vars and services.
|
|
15
|
+
* Preserves source positions for accurate source maps.
|
|
16
|
+
*/
|
|
17
|
+
export function rewriteStatement(factory, stmt, ctx) {
|
|
18
|
+
const visitor = createRewriteVisitor(factory, ctx);
|
|
19
|
+
const result = ts.visitNode(stmt, visitor);
|
|
20
|
+
// Preserve source position from original statement for source maps
|
|
21
|
+
return ts.setTextRange(result, stmt);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Rewrite an expression to use state.vars and services.
|
|
25
|
+
* Preserves source positions for accurate source maps.
|
|
26
|
+
*/
|
|
27
|
+
export function rewriteExpression(factory, expr, ctx) {
|
|
28
|
+
const visitor = createRewriteVisitor(factory, ctx);
|
|
29
|
+
const result = ts.visitNode(expr, visitor);
|
|
30
|
+
// Preserve source position from original expression for source maps
|
|
31
|
+
return ts.setTextRange(result, expr);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Build a derived RewriterContext that removes the given names from all
|
|
35
|
+
* rewrite sets. Used when descending into a nested scope (function
|
|
36
|
+
* parameters, catch clause variable, for-of/in loop variable) where those
|
|
37
|
+
* names shadow the outer rewrite targets.
|
|
38
|
+
*/
|
|
39
|
+
function withShadowed(ctx, shadowed) {
|
|
40
|
+
if (shadowed.size === 0)
|
|
41
|
+
return ctx;
|
|
42
|
+
const subtract = (s) => {
|
|
43
|
+
const out = new Set();
|
|
44
|
+
for (const v of s)
|
|
45
|
+
if (!shadowed.has(v))
|
|
46
|
+
out.add(v);
|
|
47
|
+
return out;
|
|
48
|
+
};
|
|
49
|
+
const subtractMap = (m) => {
|
|
50
|
+
const out = new Map();
|
|
51
|
+
for (const [k, v] of m)
|
|
52
|
+
if (!shadowed.has(k))
|
|
53
|
+
out.set(k, v);
|
|
54
|
+
return out;
|
|
55
|
+
};
|
|
56
|
+
return {
|
|
57
|
+
paramVars: subtract(ctx.paramVars),
|
|
58
|
+
paramAliases: subtractMap(ctx.paramAliases),
|
|
59
|
+
serviceVars: subtract(ctx.serviceVars),
|
|
60
|
+
localVars: subtract(ctx.localVars),
|
|
61
|
+
usingVars: subtract(ctx.usingVars),
|
|
62
|
+
raceVars: subtract(ctx.raceVars),
|
|
63
|
+
blockLocalVars: ctx.blockLocalVars ? subtract(ctx.blockLocalVars) : undefined,
|
|
64
|
+
breakTarget: ctx.breakTarget,
|
|
65
|
+
continueTarget: ctx.continueTarget,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Collect parameter binding names from a function-like node.
|
|
70
|
+
*/
|
|
71
|
+
function collectParameterNames(params) {
|
|
72
|
+
const names = new Set();
|
|
73
|
+
for (const p of params) {
|
|
74
|
+
extractBindingNames(p.name, names);
|
|
75
|
+
}
|
|
76
|
+
return names;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Create a visitor that rewrites variable references.
|
|
80
|
+
*/
|
|
81
|
+
function createRewriteVisitor(factory, ctx) {
|
|
82
|
+
const visitor = (node) => {
|
|
83
|
+
// Preserve literals unchanged - they don't need rewriting and visitEachChild
|
|
84
|
+
// can corrupt them when no proper transformation context is provided
|
|
85
|
+
// Note: We create new literals to ensure they have proper node structure for printing
|
|
86
|
+
if (ts.isStringLiteral(node)) {
|
|
87
|
+
return factory.createStringLiteral(node.text);
|
|
88
|
+
}
|
|
89
|
+
if (ts.isNumericLiteral(node)) {
|
|
90
|
+
return factory.createNumericLiteral(node.text);
|
|
91
|
+
}
|
|
92
|
+
if (ts.isNoSubstitutionTemplateLiteral(node)) {
|
|
93
|
+
return factory.createNoSubstitutionTemplateLiteral(node.text, node.rawText);
|
|
94
|
+
}
|
|
95
|
+
if (node.kind === ts.SyntaxKind.TrueKeyword) {
|
|
96
|
+
return factory.createTrue();
|
|
97
|
+
}
|
|
98
|
+
if (node.kind === ts.SyntaxKind.FalseKeyword) {
|
|
99
|
+
return factory.createFalse();
|
|
100
|
+
}
|
|
101
|
+
if (node.kind === ts.SyntaxKind.NullKeyword) {
|
|
102
|
+
return factory.createNull();
|
|
103
|
+
}
|
|
104
|
+
// Nested function-like scopes: parameter bindings shadow outer locals.
|
|
105
|
+
// Build a sub-context with those names removed and recurse with a fresh
|
|
106
|
+
// visitor so neither the parameter declaration sites NOR body references
|
|
107
|
+
// to the shadowed names get rewritten to state.vars.* / services.*.
|
|
108
|
+
if (ts.isFunctionDeclaration(node) ||
|
|
109
|
+
ts.isFunctionExpression(node) ||
|
|
110
|
+
ts.isArrowFunction(node) ||
|
|
111
|
+
ts.isMethodDeclaration(node) ||
|
|
112
|
+
ts.isConstructorDeclaration(node) ||
|
|
113
|
+
ts.isGetAccessorDeclaration(node) ||
|
|
114
|
+
ts.isSetAccessorDeclaration(node)) {
|
|
115
|
+
const shadowed = collectParameterNames(node.parameters);
|
|
116
|
+
if (shadowed.size > 0) {
|
|
117
|
+
const subVisitor = createRewriteVisitor(factory, withShadowed(ctx, shadowed));
|
|
118
|
+
return ts.visitEachChild(node, subVisitor, undefined);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// for-of / for-in: the loop variable shadows outer names inside the
|
|
122
|
+
// body. The iterable expression evaluates in OUTER scope so it must
|
|
123
|
+
// not see the shadowing.
|
|
124
|
+
if (ts.isForOfStatement(node) || ts.isForInStatement(node)) {
|
|
125
|
+
const init = node.initializer;
|
|
126
|
+
if (init && ts.isVariableDeclarationList(init)) {
|
|
127
|
+
const shadowed = new Set();
|
|
128
|
+
for (const decl of init.declarations) {
|
|
129
|
+
extractBindingNames(decl.name, shadowed);
|
|
130
|
+
}
|
|
131
|
+
if (shadowed.size > 0) {
|
|
132
|
+
const subVisitor = createRewriteVisitor(factory, withShadowed(ctx, shadowed));
|
|
133
|
+
const newExpr = ts.visitNode(node.expression, visitor);
|
|
134
|
+
const newInit = ts.visitNode(node.initializer, subVisitor);
|
|
135
|
+
const newStmt = ts.visitNode(node.statement, subVisitor);
|
|
136
|
+
return ts.isForOfStatement(node)
|
|
137
|
+
? factory.updateForOfStatement(node, node.awaitModifier, newInit, newExpr, newStmt)
|
|
138
|
+
: factory.updateForInStatement(node, newInit, newExpr, newStmt);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Catch clause: the bound variable shadows outer names inside the block.
|
|
143
|
+
if (ts.isCatchClause(node) && node.variableDeclaration) {
|
|
144
|
+
const shadowed = new Set();
|
|
145
|
+
extractBindingNames(node.variableDeclaration.name, shadowed);
|
|
146
|
+
if (shadowed.size > 0) {
|
|
147
|
+
const subVisitor = createRewriteVisitor(factory, withShadowed(ctx, shadowed));
|
|
148
|
+
return ts.visitEachChild(node, subVisitor, undefined);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Rewrite identifiers
|
|
152
|
+
if (ts.isIdentifier(node)) {
|
|
153
|
+
const name = node.text;
|
|
154
|
+
// Don't rewrite if it's a property name (handled by parent)
|
|
155
|
+
if (isPropertyName(node)) {
|
|
156
|
+
return node;
|
|
157
|
+
}
|
|
158
|
+
// Block-local variables - declared in this block, don't rewrite
|
|
159
|
+
if (ctx.blockLocalVars?.has(name)) {
|
|
160
|
+
return node;
|
|
161
|
+
}
|
|
162
|
+
// Service variable -> services.xxx
|
|
163
|
+
if (ctx.serviceVars.has(name)) {
|
|
164
|
+
return factory.createPropertyAccessExpression(factory.createIdentifier('services'), name);
|
|
165
|
+
}
|
|
166
|
+
// Param variable -> state.vars.xxx (using alias if renamed via destructuring)
|
|
167
|
+
if (ctx.paramVars.has(name)) {
|
|
168
|
+
const varName = ctx.paramAliases.get(name) ?? name;
|
|
169
|
+
return factory.createPropertyAccessExpression(factory.createPropertyAccessExpression(factory.createIdentifier('state'), 'vars'), varName);
|
|
170
|
+
}
|
|
171
|
+
// Race variable -> __raceResult (must check before localVars since r might be in both)
|
|
172
|
+
// Race variables (from const r = race()) hold the race result after resumption
|
|
173
|
+
if (ctx.raceVars?.has(name)) {
|
|
174
|
+
return factory.createIdentifier('__raceResult');
|
|
175
|
+
}
|
|
176
|
+
// Local variable -> state.vars.xxx
|
|
177
|
+
if (ctx.localVars.has(name)) {
|
|
178
|
+
return factory.createPropertyAccessExpression(factory.createPropertyAccessExpression(factory.createIdentifier('state'), 'vars'), name);
|
|
179
|
+
}
|
|
180
|
+
// Using variable -> keep as local variable (declared with let at function scope)
|
|
181
|
+
// These are rehydrated at resume points and accessed directly, not via state.vars
|
|
182
|
+
if (ctx.usingVars.has(name)) {
|
|
183
|
+
return node; // Keep as-is, it's a local variable
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// Handle destructuring in variable declarations
|
|
187
|
+
if (ts.isVariableDeclaration(node)) {
|
|
188
|
+
// Skip rewriting the binding pattern itself
|
|
189
|
+
// Only rewrite the initializer
|
|
190
|
+
if (node.initializer) {
|
|
191
|
+
const newInitializer = ts.visitNode(node.initializer, visitor);
|
|
192
|
+
return factory.updateVariableDeclaration(node, node.name, node.exclamationToken, node.type, newInitializer);
|
|
193
|
+
}
|
|
194
|
+
return node;
|
|
195
|
+
}
|
|
196
|
+
// Handle shorthand property assignments: { orderId } -> { orderId: state.vars.orderId }
|
|
197
|
+
if (ts.isShorthandPropertyAssignment(node)) {
|
|
198
|
+
const name = node.name.text;
|
|
199
|
+
// Using vars are local, keep shorthand as-is (will reference local var)
|
|
200
|
+
if (ctx.usingVars.has(name)) {
|
|
201
|
+
return node;
|
|
202
|
+
}
|
|
203
|
+
if (ctx.paramVars.has(name) || ctx.localVars.has(name)) {
|
|
204
|
+
const varName = ctx.paramVars.has(name) ? (ctx.paramAliases.get(name) ?? name) : name;
|
|
205
|
+
return factory.createPropertyAssignment(node.name, factory.createPropertyAccessExpression(factory.createPropertyAccessExpression(factory.createIdentifier('state'), 'vars'), varName));
|
|
206
|
+
}
|
|
207
|
+
if (ctx.serviceVars.has(name)) {
|
|
208
|
+
return factory.createPropertyAssignment(node.name, factory.createPropertyAccessExpression(factory.createIdentifier('services'), name));
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return ts.visitEachChild(node, visitor, undefined);
|
|
212
|
+
};
|
|
213
|
+
return visitor;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Check if an identifier is being used as a property name.
|
|
217
|
+
*/
|
|
218
|
+
function isPropertyName(node) {
|
|
219
|
+
const parent = node.parent;
|
|
220
|
+
// Cloned/synthesized nodes may not have parents
|
|
221
|
+
if (!parent) {
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
// Property access: obj.prop - don't rewrite 'prop'
|
|
225
|
+
if (ts.isPropertyAccessExpression(parent) && parent.name === node) {
|
|
226
|
+
return true;
|
|
227
|
+
}
|
|
228
|
+
// Property assignment: { prop: value } - don't rewrite 'prop'
|
|
229
|
+
if (ts.isPropertyAssignment(parent) && parent.name === node) {
|
|
230
|
+
return true;
|
|
231
|
+
}
|
|
232
|
+
// Method declaration: method() {} - don't rewrite 'method'
|
|
233
|
+
if (ts.isMethodDeclaration(parent) && parent.name === node) {
|
|
234
|
+
return true;
|
|
235
|
+
}
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Extract param variable names from handler parameters.
|
|
240
|
+
*
|
|
241
|
+
* Handles both tuple and object destructuring:
|
|
242
|
+
* handler(deps, [orderId]) -> paramVars: {orderId}, aliases: {}
|
|
243
|
+
* handler(deps, { order: orderId }) -> paramVars: {orderId}, aliases: {orderId -> order}
|
|
244
|
+
*
|
|
245
|
+
* The aliases map local names to the param names from the path.
|
|
246
|
+
* The rewriter uses aliases to access state.vars[paramName] instead of state.vars[localName].
|
|
247
|
+
*/
|
|
248
|
+
export function extractParamVars(handler) {
|
|
249
|
+
const params = new Set();
|
|
250
|
+
const paramsParam = handler.parameters[1];
|
|
251
|
+
if (paramsParam) {
|
|
252
|
+
extractBindingNames(paramsParam.name, params);
|
|
253
|
+
}
|
|
254
|
+
return params;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Extract param aliases from object destructuring rename patterns.
|
|
258
|
+
*
|
|
259
|
+
* For `{ user: userId }`, returns Map { "userId" -> "user" }.
|
|
260
|
+
* The rewriter uses this to access `state.vars.user` when it sees `userId`.
|
|
261
|
+
*/
|
|
262
|
+
export function extractParamAliases(handler) {
|
|
263
|
+
const aliases = new Map();
|
|
264
|
+
const paramsParam = handler.parameters[1];
|
|
265
|
+
if (!paramsParam)
|
|
266
|
+
return aliases;
|
|
267
|
+
const binding = paramsParam.name;
|
|
268
|
+
if (!ts.isObjectBindingPattern(binding))
|
|
269
|
+
return aliases;
|
|
270
|
+
for (const element of binding.elements) {
|
|
271
|
+
if (!ts.isBindingElement(element))
|
|
272
|
+
continue;
|
|
273
|
+
// { user: userId } - propertyName is "user", name is "userId"
|
|
274
|
+
if (element.propertyName && ts.isIdentifier(element.propertyName) && ts.isIdentifier(element.name)) {
|
|
275
|
+
aliases.set(element.name.text, element.propertyName.text);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return aliases;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Extract service variable names from handler parameters.
|
|
282
|
+
*
|
|
283
|
+
* Handles: async handler({ payments, shipping }, [...])
|
|
284
|
+
*/
|
|
285
|
+
export function extractServiceVars(handler) {
|
|
286
|
+
const services = new Set();
|
|
287
|
+
// First parameter is the deps object: { payments, shipping }
|
|
288
|
+
const depsParam = handler.parameters[0];
|
|
289
|
+
if (depsParam) {
|
|
290
|
+
extractBindingNames(depsParam.name, services);
|
|
291
|
+
}
|
|
292
|
+
return services;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Extract variable names from a binding pattern.
|
|
296
|
+
*/
|
|
297
|
+
function extractBindingNames(name, result) {
|
|
298
|
+
if (ts.isIdentifier(name)) {
|
|
299
|
+
result.add(name.text);
|
|
300
|
+
}
|
|
301
|
+
else if (ts.isObjectBindingPattern(name)) {
|
|
302
|
+
for (const element of name.elements) {
|
|
303
|
+
if (ts.isBindingElement(element)) {
|
|
304
|
+
extractBindingNames(element.name, result);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
else if (ts.isArrayBindingPattern(name)) {
|
|
309
|
+
for (const element of name.elements) {
|
|
310
|
+
if (ts.isBindingElement(element)) {
|
|
311
|
+
extractBindingNames(element.name, result);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Extract all variable names declared in a list of statements.
|
|
318
|
+
* Used to identify block-local variables that shouldn't be rewritten.
|
|
319
|
+
*/
|
|
320
|
+
export function extractDeclaredVars(statements) {
|
|
321
|
+
const vars = new Set();
|
|
322
|
+
for (const stmt of statements) {
|
|
323
|
+
if (ts.isVariableStatement(stmt)) {
|
|
324
|
+
for (const decl of stmt.declarationList.declarations) {
|
|
325
|
+
extractBindingNames(decl.name, vars);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
return vars;
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Clone an expression, creating synthesized nodes that can be printed.
|
|
333
|
+
* This is necessary when the original expression comes from a different source file.
|
|
334
|
+
*/
|
|
335
|
+
export function cloneExpression(factory, expr) {
|
|
336
|
+
// NumericLiteral
|
|
337
|
+
if (ts.isNumericLiteral(expr)) {
|
|
338
|
+
return factory.createNumericLiteral(expr.text);
|
|
339
|
+
}
|
|
340
|
+
// StringLiteral
|
|
341
|
+
if (ts.isStringLiteral(expr)) {
|
|
342
|
+
return factory.createStringLiteral(expr.text);
|
|
343
|
+
}
|
|
344
|
+
// Identifier
|
|
345
|
+
if (ts.isIdentifier(expr)) {
|
|
346
|
+
return factory.createIdentifier(expr.text);
|
|
347
|
+
}
|
|
348
|
+
// PropertyAccessExpression: obj.prop
|
|
349
|
+
if (ts.isPropertyAccessExpression(expr)) {
|
|
350
|
+
return factory.createPropertyAccessExpression(cloneExpression(factory, expr.expression), expr.name.text);
|
|
351
|
+
}
|
|
352
|
+
// ElementAccessExpression: obj[key]
|
|
353
|
+
if (ts.isElementAccessExpression(expr)) {
|
|
354
|
+
return factory.createElementAccessExpression(cloneExpression(factory, expr.expression), cloneExpression(factory, expr.argumentExpression));
|
|
355
|
+
}
|
|
356
|
+
// BinaryExpression: a + b, a * b, etc.
|
|
357
|
+
if (ts.isBinaryExpression(expr)) {
|
|
358
|
+
return factory.createBinaryExpression(cloneExpression(factory, expr.left), expr.operatorToken.kind, cloneExpression(factory, expr.right));
|
|
359
|
+
}
|
|
360
|
+
// ParenthesizedExpression: (expr)
|
|
361
|
+
if (ts.isParenthesizedExpression(expr)) {
|
|
362
|
+
return factory.createParenthesizedExpression(cloneExpression(factory, expr.expression));
|
|
363
|
+
}
|
|
364
|
+
// ConditionalExpression: cond ? a : b
|
|
365
|
+
if (ts.isConditionalExpression(expr)) {
|
|
366
|
+
return factory.createConditionalExpression(cloneExpression(factory, expr.condition), factory.createToken(ts.SyntaxKind.QuestionToken), cloneExpression(factory, expr.whenTrue), factory.createToken(ts.SyntaxKind.ColonToken), cloneExpression(factory, expr.whenFalse));
|
|
367
|
+
}
|
|
368
|
+
// CallExpression: fn(args)
|
|
369
|
+
if (ts.isCallExpression(expr)) {
|
|
370
|
+
return factory.createCallExpression(cloneExpression(factory, expr.expression), undefined, // type arguments
|
|
371
|
+
expr.arguments.map(arg => cloneExpression(factory, arg)));
|
|
372
|
+
}
|
|
373
|
+
// PrefixUnaryExpression: !x, -x, ++x
|
|
374
|
+
if (ts.isPrefixUnaryExpression(expr)) {
|
|
375
|
+
return factory.createPrefixUnaryExpression(expr.operator, cloneExpression(factory, expr.operand));
|
|
376
|
+
}
|
|
377
|
+
// PostfixUnaryExpression: x++, x--
|
|
378
|
+
if (ts.isPostfixUnaryExpression(expr)) {
|
|
379
|
+
return factory.createPostfixUnaryExpression(cloneExpression(factory, expr.operand), expr.operator);
|
|
380
|
+
}
|
|
381
|
+
// ObjectLiteralExpression: { a: 1, b: 2 }
|
|
382
|
+
if (ts.isObjectLiteralExpression(expr)) {
|
|
383
|
+
return factory.createObjectLiteralExpression(expr.properties.map(prop => {
|
|
384
|
+
if (ts.isPropertyAssignment(prop)) {
|
|
385
|
+
const name = ts.isIdentifier(prop.name)
|
|
386
|
+
? factory.createIdentifier(prop.name.text)
|
|
387
|
+
: ts.isStringLiteral(prop.name)
|
|
388
|
+
? factory.createStringLiteral(prop.name.text)
|
|
389
|
+
: ts.isNumericLiteral(prop.name)
|
|
390
|
+
? factory.createNumericLiteral(prop.name.text)
|
|
391
|
+
: prop.name;
|
|
392
|
+
return factory.createPropertyAssignment(name, cloneExpression(factory, prop.initializer));
|
|
393
|
+
}
|
|
394
|
+
if (ts.isShorthandPropertyAssignment(prop)) {
|
|
395
|
+
return factory.createShorthandPropertyAssignment(prop.name.text);
|
|
396
|
+
}
|
|
397
|
+
return prop;
|
|
398
|
+
}), true);
|
|
399
|
+
}
|
|
400
|
+
// ArrayLiteralExpression: [a, b, c]
|
|
401
|
+
if (ts.isArrayLiteralExpression(expr)) {
|
|
402
|
+
return factory.createArrayLiteralExpression(expr.elements.map(el => cloneExpression(factory, el)));
|
|
403
|
+
}
|
|
404
|
+
// true/false literals
|
|
405
|
+
if (expr.kind === ts.SyntaxKind.TrueKeyword) {
|
|
406
|
+
return factory.createTrue();
|
|
407
|
+
}
|
|
408
|
+
if (expr.kind === ts.SyntaxKind.FalseKeyword) {
|
|
409
|
+
return factory.createFalse();
|
|
410
|
+
}
|
|
411
|
+
// null
|
|
412
|
+
if (expr.kind === ts.SyntaxKind.NullKeyword) {
|
|
413
|
+
return factory.createNull();
|
|
414
|
+
}
|
|
415
|
+
// Fallback: return original (may not print correctly)
|
|
416
|
+
return expr;
|
|
417
|
+
}
|
|
418
|
+
//# sourceMappingURL=rewriter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rewriter.js","sourceRoot":"","sources":["../../src/compiler/rewriter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @justscale/core/process - Step Hash Computation
|
|
3
|
+
*
|
|
4
|
+
* Computes stable hashes for process steps to enable:
|
|
5
|
+
* 1. Persistence stability (code changes don't break suspended processes)
|
|
6
|
+
* 2. Version migration detection
|
|
7
|
+
* 3. Debugging/tracing
|
|
8
|
+
*
|
|
9
|
+
* Hash inputs:
|
|
10
|
+
* - Step type (entry, resume, branch)
|
|
11
|
+
* - Signal/timer being waited on (for resume steps)
|
|
12
|
+
* - Suspension index within the function
|
|
13
|
+
* - Control flow context
|
|
14
|
+
*/
|
|
15
|
+
import type { AnalysisResult } from './analyzer.js';
|
|
16
|
+
export interface StepHashInput {
|
|
17
|
+
type: 'entry' | 'block' | 'resume' | 'branch';
|
|
18
|
+
opcodeRange: {
|
|
19
|
+
start: number;
|
|
20
|
+
end: number;
|
|
21
|
+
};
|
|
22
|
+
index: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Compute a stable hash for a step.
|
|
26
|
+
*
|
|
27
|
+
* The hash is based on:
|
|
28
|
+
* 1. Step type
|
|
29
|
+
* 2. Signal/timer identity (for suspension points)
|
|
30
|
+
* 3. Step index as tiebreaker
|
|
31
|
+
*
|
|
32
|
+
* This means:
|
|
33
|
+
* - Adding console.log doesn't change the hash (no new suspension)
|
|
34
|
+
* - Renaming variables doesn't change the hash (not part of identity)
|
|
35
|
+
* - Adding a new suspension point DOES change subsequent hashes
|
|
36
|
+
*/
|
|
37
|
+
export declare function computeStepHash(input: StepHashInput, analysis: AnalysisResult, opcodeStart: number): string;
|
|
38
|
+
/**
|
|
39
|
+
* Compute a version hash for the entire process.
|
|
40
|
+
* Used to detect if the process structure has changed.
|
|
41
|
+
*/
|
|
42
|
+
export declare function computeVersionHash(analysis: AnalysisResult): string;
|
|
43
|
+
//# sourceMappingURL=step-hash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-hash.d.ts","sourceRoot":"","sources":["../../src/compiler/step-hash.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAA;IAC7C,WAAW,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IAC3C,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAE,MAAM,GAClB,MAAM,CA6CR;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CASnE"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @justscale/core/process - Step Hash Computation
|
|
3
|
+
*
|
|
4
|
+
* Computes stable hashes for process steps to enable:
|
|
5
|
+
* 1. Persistence stability (code changes don't break suspended processes)
|
|
6
|
+
* 2. Version migration detection
|
|
7
|
+
* 3. Debugging/tracing
|
|
8
|
+
*
|
|
9
|
+
* Hash inputs:
|
|
10
|
+
* - Step type (entry, resume, branch)
|
|
11
|
+
* - Signal/timer being waited on (for resume steps)
|
|
12
|
+
* - Suspension index within the function
|
|
13
|
+
* - Control flow context
|
|
14
|
+
*/
|
|
15
|
+
import { createHash } from 'crypto';
|
|
16
|
+
/**
|
|
17
|
+
* Compute a stable hash for a step.
|
|
18
|
+
*
|
|
19
|
+
* The hash is based on:
|
|
20
|
+
* 1. Step type
|
|
21
|
+
* 2. Signal/timer identity (for suspension points)
|
|
22
|
+
* 3. Step index as tiebreaker
|
|
23
|
+
*
|
|
24
|
+
* This means:
|
|
25
|
+
* - Adding console.log doesn't change the hash (no new suspension)
|
|
26
|
+
* - Renaming variables doesn't change the hash (not part of identity)
|
|
27
|
+
* - Adding a new suspension point DOES change subsequent hashes
|
|
28
|
+
*/
|
|
29
|
+
export function computeStepHash(input, analysis, opcodeStart) {
|
|
30
|
+
const { type, index } = input;
|
|
31
|
+
const { opcodes } = analysis;
|
|
32
|
+
// Build hash input string
|
|
33
|
+
const parts = [type];
|
|
34
|
+
// For resume/branch steps, include the signal/timer being waited on
|
|
35
|
+
if (type === 'resume' && opcodeStart > 0) {
|
|
36
|
+
const waitOp = opcodes[opcodeStart - 1];
|
|
37
|
+
if (waitOp.op === 'WAIT') {
|
|
38
|
+
parts.push(`signal:${waitOp.signal}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (type === 'branch') {
|
|
42
|
+
// Find the race branch this step handles
|
|
43
|
+
for (let i = 0; i < opcodeStart; i++) {
|
|
44
|
+
const op = opcodes[i];
|
|
45
|
+
if (op.op === 'RACE_START') {
|
|
46
|
+
for (const branch of op.branches) {
|
|
47
|
+
if (branch.jumpTarget === opcodeStart) {
|
|
48
|
+
if (branch.signal) {
|
|
49
|
+
parts.push(`race-signal:${branch.signal}`);
|
|
50
|
+
}
|
|
51
|
+
else if (branch.timer) {
|
|
52
|
+
// Serialize timer without the AST node - just unit and expression text
|
|
53
|
+
const timerInfo = `${branch.timer.unit}:${branch.timer.valueExpr.getText()}`;
|
|
54
|
+
parts.push(`race-timer:${timerInfo}`);
|
|
55
|
+
}
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Include index as tiebreaker for uniqueness
|
|
63
|
+
parts.push(`idx:${index}`);
|
|
64
|
+
// Compute hash
|
|
65
|
+
const hashInput = parts.join('|');
|
|
66
|
+
const hash = createHash('sha256').update(hashInput).digest('hex').slice(0, 8);
|
|
67
|
+
// Return formatted hash with type prefix
|
|
68
|
+
return `${type}_${hash}`;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Compute a version hash for the entire process.
|
|
72
|
+
* Used to detect if the process structure has changed.
|
|
73
|
+
*/
|
|
74
|
+
export function computeVersionHash(analysis) {
|
|
75
|
+
const structure = JSON.stringify({
|
|
76
|
+
opcodes: analysis.opcodes.map(op => op.op),
|
|
77
|
+
signals: Object.keys(analysis.signals).sort(),
|
|
78
|
+
rehydration: Object.keys(analysis.rehydrationBlocks).sort(),
|
|
79
|
+
});
|
|
80
|
+
const hash = createHash('sha256').update(structure).digest('hex').slice(0, 8);
|
|
81
|
+
return `v_${hash}`;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=step-hash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-hash.js","sourceRoot":"","sources":["../../src/compiler/step-hash.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @justscale/core/process - Switch-Based Code Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates VM-style switch-based execution code from process analysis.
|
|
5
|
+
*
|
|
6
|
+
* The generated code follows this pattern:
|
|
7
|
+
* ```
|
|
8
|
+
* async execute(ctx) {
|
|
9
|
+
* const { state, services } = ctx
|
|
10
|
+
* let step = state.step | 0
|
|
11
|
+
* const __r = [0, undefined] // [DONE/SUSPEND, payload]
|
|
12
|
+
*
|
|
13
|
+
* main_loop: while (true) {
|
|
14
|
+
* switch (step) {
|
|
15
|
+
* case 0: { ... }
|
|
16
|
+
* case 1: { ... }
|
|
17
|
+
* }
|
|
18
|
+
* }
|
|
19
|
+
* return __r
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
import ts from 'typescript';
|
|
24
|
+
import type { AnalysisResult } from './analyzer.js';
|
|
25
|
+
export interface SwitchCodeGenInput {
|
|
26
|
+
id: string;
|
|
27
|
+
path: string;
|
|
28
|
+
version: string;
|
|
29
|
+
injectNode: ts.ObjectLiteralExpression | undefined;
|
|
30
|
+
typesNode?: ts.Expression;
|
|
31
|
+
handler: ts.FunctionExpression | ts.ArrowFunction | ts.MethodDeclaration;
|
|
32
|
+
analysis: AnalysisResult;
|
|
33
|
+
originalNode?: ts.Node;
|
|
34
|
+
typeChecker?: ts.TypeChecker;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Represents a step (case) in the generated switch statement.
|
|
38
|
+
*/
|
|
39
|
+
export interface Step {
|
|
40
|
+
/** Unique step index (0-based) */
|
|
41
|
+
index: number;
|
|
42
|
+
/** Hash for persistence stability */
|
|
43
|
+
hash: string;
|
|
44
|
+
/** Step type for semantic meaning */
|
|
45
|
+
type: 'entry' | 'block' | 'resume' | 'branch';
|
|
46
|
+
/** Source line range [start, end] for debugging */
|
|
47
|
+
sourceRange?: [number, number];
|
|
48
|
+
/** Opcodes to execute in this step */
|
|
49
|
+
opcodeRange: {
|
|
50
|
+
start: number;
|
|
51
|
+
end: number;
|
|
52
|
+
};
|
|
53
|
+
/** Next step after execution (if not suspended/returned) */
|
|
54
|
+
nextStep?: number;
|
|
55
|
+
/** For resume steps: the rehydration deps */
|
|
56
|
+
rehydrateDeps?: string[];
|
|
57
|
+
/** For race branches: branch info */
|
|
58
|
+
branchInfo?: {
|
|
59
|
+
raceOpcodeIndex: number;
|
|
60
|
+
branchId: string;
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Result of building steps from opcodes.
|
|
65
|
+
*/
|
|
66
|
+
export interface StepBuildResult {
|
|
67
|
+
steps: Step[];
|
|
68
|
+
stepMap: Record<string, number>;
|
|
69
|
+
sourceMap: Record<number, [number, number]>;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Build steps from opcodes.
|
|
73
|
+
* Steps are created for:
|
|
74
|
+
* 1. Entry point (step 0)
|
|
75
|
+
* 2. After each suspension point (WAIT, RACE_SUSPEND)
|
|
76
|
+
* 3. Jump targets (after JUMP_IF, LABEL targets)
|
|
77
|
+
* 4. Race branch handlers
|
|
78
|
+
*/
|
|
79
|
+
export declare function buildSteps(analysis: AnalysisResult): StepBuildResult;
|
|
80
|
+
/**
|
|
81
|
+
* Generate the compiled switch-based process.
|
|
82
|
+
*/
|
|
83
|
+
export declare function generateSwitchProcess(factory: ts.NodeFactory, input: SwitchCodeGenInput): ts.Expression;
|
|
84
|
+
//# sourceMappingURL=switch-codegen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switch-codegen.d.ts","sourceRoot":"","sources":["../../src/compiler/switch-codegen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,cAAc,EAA+B,MAAM,eAAe,CAAC;AAajF,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,EAAE,CAAC,uBAAuB,GAAG,SAAS,CAAA;IAClD,SAAS,CAAC,EAAE,EAAE,CAAC,UAAU,CAAA;IACzB,OAAO,EAAE,EAAE,CAAC,kBAAkB,GAAG,EAAE,CAAC,aAAa,GAAG,EAAE,CAAC,iBAAiB,CAAA;IACxE,QAAQ,EAAE,cAAc,CAAA;IACxB,YAAY,CAAC,EAAE,EAAE,CAAC,IAAI,CAAA;IACtB,WAAW,CAAC,EAAE,EAAE,CAAC,WAAW,CAAA;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,qCAAqC;IACrC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAA;IAC7C,mDAAmD;IACnD,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,sCAAsC;IACtC,WAAW,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IAC3C,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,6CAA6C;IAC7C,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,qCAAqC;IACrC,UAAU,CAAC,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;CAC3D;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,IAAI,EAAE,CAAA;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAC5C;AAuFD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,cAAc,GAAG,eAAe,CA2TpE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,EAAE,CAAC,WAAW,EACvB,KAAK,EAAE,kBAAkB,GACxB,EAAE,CAAC,UAAU,CAqHf"}
|