@tsonic/frontend 0.0.35 → 0.0.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/ir/builder/statements.d.ts.map +1 -1
- package/dist/ir/builder/statements.js +13 -3
- package/dist/ir/builder/statements.js.map +1 -1
- package/dist/ir/converters/statements/control/blocks.d.ts.map +1 -1
- package/dist/ir/converters/statements/control/blocks.js +21 -4
- package/dist/ir/converters/statements/control/blocks.js.map +1 -1
- package/dist/ir/converters/statements/control/conditionals.d.ts.map +1 -1
- package/dist/ir/converters/statements/control/conditionals.js +16 -1
- package/dist/ir/converters/statements/control/conditionals.js.map +1 -1
- package/dist/ir/converters/statements/control/loops.d.ts.map +1 -1
- package/dist/ir/converters/statements/control/loops.js +63 -11
- package/dist/ir/converters/statements/control/loops.js.map +1 -1
- package/dist/ir/converters/statements/declarations/variables.d.ts.map +1 -1
- package/dist/ir/converters/statements/declarations/variables.js +33 -57
- package/dist/ir/converters/statements/declarations/variables.js.map +1 -1
- package/dist/ir/converters/statements/helpers.d.ts.map +1 -1
- package/dist/ir/converters/statements/helpers.js +21 -18
- package/dist/ir/converters/statements/helpers.js.map +1 -1
- package/dist/ir/converters/type-env.d.ts +32 -0
- package/dist/ir/converters/type-env.d.ts.map +1 -0
- package/dist/ir/converters/type-env.js +186 -0
- package/dist/ir/converters/type-env.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conditionals.js","sourceRoot":"","sources":["../../../../../src/ir/converters/statements/control/conditionals.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"conditionals.js","sourceRoot":"","sources":["../../../../../src/ir/converters/statements/control/conditionals.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loops.d.ts","sourceRoot":"","sources":["../../../../../src/ir/converters/statements/control/loops.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,MAAM,EACP,MAAM,mBAAmB,CAAC;AAK3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"loops.d.ts","sourceRoot":"","sources":["../../../../../src/ir/converters/statements/control/loops.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,MAAM,EACP,MAAM,mBAAmB,CAAC;AAK3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAGlE;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAChC,MAAM,EAAE,CAAC,cAAc,EACvB,KAAK,cAAc,EACnB,qBAAqB,MAAM,KAC1B,gBAOF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAC9B,MAAM,EAAE,CAAC,YAAY,EACrB,KAAK,cAAc,EACnB,qBAAqB,MAAM,KAC1B,cA0BF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAChC,MAAM,EAAE,CAAC,cAAc,EACvB,KAAK,cAAc,EACnB,qBAAqB,MAAM,KAC1B,gBAoDF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAChC,MAAM,EAAE,CAAC,cAAc,EACvB,KAAK,cAAc,EACnB,qBAAqB,MAAM,KAC1B,gBA8CF,CAAC"}
|
|
@@ -8,6 +8,7 @@ import { convertExpression } from "../../../expression-converter.js";
|
|
|
8
8
|
import { convertBindingName } from "../../../syntax/binding-patterns.js";
|
|
9
9
|
import { convertStatementSingle } from "../../../statement-converter.js";
|
|
10
10
|
import { convertVariableDeclarationList } from "../helpers.js";
|
|
11
|
+
import { withVariableTypeEnv } from "../../type-env.js";
|
|
11
12
|
/**
|
|
12
13
|
* Convert while statement
|
|
13
14
|
*
|
|
@@ -27,19 +28,27 @@ export const convertWhileStatement = (node, ctx, expectedReturnType) => {
|
|
|
27
28
|
* @param expectedReturnType - Return type from enclosing function for contextual typing.
|
|
28
29
|
*/
|
|
29
30
|
export const convertForStatement = (node, ctx, expectedReturnType) => {
|
|
30
|
-
|
|
31
|
+
let initializer;
|
|
32
|
+
let bodyCtx = ctx;
|
|
33
|
+
if (node.initializer) {
|
|
34
|
+
if (ts.isVariableDeclarationList(node.initializer)) {
|
|
35
|
+
const converted = convertVariableDeclarationList(node.initializer, ctx);
|
|
36
|
+
initializer = converted;
|
|
37
|
+
bodyCtx = withVariableTypeEnv(ctx, node.initializer.declarations, converted);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
initializer = convertExpression(node.initializer, ctx, undefined);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const body = convertStatementSingle(node.statement, bodyCtx, expectedReturnType);
|
|
31
44
|
return {
|
|
32
45
|
kind: "forStatement",
|
|
33
|
-
initializer
|
|
34
|
-
? ts.isVariableDeclarationList(node.initializer)
|
|
35
|
-
? convertVariableDeclarationList(node.initializer, ctx)
|
|
36
|
-
: convertExpression(node.initializer, ctx, undefined)
|
|
37
|
-
: undefined,
|
|
46
|
+
initializer,
|
|
38
47
|
condition: node.condition
|
|
39
|
-
? convertExpression(node.condition,
|
|
48
|
+
? convertExpression(node.condition, bodyCtx, undefined)
|
|
40
49
|
: undefined,
|
|
41
50
|
update: node.incrementor
|
|
42
|
-
? convertExpression(node.incrementor,
|
|
51
|
+
? convertExpression(node.incrementor, bodyCtx, undefined)
|
|
43
52
|
: undefined,
|
|
44
53
|
body: body ?? { kind: "emptyStatement" },
|
|
45
54
|
};
|
|
@@ -56,11 +65,35 @@ export const convertForOfStatement = (node, ctx, expectedReturnType) => {
|
|
|
56
65
|
const variable = ts.isVariableDeclarationList(node.initializer)
|
|
57
66
|
? convertBindingName(firstDecl?.name ?? ts.factory.createIdentifier("_"))
|
|
58
67
|
: convertBindingName(node.initializer);
|
|
59
|
-
const
|
|
68
|
+
const expression = convertExpression(node.expression, ctx, undefined);
|
|
69
|
+
// Thread inferred loop variable type into the body (deterministic, TS-free).
|
|
70
|
+
// This is required for correct boolean-context lowering (e.g., `if (s)` for strings).
|
|
71
|
+
let bodyCtx = ctx;
|
|
72
|
+
if (ts.isVariableDeclarationList(node.initializer) && firstDecl) {
|
|
73
|
+
const srcType = expression.inferredType;
|
|
74
|
+
const elementType = srcType?.kind === "arrayType"
|
|
75
|
+
? srcType.elementType
|
|
76
|
+
: srcType?.kind === "tupleType"
|
|
77
|
+
? srcType.elementTypes.length === 1
|
|
78
|
+
? srcType.elementTypes[0]
|
|
79
|
+
: { kind: "unionType", types: srcType.elementTypes }
|
|
80
|
+
: undefined;
|
|
81
|
+
if (elementType) {
|
|
82
|
+
bodyCtx = withVariableTypeEnv(ctx, [firstDecl], {
|
|
83
|
+
kind: "variableDeclaration",
|
|
84
|
+
declarationKind: "const",
|
|
85
|
+
declarations: [
|
|
86
|
+
{ kind: "variableDeclarator", name: variable, type: elementType },
|
|
87
|
+
],
|
|
88
|
+
isExported: false,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const body = convertStatementSingle(node.statement, bodyCtx, expectedReturnType);
|
|
60
93
|
return {
|
|
61
94
|
kind: "forOfStatement",
|
|
62
95
|
variable,
|
|
63
|
-
expression
|
|
96
|
+
expression,
|
|
64
97
|
body: body ?? { kind: "emptyStatement" },
|
|
65
98
|
// TS parser marks `for await` loops with both `awaitModifier` and AwaitContext flags.
|
|
66
99
|
// Use both to be resilient across TS versions/host implementations.
|
|
@@ -85,7 +118,26 @@ export const convertForInStatement = (node, ctx, expectedReturnType) => {
|
|
|
85
118
|
const typedVariable = variable.kind === "identifierPattern"
|
|
86
119
|
? { ...variable, type: { kind: "primitiveType", name: "string" } }
|
|
87
120
|
: variable;
|
|
88
|
-
|
|
121
|
+
// `for (k in obj)` binds `k` as a string. Thread this into the body for
|
|
122
|
+
// correct boolean-context lowering (empty string is falsy in JS).
|
|
123
|
+
let bodyCtx = ctx;
|
|
124
|
+
const stringType = { kind: "primitiveType", name: "string" };
|
|
125
|
+
if (ts.isVariableDeclarationList(node.initializer) && firstDecl) {
|
|
126
|
+
bodyCtx = withVariableTypeEnv(ctx, [firstDecl], {
|
|
127
|
+
kind: "variableDeclaration",
|
|
128
|
+
declarationKind: "const",
|
|
129
|
+
declarations: [
|
|
130
|
+
{ kind: "variableDeclarator", name: typedVariable, type: stringType },
|
|
131
|
+
],
|
|
132
|
+
isExported: false,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
else if (ts.isIdentifier(node.initializer)) {
|
|
136
|
+
// Assignment form: for (k in obj) { ... } where k is pre-declared.
|
|
137
|
+
// Do not override its declaration type here.
|
|
138
|
+
bodyCtx = ctx;
|
|
139
|
+
}
|
|
140
|
+
const body = convertStatementSingle(node.statement, bodyCtx, expectedReturnType);
|
|
89
141
|
return {
|
|
90
142
|
kind: "forInStatement",
|
|
91
143
|
variable: typedVariable,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loops.js","sourceRoot":"","sources":["../../../../../src/ir/converters/statements/control/loops.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAQjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,8BAA8B,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"loops.js","sourceRoot":"","sources":["../../../../../src/ir/converters/statements/control/loops.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAQjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,8BAA8B,EAAE,MAAM,eAAe,CAAC;AAE/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,IAAuB,EACvB,GAAmB,EACnB,kBAA2B,EACT,EAAE;IACpB,MAAM,IAAI,GAAG,sBAAsB,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,kBAAkB,CAAC,CAAC;IAC7E,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,SAAS,EAAE,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,SAAS,CAAC;QAC7D,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE;KACzC,CAAC;AACJ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,IAAqB,EACrB,GAAmB,EACnB,kBAA2B,EACX,EAAE;IAClB,IAAI,WAAsD,CAAC;IAC3D,IAAI,OAAO,GAAmB,GAAG,CAAC;IAElC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,IAAI,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACnD,MAAM,SAAS,GAAG,8BAA8B,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;YACxE,WAAW,GAAG,SAAS,CAAC;YACxB,OAAO,GAAG,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAC/E,CAAC;aAAM,CAAC;YACN,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,sBAAsB,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC;IACjF,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,WAAW;QACX,SAAS,EAAE,IAAI,CAAC,SAAS;YACvB,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC;YACvD,CAAC,CAAC,SAAS;QACb,MAAM,EAAE,IAAI,CAAC,WAAW;YACtB,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,SAAS,CAAC;YACzD,CAAC,CAAC,SAAS;QACb,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE;KACzC,CAAC;AACJ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,IAAuB,EACvB,GAAmB,EACnB,kBAA2B,EACT,EAAE;IACpB,MAAM,SAAS,GAAG,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,WAAW,CAAC;QAC9D,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,QAAQ,GAAG,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,WAAW,CAAC;QAC7D,CAAC,CAAC,kBAAkB,CAAC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACzE,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAA6B,CAAC,CAAC;IAE3D,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IAEtE,6EAA6E;IAC7E,sFAAsF;IACtF,IAAI,OAAO,GAAG,GAAG,CAAC;IAClB,IAAI,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,SAAS,EAAE,CAAC;QAChE,MAAM,OAAO,GAAG,UAAU,CAAC,YAAY,CAAC;QACxC,MAAM,WAAW,GACf,OAAO,EAAE,IAAI,KAAK,WAAW;YAC3B,CAAC,CAAC,OAAO,CAAC,WAAW;YACrB,CAAC,CAAC,OAAO,EAAE,IAAI,KAAK,WAAW;gBAC7B,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;oBACjC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;oBACzB,CAAC,CAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,YAAY,EAAY;gBACjE,CAAC,CAAC,SAAS,CAAC;QAClB,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,GAAG,mBAAmB,CAC3B,GAAG,EACH,CAAC,SAAS,CAAC,EACX;gBACE,IAAI,EAAE,qBAAqB;gBAC3B,eAAe,EAAE,OAAO;gBACxB,YAAY,EAAE;oBACZ,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE;iBAClE;gBACD,UAAU,EAAE,KAAK;aAClB,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,sBAAsB,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC;IACjF,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,QAAQ;QACR,UAAU;QACV,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE;QACxC,sFAAsF;QACtF,oEAAoE;QACpE,OAAO,EACL,IAAI,CAAC,aAAa,KAAK,SAAS;YAChC,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC;KACjD,CAAC;AACJ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,IAAuB,EACvB,GAAmB,EACnB,kBAA2B,EACT,EAAE;IACpB,MAAM,SAAS,GAAG,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,WAAW,CAAC;QAC9D,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,QAAQ,GAAG,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,WAAW,CAAC;QAC7D,CAAC,CAAC,kBAAkB,CAAC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACzE,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC;YACjC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;YACtC,CAAC,CAAC,kBAAkB,CAAC,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;IAE3D,MAAM,aAAa,GACjB,QAAQ,CAAC,IAAI,KAAK,mBAAmB;QACnC,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAW,EAAE;QAC3E,CAAC,CAAC,QAAQ,CAAC;IAEf,wEAAwE;IACxE,kEAAkE;IAClE,IAAI,OAAO,GAAG,GAAG,CAAC;IAClB,MAAM,UAAU,GAAG,EAAE,IAAI,EAAE,eAAwB,EAAE,IAAI,EAAE,QAAiB,EAAE,CAAC;IAC/E,IAAI,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,SAAS,EAAE,CAAC;QAChE,OAAO,GAAG,mBAAmB,CAC3B,GAAG,EACH,CAAC,SAAS,CAAC,EACX;YACE,IAAI,EAAE,qBAAqB;YAC3B,eAAe,EAAE,OAAO;YACxB,YAAY,EAAE;gBACZ,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE;aACtE;YACD,UAAU,EAAE,KAAK;SAClB,CACF,CAAC;IACJ,CAAC;SAAM,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7C,mEAAmE;QACnE,6CAA6C;QAC7C,OAAO,GAAG,GAAG,CAAC;IAChB,CAAC;IAED,MAAM,IAAI,GAAG,sBAAsB,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC;IACjF,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,QAAQ,EAAE,aAAa;QACvB,UAAU,EAAE,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,SAAS,CAAC;QAC9D,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE;KACzC,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variables.d.ts","sourceRoot":"","sources":["../../../../../src/ir/converters/statements/declarations/variables.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,
|
|
1
|
+
{"version":3,"file":"variables.d.ts","sourceRoot":"","sources":["../../../../../src/ir/converters/statements/declarations/variables.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EACL,qBAAqB,EAEtB,MAAM,mBAAmB,CAAC;AAI3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAyElE;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,wBAAwB,GACnC,MAAM,EAAE,CAAC,iBAAiB,EAC1B,KAAK,cAAc,KAClB,qBAwDF,CAAC"}
|
|
@@ -5,6 +5,7 @@ import * as ts from "typescript";
|
|
|
5
5
|
import { convertExpression } from "../../../expression-converter.js";
|
|
6
6
|
import { convertBindingName } from "../../../syntax/binding-patterns.js";
|
|
7
7
|
import { hasExportModifier } from "../helpers.js";
|
|
8
|
+
import { deriveTypeFromExpression, withVariableDeclaratorTypeEnv } from "../../type-env.js";
|
|
8
9
|
/**
|
|
9
10
|
* Derive the type from a converted IR expression using deterministic rules.
|
|
10
11
|
* NO TYPESCRIPT FALLBACK - types must be derivable from IR or undefined.
|
|
@@ -16,36 +17,6 @@ import { hasExportModifier } from "../helpers.js";
|
|
|
16
17
|
* - Identifiers → use inferredType
|
|
17
18
|
* - Other → use inferredType if available, otherwise undefined
|
|
18
19
|
*/
|
|
19
|
-
const deriveTypeFromExpression = (expr) => {
|
|
20
|
-
// For literals, the inferredType is already set deterministically
|
|
21
|
-
if (expr.kind === "literal") {
|
|
22
|
-
return expr.inferredType;
|
|
23
|
-
}
|
|
24
|
-
// For arrays, derive from first element's type or array's inferredType
|
|
25
|
-
if (expr.kind === "array") {
|
|
26
|
-
if (expr.inferredType) {
|
|
27
|
-
return expr.inferredType;
|
|
28
|
-
}
|
|
29
|
-
// Try to derive from first element
|
|
30
|
-
if (expr.elements.length > 0) {
|
|
31
|
-
const firstElement = expr.elements[0];
|
|
32
|
-
if (firstElement) {
|
|
33
|
-
const elementType = deriveTypeFromExpression(firstElement);
|
|
34
|
-
if (elementType) {
|
|
35
|
-
return { kind: "arrayType", elementType };
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
return undefined;
|
|
40
|
-
}
|
|
41
|
-
// For all other expressions, use their inferredType if available
|
|
42
|
-
// This includes call, new, identifier, member access, etc.
|
|
43
|
-
if ("inferredType" in expr && expr.inferredType) {
|
|
44
|
-
return expr.inferredType;
|
|
45
|
-
}
|
|
46
|
-
// Cannot determine type - return undefined (no TypeScript fallback)
|
|
47
|
-
return undefined;
|
|
48
|
-
};
|
|
49
20
|
/**
|
|
50
21
|
* Check if a variable statement is at module level (not inside a function).
|
|
51
22
|
* Module-level variables become static fields in C# and need explicit types.
|
|
@@ -113,36 +84,41 @@ export const convertVariableStatement = (node, ctx) => {
|
|
|
113
84
|
// Module-level variables need explicit types in C# (they become static fields)
|
|
114
85
|
const isModuleLevel = isModuleLevelVariable(node);
|
|
115
86
|
const needsExplicitType = isExported || isModuleLevel;
|
|
87
|
+
let currentCtx = ctx;
|
|
88
|
+
const declarations = [];
|
|
89
|
+
// Convert declarations sequentially so later declarators can refer to earlier ones:
|
|
90
|
+
// const a = false, b = !a;
|
|
91
|
+
for (const decl of node.declarationList.declarations) {
|
|
92
|
+
// expectedType for initializer: ONLY from explicit type annotation
|
|
93
|
+
// This ensures deterministic literal typing (e.g., 100 -> int unless annotated)
|
|
94
|
+
const expectedType = getExpectedTypeForInitializer(decl, currentCtx);
|
|
95
|
+
// Convert initializer first so we can deterministically derive types from IR.
|
|
96
|
+
const convertedInitializer = decl.initializer
|
|
97
|
+
? convertExpression(decl.initializer, currentCtx, expectedType)
|
|
98
|
+
: undefined;
|
|
99
|
+
// Determine declared type:
|
|
100
|
+
// 1) Explicit annotation wins.
|
|
101
|
+
// 2) For module-level/static variables (and exports), C# requires explicit type.
|
|
102
|
+
// Derive from initializer deterministically (no TS fallback).
|
|
103
|
+
const declaredType = decl.type
|
|
104
|
+
? currentCtx.typeSystem.typeFromSyntax(currentCtx.binding.captureTypeSyntax(decl.type))
|
|
105
|
+
: needsExplicitType && convertedInitializer && !isBindingPattern(decl)
|
|
106
|
+
? deriveTypeFromExpression(convertedInitializer)
|
|
107
|
+
: undefined;
|
|
108
|
+
const irDecl = {
|
|
109
|
+
kind: "variableDeclarator",
|
|
110
|
+
name: convertBindingName(decl.name),
|
|
111
|
+
type: declaredType,
|
|
112
|
+
initializer: convertedInitializer,
|
|
113
|
+
};
|
|
114
|
+
declarations.push(irDecl);
|
|
115
|
+
// Thread deterministic local types forward within the same statement.
|
|
116
|
+
currentCtx = withVariableDeclaratorTypeEnv(currentCtx, decl.name, irDecl);
|
|
117
|
+
}
|
|
116
118
|
return {
|
|
117
119
|
kind: "variableDeclaration",
|
|
118
120
|
declarationKind,
|
|
119
|
-
declarations
|
|
120
|
-
// expectedType for initializer: ONLY from explicit type annotation
|
|
121
|
-
// This ensures deterministic literal typing (e.g., 100 -> int unless annotated)
|
|
122
|
-
const expectedType = getExpectedTypeForInitializer(decl, ctx);
|
|
123
|
-
// Convert initializer FIRST (before determining type)
|
|
124
|
-
// This allows us to derive the variable type from the converted expression
|
|
125
|
-
const convertedInitializer = decl.initializer
|
|
126
|
-
? convertExpression(decl.initializer, ctx, expectedType)
|
|
127
|
-
: undefined;
|
|
128
|
-
// Determine the variable type:
|
|
129
|
-
// 1. If there's an explicit annotation, use it
|
|
130
|
-
// 2. If we need an explicit type (module-level) and have an initializer,
|
|
131
|
-
// derive it from the converted expression (NO TypeScript fallback)
|
|
132
|
-
// 3. Otherwise, undefined (let emitter use var or report error)
|
|
133
|
-
// PHASE 4 (Alice's spec): Use captureTypeSyntax + typeFromSyntax
|
|
134
|
-
const declaredType = decl.type
|
|
135
|
-
? ctx.typeSystem.typeFromSyntax(ctx.binding.captureTypeSyntax(decl.type))
|
|
136
|
-
: needsExplicitType && convertedInitializer && !isBindingPattern(decl)
|
|
137
|
-
? deriveTypeFromExpression(convertedInitializer)
|
|
138
|
-
: undefined;
|
|
139
|
-
return {
|
|
140
|
-
kind: "variableDeclarator",
|
|
141
|
-
name: convertBindingName(decl.name),
|
|
142
|
-
type: declaredType,
|
|
143
|
-
initializer: convertedInitializer,
|
|
144
|
-
};
|
|
145
|
-
}),
|
|
121
|
+
declarations,
|
|
146
122
|
isExported,
|
|
147
123
|
};
|
|
148
124
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variables.js","sourceRoot":"","sources":["../../../../../src/ir/converters/statements/declarations/variables.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"variables.js","sourceRoot":"","sources":["../../../../../src/ir/converters/statements/declarations/variables.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../src/ir/converters/statements/helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EACL,WAAW,EACX,eAAe,EACf,eAAe,EAEf,qBAAqB,
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../src/ir/converters/statements/helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EACL,WAAW,EACX,eAAe,EACf,eAAe,EAEf,qBAAqB,EAEtB,MAAM,gBAAgB,CAAC;AAIxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D;;GAEG;AACH,eAAO,MAAM,qBAAqB,GAChC,gBAAgB,SAAS,EAAE,CAAC,wBAAwB,EAAE,GAAG,SAAS,EAClE,KAAK,cAAc,KAClB,SAAS,eAAe,EAAE,GAAG,SAsC/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAC5B,YAAY,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,oBAAoB,CAAC,EACjD,KAAK,cAAc,KAClB,SAAS,WAAW,EA2DtB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,8BAA8B,GACzC,MAAM,EAAE,CAAC,uBAAuB,EAChC,KAAK,cAAc,KAClB,qBAiCF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,MAAM,EAAE,CAAC,IAAI,KAAG,OAMjD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,MAAM,EAAE,CAAC,IAAI,KAAG,OAMjD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,MAAM,EAAE,CAAC,IAAI,KAAG,OAMnD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAAI,MAAM,EAAE,CAAC,IAAI,KAAG,eAQhD,CAAC"}
|
|
@@ -5,6 +5,7 @@ import * as ts from "typescript";
|
|
|
5
5
|
import { convertBindingName } from "../../syntax/binding-patterns.js";
|
|
6
6
|
import { convertExpression } from "../../expression-converter.js";
|
|
7
7
|
import { convertInterfaceMember } from "./declarations.js";
|
|
8
|
+
import { withVariableDeclaratorTypeEnv } from "../type-env.js";
|
|
8
9
|
/**
|
|
9
10
|
* Convert TypeScript type parameters to IR, detecting structural constraints
|
|
10
11
|
*/
|
|
@@ -105,24 +106,26 @@ export const convertVariableDeclarationList = (node, ctx) => {
|
|
|
105
106
|
const declarationKind = isConst ? "const" : isLet ? "let" : "var";
|
|
106
107
|
// PHASE 4 (Alice's spec): Use captureTypeSyntax + typeFromSyntax
|
|
107
108
|
const typeSystem = ctx.typeSystem;
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
|
|
109
|
+
let currentCtx = ctx;
|
|
110
|
+
const declarations = [];
|
|
111
|
+
// Convert sequentially so later declarators can refer to earlier ones.
|
|
112
|
+
for (const decl of node.declarations) {
|
|
113
|
+
const declType = decl.type
|
|
114
|
+
? typeSystem.typeFromSyntax(currentCtx.binding.captureTypeSyntax(decl.type))
|
|
115
|
+
: undefined;
|
|
116
|
+
const initializer = decl.initializer
|
|
117
|
+
? convertExpression(decl.initializer, currentCtx, declType)
|
|
118
|
+
: undefined;
|
|
119
|
+
const irDecl = {
|
|
120
|
+
kind: "variableDeclarator",
|
|
121
|
+
name: convertBindingName(decl.name),
|
|
122
|
+
type: declType,
|
|
123
|
+
initializer,
|
|
124
|
+
};
|
|
125
|
+
declarations.push(irDecl);
|
|
126
|
+
currentCtx = withVariableDeclaratorTypeEnv(currentCtx, decl.name, irDecl);
|
|
127
|
+
}
|
|
128
|
+
return { kind: "variableDeclaration", declarationKind, declarations, isExported: false };
|
|
126
129
|
};
|
|
127
130
|
/**
|
|
128
131
|
* Check if node has export modifier
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/ir/converters/statements/helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/ir/converters/statements/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type environment helpers
|
|
3
|
+
*
|
|
4
|
+
* Extends ProgramContext.typeEnv with deterministic types discovered during conversion.
|
|
5
|
+
*
|
|
6
|
+
* IMPORTANT:
|
|
7
|
+
* - This is NOT TypeScript type-checking.
|
|
8
|
+
* - This is deterministic, IR-derived typing used to avoid "unknown" fallbacks
|
|
9
|
+
* for common local variables (e.g., `const ok = x !== undefined` → boolean).
|
|
10
|
+
*/
|
|
11
|
+
import * as ts from "typescript";
|
|
12
|
+
import type { ProgramContext } from "../program-context.js";
|
|
13
|
+
import type { IrExpression, IrType, IrVariableDeclaration, IrVariableDeclarator } from "../types.js";
|
|
14
|
+
/**
|
|
15
|
+
* Derive the type from a converted IR expression using deterministic rules.
|
|
16
|
+
* NO TYPESCRIPT FALLBACK - types must be derivable from IR or undefined.
|
|
17
|
+
*
|
|
18
|
+
* DETERMINISTIC TYPING RULES:
|
|
19
|
+
* - Literals → use inferredType (already set deterministically in literals.ts)
|
|
20
|
+
* - Arrays → use inferredType, or derive from first element
|
|
21
|
+
* - All other expressions → use inferredType if present
|
|
22
|
+
*/
|
|
23
|
+
export declare const deriveTypeFromExpression: (expr: IrExpression) => IrType | undefined;
|
|
24
|
+
export declare const withVariableDeclaratorTypeEnv: (ctx: ProgramContext, name: ts.BindingName, decl: IrVariableDeclarator) => ProgramContext;
|
|
25
|
+
/**
|
|
26
|
+
* Extend ctx.typeEnv with deterministic types for declared variables.
|
|
27
|
+
*
|
|
28
|
+
* Used to type later references to locals without resorting to "unknown" fallbacks.
|
|
29
|
+
* This is required for correct emission of operators like `!x` (boolean vs truthiness).
|
|
30
|
+
*/
|
|
31
|
+
export declare const withVariableTypeEnv: (ctx: ProgramContext, tsDecls: readonly ts.VariableDeclaration[], ir: IrVariableDeclaration) => ProgramContext;
|
|
32
|
+
//# sourceMappingURL=type-env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-env.d.ts","sourceRoot":"","sources":["../../../src/ir/converters/type-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EACV,YAAY,EACZ,MAAM,EACN,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,aAAa,CAAC;AAErB;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,GAAI,MAAM,YAAY,KAAG,MAAM,GAAG,SAkBtE,CAAC;AAqIF,eAAO,MAAM,6BAA6B,GACxC,KAAK,cAAc,EACnB,MAAM,EAAE,CAAC,WAAW,EACpB,MAAM,oBAAoB,KACzB,cAYF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAC9B,KAAK,cAAc,EACnB,SAAS,SAAS,EAAE,CAAC,mBAAmB,EAAE,EAC1C,IAAI,qBAAqB,KACxB,cAoBF,CAAC"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type environment helpers
|
|
3
|
+
*
|
|
4
|
+
* Extends ProgramContext.typeEnv with deterministic types discovered during conversion.
|
|
5
|
+
*
|
|
6
|
+
* IMPORTANT:
|
|
7
|
+
* - This is NOT TypeScript type-checking.
|
|
8
|
+
* - This is deterministic, IR-derived typing used to avoid "unknown" fallbacks
|
|
9
|
+
* for common local variables (e.g., `const ok = x !== undefined` → boolean).
|
|
10
|
+
*/
|
|
11
|
+
import * as ts from "typescript";
|
|
12
|
+
/**
|
|
13
|
+
* Derive the type from a converted IR expression using deterministic rules.
|
|
14
|
+
* NO TYPESCRIPT FALLBACK - types must be derivable from IR or undefined.
|
|
15
|
+
*
|
|
16
|
+
* DETERMINISTIC TYPING RULES:
|
|
17
|
+
* - Literals → use inferredType (already set deterministically in literals.ts)
|
|
18
|
+
* - Arrays → use inferredType, or derive from first element
|
|
19
|
+
* - All other expressions → use inferredType if present
|
|
20
|
+
*/
|
|
21
|
+
export const deriveTypeFromExpression = (expr) => {
|
|
22
|
+
if (expr.kind === "literal") {
|
|
23
|
+
return expr.inferredType;
|
|
24
|
+
}
|
|
25
|
+
if (expr.kind === "array") {
|
|
26
|
+
if (expr.inferredType)
|
|
27
|
+
return expr.inferredType;
|
|
28
|
+
const first = expr.elements[0];
|
|
29
|
+
if (!first)
|
|
30
|
+
return undefined;
|
|
31
|
+
const elementType = deriveTypeFromExpression(first);
|
|
32
|
+
return elementType ? { kind: "arrayType", elementType } : undefined;
|
|
33
|
+
}
|
|
34
|
+
if ("inferredType" in expr && expr.inferredType) {
|
|
35
|
+
return expr.inferredType;
|
|
36
|
+
}
|
|
37
|
+
return undefined;
|
|
38
|
+
};
|
|
39
|
+
const normalizeEnvType = (type) => {
|
|
40
|
+
if (!type)
|
|
41
|
+
return undefined;
|
|
42
|
+
if (type.kind === "unknownType" || type.kind === "anyType")
|
|
43
|
+
return undefined;
|
|
44
|
+
return type;
|
|
45
|
+
};
|
|
46
|
+
const getTupleElementType = (type, index) => {
|
|
47
|
+
if (!type)
|
|
48
|
+
return undefined;
|
|
49
|
+
if (type.kind === "tupleType") {
|
|
50
|
+
return type.elementTypes[index];
|
|
51
|
+
}
|
|
52
|
+
return undefined;
|
|
53
|
+
};
|
|
54
|
+
const getArrayElementType = (type, index) => {
|
|
55
|
+
if (!type)
|
|
56
|
+
return undefined;
|
|
57
|
+
if (type.kind === "arrayType")
|
|
58
|
+
return type.elementType;
|
|
59
|
+
const tuple = getTupleElementType(type, index);
|
|
60
|
+
if (tuple)
|
|
61
|
+
return tuple;
|
|
62
|
+
return undefined;
|
|
63
|
+
};
|
|
64
|
+
const getObjectPropertyType = (ctx, type, propName) => {
|
|
65
|
+
if (!type)
|
|
66
|
+
return undefined;
|
|
67
|
+
if (type.kind === "objectType") {
|
|
68
|
+
const member = type.members.find((m) => m.kind === "propertySignature" && m.name === propName);
|
|
69
|
+
if (member && member.kind === "propertySignature") {
|
|
70
|
+
return member.type;
|
|
71
|
+
}
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
if (type.kind === "referenceType") {
|
|
75
|
+
const memberType = ctx.typeSystem.typeOfMember(type, {
|
|
76
|
+
kind: "byName",
|
|
77
|
+
name: propName,
|
|
78
|
+
});
|
|
79
|
+
return memberType.kind === "unknownType" ? undefined : memberType;
|
|
80
|
+
}
|
|
81
|
+
return undefined;
|
|
82
|
+
};
|
|
83
|
+
const getPropertyNameText = (name) => {
|
|
84
|
+
if (ts.isIdentifier(name))
|
|
85
|
+
return name.text;
|
|
86
|
+
if (ts.isStringLiteral(name))
|
|
87
|
+
return name.text;
|
|
88
|
+
if (ts.isNumericLiteral(name))
|
|
89
|
+
return name.text;
|
|
90
|
+
return undefined;
|
|
91
|
+
};
|
|
92
|
+
const extendEnvForBindingName = (ctx, name, sourceType, ensureEnv) => {
|
|
93
|
+
const normalizedSource = normalizeEnvType(sourceType);
|
|
94
|
+
if (!normalizedSource)
|
|
95
|
+
return;
|
|
96
|
+
if (ts.isIdentifier(name)) {
|
|
97
|
+
const declId = ctx.binding.resolveIdentifier(name);
|
|
98
|
+
if (declId) {
|
|
99
|
+
ensureEnv().set(declId.id, normalizedSource);
|
|
100
|
+
}
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (ts.isArrayBindingPattern(name)) {
|
|
104
|
+
// Each element gets the array element type (or tuple element type if known).
|
|
105
|
+
for (let i = 0; i < name.elements.length; i++) {
|
|
106
|
+
const element = name.elements[i];
|
|
107
|
+
if (!element)
|
|
108
|
+
continue;
|
|
109
|
+
if (ts.isOmittedExpression(element))
|
|
110
|
+
continue;
|
|
111
|
+
const isRest = !!element.dotDotDotToken;
|
|
112
|
+
const elementType = getArrayElementType(normalizedSource, i);
|
|
113
|
+
const boundType = isRest && elementType
|
|
114
|
+
? { kind: "arrayType", elementType }
|
|
115
|
+
: elementType;
|
|
116
|
+
extendEnvForBindingName(ctx, element.name, boundType, ensureEnv);
|
|
117
|
+
}
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
if (ts.isObjectBindingPattern(name)) {
|
|
121
|
+
for (const element of name.elements) {
|
|
122
|
+
if (element.dotDotDotToken) {
|
|
123
|
+
// Rest object: its truthiness is object-like (always truthy if non-null),
|
|
124
|
+
// so the exact structural type is not required for boolean-context correctness.
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
const key = element.propertyName !== undefined
|
|
128
|
+
? getPropertyNameText(element.propertyName)
|
|
129
|
+
: ts.isIdentifier(element.name)
|
|
130
|
+
? element.name.text
|
|
131
|
+
: undefined;
|
|
132
|
+
if (!key)
|
|
133
|
+
continue;
|
|
134
|
+
const propType = getObjectPropertyType(ctx, normalizedSource, key);
|
|
135
|
+
extendEnvForBindingName(ctx, element.name, propType, ensureEnv);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
const deriveDeclaratorType = (decl) => {
|
|
140
|
+
const explicitType = normalizeEnvType(decl.type);
|
|
141
|
+
if (explicitType)
|
|
142
|
+
return explicitType;
|
|
143
|
+
const initType = decl.initializer
|
|
144
|
+
? normalizeEnvType(deriveTypeFromExpression(decl.initializer))
|
|
145
|
+
: undefined;
|
|
146
|
+
return initType;
|
|
147
|
+
};
|
|
148
|
+
export const withVariableDeclaratorTypeEnv = (ctx, name, decl) => {
|
|
149
|
+
const type = deriveDeclaratorType(decl);
|
|
150
|
+
if (!type)
|
|
151
|
+
return ctx;
|
|
152
|
+
let nextEnv;
|
|
153
|
+
const ensureEnv = () => {
|
|
154
|
+
if (!nextEnv)
|
|
155
|
+
nextEnv = new Map(ctx.typeEnv ?? []);
|
|
156
|
+
return nextEnv;
|
|
157
|
+
};
|
|
158
|
+
extendEnvForBindingName(ctx, name, type, ensureEnv);
|
|
159
|
+
return nextEnv ? { ...ctx, typeEnv: nextEnv } : ctx;
|
|
160
|
+
};
|
|
161
|
+
/**
|
|
162
|
+
* Extend ctx.typeEnv with deterministic types for declared variables.
|
|
163
|
+
*
|
|
164
|
+
* Used to type later references to locals without resorting to "unknown" fallbacks.
|
|
165
|
+
* This is required for correct emission of operators like `!x` (boolean vs truthiness).
|
|
166
|
+
*/
|
|
167
|
+
export const withVariableTypeEnv = (ctx, tsDecls, ir) => {
|
|
168
|
+
let nextEnv;
|
|
169
|
+
const ensureEnv = () => {
|
|
170
|
+
if (!nextEnv)
|
|
171
|
+
nextEnv = new Map(ctx.typeEnv ?? []);
|
|
172
|
+
return nextEnv;
|
|
173
|
+
};
|
|
174
|
+
for (let i = 0; i < tsDecls.length; i++) {
|
|
175
|
+
const tsDecl = tsDecls[i];
|
|
176
|
+
const irDecl = ir.declarations[i];
|
|
177
|
+
if (!tsDecl || !irDecl)
|
|
178
|
+
continue;
|
|
179
|
+
const inferredType = deriveDeclaratorType(irDecl);
|
|
180
|
+
if (!inferredType)
|
|
181
|
+
continue;
|
|
182
|
+
extendEnvForBindingName(ctx, tsDecl.name, inferredType, ensureEnv);
|
|
183
|
+
}
|
|
184
|
+
return nextEnv ? { ...ctx, typeEnv: nextEnv } : ctx;
|
|
185
|
+
};
|
|
186
|
+
//# sourceMappingURL=type-env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-env.js","sourceRoot":"","sources":["../../../src/ir/converters/type-env.ts"],"names":[],"mappings":"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"}
|