@tsonic/frontend 0.0.35 → 0.0.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/ir/builder/statements.d.ts.map +1 -1
  3. package/dist/ir/builder/statements.js +13 -3
  4. package/dist/ir/builder/statements.js.map +1 -1
  5. package/dist/ir/converters/expressions/operators.d.ts.map +1 -1
  6. package/dist/ir/converters/expressions/operators.js +58 -2
  7. package/dist/ir/converters/expressions/operators.js.map +1 -1
  8. package/dist/ir/converters/statements/control/blocks.d.ts.map +1 -1
  9. package/dist/ir/converters/statements/control/blocks.js +21 -4
  10. package/dist/ir/converters/statements/control/blocks.js.map +1 -1
  11. package/dist/ir/converters/statements/control/conditionals.d.ts.map +1 -1
  12. package/dist/ir/converters/statements/control/conditionals.js +16 -1
  13. package/dist/ir/converters/statements/control/conditionals.js.map +1 -1
  14. package/dist/ir/converters/statements/control/loops.d.ts.map +1 -1
  15. package/dist/ir/converters/statements/control/loops.js +63 -11
  16. package/dist/ir/converters/statements/control/loops.js.map +1 -1
  17. package/dist/ir/converters/statements/declarations/variables.d.ts.map +1 -1
  18. package/dist/ir/converters/statements/declarations/variables.js +33 -57
  19. package/dist/ir/converters/statements/declarations/variables.js.map +1 -1
  20. package/dist/ir/converters/statements/helpers.d.ts.map +1 -1
  21. package/dist/ir/converters/statements/helpers.js +21 -18
  22. package/dist/ir/converters/statements/helpers.js.map +1 -1
  23. package/dist/ir/converters/type-env.d.ts +32 -0
  24. package/dist/ir/converters/type-env.d.ts.map +1 -0
  25. package/dist/ir/converters/type-env.js +186 -0
  26. package/dist/ir/converters/type-env.js.map +1 -0
  27. package/package.json +1 -1
@@ -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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tsonic/frontend",
3
- "version": "0.0.35",
3
+ "version": "0.0.37",
4
4
  "description": "TypeScript parser and IR builder for Tsonic compiler",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",