@tsonic/emitter 0.0.4 → 0.0.5
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/core/imports.d.ts.map +1 -1
- package/dist/core/imports.js +13 -9
- package/dist/core/imports.js.map +1 -1
- package/dist/core/local-types.d.ts +19 -0
- package/dist/core/local-types.d.ts.map +1 -0
- package/dist/core/local-types.js +77 -0
- package/dist/core/local-types.js.map +1 -0
- package/dist/core/module-emitter/orchestrator.d.ts.map +1 -1
- package/dist/core/module-emitter/orchestrator.js +11 -4
- package/dist/core/module-emitter/orchestrator.js.map +1 -1
- package/dist/core/module-emitter/static-container.d.ts +2 -1
- package/dist/core/module-emitter/static-container.d.ts.map +1 -1
- package/dist/core/module-emitter/static-container.js +7 -2
- package/dist/core/module-emitter/static-container.js.map +1 -1
- package/dist/core/module-map.d.ts.map +1 -1
- package/dist/core/module-map.js +6 -0
- package/dist/core/module-map.js.map +1 -1
- package/dist/core/type-resolution.d.ts +47 -0
- package/dist/core/type-resolution.d.ts.map +1 -0
- package/dist/core/type-resolution.js +283 -0
- package/dist/core/type-resolution.js.map +1 -0
- package/dist/core/type-resolution.test.d.ts +5 -0
- package/dist/core/type-resolution.test.d.ts.map +1 -0
- package/dist/core/type-resolution.test.js +271 -0
- package/dist/core/type-resolution.test.js.map +1 -0
- package/dist/emitter-types/context.d.ts +29 -0
- package/dist/emitter-types/context.d.ts.map +1 -1
- package/dist/emitter-types/context.js +39 -0
- package/dist/emitter-types/context.js.map +1 -1
- package/dist/emitter-types/core.d.ts +31 -0
- package/dist/emitter-types/core.d.ts.map +1 -1
- package/dist/emitter-types/index.d.ts +2 -2
- package/dist/emitter-types/index.d.ts.map +1 -1
- package/dist/emitter-types/index.js +1 -1
- package/dist/emitter-types/index.js.map +1 -1
- package/dist/expression-emitter.d.ts.map +1 -1
- package/dist/expression-emitter.js +5 -5
- package/dist/expression-emitter.js.map +1 -1
- package/dist/expressions/collections.d.ts +5 -1
- package/dist/expressions/collections.d.ts.map +1 -1
- package/dist/expressions/collections.js +19 -8
- package/dist/expressions/collections.js.map +1 -1
- package/dist/expressions/literals.d.ts +2 -1
- package/dist/expressions/literals.d.ts.map +1 -1
- package/dist/expressions/literals.js +10 -1
- package/dist/expressions/literals.js.map +1 -1
- package/dist/expressions/literals.test.d.ts +5 -0
- package/dist/expressions/literals.test.d.ts.map +1 -0
- package/dist/expressions/literals.test.js +155 -0
- package/dist/expressions/literals.test.js.map +1 -0
- package/dist/expressions/operators.d.ts +5 -1
- package/dist/expressions/operators.d.ts.map +1 -1
- package/dist/expressions/operators.js +8 -3
- package/dist/expressions/operators.js.map +1 -1
- package/dist/statements/blocks.d.ts +1 -0
- package/dist/statements/blocks.d.ts.map +1 -1
- package/dist/statements/blocks.js +3 -1
- package/dist/statements/blocks.js.map +1 -1
- package/dist/statements/classes/members/methods.d.ts.map +1 -1
- package/dist/statements/classes/members/methods.js +14 -4
- package/dist/statements/classes/members/methods.js.map +1 -1
- package/dist/statements/declarations/classes.d.ts.map +1 -1
- package/dist/statements/declarations/classes.js +8 -3
- package/dist/statements/declarations/classes.js.map +1 -1
- package/dist/statements/declarations/functions.d.ts.map +1 -1
- package/dist/statements/declarations/functions.js +14 -4
- package/dist/statements/declarations/functions.js.map +1 -1
- package/dist/types/emitter.d.ts.map +1 -1
- package/dist/types/emitter.js +3 -0
- package/dist/types/emitter.js.map +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for type resolution helpers
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it } from "mocha";
|
|
5
|
+
import { expect } from "chai";
|
|
6
|
+
import { containsTypeParameter, substituteTypeArgs, getPropertyType, } from "./type-resolution.js";
|
|
7
|
+
describe("type-resolution", () => {
|
|
8
|
+
describe("containsTypeParameter", () => {
|
|
9
|
+
it("returns true for typeParameterType IR kind", () => {
|
|
10
|
+
const type = { kind: "typeParameterType", name: "T" };
|
|
11
|
+
const typeParams = new Set();
|
|
12
|
+
expect(containsTypeParameter(type, typeParams)).to.be.true;
|
|
13
|
+
});
|
|
14
|
+
it("returns true for referenceType matching typeParams set (legacy)", () => {
|
|
15
|
+
const type = { kind: "referenceType", name: "T" };
|
|
16
|
+
const typeParams = new Set(["T"]);
|
|
17
|
+
expect(containsTypeParameter(type, typeParams)).to.be.true;
|
|
18
|
+
});
|
|
19
|
+
it("returns false for referenceType not in typeParams set", () => {
|
|
20
|
+
const type = { kind: "referenceType", name: "string" };
|
|
21
|
+
const typeParams = new Set(["T"]);
|
|
22
|
+
expect(containsTypeParameter(type, typeParams)).to.be.false;
|
|
23
|
+
});
|
|
24
|
+
it("returns true for Array<T> containing type parameter", () => {
|
|
25
|
+
const type = {
|
|
26
|
+
kind: "referenceType",
|
|
27
|
+
name: "Array",
|
|
28
|
+
typeArguments: [{ kind: "typeParameterType", name: "T" }],
|
|
29
|
+
};
|
|
30
|
+
const typeParams = new Set();
|
|
31
|
+
expect(containsTypeParameter(type, typeParams)).to.be.true;
|
|
32
|
+
});
|
|
33
|
+
it("returns false for Array<string> (concrete type)", () => {
|
|
34
|
+
const type = {
|
|
35
|
+
kind: "referenceType",
|
|
36
|
+
name: "Array",
|
|
37
|
+
typeArguments: [{ kind: "primitiveType", name: "string" }],
|
|
38
|
+
};
|
|
39
|
+
const typeParams = new Set();
|
|
40
|
+
expect(containsTypeParameter(type, typeParams)).to.be.false;
|
|
41
|
+
});
|
|
42
|
+
it("returns true for arrayType with type parameter element", () => {
|
|
43
|
+
const type = {
|
|
44
|
+
kind: "arrayType",
|
|
45
|
+
elementType: { kind: "typeParameterType", name: "T" },
|
|
46
|
+
};
|
|
47
|
+
const typeParams = new Set();
|
|
48
|
+
expect(containsTypeParameter(type, typeParams)).to.be.true;
|
|
49
|
+
});
|
|
50
|
+
it("returns true for union type containing type parameter", () => {
|
|
51
|
+
const type = {
|
|
52
|
+
kind: "unionType",
|
|
53
|
+
types: [
|
|
54
|
+
{ kind: "primitiveType", name: "string" },
|
|
55
|
+
{ kind: "typeParameterType", name: "T" },
|
|
56
|
+
],
|
|
57
|
+
};
|
|
58
|
+
const typeParams = new Set();
|
|
59
|
+
expect(containsTypeParameter(type, typeParams)).to.be.true;
|
|
60
|
+
});
|
|
61
|
+
it("returns false for primitive types", () => {
|
|
62
|
+
const type = { kind: "primitiveType", name: "number" };
|
|
63
|
+
const typeParams = new Set(["T"]);
|
|
64
|
+
expect(containsTypeParameter(type, typeParams)).to.be.false;
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe("substituteTypeArgs", () => {
|
|
68
|
+
it("substitutes simple type parameter", () => {
|
|
69
|
+
const type = { kind: "typeParameterType", name: "T" };
|
|
70
|
+
const typeParamNames = ["T"];
|
|
71
|
+
const typeArgs = [{ kind: "primitiveType", name: "string" }];
|
|
72
|
+
const result = substituteTypeArgs(type, typeParamNames, typeArgs);
|
|
73
|
+
expect(result).to.deep.equal({ kind: "primitiveType", name: "string" });
|
|
74
|
+
});
|
|
75
|
+
it("substitutes type parameter in referenceType (legacy)", () => {
|
|
76
|
+
const type = { kind: "referenceType", name: "T" };
|
|
77
|
+
const typeParamNames = ["T"];
|
|
78
|
+
const typeArgs = [{ kind: "primitiveType", name: "number" }];
|
|
79
|
+
const result = substituteTypeArgs(type, typeParamNames, typeArgs);
|
|
80
|
+
expect(result).to.deep.equal({ kind: "primitiveType", name: "number" });
|
|
81
|
+
});
|
|
82
|
+
it("substitutes type argument in generic reference", () => {
|
|
83
|
+
const type = {
|
|
84
|
+
kind: "referenceType",
|
|
85
|
+
name: "Array",
|
|
86
|
+
typeArguments: [{ kind: "typeParameterType", name: "T" }],
|
|
87
|
+
};
|
|
88
|
+
const typeParamNames = ["T"];
|
|
89
|
+
const typeArgs = [{ kind: "primitiveType", name: "string" }];
|
|
90
|
+
const result = substituteTypeArgs(type, typeParamNames, typeArgs);
|
|
91
|
+
expect(result).to.deep.equal({
|
|
92
|
+
kind: "referenceType",
|
|
93
|
+
name: "Array",
|
|
94
|
+
typeArguments: [{ kind: "primitiveType", name: "string" }],
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
it("substitutes in array element type", () => {
|
|
98
|
+
const type = {
|
|
99
|
+
kind: "arrayType",
|
|
100
|
+
elementType: { kind: "typeParameterType", name: "T" },
|
|
101
|
+
};
|
|
102
|
+
const typeParamNames = ["T"];
|
|
103
|
+
const typeArgs = [{ kind: "primitiveType", name: "boolean" }];
|
|
104
|
+
const result = substituteTypeArgs(type, typeParamNames, typeArgs);
|
|
105
|
+
expect(result).to.deep.equal({
|
|
106
|
+
kind: "arrayType",
|
|
107
|
+
elementType: { kind: "primitiveType", name: "boolean" },
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
it("returns unchanged type when no matching type param", () => {
|
|
111
|
+
const type = { kind: "referenceType", name: "SomeType" };
|
|
112
|
+
const typeParamNames = ["T"];
|
|
113
|
+
const typeArgs = [{ kind: "primitiveType", name: "string" }];
|
|
114
|
+
const result = substituteTypeArgs(type, typeParamNames, typeArgs);
|
|
115
|
+
expect(result).to.deep.equal({ kind: "referenceType", name: "SomeType" });
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
describe("getPropertyType", () => {
|
|
119
|
+
const defaultOptions = {
|
|
120
|
+
rootNamespace: "Test",
|
|
121
|
+
indent: 4,
|
|
122
|
+
};
|
|
123
|
+
const createContext = (localTypes) => ({
|
|
124
|
+
indentLevel: 0,
|
|
125
|
+
options: defaultOptions,
|
|
126
|
+
isStatic: false,
|
|
127
|
+
isAsync: false,
|
|
128
|
+
localTypes,
|
|
129
|
+
});
|
|
130
|
+
it("returns property type from interface", () => {
|
|
131
|
+
const members = [
|
|
132
|
+
{
|
|
133
|
+
kind: "propertySignature",
|
|
134
|
+
name: "value",
|
|
135
|
+
type: { kind: "typeParameterType", name: "T" },
|
|
136
|
+
isOptional: false,
|
|
137
|
+
isReadonly: false,
|
|
138
|
+
},
|
|
139
|
+
];
|
|
140
|
+
const localTypes = new Map([
|
|
141
|
+
[
|
|
142
|
+
"Result",
|
|
143
|
+
{
|
|
144
|
+
kind: "interface",
|
|
145
|
+
typeParameters: ["T"],
|
|
146
|
+
members,
|
|
147
|
+
extends: [],
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
]);
|
|
151
|
+
const contextualType = {
|
|
152
|
+
kind: "referenceType",
|
|
153
|
+
name: "Result",
|
|
154
|
+
typeArguments: [{ kind: "primitiveType", name: "string" }],
|
|
155
|
+
};
|
|
156
|
+
const context = createContext(localTypes);
|
|
157
|
+
const result = getPropertyType(contextualType, "value", context);
|
|
158
|
+
// After substitution, T becomes string
|
|
159
|
+
expect(result).to.deep.equal({ kind: "primitiveType", name: "string" });
|
|
160
|
+
});
|
|
161
|
+
it("returns undefined for unknown property", () => {
|
|
162
|
+
const members = [
|
|
163
|
+
{
|
|
164
|
+
kind: "propertySignature",
|
|
165
|
+
name: "value",
|
|
166
|
+
type: { kind: "typeParameterType", name: "T" },
|
|
167
|
+
isOptional: false,
|
|
168
|
+
isReadonly: false,
|
|
169
|
+
},
|
|
170
|
+
];
|
|
171
|
+
const localTypes = new Map([
|
|
172
|
+
[
|
|
173
|
+
"Result",
|
|
174
|
+
{
|
|
175
|
+
kind: "interface",
|
|
176
|
+
typeParameters: ["T"],
|
|
177
|
+
members,
|
|
178
|
+
extends: [],
|
|
179
|
+
},
|
|
180
|
+
],
|
|
181
|
+
]);
|
|
182
|
+
const contextualType = {
|
|
183
|
+
kind: "referenceType",
|
|
184
|
+
name: "Result",
|
|
185
|
+
typeArguments: [{ kind: "primitiveType", name: "string" }],
|
|
186
|
+
};
|
|
187
|
+
const context = createContext(localTypes);
|
|
188
|
+
const result = getPropertyType(contextualType, "unknown", context);
|
|
189
|
+
expect(result).to.be.undefined;
|
|
190
|
+
});
|
|
191
|
+
it("returns undefined for unknown type", () => {
|
|
192
|
+
const localTypes = new Map();
|
|
193
|
+
const contextualType = {
|
|
194
|
+
kind: "referenceType",
|
|
195
|
+
name: "ExternalType",
|
|
196
|
+
};
|
|
197
|
+
const context = createContext(localTypes);
|
|
198
|
+
const result = getPropertyType(contextualType, "value", context);
|
|
199
|
+
expect(result).to.be.undefined;
|
|
200
|
+
});
|
|
201
|
+
it("returns unsubstituted type when no type arguments", () => {
|
|
202
|
+
const members = [
|
|
203
|
+
{
|
|
204
|
+
kind: "propertySignature",
|
|
205
|
+
name: "value",
|
|
206
|
+
type: { kind: "typeParameterType", name: "T" },
|
|
207
|
+
isOptional: false,
|
|
208
|
+
isReadonly: false,
|
|
209
|
+
},
|
|
210
|
+
];
|
|
211
|
+
const localTypes = new Map([
|
|
212
|
+
[
|
|
213
|
+
"Result",
|
|
214
|
+
{
|
|
215
|
+
kind: "interface",
|
|
216
|
+
typeParameters: ["T"],
|
|
217
|
+
members,
|
|
218
|
+
extends: [],
|
|
219
|
+
},
|
|
220
|
+
],
|
|
221
|
+
]);
|
|
222
|
+
const contextualType = {
|
|
223
|
+
kind: "referenceType",
|
|
224
|
+
name: "Result",
|
|
225
|
+
// No typeArguments - using raw generic type
|
|
226
|
+
};
|
|
227
|
+
const context = createContext(localTypes);
|
|
228
|
+
const result = getPropertyType(contextualType, "value", context);
|
|
229
|
+
// Returns unsubstituted T
|
|
230
|
+
expect(result).to.deep.equal({ kind: "typeParameterType", name: "T" });
|
|
231
|
+
});
|
|
232
|
+
it("chases type alias", () => {
|
|
233
|
+
const members = [
|
|
234
|
+
{
|
|
235
|
+
kind: "propertySignature",
|
|
236
|
+
name: "data",
|
|
237
|
+
type: { kind: "primitiveType", name: "string" },
|
|
238
|
+
isOptional: false,
|
|
239
|
+
isReadonly: false,
|
|
240
|
+
},
|
|
241
|
+
];
|
|
242
|
+
const localTypes = new Map([
|
|
243
|
+
[
|
|
244
|
+
"MyAlias",
|
|
245
|
+
{
|
|
246
|
+
kind: "typeAlias",
|
|
247
|
+
typeParameters: [],
|
|
248
|
+
type: { kind: "referenceType", name: "Target" },
|
|
249
|
+
},
|
|
250
|
+
],
|
|
251
|
+
[
|
|
252
|
+
"Target",
|
|
253
|
+
{
|
|
254
|
+
kind: "interface",
|
|
255
|
+
typeParameters: [],
|
|
256
|
+
members,
|
|
257
|
+
extends: [],
|
|
258
|
+
},
|
|
259
|
+
],
|
|
260
|
+
]);
|
|
261
|
+
const contextualType = {
|
|
262
|
+
kind: "referenceType",
|
|
263
|
+
name: "MyAlias",
|
|
264
|
+
};
|
|
265
|
+
const context = createContext(localTypes);
|
|
266
|
+
const result = getPropertyType(contextualType, "data", context);
|
|
267
|
+
expect(result).to.deep.equal({ kind: "primitiveType", name: "string" });
|
|
268
|
+
});
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
//# sourceMappingURL=type-resolution.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-resolution.test.js","sourceRoot":"","sources":["../../src/core/type-resolution.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,4 +26,33 @@ export declare const withAsync: (context: EmitterContext, isAsync: boolean) => E
|
|
|
26
26
|
* Set current class name in context
|
|
27
27
|
*/
|
|
28
28
|
export declare const withClassName: (context: EmitterContext, className: string) => EmitterContext;
|
|
29
|
+
/**
|
|
30
|
+
* Scoped fields that should be restored after emission.
|
|
31
|
+
* These fields define lexical scopes and should not leak to parent scopes.
|
|
32
|
+
*/
|
|
33
|
+
type ScopedFields = Pick<EmitterContext, "typeParameters" | "returnType">;
|
|
34
|
+
/**
|
|
35
|
+
* Execute an emission function with scoped context fields.
|
|
36
|
+
*
|
|
37
|
+
* This helper ensures that scoped fields (typeParameters, returnType) are
|
|
38
|
+
* restored after emission, preventing scope leaks when context is threaded
|
|
39
|
+
* upward via [result, newContext] tuples.
|
|
40
|
+
*
|
|
41
|
+
* Other context mutations (intLoopVars, importBindings, etc.) are preserved
|
|
42
|
+
* and bubbled up correctly.
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```typescript
|
|
46
|
+
* const [result, finalCtx] = withScoped(
|
|
47
|
+
* context,
|
|
48
|
+
* {
|
|
49
|
+
* typeParameters: new Set([...context.typeParameters ?? [], "T"]),
|
|
50
|
+
* returnType: stmt.returnType
|
|
51
|
+
* },
|
|
52
|
+
* (scopedCtx) => emitFunctionBody(stmt.body, scopedCtx)
|
|
53
|
+
* );
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export declare const withScoped: <T>(context: EmitterContext, scopedPatch: Partial<ScopedFields>, emit: (ctx: EmitterContext) => [T, EmitterContext]) => [T, EmitterContext];
|
|
57
|
+
export {};
|
|
29
58
|
//# sourceMappingURL=context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/emitter-types/context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAM3D;;GAEG;AACH,eAAO,MAAM,aAAa,GAAI,SAAS,cAAc,KAAG,cA4BvD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,MAAM,GAAI,SAAS,cAAc,KAAG,cAG/C,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,MAAM,GAAI,SAAS,cAAc,KAAG,cAG/C,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,UAAU,GACrB,SAAS,cAAc,EACvB,UAAU,OAAO,KAChB,cAGD,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,SAAS,GACpB,SAAS,cAAc,EACvB,SAAS,OAAO,KACf,cAGD,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,aAAa,GACxB,SAAS,cAAc,EACvB,WAAW,MAAM,KAChB,cAGD,CAAC"}
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/emitter-types/context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAM3D;;GAEG;AACH,eAAO,MAAM,aAAa,GAAI,SAAS,cAAc,KAAG,cA4BvD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,MAAM,GAAI,SAAS,cAAc,KAAG,cAG/C,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,MAAM,GAAI,SAAS,cAAc,KAAG,cAG/C,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,UAAU,GACrB,SAAS,cAAc,EACvB,UAAU,OAAO,KAChB,cAGD,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,SAAS,GACpB,SAAS,cAAc,EACvB,SAAS,OAAO,KACf,cAGD,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,aAAa,GACxB,SAAS,cAAc,EACvB,WAAW,MAAM,KAChB,cAGD,CAAC;AAEH;;;GAGG;AACH,KAAK,YAAY,GAAG,IAAI,CAAC,cAAc,EAAE,gBAAgB,GAAG,YAAY,CAAC,CAAC;AAE1E;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,UAAU,GAAI,CAAC,EAC1B,SAAS,cAAc,EACvB,aAAa,OAAO,CAAC,YAAY,CAAC,EAClC,MAAM,CAAC,GAAG,EAAE,cAAc,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,KACjD,CAAC,CAAC,EAAE,cAAc,CAoBpB,CAAC"}
|
|
@@ -65,4 +65,43 @@ export const withClassName = (context, className) => ({
|
|
|
65
65
|
...context,
|
|
66
66
|
className,
|
|
67
67
|
});
|
|
68
|
+
/**
|
|
69
|
+
* Execute an emission function with scoped context fields.
|
|
70
|
+
*
|
|
71
|
+
* This helper ensures that scoped fields (typeParameters, returnType) are
|
|
72
|
+
* restored after emission, preventing scope leaks when context is threaded
|
|
73
|
+
* upward via [result, newContext] tuples.
|
|
74
|
+
*
|
|
75
|
+
* Other context mutations (intLoopVars, importBindings, etc.) are preserved
|
|
76
|
+
* and bubbled up correctly.
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```typescript
|
|
80
|
+
* const [result, finalCtx] = withScoped(
|
|
81
|
+
* context,
|
|
82
|
+
* {
|
|
83
|
+
* typeParameters: new Set([...context.typeParameters ?? [], "T"]),
|
|
84
|
+
* returnType: stmt.returnType
|
|
85
|
+
* },
|
|
86
|
+
* (scopedCtx) => emitFunctionBody(stmt.body, scopedCtx)
|
|
87
|
+
* );
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
export const withScoped = (context, scopedPatch, emit) => {
|
|
91
|
+
// Save current scoped field values
|
|
92
|
+
const saved = {
|
|
93
|
+
typeParameters: context.typeParameters,
|
|
94
|
+
returnType: context.returnType,
|
|
95
|
+
};
|
|
96
|
+
// Create child context with scoped patch applied
|
|
97
|
+
const childContext = { ...context, ...scopedPatch };
|
|
98
|
+
// Execute the emission
|
|
99
|
+
const [result, innerContext] = emit(childContext);
|
|
100
|
+
// Restore scoped fields while keeping other mutations from child
|
|
101
|
+
const restoredContext = {
|
|
102
|
+
...innerContext,
|
|
103
|
+
...saved,
|
|
104
|
+
};
|
|
105
|
+
return [result, restoredContext];
|
|
106
|
+
};
|
|
68
107
|
//# sourceMappingURL=context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/emitter-types/context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,aAAa,EACb,qBAAqB,GACtB,MAAM,oCAAoC,CAAC;AAE5C;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAuB,EAAkB,EAAE;IACvE,sDAAsD;IACtD,IAAI,QAAQ,GAA+B,SAAS,CAAC;IACrD,IAAI,gBAAgB,GAAuC,SAAS,CAAC;IAErE,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtD,MAAM,eAAe,GAAG,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACzD,IAAI,eAAe,CAAC,EAAE,EAAE,CAAC;YACvB,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC;YAC1C,gBAAgB,GAAG,qBAAqB,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC3E,CAAC;aAAM,CAAC;YACN,sDAAsD;YACtD,wDAAwD;YACxD,OAAO,CAAC,IAAI,CACV,oCAAoC,EACpC,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACvD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,WAAW,EAAE,CAAC;QACd,OAAO;QACP,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,KAAK;QACd,QAAQ;QACR,gBAAgB;KACjB,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,OAAuB,EAAkB,EAAE,CAAC,CAAC;IAClE,GAAG,OAAO;IACV,WAAW,EAAE,OAAO,CAAC,WAAW,GAAG,CAAC;CACrC,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,OAAuB,EAAkB,EAAE,CAAC,CAAC;IAClE,GAAG,OAAO;IACV,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC;CAClD,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,OAAuB,EACvB,QAAiB,EACD,EAAE,CAAC,CAAC;IACpB,GAAG,OAAO;IACV,QAAQ;CACT,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,OAAuB,EACvB,OAAgB,EACA,EAAE,CAAC,CAAC;IACpB,GAAG,OAAO;IACV,OAAO;CACR,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,OAAuB,EACvB,SAAiB,EACD,EAAE,CAAC,CAAC;IACpB,GAAG,OAAO;IACV,SAAS;CACV,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/emitter-types/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import type { MetadataFile } from "@tsonic/frontend/types/metadata.js";
|
|
5
5
|
import type { TypeBinding } from "@tsonic/frontend/types/bindings.js";
|
|
6
|
+
import type { IrType, IrInterfaceMember, IrClassMember } from "@tsonic/frontend";
|
|
6
7
|
/**
|
|
7
8
|
* Module identity for import resolution
|
|
8
9
|
*/
|
|
@@ -10,6 +11,11 @@ export type ModuleIdentity = {
|
|
|
10
11
|
readonly namespace: string;
|
|
11
12
|
readonly className: string;
|
|
12
13
|
readonly filePath: string;
|
|
14
|
+
/**
|
|
15
|
+
* True if the module has a type declaration (class/interface) with the same name as className.
|
|
16
|
+
* When true, value imports should target ClassName__Module instead of ClassName.
|
|
17
|
+
*/
|
|
18
|
+
readonly hasTypeCollision: boolean;
|
|
13
19
|
};
|
|
14
20
|
/**
|
|
15
21
|
* Module map for resolving cross-file imports
|
|
@@ -79,6 +85,25 @@ export type ImportBinding = {
|
|
|
79
85
|
/** For value imports: the member name inside the container (e.g., "createUser") */
|
|
80
86
|
readonly member?: string;
|
|
81
87
|
};
|
|
88
|
+
/**
|
|
89
|
+
* Information about a locally-defined type (class/interface/typeAlias).
|
|
90
|
+
* Used for property type lookup during expression emission.
|
|
91
|
+
*/
|
|
92
|
+
export type LocalTypeInfo = {
|
|
93
|
+
readonly kind: "interface";
|
|
94
|
+
readonly typeParameters: readonly string[];
|
|
95
|
+
readonly members: readonly IrInterfaceMember[];
|
|
96
|
+
readonly extends: readonly IrType[];
|
|
97
|
+
} | {
|
|
98
|
+
readonly kind: "class";
|
|
99
|
+
readonly typeParameters: readonly string[];
|
|
100
|
+
readonly members: readonly IrClassMember[];
|
|
101
|
+
readonly implements: readonly IrType[];
|
|
102
|
+
} | {
|
|
103
|
+
readonly kind: "typeAlias";
|
|
104
|
+
readonly typeParameters: readonly string[];
|
|
105
|
+
readonly type: IrType;
|
|
106
|
+
};
|
|
82
107
|
/**
|
|
83
108
|
* Context passed through emission process
|
|
84
109
|
*/
|
|
@@ -107,6 +132,12 @@ export type EmitterContext = {
|
|
|
107
132
|
readonly importBindings?: ReadonlyMap<string, ImportBinding>;
|
|
108
133
|
/** Set of variable names known to be int (from canonical for-loop counters) */
|
|
109
134
|
readonly intLoopVars?: ReadonlySet<string>;
|
|
135
|
+
/** Type parameter names in current scope (for detecting generic type contexts) */
|
|
136
|
+
readonly typeParameters?: ReadonlySet<string>;
|
|
137
|
+
/** Return type of current function/method (for contextual typing in return statements) */
|
|
138
|
+
readonly returnType?: IrType;
|
|
139
|
+
/** Map of local type names to their definitions (for property type lookup) */
|
|
140
|
+
readonly localTypes?: ReadonlyMap<string, LocalTypeInfo>;
|
|
110
141
|
};
|
|
111
142
|
/**
|
|
112
143
|
* Result of emitting C# code
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/emitter-types/core.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/emitter-types/core.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Emitter types - Public API
|
|
3
3
|
*/
|
|
4
|
-
export type { EmitterOptions, EmitterContext, EmitResult, CSharpFragment, ImportBinding, ModuleIdentity, ModuleMap, ExportSource, ExportMap, JsonAotRegistry, } from "./core.js";
|
|
4
|
+
export type { EmitterOptions, EmitterContext, EmitResult, CSharpFragment, ImportBinding, ModuleIdentity, ModuleMap, ExportSource, ExportMap, JsonAotRegistry, LocalTypeInfo, } from "./core.js";
|
|
5
5
|
export type { CSharpAccessModifier, CSharpClassModifier, CSharpMethodModifier, CSharpUsing, } from "./csharp-types.js";
|
|
6
|
-
export { createContext, indent, dedent, withStatic, withAsync, withClassName, } from "./context.js";
|
|
6
|
+
export { createContext, indent, dedent, withStatic, withAsync, withClassName, withScoped, } from "./context.js";
|
|
7
7
|
export { getIndent } from "./formatting.js";
|
|
8
8
|
export { renderTypeFQN, renderMemberFQN, renderFQN, FQN } from "./fqn.js";
|
|
9
9
|
export { escapeCSharpIdentifier, isCSharpKeyword } from "./identifiers.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/emitter-types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EACV,cAAc,EACd,cAAc,EACd,UAAU,EACV,cAAc,EACd,aAAa,EACb,cAAc,EACd,SAAS,EACT,YAAY,EACZ,SAAS,EACT,eAAe,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/emitter-types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EACV,cAAc,EACd,cAAc,EACd,UAAU,EACV,cAAc,EACd,aAAa,EACb,cAAc,EACd,SAAS,EACT,YAAY,EACZ,SAAS,EACT,eAAe,EACf,aAAa,GACd,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,aAAa,EACb,MAAM,EACN,MAAM,EACN,UAAU,EACV,SAAS,EACT,aAAa,EACb,UAAU,GACX,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Emitter types - Public API
|
|
3
3
|
*/
|
|
4
|
-
export { createContext, indent, dedent, withStatic, withAsync, withClassName, } from "./context.js";
|
|
4
|
+
export { createContext, indent, dedent, withStatic, withAsync, withClassName, withScoped, } from "./context.js";
|
|
5
5
|
export { getIndent } from "./formatting.js";
|
|
6
6
|
export { renderTypeFQN, renderMemberFQN, renderFQN, FQN } from "./fqn.js";
|
|
7
7
|
export { escapeCSharpIdentifier, isCSharpKeyword } from "./identifiers.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/emitter-types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/emitter-types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqBH,OAAO,EACL,aAAa,EACb,MAAM,EACN,MAAM,EACN,UAAU,EACV,SAAS,EACT,aAAa,EACb,UAAU,GACX,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expression-emitter.d.ts","sourceRoot":"","sources":["../src/expression-emitter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA6B5D;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GACzB,MAAM,YAAY,EAClB,SAAS,cAAc,EACvB,eAAe,MAAM,KACpB,CAAC,cAAc,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"expression-emitter.d.ts","sourceRoot":"","sources":["../src/expression-emitter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA6B5D;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GACzB,MAAM,YAAY,EAClB,SAAS,cAAc,EACvB,eAAe,MAAM,KACpB,CAAC,cAAc,EAAE,cAAc,CAsEjC,CAAC;AAGF,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,8BAA8B,CAAC"}
|
|
@@ -20,15 +20,15 @@ import { emitTemplateLiteral, emitSpread, emitAwait, } from "./expressions/other
|
|
|
20
20
|
export const emitExpression = (expr, context, expectedType) => {
|
|
21
21
|
switch (expr.kind) {
|
|
22
22
|
case "literal":
|
|
23
|
-
//
|
|
24
|
-
//
|
|
25
|
-
return emitLiteral(expr, context, getExpectedClrTypeForNumeric(expr.inferredType));
|
|
23
|
+
// Pass expectedType for null → default conversion in generic contexts
|
|
24
|
+
// Also check if the literal has an inferredType that requires integer emission
|
|
25
|
+
return emitLiteral(expr, context, expectedType, getExpectedClrTypeForNumeric(expr.inferredType));
|
|
26
26
|
case "identifier":
|
|
27
27
|
return emitIdentifier(expr, context);
|
|
28
28
|
case "array":
|
|
29
29
|
return emitArray(expr, context, expectedType);
|
|
30
30
|
case "object":
|
|
31
|
-
return emitObject(expr, context);
|
|
31
|
+
return emitObject(expr, context, expectedType);
|
|
32
32
|
case "memberAccess":
|
|
33
33
|
return emitMemberAccess(expr, context);
|
|
34
34
|
case "call":
|
|
@@ -46,7 +46,7 @@ export const emitExpression = (expr, context, expectedType) => {
|
|
|
46
46
|
case "assignment":
|
|
47
47
|
return emitAssignment(expr, context);
|
|
48
48
|
case "conditional":
|
|
49
|
-
return emitConditional(expr, context);
|
|
49
|
+
return emitConditional(expr, context, expectedType);
|
|
50
50
|
case "functionExpression":
|
|
51
51
|
return emitFunctionExpression(expr, context);
|
|
52
52
|
case "arrowFunction":
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expression-emitter.js","sourceRoot":"","sources":["../src/expression-emitter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,sDAAsD;AACtD,OAAO,EACL,WAAW,EACX,4BAA4B,GAC7B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EACL,UAAU,EACV,WAAW,EACX,SAAS,EACT,UAAU,EACV,cAAc,EACd,eAAe,GAChB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,mBAAmB,EACnB,UAAU,EACV,SAAS,GACV,MAAM,wBAAwB,CAAC;AAEhC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,IAAkB,EAClB,OAAuB,EACvB,YAAqB,EACa,EAAE;IACpC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,SAAS;YACZ,
|
|
1
|
+
{"version":3,"file":"expression-emitter.js","sourceRoot":"","sources":["../src/expression-emitter.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,8 +17,12 @@ export declare const emitArray: (expr: Extract<IrExpression, {
|
|
|
17
17
|
* 2. Nominal type (interface, class) → new TypeName { prop = value, ... }
|
|
18
18
|
*
|
|
19
19
|
* Anonymous object types should be caught by validation (TSN7403) before reaching here.
|
|
20
|
+
*
|
|
21
|
+
* @param expr - The object expression
|
|
22
|
+
* @param context - Emitter context
|
|
23
|
+
* @param expectedType - Optional expected type (for property type resolution in generic contexts)
|
|
20
24
|
*/
|
|
21
25
|
export declare const emitObject: (expr: Extract<IrExpression, {
|
|
22
26
|
kind: "object";
|
|
23
|
-
}>, context: EmitterContext) => [CSharpFragment, EmitterContext];
|
|
27
|
+
}>, context: EmitterContext, expectedType?: IrType) => [CSharpFragment, EmitterContext];
|
|
24
28
|
//# sourceMappingURL=collections.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../../src/expressions/collections.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../../src/expressions/collections.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAiB7D;;GAEG;AACH,eAAO,MAAM,SAAS,GACpB,MAAM,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,EAC9C,SAAS,cAAc,EACvB,eAAe,MAAM,KACpB,CAAC,cAAc,EAAE,cAAc,CAmJjC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,UAAU,GACrB,MAAM,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,EAC/C,SAAS,cAAc,EACvB,eAAe,MAAM,KACpB,CAAC,cAAc,EAAE,cAAc,CAmDjC,CAAC"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { emitType } from "../type-emitter.js";
|
|
5
5
|
import { emitExpression } from "../expression-emitter.js";
|
|
6
|
+
import { getPropertyType } from "../core/type-resolution.js";
|
|
6
7
|
/**
|
|
7
8
|
* Escape a string for use in a C# string literal.
|
|
8
9
|
* Handles backslashes, quotes, newlines, carriage returns, and tabs.
|
|
@@ -134,12 +135,18 @@ export const emitArray = (expr, context, expectedType) => {
|
|
|
134
135
|
* 2. Nominal type (interface, class) → new TypeName { prop = value, ... }
|
|
135
136
|
*
|
|
136
137
|
* Anonymous object types should be caught by validation (TSN7403) before reaching here.
|
|
138
|
+
*
|
|
139
|
+
* @param expr - The object expression
|
|
140
|
+
* @param context - Emitter context
|
|
141
|
+
* @param expectedType - Optional expected type (for property type resolution in generic contexts)
|
|
137
142
|
*/
|
|
138
|
-
export const emitObject = (expr, context) => {
|
|
143
|
+
export const emitObject = (expr, context, expectedType) => {
|
|
139
144
|
let currentContext = context;
|
|
145
|
+
// Use expectedType if provided, fall back to contextualType
|
|
146
|
+
const effectiveType = expectedType ?? expr.contextualType;
|
|
140
147
|
// Check if contextual type is a dictionary type
|
|
141
|
-
if (
|
|
142
|
-
return emitDictionaryLiteral(expr, currentContext);
|
|
148
|
+
if (effectiveType?.kind === "dictionaryType") {
|
|
149
|
+
return emitDictionaryLiteral(expr, currentContext, effectiveType);
|
|
143
150
|
}
|
|
144
151
|
// Regular object literal with nominal type
|
|
145
152
|
const properties = [];
|
|
@@ -150,14 +157,18 @@ export const emitObject = (expr, context) => {
|
|
|
150
157
|
}
|
|
151
158
|
else {
|
|
152
159
|
const key = typeof prop.key === "string" ? prop.key : "/* computed */";
|
|
153
|
-
|
|
160
|
+
// Resolve property type from contextual type for generic null→default handling
|
|
161
|
+
const propertyExpectedType = typeof prop.key === "string"
|
|
162
|
+
? getPropertyType(effectiveType, prop.key, currentContext)
|
|
163
|
+
: undefined;
|
|
164
|
+
const [valueFrag, newContext] = emitExpression(prop.value, currentContext, propertyExpectedType);
|
|
154
165
|
properties.push(`${key} = ${valueFrag.text}`);
|
|
155
166
|
currentContext = newContext;
|
|
156
167
|
}
|
|
157
168
|
}
|
|
158
169
|
// Check for contextual type (from return type, variable annotation, etc.)
|
|
159
170
|
// If present, emit `new TypeName { ... }` instead of anonymous `new { ... }`
|
|
160
|
-
const [typeName, finalContext] = resolveContextualType(
|
|
171
|
+
const [typeName, finalContext] = resolveContextualType(effectiveType, currentContext);
|
|
161
172
|
if (!typeName) {
|
|
162
173
|
// ICE: Validation (TSN7403) should have caught anonymous object literals
|
|
163
174
|
throw new Error("ICE: Object literal without contextual type reached emitter - validation missed TSN7403");
|
|
@@ -171,9 +182,8 @@ export const emitObject = (expr, context) => {
|
|
|
171
182
|
* Input: const d: Record<string, number> = { a: 1, b: 2 };
|
|
172
183
|
* Output: new Dictionary<string, double> { ["a"] = 1.0, ["b"] = 2.0 }
|
|
173
184
|
*/
|
|
174
|
-
const emitDictionaryLiteral = (expr, context) => {
|
|
185
|
+
const emitDictionaryLiteral = (expr, context, dictType) => {
|
|
175
186
|
let currentContext = context;
|
|
176
|
-
const dictType = expr.contextualType;
|
|
177
187
|
// Get key and value type strings
|
|
178
188
|
const [keyTypeStr, ctx1] = emitDictKeyType(dictType.keyType, currentContext);
|
|
179
189
|
const [valueTypeStr, ctx2] = emitType(dictType.valueType, ctx1);
|
|
@@ -190,7 +200,8 @@ const emitDictionaryLiteral = (expr, context) => {
|
|
|
190
200
|
if (typeof prop.key !== "string") {
|
|
191
201
|
throw new Error("ICE: Computed property key in dictionary literal - validation gap");
|
|
192
202
|
}
|
|
193
|
-
|
|
203
|
+
// Pass dictionary value type as expectedType for generic null→default handling
|
|
204
|
+
const [valueFrag, newContext] = emitExpression(prop.value, currentContext, dictType.valueType);
|
|
194
205
|
entries.push(`["${escapeCSharpString(prop.key)}"] = ${valueFrag.text}`);
|
|
195
206
|
currentContext = newContext;
|
|
196
207
|
}
|