@tsonic/emitter 0.0.13 → 0.0.15
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/array.test.d.ts +1 -1
- package/dist/array.test.js +17 -16
- package/dist/array.test.js.map +1 -1
- package/dist/core/attributes.test.js +2 -2
- package/dist/core/attributes.test.js.map +1 -1
- package/dist/core/imports.d.ts.map +1 -1
- package/dist/core/imports.js +1 -9
- package/dist/core/imports.js.map +1 -1
- package/dist/core/module-emitter/static-container.d.ts.map +1 -1
- package/dist/core/module-emitter/static-container.js +3 -1
- package/dist/core/module-emitter/static-container.js.map +1 -1
- package/dist/core/unsafe.d.ts +11 -0
- package/dist/core/unsafe.d.ts.map +1 -0
- package/dist/core/unsafe.js +264 -0
- package/dist/core/unsafe.js.map +1 -0
- package/dist/emitter-types/context.d.ts +1 -1
- package/dist/emitter-types/context.d.ts.map +1 -1
- package/dist/emitter-types/context.js +4 -3
- package/dist/emitter-types/context.js.map +1 -1
- package/dist/emitter-types/core.d.ts +4 -2
- package/dist/emitter-types/core.d.ts.map +1 -1
- package/dist/emitter-types/fqn.d.ts +0 -7
- package/dist/emitter-types/fqn.d.ts.map +1 -1
- package/dist/emitter-types/fqn.js +0 -8
- package/dist/emitter-types/fqn.js.map +1 -1
- package/dist/expression-emitter.d.ts.map +1 -1
- package/dist/expression-emitter.js +268 -63
- package/dist/expression-emitter.js.map +1 -1
- package/dist/expressions/access.d.ts.map +1 -1
- package/dist/expressions/access.js +36 -40
- package/dist/expressions/access.js.map +1 -1
- package/dist/expressions/calls.d.ts.map +1 -1
- package/dist/expressions/calls.js +233 -70
- package/dist/expressions/calls.js.map +1 -1
- package/dist/expressions/collections.d.ts.map +1 -1
- package/dist/expressions/collections.js +37 -41
- package/dist/expressions/collections.js.map +1 -1
- package/dist/expressions/functions.d.ts.map +1 -1
- package/dist/expressions/functions.js +30 -10
- package/dist/expressions/functions.js.map +1 -1
- package/dist/expressions/identifiers.d.ts.map +1 -1
- package/dist/expressions/identifiers.js +5 -30
- package/dist/expressions/identifiers.js.map +1 -1
- package/dist/expressions/index.test.js +87 -198
- package/dist/expressions/index.test.js.map +1 -1
- package/dist/expressions/literals.d.ts +4 -5
- package/dist/expressions/literals.d.ts.map +1 -1
- package/dist/expressions/literals.js +62 -15
- package/dist/expressions/literals.js.map +1 -1
- package/dist/expressions/operators.d.ts +0 -4
- package/dist/expressions/operators.d.ts.map +1 -1
- package/dist/expressions/operators.js +49 -19
- package/dist/expressions/operators.js.map +1 -1
- package/dist/expressions/other.d.ts.map +1 -1
- package/dist/expressions/other.js +21 -3
- package/dist/expressions/other.js.map +1 -1
- package/dist/extension-methods.test.d.ts +5 -0
- package/dist/extension-methods.test.d.ts.map +1 -0
- package/dist/extension-methods.test.js +110 -0
- package/dist/extension-methods.test.js.map +1 -0
- package/dist/generator-exchange.d.ts.map +1 -1
- package/dist/generator-exchange.js +2 -1
- package/dist/generator-exchange.js.map +1 -1
- package/dist/generator.test.js +9 -9
- package/dist/generator.test.js.map +1 -1
- package/dist/golden-tests/discovery.d.ts +6 -11
- package/dist/golden-tests/discovery.d.ts.map +1 -1
- package/dist/golden-tests/discovery.js +14 -79
- package/dist/golden-tests/discovery.js.map +1 -1
- package/dist/golden-tests/index.d.ts +1 -1
- package/dist/golden-tests/index.d.ts.map +1 -1
- package/dist/golden-tests/index.js.map +1 -1
- package/dist/golden-tests/runner.d.ts.map +1 -1
- package/dist/golden-tests/runner.js +6 -7
- package/dist/golden-tests/runner.js.map +1 -1
- package/dist/golden-tests/types.d.ts +0 -7
- package/dist/golden-tests/types.d.ts.map +1 -1
- package/dist/golden.test.d.ts +3 -10
- package/dist/golden.test.d.ts.map +1 -1
- package/dist/golden.test.js +8 -24
- package/dist/golden.test.js.map +1 -1
- package/dist/hierarchical-bindings.test.js +17 -11
- package/dist/hierarchical-bindings.test.js.map +1 -1
- package/dist/integration.test.js +61 -20
- package/dist/integration.test.js.map +1 -1
- package/dist/invariants/emitter-globals-subset.test.d.ts +1 -1
- package/dist/invariants/emitter-globals-subset.test.js +34 -74
- package/dist/invariants/emitter-globals-subset.test.js.map +1 -1
- package/dist/invariants/numeric-proof-contract.test.js +3 -3
- package/dist/invariants/numeric-proof-contract.test.js.map +1 -1
- package/dist/patterns.d.ts +98 -0
- package/dist/patterns.d.ts.map +1 -0
- package/dist/patterns.js +366 -0
- package/dist/patterns.js.map +1 -0
- package/dist/patterns.test.d.ts +15 -0
- package/dist/patterns.test.d.ts.map +1 -0
- package/dist/patterns.test.js +1262 -0
- package/dist/patterns.test.js.map +1 -0
- package/dist/specialization/generation.d.ts.map +1 -1
- package/dist/specialization/generation.js +2 -2
- package/dist/specialization/generation.js.map +1 -1
- package/dist/specialization/substitution.d.ts.map +1 -1
- package/dist/specialization/substitution.js +4 -0
- package/dist/specialization/substitution.js.map +1 -1
- package/dist/specialization/type-aliases.test.js +1 -1
- package/dist/specialization/type-aliases.test.js.map +1 -1
- package/dist/statement-emitter.d.ts.map +1 -1
- package/dist/statement-emitter.js +1 -1
- package/dist/statement-emitter.js.map +1 -1
- package/dist/statements/blocks.d.ts.map +1 -1
- package/dist/statements/blocks.js +14 -45
- package/dist/statements/blocks.js.map +1 -1
- package/dist/statements/classes/index.d.ts +1 -1
- package/dist/statements/classes/index.d.ts.map +1 -1
- package/dist/statements/classes/index.js +1 -1
- package/dist/statements/classes/index.js.map +1 -1
- package/dist/statements/classes/inline-types.d.ts.map +1 -1
- package/dist/statements/classes/inline-types.js +11 -1
- package/dist/statements/classes/inline-types.js.map +1 -1
- package/dist/statements/classes/members/constructors.d.ts.map +1 -1
- package/dist/statements/classes/members/constructors.js +30 -12
- package/dist/statements/classes/members/constructors.js.map +1 -1
- package/dist/statements/classes/members/methods.d.ts.map +1 -1
- package/dist/statements/classes/members/methods.js +51 -23
- package/dist/statements/classes/members/methods.js.map +1 -1
- package/dist/statements/classes/members/orchestrator.d.ts.map +1 -1
- package/dist/statements/classes/members/orchestrator.js +1 -3
- package/dist/statements/classes/members/orchestrator.js.map +1 -1
- package/dist/statements/classes/members/properties.d.ts.map +1 -1
- package/dist/statements/classes/members/properties.js +56 -9
- package/dist/statements/classes/members/properties.js.map +1 -1
- package/dist/statements/classes/parameters.d.ts +43 -1
- package/dist/statements/classes/parameters.d.ts.map +1 -1
- package/dist/statements/classes/parameters.js +73 -13
- package/dist/statements/classes/parameters.js.map +1 -1
- package/dist/statements/classes/properties.d.ts.map +1 -1
- package/dist/statements/classes/properties.js +1 -1
- package/dist/statements/classes/properties.js.map +1 -1
- package/dist/statements/classes.d.ts +1 -1
- package/dist/statements/classes.d.ts.map +1 -1
- package/dist/statements/classes.js +1 -1
- package/dist/statements/classes.js.map +1 -1
- package/dist/statements/control/conditionals.d.ts.map +1 -1
- package/dist/statements/control/conditionals.js +78 -23
- package/dist/statements/control/conditionals.js.map +1 -1
- package/dist/statements/control/loops.d.ts.map +1 -1
- package/dist/statements/control/loops.js +25 -5
- package/dist/statements/control/loops.js.map +1 -1
- package/dist/statements/declarations/classes.d.ts.map +1 -1
- package/dist/statements/declarations/classes.js +128 -10
- 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 +28 -12
- package/dist/statements/declarations/functions.js.map +1 -1
- package/dist/statements/declarations/interfaces.d.ts.map +1 -1
- package/dist/statements/declarations/interfaces.js +50 -7
- package/dist/statements/declarations/interfaces.js.map +1 -1
- package/dist/statements/declarations/type-aliases.d.ts.map +1 -1
- package/dist/statements/declarations/type-aliases.js +6 -1
- package/dist/statements/declarations/type-aliases.js.map +1 -1
- package/dist/statements/declarations/variables.d.ts.map +1 -1
- package/dist/statements/declarations/variables.js +196 -38
- package/dist/statements/declarations/variables.js.map +1 -1
- package/dist/statements/index.test.js +7 -5
- package/dist/statements/index.test.js.map +1 -1
- package/dist/types/arrays.d.ts +3 -9
- package/dist/types/arrays.d.ts.map +1 -1
- package/dist/types/arrays.js +5 -19
- package/dist/types/arrays.js.map +1 -1
- package/dist/types/parameters.d.ts.map +1 -1
- package/dist/types/parameters.js +36 -1
- package/dist/types/parameters.js.map +1 -1
- package/dist/types/parameters.test.js +1 -1
- package/dist/types/parameters.test.js.map +1 -1
- package/dist/types/references.d.ts.map +1 -1
- package/dist/types/references.js +86 -51
- package/dist/types/references.js.map +1 -1
- package/dist/types/references.test.js +35 -95
- package/dist/types/references.test.js.map +1 -1
- package/dist/types/unions.d.ts.map +1 -1
- package/dist/types/unions.js +20 -0
- package/dist/types/unions.js.map +1 -1
- package/package.json +3 -3
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { describe, it } from "mocha";
|
|
6
6
|
import { expect } from "chai";
|
|
7
7
|
import * as ts from "typescript";
|
|
8
|
-
import { buildIrModule, DotnetMetadataRegistry, BindingRegistry, createClrBindingsResolver, } from "@tsonic/frontend";
|
|
8
|
+
import { buildIrModule, DotnetMetadataRegistry, BindingRegistry, createClrBindingsResolver, createBinding, createProgramContext, } from "@tsonic/frontend";
|
|
9
9
|
import { emitModule } from "./emitter.js";
|
|
10
10
|
describe("Hierarchical Bindings - Full Pipeline", () => {
|
|
11
11
|
it("should compile TypeScript with hierarchical bindings to correct C#", () => {
|
|
@@ -64,9 +64,11 @@ describe("Hierarchical Bindings - Full Pipeline", () => {
|
|
|
64
64
|
getNewLine: () => "\n",
|
|
65
65
|
getDefaultLibFileName: (_options) => "lib.d.ts",
|
|
66
66
|
});
|
|
67
|
+
const checker = program.getTypeChecker();
|
|
67
68
|
const testProgram = {
|
|
68
69
|
program,
|
|
69
|
-
checker
|
|
70
|
+
checker,
|
|
71
|
+
binding: createBinding(checker),
|
|
70
72
|
options: {
|
|
71
73
|
projectRoot: "/test",
|
|
72
74
|
sourceRoot: "/test",
|
|
@@ -74,15 +76,16 @@ describe("Hierarchical Bindings - Full Pipeline", () => {
|
|
|
74
76
|
strict: true,
|
|
75
77
|
},
|
|
76
78
|
sourceFiles: [sourceFile],
|
|
79
|
+
declarationSourceFiles: [],
|
|
77
80
|
metadata: new DotnetMetadataRegistry(),
|
|
78
81
|
bindings,
|
|
79
82
|
clrResolver: createClrBindingsResolver("/test"),
|
|
80
83
|
};
|
|
84
|
+
// Phase 5: Create ProgramContext for this compilation
|
|
85
|
+
const options = { sourceRoot: "/test", rootNamespace: "TestApp" };
|
|
86
|
+
const ctx = createProgramContext(testProgram, options);
|
|
81
87
|
// Step 1: Build IR
|
|
82
|
-
const irResult = buildIrModule(sourceFile, testProgram,
|
|
83
|
-
sourceRoot: "/test",
|
|
84
|
-
rootNamespace: "TestApp",
|
|
85
|
-
});
|
|
88
|
+
const irResult = buildIrModule(sourceFile, testProgram, options, ctx);
|
|
86
89
|
if (!irResult.ok) {
|
|
87
90
|
throw new Error(`IR build must succeed for full pipeline test: ${JSON.stringify(irResult.error)}`);
|
|
88
91
|
}
|
|
@@ -170,9 +173,11 @@ describe("Hierarchical Bindings - Full Pipeline", () => {
|
|
|
170
173
|
getNewLine: () => "\n",
|
|
171
174
|
getDefaultLibFileName: (_options) => "lib.d.ts",
|
|
172
175
|
});
|
|
176
|
+
const checker2 = program.getTypeChecker();
|
|
173
177
|
const testProgram = {
|
|
174
178
|
program,
|
|
175
|
-
checker:
|
|
179
|
+
checker: checker2,
|
|
180
|
+
binding: createBinding(checker2),
|
|
176
181
|
options: {
|
|
177
182
|
projectRoot: "/test",
|
|
178
183
|
sourceRoot: "/test",
|
|
@@ -180,14 +185,15 @@ describe("Hierarchical Bindings - Full Pipeline", () => {
|
|
|
180
185
|
strict: true,
|
|
181
186
|
},
|
|
182
187
|
sourceFiles: [sourceFile],
|
|
188
|
+
declarationSourceFiles: [],
|
|
183
189
|
metadata: new DotnetMetadataRegistry(),
|
|
184
190
|
bindings,
|
|
185
191
|
clrResolver: createClrBindingsResolver("/test"),
|
|
186
192
|
};
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
193
|
+
// Phase 5: Create ProgramContext for this compilation
|
|
194
|
+
const options = { sourceRoot: "/test", rootNamespace: "TestApp" };
|
|
195
|
+
const ctx = createProgramContext(testProgram, options);
|
|
196
|
+
const irResult = buildIrModule(sourceFile, testProgram, options, ctx);
|
|
191
197
|
if (!irResult.ok) {
|
|
192
198
|
throw new Error("IR build failed for multiple bindings test");
|
|
193
199
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hierarchical-bindings.test.js","sourceRoot":"","sources":["../src/hierarchical-bindings.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,eAAe,EACf,yBAAyB,
|
|
1
|
+
{"version":3,"file":"hierarchical-bindings.test.js","sourceRoot":"","sources":["../src/hierarchical-bindings.test.ts"],"names":[],"mappings":"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"}
|
package/dist/integration.test.js
CHANGED
|
@@ -5,18 +5,21 @@
|
|
|
5
5
|
import { describe, it } from "mocha";
|
|
6
6
|
import { expect } from "chai";
|
|
7
7
|
import * as ts from "typescript";
|
|
8
|
-
import { buildIrModule, DotnetMetadataRegistry, BindingRegistry, createClrBindingsResolver, } from "@tsonic/frontend";
|
|
8
|
+
import { buildIrModule, DotnetMetadataRegistry, BindingRegistry, createClrBindingsResolver, createBinding, createProgramContext, } from "@tsonic/frontend";
|
|
9
9
|
import { emitModule } from "./emitter.js";
|
|
10
10
|
/**
|
|
11
11
|
* Helper to compile TypeScript source to C#
|
|
12
12
|
*/
|
|
13
13
|
const compileToCSharp = (source, fileName = "/test/test.ts") => {
|
|
14
|
+
// Phase 5: Each test creates fresh ProgramContext - no global cleanup needed
|
|
14
15
|
const sourceFile = ts.createSourceFile(fileName, source, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
|
|
15
16
|
const compilerOptions = {
|
|
16
17
|
target: ts.ScriptTarget.ES2022,
|
|
17
18
|
module: ts.ModuleKind.NodeNext,
|
|
18
19
|
strict: true,
|
|
19
20
|
noEmit: true,
|
|
21
|
+
noLib: true,
|
|
22
|
+
skipLibCheck: true,
|
|
20
23
|
};
|
|
21
24
|
const host = ts.createCompilerHost(compilerOptions);
|
|
22
25
|
const originalGetSourceFile = host.getSourceFile;
|
|
@@ -27,24 +30,27 @@ const compileToCSharp = (source, fileName = "/test/test.ts") => {
|
|
|
27
30
|
return originalGetSourceFile.call(host, name, languageVersionOrOptions, onError, shouldCreateNewSourceFile);
|
|
28
31
|
};
|
|
29
32
|
const tsProgram = ts.createProgram([fileName], compilerOptions, host);
|
|
33
|
+
const checker = tsProgram.getTypeChecker();
|
|
30
34
|
const tsonicProgram = {
|
|
31
35
|
program: tsProgram,
|
|
32
|
-
checker
|
|
36
|
+
checker,
|
|
37
|
+
binding: createBinding(checker),
|
|
33
38
|
options: {
|
|
34
39
|
projectRoot: "/test",
|
|
35
40
|
sourceRoot: "/test",
|
|
36
41
|
rootNamespace: "Test",
|
|
37
42
|
},
|
|
38
43
|
sourceFiles: [sourceFile],
|
|
44
|
+
declarationSourceFiles: [],
|
|
39
45
|
metadata: new DotnetMetadataRegistry(),
|
|
40
46
|
bindings: new BindingRegistry(),
|
|
41
47
|
clrResolver: createClrBindingsResolver("/test"),
|
|
42
48
|
};
|
|
49
|
+
// Phase 5: Create ProgramContext for this compilation
|
|
50
|
+
const options = { sourceRoot: "/test", rootNamespace: "Test" };
|
|
51
|
+
const ctx = createProgramContext(tsonicProgram, options);
|
|
43
52
|
// Build IR
|
|
44
|
-
const irResult = buildIrModule(sourceFile, tsonicProgram,
|
|
45
|
-
sourceRoot: "/test",
|
|
46
|
-
rootNamespace: "Test",
|
|
47
|
-
});
|
|
53
|
+
const irResult = buildIrModule(sourceFile, tsonicProgram, options, ctx);
|
|
48
54
|
if (!irResult.ok) {
|
|
49
55
|
throw new Error(`IR build failed: ${irResult.error.message}`);
|
|
50
56
|
}
|
|
@@ -155,6 +161,8 @@ describe("End-to-End Integration", () => {
|
|
|
155
161
|
describe("Combined Features", () => {
|
|
156
162
|
it("should compile code with multiple generic features", () => {
|
|
157
163
|
const source = `
|
|
164
|
+
import { int } from "@tsonic/core/types.js";
|
|
165
|
+
|
|
158
166
|
export interface Repository<T> {
|
|
159
167
|
items: T[];
|
|
160
168
|
add(item: T): void;
|
|
@@ -169,13 +177,18 @@ describe("End-to-End Integration", () => {
|
|
|
169
177
|
}
|
|
170
178
|
|
|
171
179
|
findById(id: number): T | undefined {
|
|
172
|
-
|
|
180
|
+
for (let i: int = 0; i < this.items.length; i++) {
|
|
181
|
+
if (this.items[i].id === id) {
|
|
182
|
+
return this.items[i];
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return undefined;
|
|
173
186
|
}
|
|
174
187
|
}
|
|
175
188
|
`;
|
|
176
189
|
const csharp = compileToCSharp(source);
|
|
177
|
-
//
|
|
178
|
-
expect(csharp).to.match(/public\s+
|
|
190
|
+
// Method-bearing interfaces emit as C# interfaces (required for constraints/implements)
|
|
191
|
+
expect(csharp).to.match(/public\s+interface\s+Repository\s*<T>/);
|
|
179
192
|
// Should emit InMemoryRepository as generic class with constraint
|
|
180
193
|
expect(csharp).to.match(/public\s+class\s+InMemoryRepository\s*<T>/);
|
|
181
194
|
expect(csharp).to.include("where T : __Constraint_T");
|
|
@@ -187,6 +200,12 @@ describe("End-to-End Integration", () => {
|
|
|
187
200
|
describe("Lambda Parameter Type Inference", () => {
|
|
188
201
|
it("should infer types for Promise executor callback parameters", () => {
|
|
189
202
|
const source = `
|
|
203
|
+
// Inline minimal types for this test
|
|
204
|
+
declare function setTimeout(fn: () => void, ms: number): void;
|
|
205
|
+
declare class Promise<T> {
|
|
206
|
+
constructor(executor: (resolve: () => void) => void);
|
|
207
|
+
}
|
|
208
|
+
|
|
190
209
|
export function delay(ms: number): Promise<void> {
|
|
191
210
|
return new Promise((resolve) => {
|
|
192
211
|
setTimeout(resolve, ms);
|
|
@@ -198,15 +217,26 @@ describe("End-to-End Integration", () => {
|
|
|
198
217
|
// The key is that resolve has a type annotation, not just the bare identifier
|
|
199
218
|
expect(csharp).to.match(/\(global::System\.Action.*\s+resolve\)\s*=>/);
|
|
200
219
|
});
|
|
201
|
-
it("should infer types for
|
|
220
|
+
it("should infer types for generic method callbacks", () => {
|
|
202
221
|
const source = `
|
|
203
|
-
|
|
204
|
-
|
|
222
|
+
// Custom generic class with map method (valid in dotnet mode)
|
|
223
|
+
export class Box<T> {
|
|
224
|
+
value: T;
|
|
225
|
+
constructor(value: T) {
|
|
226
|
+
this.value = value;
|
|
227
|
+
}
|
|
228
|
+
map<U>(fn: (x: T) => U): Box<U> {
|
|
229
|
+
return new Box<U>(fn(this.value));
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
export function doubleBox(box: Box<number>): Box<number> {
|
|
234
|
+
return box.map((n) => n * 2);
|
|
205
235
|
}
|
|
206
236
|
`;
|
|
207
237
|
const csharp = compileToCSharp(source);
|
|
208
238
|
// Should emit lambda with typed parameter
|
|
209
|
-
// n should be inferred as number (double in C#)
|
|
239
|
+
// n should be inferred as number (double in C#) from Box<number>.map's callback type
|
|
210
240
|
expect(csharp).to.include("(double n) => n * 2");
|
|
211
241
|
});
|
|
212
242
|
});
|
|
@@ -234,6 +264,8 @@ describe("End-to-End Integration", () => {
|
|
|
234
264
|
describe("Full Module Compilation", () => {
|
|
235
265
|
it("should compile a complete module with all features", () => {
|
|
236
266
|
const source = `
|
|
267
|
+
import { int } from "@tsonic/core/types.js";
|
|
268
|
+
|
|
237
269
|
// Type definitions
|
|
238
270
|
export interface User {
|
|
239
271
|
id: number;
|
|
@@ -243,7 +275,7 @@ describe("End-to-End Integration", () => {
|
|
|
243
275
|
|
|
244
276
|
export type UserId = number;
|
|
245
277
|
|
|
246
|
-
//
|
|
278
|
+
// User repository
|
|
247
279
|
export class UserRepository {
|
|
248
280
|
private users: User[] = [];
|
|
249
281
|
|
|
@@ -252,7 +284,12 @@ describe("End-to-End Integration", () => {
|
|
|
252
284
|
}
|
|
253
285
|
|
|
254
286
|
findById(id: UserId): User | undefined {
|
|
255
|
-
|
|
287
|
+
for (let i: int = 0; i < this.users.length; i++) {
|
|
288
|
+
if (this.users[i].id === id) {
|
|
289
|
+
return this.users[i];
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return undefined;
|
|
256
293
|
}
|
|
257
294
|
|
|
258
295
|
all(): User[] {
|
|
@@ -260,9 +297,13 @@ describe("End-to-End Integration", () => {
|
|
|
260
297
|
}
|
|
261
298
|
}
|
|
262
299
|
|
|
263
|
-
// Generic utility function
|
|
264
|
-
export function
|
|
265
|
-
|
|
300
|
+
// Generic utility function with manual iteration
|
|
301
|
+
export function transform<T, U>(arr: T[], fn: (item: T) => U): U[] {
|
|
302
|
+
const result: U[] = [];
|
|
303
|
+
for (let i: int = 0; i < arr.length; i++) {
|
|
304
|
+
result.push(fn(arr[i]));
|
|
305
|
+
}
|
|
306
|
+
return result;
|
|
266
307
|
}
|
|
267
308
|
`;
|
|
268
309
|
const csharp = compileToCSharp(source);
|
|
@@ -271,8 +312,8 @@ describe("End-to-End Integration", () => {
|
|
|
271
312
|
expect(csharp).to.include("// type UserId = double"); // number → double in C#
|
|
272
313
|
// Should have the repository class
|
|
273
314
|
expect(csharp).to.include("class UserRepository");
|
|
274
|
-
// Should have the generic function with
|
|
275
|
-
expect(csharp).to.match(/public\s+static\s+
|
|
315
|
+
// Should have the generic function with native array return type
|
|
316
|
+
expect(csharp).to.match(/public\s+static\s+U\[\]\s+transform\s*<T,\s*U>/);
|
|
276
317
|
// Should have proper namespace structure
|
|
277
318
|
expect(csharp).to.include("namespace Test");
|
|
278
319
|
expect(csharp).to.include("public static class test");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../src/integration.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,eAAe,EACf,yBAAyB,
|
|
1
|
+
{"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../src/integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Mechanical Invariant Test: Emitter Special-Cases ⊆ Globals
|
|
3
3
|
*
|
|
4
4
|
* This test verifies that every identifier the emitter "just knows" about
|
|
5
|
-
* via special-casing exists in
|
|
5
|
+
* via special-casing exists in the globals package.
|
|
6
6
|
*
|
|
7
7
|
* The principle: The emitter must not emit CLR mappings for types that
|
|
8
8
|
* aren't declared in the globals packages. If a type isn't in globals,
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Mechanical Invariant Test: Emitter Special-Cases ⊆ Globals
|
|
3
3
|
*
|
|
4
4
|
* This test verifies that every identifier the emitter "just knows" about
|
|
5
|
-
* via special-casing exists in
|
|
5
|
+
* via special-casing exists in the globals package.
|
|
6
6
|
*
|
|
7
7
|
* The principle: The emitter must not emit CLR mappings for types that
|
|
8
8
|
* aren't declared in the globals packages. If a type isn't in globals,
|
|
@@ -15,40 +15,25 @@ import { describe, it } from "mocha";
|
|
|
15
15
|
import { strict as assert } from "assert";
|
|
16
16
|
/**
|
|
17
17
|
* Types that the emitter special-cases with hardcoded CLR mappings.
|
|
18
|
-
* Each entry specifies which runtime mode(s) the special-casing applies to.
|
|
19
18
|
*
|
|
20
19
|
* IMPORTANT: When adding new special-cases to the emitter, you MUST:
|
|
21
20
|
* 1. Add the type to this list
|
|
22
|
-
* 2. Ensure the type is declared in the
|
|
21
|
+
* 2. Ensure the type is declared in the globals package
|
|
23
22
|
* 3. Update the assertions below
|
|
24
23
|
*/
|
|
25
|
-
const EMITTER_SPECIAL_CASES =
|
|
26
|
-
// From references.ts:192 - Array<T> →
|
|
27
|
-
Array
|
|
24
|
+
const EMITTER_SPECIAL_CASES = [
|
|
25
|
+
// From references.ts:192 - Array<T> → T[] (native array)
|
|
26
|
+
"Array",
|
|
28
27
|
// From references.ts:204,217 - Promise<T> → Task<T>
|
|
29
|
-
Promise
|
|
30
|
-
// From references.ts:
|
|
31
|
-
PromiseLike
|
|
32
|
-
|
|
33
|
-
Error: { js: true, dotnet: false },
|
|
34
|
-
};
|
|
35
|
-
/**
|
|
36
|
-
* Types that MUST be declared in js-globals for the emitter to work correctly.
|
|
37
|
-
* These are types that have special-case handling when runtime === "js".
|
|
38
|
-
*/
|
|
39
|
-
const REQUIRED_IN_JS_GLOBALS = ["Array", "Promise", "PromiseLike", "Error"];
|
|
40
|
-
/**
|
|
41
|
-
* Types that MUST be declared in base globals for the emitter to work correctly.
|
|
42
|
-
* These are types that have special-case handling when runtime === "dotnet".
|
|
43
|
-
*/
|
|
44
|
-
const REQUIRED_IN_BASE_GLOBALS = ["Array", "Promise", "PromiseLike"];
|
|
28
|
+
"Promise",
|
|
29
|
+
// From references.ts:224 - PromiseLike<T> → Task<T>
|
|
30
|
+
"PromiseLike",
|
|
31
|
+
];
|
|
45
32
|
/**
|
|
46
|
-
* Types that are NOT in
|
|
47
|
-
* These must
|
|
48
|
-
* If the emitter special-cased these, it would produce wrong output for code
|
|
49
|
-
* that can't even type-check.
|
|
33
|
+
* Types that are NOT in globals and must NOT be special-cased.
|
|
34
|
+
* These must fail at TS name resolution first.
|
|
50
35
|
*/
|
|
51
|
-
const
|
|
36
|
+
const TYPES_NOT_IN_GLOBALS = [
|
|
52
37
|
"Map", // Not in globals - must fail at TS name resolution
|
|
53
38
|
"Set", // Not in globals - must fail at TS name resolution
|
|
54
39
|
"WeakMap", // Not in globals
|
|
@@ -60,77 +45,52 @@ const TYPES_NOT_IN_ANY_GLOBALS = [
|
|
|
60
45
|
"isFinite", // Not in globals
|
|
61
46
|
];
|
|
62
47
|
/**
|
|
63
|
-
* Types that ARE in
|
|
48
|
+
* Types that ARE in globals but are NOT special-cased by the emitter.
|
|
64
49
|
* This is correct behavior - they go through normal type resolution.
|
|
65
|
-
* These are listed here to document that they're intentionally not special-cased.
|
|
66
|
-
*
|
|
67
|
-
* Note: These types are legitimate in JS mode and resolve through the normal
|
|
68
|
-
* import/binding path, not hardcoded CLR mappings.
|
|
69
50
|
*/
|
|
70
|
-
const
|
|
71
|
-
"console", // In
|
|
72
|
-
"Math", // In
|
|
73
|
-
"JSON", // In
|
|
74
|
-
"RegExp", // In
|
|
51
|
+
const IN_GLOBALS_NOT_SPECIAL_CASED = [
|
|
52
|
+
"console", // In globals, resolves via normal path
|
|
53
|
+
"Math", // In globals, resolves via normal path
|
|
54
|
+
"JSON", // In globals, resolves via normal path
|
|
55
|
+
"RegExp", // In globals (minimal), resolves via normal path
|
|
75
56
|
];
|
|
76
57
|
describe("Emitter-Globals Subset Invariant", () => {
|
|
77
|
-
describe("Special-cased types exist in
|
|
78
|
-
it("all
|
|
79
|
-
|
|
80
|
-
.filter(([_, modes]) => modes.js)
|
|
81
|
-
.map(([name]) => name);
|
|
82
|
-
// This assertion documents the invariant
|
|
83
|
-
assert.deepEqual(jsSpecialCases.sort(), REQUIRED_IN_JS_GLOBALS.sort(), "JS-mode special cases must match required js-globals types");
|
|
84
|
-
});
|
|
85
|
-
it("all dotnet-mode special cases are in base globals", () => {
|
|
86
|
-
const dotnetSpecialCases = Object.entries(EMITTER_SPECIAL_CASES)
|
|
87
|
-
.filter(([_, modes]) => modes.dotnet)
|
|
88
|
-
.map(([name]) => name);
|
|
89
|
-
assert.deepEqual(dotnetSpecialCases.sort(), REQUIRED_IN_BASE_GLOBALS.sort(), "Dotnet-mode special cases must match required base globals types");
|
|
90
|
-
});
|
|
91
|
-
it("Error is only special-cased in JS mode", () => {
|
|
92
|
-
const errorConfig = EMITTER_SPECIAL_CASES.Error;
|
|
93
|
-
assert.equal(errorConfig.js, true, "Error should be special-cased in JS mode");
|
|
94
|
-
assert.equal(errorConfig.dotnet, false, "Error should NOT be special-cased in dotnet mode");
|
|
58
|
+
describe("Special-cased types exist in globals", () => {
|
|
59
|
+
it("documents all special-cased types", () => {
|
|
60
|
+
assert.deepEqual([...EMITTER_SPECIAL_CASES].sort(), ["Array", "Promise", "PromiseLike"], "Complete list of emitter special-cased types");
|
|
95
61
|
});
|
|
96
62
|
});
|
|
97
63
|
describe("Types not in globals are not special-cased", () => {
|
|
98
|
-
it("Map is not special-cased (not in
|
|
99
|
-
assert.
|
|
64
|
+
it("Map is not special-cased (not in globals)", () => {
|
|
65
|
+
assert.ok(!EMITTER_SPECIAL_CASES.includes("Map"), "Map must not be special-cased - it's not in globals, TS will fail first");
|
|
100
66
|
});
|
|
101
|
-
it("Set is not special-cased (not in
|
|
102
|
-
assert.
|
|
67
|
+
it("Set is not special-cased (not in globals)", () => {
|
|
68
|
+
assert.ok(!EMITTER_SPECIAL_CASES.includes("Set"), "Set must not be special-cased - it's not in globals, TS will fail first");
|
|
103
69
|
});
|
|
104
70
|
it("no types outside globals are special-cased", () => {
|
|
105
|
-
for (const typeName of
|
|
106
|
-
assert.
|
|
71
|
+
for (const typeName of TYPES_NOT_IN_GLOBALS) {
|
|
72
|
+
assert.ok(!EMITTER_SPECIAL_CASES.includes(typeName), `${typeName} must not be special-cased - it's not in globals`);
|
|
107
73
|
}
|
|
108
74
|
});
|
|
109
75
|
});
|
|
110
|
-
describe("
|
|
111
|
-
it("console/Math/JSON are in
|
|
112
|
-
// These types ARE in
|
|
76
|
+
describe("Globals types correctly handled", () => {
|
|
77
|
+
it("console/Math/JSON are in globals but not special-cased (correct)", () => {
|
|
78
|
+
// These types ARE in globals and should NOT be special-cased.
|
|
113
79
|
// They resolve through normal type resolution, not hardcoded CLR mappings.
|
|
114
|
-
for (const typeName of
|
|
115
|
-
assert.
|
|
80
|
+
for (const typeName of IN_GLOBALS_NOT_SPECIAL_CASED) {
|
|
81
|
+
assert.ok(!EMITTER_SPECIAL_CASES.includes(typeName), `${typeName} is in globals but should NOT be special-cased (uses normal resolution)`);
|
|
116
82
|
}
|
|
117
83
|
});
|
|
118
84
|
});
|
|
119
85
|
describe("Invariant documentation", () => {
|
|
120
|
-
it("documents the complete list of special-cased types", () => {
|
|
121
|
-
const specialCasedTypes = Object.keys(EMITTER_SPECIAL_CASES);
|
|
122
|
-
// This test will fail if someone adds a new special case without updating this file
|
|
123
|
-
assert.deepEqual(specialCasedTypes.sort(), ["Array", "Error", "Promise", "PromiseLike"], "Complete list of emitter special-cased types");
|
|
124
|
-
});
|
|
125
86
|
it("documents source locations for special cases", () => {
|
|
126
87
|
// This is a documentation test - it reminds maintainers where to look
|
|
127
88
|
const sourceLocations = {
|
|
128
89
|
Array: "packages/emitter/src/types/references.ts:192",
|
|
129
90
|
Promise: "packages/emitter/src/types/references.ts:204,217",
|
|
130
|
-
PromiseLike: "packages/emitter/src/types/references.ts:
|
|
131
|
-
Error: "packages/emitter/src/types/references.ts:232",
|
|
91
|
+
PromiseLike: "packages/emitter/src/types/references.ts:224",
|
|
132
92
|
};
|
|
133
|
-
assert.equal(Object.keys(sourceLocations).length,
|
|
93
|
+
assert.equal(Object.keys(sourceLocations).length, EMITTER_SPECIAL_CASES.length, "All special cases should have documented source locations");
|
|
134
94
|
});
|
|
135
95
|
});
|
|
136
96
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emitter-globals-subset.test.js","sourceRoot":"","sources":["../../src/invariants/emitter-globals-subset.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE1C
|
|
1
|
+
{"version":3,"file":"emitter-globals-subset.test.js","sourceRoot":"","sources":["../../src/invariants/emitter-globals-subset.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -467,7 +467,7 @@ describe("Numeric Proof Contract (Behavioral)", () => {
|
|
|
467
467
|
indexRaw: "0",
|
|
468
468
|
});
|
|
469
469
|
// Should not throw - proof marker is present
|
|
470
|
-
expect(() => emitModule(module
|
|
470
|
+
expect(() => emitModule(module)).to.not.throw();
|
|
471
471
|
});
|
|
472
472
|
it("ICE when proof marker missing - even for literal 0", () => {
|
|
473
473
|
// REGRESSION GUARD: This test ensures nobody "helpfully" re-adds
|
|
@@ -480,7 +480,7 @@ describe("Numeric Proof Contract (Behavioral)", () => {
|
|
|
480
480
|
indexRaw: "0",
|
|
481
481
|
});
|
|
482
482
|
// Emitter should ICE because proof marker is missing
|
|
483
|
-
expect(() => emitModule(module
|
|
483
|
+
expect(() => emitModule(module)).to.throw(/Internal Compiler Error.*Int32 proof/);
|
|
484
484
|
});
|
|
485
485
|
it("ICE when proof marker missing - even for literal 1", () => {
|
|
486
486
|
// REGRESSION GUARD: Same as above for literal 1
|
|
@@ -490,7 +490,7 @@ describe("Numeric Proof Contract (Behavioral)", () => {
|
|
|
490
490
|
indexValue: 1,
|
|
491
491
|
indexRaw: "1",
|
|
492
492
|
});
|
|
493
|
-
expect(() => emitModule(module
|
|
493
|
+
expect(() => emitModule(module)).to.throw(/Internal Compiler Error.*Int32 proof/);
|
|
494
494
|
});
|
|
495
495
|
});
|
|
496
496
|
// ============================================================================
|