@tsonic/emitter 0.0.6 → 0.0.13
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.js +5 -5
- package/dist/array.test.js.map +1 -1
- package/dist/core/attributes.d.ts +43 -0
- package/dist/core/attributes.d.ts.map +1 -0
- package/dist/core/attributes.js +128 -0
- package/dist/core/attributes.js.map +1 -0
- package/dist/core/attributes.test.d.ts +5 -0
- package/dist/core/attributes.test.d.ts.map +1 -0
- package/dist/core/attributes.test.js +296 -0
- package/dist/core/attributes.test.js.map +1 -0
- package/dist/core/imports.test.js +6 -3
- package/dist/core/imports.test.js.map +1 -1
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/module-emitter/static-container.d.ts.map +1 -1
- package/dist/core/module-emitter/static-container.js +50 -1
- package/dist/core/module-emitter/static-container.js.map +1 -1
- package/dist/core/module-emitter.test.js +2 -1
- package/dist/core/module-emitter.test.js.map +1 -1
- package/dist/core/module-map.d.ts.map +1 -1
- package/dist/core/module-map.js +5 -1
- package/dist/core/module-map.js.map +1 -1
- package/dist/core/module-map.test.d.ts +8 -0
- package/dist/core/module-map.test.d.ts.map +1 -0
- package/dist/core/module-map.test.js +94 -0
- package/dist/core/module-map.test.js.map +1 -0
- package/dist/core/type-compatibility.d.ts +31 -0
- package/dist/core/type-compatibility.d.ts.map +1 -0
- package/dist/core/type-compatibility.js +99 -0
- package/dist/core/type-compatibility.js.map +1 -0
- package/dist/core/type-resolution.d.ts +83 -3
- package/dist/core/type-resolution.d.ts.map +1 -1
- package/dist/core/type-resolution.js +262 -4
- package/dist/core/type-resolution.js.map +1 -1
- package/dist/core/type-resolution.test.js +110 -1
- package/dist/core/type-resolution.test.js.map +1 -1
- package/dist/emitter-types/context.d.ts.map +1 -1
- package/dist/emitter-types/context.js +21 -1
- package/dist/emitter-types/context.js.map +1 -1
- package/dist/emitter-types/core.d.ts +26 -0
- package/dist/emitter-types/core.d.ts.map +1 -1
- package/dist/emitter-types/identifiers.d.ts.map +1 -1
- package/dist/emitter-types/identifiers.js +4 -43
- package/dist/emitter-types/identifiers.js.map +1 -1
- package/dist/emitter-types/index.d.ts +1 -1
- package/dist/emitter-types/index.d.ts.map +1 -1
- package/dist/emitter-types/index.js.map +1 -1
- package/dist/emitter.d.ts.map +1 -1
- package/dist/emitter.js +47 -1
- package/dist/emitter.js.map +1 -1
- package/dist/expression-emitter.d.ts.map +1 -1
- package/dist/expression-emitter.js +51 -3
- package/dist/expression-emitter.js.map +1 -1
- package/dist/expressions/access.d.ts.map +1 -1
- package/dist/expressions/access.js +138 -23
- package/dist/expressions/access.js.map +1 -1
- package/dist/expressions/calls.d.ts.map +1 -1
- package/dist/expressions/calls.js +90 -13
- package/dist/expressions/calls.js.map +1 -1
- package/dist/expressions/collections.d.ts +3 -2
- package/dist/expressions/collections.d.ts.map +1 -1
- package/dist/expressions/collections.js +251 -52
- package/dist/expressions/collections.js.map +1 -1
- package/dist/expressions/functions.d.ts +2 -2
- package/dist/expressions/functions.d.ts.map +1 -1
- package/dist/expressions/functions.js +81 -38
- package/dist/expressions/functions.js.map +1 -1
- package/dist/expressions/identifiers.d.ts.map +1 -1
- package/dist/expressions/identifiers.js +28 -7
- package/dist/expressions/identifiers.js.map +1 -1
- package/dist/expressions/index.test.js +191 -4
- package/dist/expressions/index.test.js.map +1 -1
- package/dist/expressions/literals.d.ts +7 -17
- package/dist/expressions/literals.d.ts.map +1 -1
- package/dist/expressions/literals.js +27 -87
- package/dist/expressions/literals.js.map +1 -1
- package/dist/expressions/literals.test.js +52 -2
- package/dist/expressions/literals.test.js.map +1 -1
- package/dist/expressions/operators.d.ts +29 -11
- package/dist/expressions/operators.d.ts.map +1 -1
- package/dist/expressions/operators.js +244 -67
- package/dist/expressions/operators.js.map +1 -1
- package/dist/expressions/other.d.ts +3 -0
- package/dist/expressions/other.d.ts.map +1 -1
- package/dist/expressions/other.js +27 -3
- package/dist/expressions/other.js.map +1 -1
- package/dist/generator-exchange.d.ts +1 -1
- package/dist/generator-exchange.d.ts.map +1 -1
- package/dist/generator-exchange.js +15 -4
- package/dist/generator-exchange.js.map +1 -1
- package/dist/generator-wrapper.d.ts +84 -0
- package/dist/generator-wrapper.d.ts.map +1 -0
- package/dist/generator-wrapper.js +312 -0
- package/dist/generator-wrapper.js.map +1 -0
- package/dist/generator-wrapper.test.d.ts +12 -0
- package/dist/generator-wrapper.test.d.ts.map +1 -0
- package/dist/generator-wrapper.test.js +179 -0
- package/dist/generator-wrapper.test.js.map +1 -0
- package/dist/generator.test.js +596 -6
- package/dist/generator.test.js.map +1 -1
- package/dist/golden-tests/config-parser.d.ts.map +1 -1
- package/dist/golden-tests/config-parser.js +81 -11
- package/dist/golden-tests/config-parser.js.map +1 -1
- package/dist/golden-tests/discovery.d.ts +14 -3
- package/dist/golden-tests/discovery.d.ts.map +1 -1
- package/dist/golden-tests/discovery.js +105 -12
- 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 +1 -0
- package/dist/golden-tests/runner.d.ts.map +1 -1
- package/dist/golden-tests/runner.js +83 -25
- package/dist/golden-tests/runner.js.map +1 -1
- package/dist/golden-tests/types.d.ts +18 -1
- package/dist/golden-tests/types.d.ts.map +1 -1
- package/dist/golden.test.d.ts +12 -5
- package/dist/golden.test.d.ts.map +1 -1
- package/dist/golden.test.js +40 -21
- package/dist/golden.test.js.map +1 -1
- package/dist/hierarchical-bindings.test.js +2 -2
- package/dist/hierarchical-bindings.test.js.map +1 -1
- package/dist/integration.test.js +57 -10
- package/dist/integration.test.js.map +1 -1
- package/dist/invariants/emitter-globals-subset.test.d.ts +15 -0
- package/dist/invariants/emitter-globals-subset.test.d.ts.map +1 -0
- package/dist/invariants/emitter-globals-subset.test.js +137 -0
- package/dist/invariants/emitter-globals-subset.test.js.map +1 -0
- package/dist/invariants/numeric-proof-contract.test.d.ts +19 -0
- package/dist/invariants/numeric-proof-contract.test.d.ts.map +1 -0
- package/dist/invariants/numeric-proof-contract.test.js +565 -0
- package/dist/invariants/numeric-proof-contract.test.js.map +1 -0
- package/dist/specialization/generic-functions.test.js +376 -0
- package/dist/specialization/generic-functions.test.js.map +1 -1
- package/dist/specialization/interfaces.test.js +6 -6
- package/dist/specialization/interfaces.test.js.map +1 -1
- package/dist/specialization/substitution.d.ts.map +1 -1
- package/dist/specialization/substitution.js +7 -0
- package/dist/specialization/substitution.js.map +1 -1
- package/dist/specialization/type-aliases.test.js +88 -5
- package/dist/specialization/type-aliases.test.js.map +1 -1
- package/dist/statement-emitter.d.ts.map +1 -1
- package/dist/statement-emitter.js +5 -1
- package/dist/statement-emitter.js.map +1 -1
- package/dist/statements/blocks.d.ts +39 -1
- package/dist/statements/blocks.d.ts.map +1 -1
- package/dist/statements/blocks.js +129 -3
- 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 +16 -5
- package/dist/statements/classes/members/methods.js.map +1 -1
- package/dist/statements/classes/members/properties.d.ts.map +1 -1
- package/dist/statements/classes/members/properties.js +10 -1
- package/dist/statements/classes/members/properties.js.map +1 -1
- package/dist/statements/classes/properties.d.ts.map +1 -1
- package/dist/statements/classes/properties.js +4 -0
- package/dist/statements/classes/properties.js.map +1 -1
- package/dist/statements/control/conditionals.d.ts.map +1 -1
- package/dist/statements/control/conditionals.js +352 -1
- package/dist/statements/control/conditionals.js.map +1 -1
- package/dist/statements/control/loops.d.ts +6 -0
- package/dist/statements/control/loops.d.ts.map +1 -1
- package/dist/statements/control/loops.js +9 -2
- 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 +20 -6
- 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 +98 -26
- 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 +11 -1
- package/dist/statements/declarations/interfaces.js.map +1 -1
- package/dist/statements/declarations/structs.test.js +7 -5
- package/dist/statements/declarations/structs.test.js.map +1 -1
- package/dist/statements/declarations/type-aliases.d.ts.map +1 -1
- package/dist/statements/declarations/type-aliases.js +18 -9
- 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 +54 -2
- package/dist/statements/declarations/variables.js.map +1 -1
- package/dist/statements/index.test.js +164 -3
- package/dist/statements/index.test.js.map +1 -1
- package/dist/types/arrays.d.ts +10 -1
- package/dist/types/arrays.d.ts.map +1 -1
- package/dist/types/arrays.js +16 -1
- package/dist/types/arrays.js.map +1 -1
- package/dist/types/dictionaries.d.ts +3 -2
- package/dist/types/dictionaries.d.ts.map +1 -1
- package/dist/types/dictionaries.js +14 -8
- package/dist/types/dictionaries.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/index.test.js +5 -2
- package/dist/types/index.test.js.map +1 -1
- package/dist/types/parameters.d.ts.map +1 -1
- package/dist/types/parameters.js +29 -0
- package/dist/types/parameters.js.map +1 -1
- package/dist/types/primitives.d.ts +12 -1
- package/dist/types/primitives.d.ts.map +1 -1
- package/dist/types/primitives.js +14 -1
- package/dist/types/primitives.js.map +1 -1
- package/dist/types/references.d.ts.map +1 -1
- package/dist/types/references.js +136 -30
- package/dist/types/references.js.map +1 -1
- package/dist/types/references.test.d.ts +11 -0
- package/dist/types/references.test.d.ts.map +1 -0
- package/dist/types/references.test.js +382 -0
- package/dist/types/references.test.js.map +1 -0
- package/dist/types/tuples.d.ts +23 -0
- package/dist/types/tuples.d.ts.map +1 -0
- package/dist/types/tuples.js +54 -0
- package/dist/types/tuples.js.map +1 -0
- package/dist/types/unions.test.js +62 -15
- package/dist/types/unions.test.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +7 -3
|
@@ -1,15 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Golden test types
|
|
3
3
|
*/
|
|
4
|
+
/**
|
|
5
|
+
* Runtime mode for golden tests:
|
|
6
|
+
* - "dotnet": uses @tsonic/globals only (native .NET APIs)
|
|
7
|
+
* - "js": uses @tsonic/globals + @tsonic/js-globals (JSRuntime APIs)
|
|
8
|
+
*/
|
|
9
|
+
export type RuntimeMode = "dotnet" | "js";
|
|
10
|
+
/**
|
|
11
|
+
* Diagnostics matching mode:
|
|
12
|
+
* - "contains": expected codes must be present, extra codes allowed (default)
|
|
13
|
+
* - "exact": actual codes must exactly match expected codes
|
|
14
|
+
*/
|
|
15
|
+
export type DiagnosticsMode = "contains" | "exact";
|
|
4
16
|
export type TestEntry = {
|
|
5
17
|
readonly input: string;
|
|
6
18
|
readonly title: string;
|
|
19
|
+
readonly expectDiagnostics?: readonly string[];
|
|
20
|
+
readonly expectDiagnosticsMode?: DiagnosticsMode;
|
|
7
21
|
};
|
|
8
22
|
export type Scenario = {
|
|
9
23
|
readonly pathParts: readonly string[];
|
|
10
24
|
readonly title: string;
|
|
11
25
|
readonly inputPath: string;
|
|
12
|
-
readonly expectedPath
|
|
26
|
+
readonly expectedPath?: string;
|
|
27
|
+
readonly expectDiagnostics?: readonly string[];
|
|
28
|
+
readonly expectDiagnosticsMode?: DiagnosticsMode;
|
|
29
|
+
readonly runtimeMode: RuntimeMode;
|
|
13
30
|
};
|
|
14
31
|
export type DescribeNode = {
|
|
15
32
|
readonly name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/golden-tests/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/golden-tests/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,IAAI,CAAC;AAE1C;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,OAAO,CAAC;AAEnD,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/C,QAAQ,CAAC,qBAAqB,CAAC,EAAE,eAAe,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/C,QAAQ,CAAC,qBAAqB,CAAC,EAAE,eAAe,CAAC;IACjD,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC7C,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB,CAAC"}
|
package/dist/golden.test.d.ts
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Golden Test Harness for Tsonic Emitter
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
4
|
+
* Directory structure:
|
|
5
|
+
* testcases/
|
|
6
|
+
* ├── common/ # Tests that work in BOTH modes
|
|
7
|
+
* │ ├── <category>/<test>/ # .ts sources + config.yaml
|
|
8
|
+
* │ ├── dotnet/<category>/<test>/ # Expected .cs for dotnet mode
|
|
9
|
+
* │ └── js/<category>/<test>/ # Expected .cs for js mode
|
|
10
|
+
* └── js-only/ # Tests that ONLY work in JS mode
|
|
11
|
+
* └── <category>/<test>/ # .ts, config.yaml, AND .cs together
|
|
12
|
+
*
|
|
13
|
+
* Two modes:
|
|
14
|
+
* - dotnet: common/ tests only, uses @tsonic/globals (native .NET APIs)
|
|
15
|
+
* - js: common/ + js-only/ tests, uses @tsonic/globals + @tsonic/js-globals
|
|
9
16
|
*/
|
|
10
17
|
export {};
|
|
11
18
|
//# sourceMappingURL=golden.test.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"golden.test.d.ts","sourceRoot":"","sources":["../src/golden.test.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"golden.test.d.ts","sourceRoot":"","sources":["../src/golden.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
|
package/dist/golden.test.js
CHANGED
|
@@ -1,35 +1,54 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Golden Test Harness for Tsonic Emitter
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
4
|
+
* Directory structure:
|
|
5
|
+
* testcases/
|
|
6
|
+
* ├── common/ # Tests that work in BOTH modes
|
|
7
|
+
* │ ├── <category>/<test>/ # .ts sources + config.yaml
|
|
8
|
+
* │ ├── dotnet/<category>/<test>/ # Expected .cs for dotnet mode
|
|
9
|
+
* │ └── js/<category>/<test>/ # Expected .cs for js mode
|
|
10
|
+
* └── js-only/ # Tests that ONLY work in JS mode
|
|
11
|
+
* └── <category>/<test>/ # .ts, config.yaml, AND .cs together
|
|
12
|
+
*
|
|
13
|
+
* Two modes:
|
|
14
|
+
* - dotnet: common/ tests only, uses @tsonic/globals (native .NET APIs)
|
|
15
|
+
* - js: common/ + js-only/ tests, uses @tsonic/globals + @tsonic/js-globals
|
|
9
16
|
*/
|
|
17
|
+
import { describe } from "mocha";
|
|
10
18
|
import * as path from "path";
|
|
11
19
|
import { fileURLToPath } from "url";
|
|
12
20
|
import { discoverScenarios, buildDescribeTree, registerNode, } from "./golden-tests/index.js";
|
|
13
21
|
const __filename = fileURLToPath(import.meta.url);
|
|
14
22
|
const __dirname = path.dirname(__filename);
|
|
15
|
-
const TESTCASES_DIR = path.join(__dirname, "../testcases");
|
|
16
23
|
/**
|
|
17
|
-
*
|
|
24
|
+
* Setup tests for a specific runtime mode
|
|
18
25
|
*/
|
|
19
|
-
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
const setupMode = (mode) => {
|
|
27
|
+
const testcasesDir = path.join(__dirname, "../testcases");
|
|
28
|
+
try {
|
|
29
|
+
const scenarios = discoverScenarios(testcasesDir, mode);
|
|
30
|
+
if (scenarios.length === 0) {
|
|
31
|
+
console.warn(`⚠️ No golden test cases found for ${mode} mode`);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
const tree = buildDescribeTree(scenarios);
|
|
35
|
+
if (tree) {
|
|
36
|
+
registerNode(tree);
|
|
37
|
+
}
|
|
28
38
|
}
|
|
29
39
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
console.error(`❌ Failed to setup ${mode} mode golden tests:`, error);
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Main test suite setup (synchronous discovery for Mocha compatibility)
|
|
47
|
+
*/
|
|
48
|
+
describe("Golden Tests (dotnet mode)", () => {
|
|
49
|
+
setupMode("dotnet");
|
|
50
|
+
});
|
|
51
|
+
describe("Golden Tests (js mode)", () => {
|
|
52
|
+
setupMode("js");
|
|
53
|
+
});
|
|
35
54
|
//# sourceMappingURL=golden.test.js.map
|
package/dist/golden.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"golden.test.js","sourceRoot":"","sources":["../src/golden.test.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"golden.test.js","sourceRoot":"","sources":["../src/golden.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,GACb,MAAM,yBAAyB,CAAC;AAGjC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C;;GAEG;AACH,MAAM,SAAS,GAAG,CAAC,IAAiB,EAAQ,EAAE;IAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAE1D,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,iBAAiB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAExD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,sCAAsC,IAAI,OAAO,CAAC,CAAC;QAClE,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAC1C,IAAI,IAAI,EAAE,CAAC;gBACT,YAAY,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,qBAAqB,IAAI,qBAAqB,EAAE,KAAK,CAAC,CAAC;QACrE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF;;GAEG;AACH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,SAAS,CAAC,QAAQ,CAAC,CAAC;AACtB,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,SAAS,CAAC,IAAI,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -91,8 +91,8 @@ describe("Hierarchical Bindings - Full Pipeline", () => {
|
|
|
91
91
|
const csharpCode = emitModule(irModule);
|
|
92
92
|
// Verify correct CLR member call
|
|
93
93
|
expect(csharpCode).to.include("System.Linq.Enumerable.SelectMany", "C# should use full CLR type.member from binding");
|
|
94
|
-
// Verify using
|
|
95
|
-
expect(csharpCode).to.include("using System.Linq", "C# should include using
|
|
94
|
+
// Verify NO using statements - all types use global:: FQN
|
|
95
|
+
expect(csharpCode).to.not.include("using System.Linq", "C# should NOT include using directives - uses global:: FQN");
|
|
96
96
|
// Verify intermediate TypeScript names are NOT in output
|
|
97
97
|
expect(csharpCode).to.not.include("systemLinq", "C# should not contain TS namespace identifier");
|
|
98
98
|
expect(csharpCode).to.not.include("enumerable", "C# should not contain TS type identifier");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hierarchical-bindings.test.js","sourceRoot":"","sources":["../src/hierarchical-bindings.test.ts"],"names":[],"mappings":"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
|
|
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
|
@@ -76,7 +76,7 @@ describe("End-to-End Integration", () => {
|
|
|
76
76
|
const csharp = compileToCSharp(source);
|
|
77
77
|
// Should emit type alias as class
|
|
78
78
|
expect(csharp).to.include("class HasId__Alias");
|
|
79
|
-
expect(csharp).to.match(/double\s+id\s*\{\s*get;\s*set;/);
|
|
79
|
+
expect(csharp).to.match(/required\s+double\s+id\s*\{\s*get;\s*set;/);
|
|
80
80
|
// Should use type alias as constraint
|
|
81
81
|
expect(csharp).to.include("where T : HasId");
|
|
82
82
|
// Should have function
|
|
@@ -96,9 +96,9 @@ describe("End-to-End Integration", () => {
|
|
|
96
96
|
// Should emit C# class (not interface)
|
|
97
97
|
expect(csharp).to.match(/public\s+class\s+User/);
|
|
98
98
|
expect(csharp).not.to.include("interface User");
|
|
99
|
-
// Should have auto-properties
|
|
100
|
-
expect(csharp).to.match(/public\s+double\s+id\s*\{\s*get;\s*set;/);
|
|
101
|
-
expect(csharp).to.match(/public\s+string\s+name\s*\{\s*get;\s*set;/);
|
|
99
|
+
// Should have auto-properties (required for non-optional)
|
|
100
|
+
expect(csharp).to.match(/public\s+required\s+double\s+id\s*\{\s*get;\s*set;/);
|
|
101
|
+
expect(csharp).to.match(/public\s+required\s+string\s+name\s*\{\s*get;\s*set;/);
|
|
102
102
|
// Optional property should be nullable
|
|
103
103
|
expect(csharp).to.match(/public\s+string\?\s+email\s*\{\s*get;\s*set;/);
|
|
104
104
|
});
|
|
@@ -112,8 +112,8 @@ describe("End-to-End Integration", () => {
|
|
|
112
112
|
const csharp = compileToCSharp(source);
|
|
113
113
|
// Should emit sealed class with __Alias suffix
|
|
114
114
|
expect(csharp).to.match(/public\s+sealed\s+class\s+Point__Alias/);
|
|
115
|
-
expect(csharp).to.match(/public\s+double\s+x\s*\{\s*get;\s*set;/);
|
|
116
|
-
expect(csharp).to.match(/public\s+double\s+y\s*\{\s*get;\s*set;/);
|
|
115
|
+
expect(csharp).to.match(/public\s+required\s+double\s+x\s*\{\s*get;\s*set;/);
|
|
116
|
+
expect(csharp).to.match(/public\s+required\s+double\s+y\s*\{\s*get;\s*set;/);
|
|
117
117
|
});
|
|
118
118
|
it("should compile generic interface", () => {
|
|
119
119
|
const source = `
|
|
@@ -125,8 +125,8 @@ describe("End-to-End Integration", () => {
|
|
|
125
125
|
const csharp = compileToCSharp(source);
|
|
126
126
|
// Should emit generic class
|
|
127
127
|
expect(csharp).to.match(/public\s+class\s+Result\s*<T>/);
|
|
128
|
-
expect(csharp).to.match(/public\s+bool\s+ok/);
|
|
129
|
-
expect(csharp).to.match(/public\s+T\s+value/);
|
|
128
|
+
expect(csharp).to.match(/public\s+required\s+bool\s+ok/);
|
|
129
|
+
expect(csharp).to.match(/public\s+required\s+T\s+value/);
|
|
130
130
|
});
|
|
131
131
|
});
|
|
132
132
|
describe("Generic Classes", () => {
|
|
@@ -184,6 +184,53 @@ describe("End-to-End Integration", () => {
|
|
|
184
184
|
expect(csharp).to.match(/double\s+id\s*\{\s*get;\s*\}/);
|
|
185
185
|
});
|
|
186
186
|
});
|
|
187
|
+
describe("Lambda Parameter Type Inference", () => {
|
|
188
|
+
it("should infer types for Promise executor callback parameters", () => {
|
|
189
|
+
const source = `
|
|
190
|
+
export function delay(ms: number): Promise<void> {
|
|
191
|
+
return new Promise((resolve) => {
|
|
192
|
+
setTimeout(resolve, ms);
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
`;
|
|
196
|
+
const csharp = compileToCSharp(source);
|
|
197
|
+
// Should emit lambda with typed resolve parameter (function type becomes Action)
|
|
198
|
+
// The key is that resolve has a type annotation, not just the bare identifier
|
|
199
|
+
expect(csharp).to.match(/\(global::System\.Action.*\s+resolve\)\s*=>/);
|
|
200
|
+
});
|
|
201
|
+
it("should infer types for array method callbacks", () => {
|
|
202
|
+
const source = `
|
|
203
|
+
export function doubleAll(nums: number[]): number[] {
|
|
204
|
+
return nums.map((n) => n * 2);
|
|
205
|
+
}
|
|
206
|
+
`;
|
|
207
|
+
const csharp = compileToCSharp(source);
|
|
208
|
+
// Should emit lambda with typed parameter
|
|
209
|
+
// n should be inferred as number (double in C#)
|
|
210
|
+
expect(csharp).to.include("(double n) => n * 2");
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
describe("Type Predicate Functions", () => {
|
|
214
|
+
it("should emit type predicate return type as bool", () => {
|
|
215
|
+
const source = `
|
|
216
|
+
export interface Dog {
|
|
217
|
+
type: "dog";
|
|
218
|
+
bark(): void;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
export type Animal = Dog;
|
|
222
|
+
|
|
223
|
+
export function isDog(animal: Animal): animal is Dog {
|
|
224
|
+
return animal.type === "dog";
|
|
225
|
+
}
|
|
226
|
+
`;
|
|
227
|
+
const csharp = compileToCSharp(source);
|
|
228
|
+
// Type predicate (animal is Dog) should emit as bool return type
|
|
229
|
+
expect(csharp).to.match(/public\s+static\s+bool\s+isDog\s*\(\s*Animal\s+animal\s*\)/);
|
|
230
|
+
// Should not emit 'dynamic' (old broken behavior)
|
|
231
|
+
expect(csharp).not.to.include("dynamic isDog");
|
|
232
|
+
});
|
|
233
|
+
});
|
|
187
234
|
describe("Full Module Compilation", () => {
|
|
188
235
|
it("should compile a complete module with all features", () => {
|
|
189
236
|
const source = `
|
|
@@ -224,8 +271,8 @@ describe("End-to-End Integration", () => {
|
|
|
224
271
|
expect(csharp).to.include("// type UserId = double"); // number → double in C#
|
|
225
272
|
// Should have the repository class
|
|
226
273
|
expect(csharp).to.include("class UserRepository");
|
|
227
|
-
// Should have the generic function
|
|
228
|
-
expect(csharp).to.match(/public\s+static\s+List<U>\s+map\s*<T,\s*U>/);
|
|
274
|
+
// Should have the generic function with global:: FQN
|
|
275
|
+
expect(csharp).to.match(/public\s+static\s+global::System\.Collections\.Generic\.List<U>\s+map\s*<T,\s*U>/);
|
|
229
276
|
// Should have proper namespace structure
|
|
230
277
|
expect(csharp).to.include("namespace Test");
|
|
231
278
|
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":"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
|
|
1
|
+
{"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../src/integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mechanical Invariant Test: Emitter Special-Cases ⊆ Globals
|
|
3
|
+
*
|
|
4
|
+
* This test verifies that every identifier the emitter "just knows" about
|
|
5
|
+
* via special-casing exists in at least one globals package.
|
|
6
|
+
*
|
|
7
|
+
* The principle: The emitter must not emit CLR mappings for types that
|
|
8
|
+
* aren't declared in the globals packages. If a type isn't in globals,
|
|
9
|
+
* TypeScript name resolution will fail first (which is correct behavior).
|
|
10
|
+
*
|
|
11
|
+
* Source of truth for special-cased identifiers:
|
|
12
|
+
* - packages/emitter/src/types/references.ts
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=emitter-globals-subset.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter-globals-subset.test.d.ts","sourceRoot":"","sources":["../../src/invariants/emitter-globals-subset.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mechanical Invariant Test: Emitter Special-Cases ⊆ Globals
|
|
3
|
+
*
|
|
4
|
+
* This test verifies that every identifier the emitter "just knows" about
|
|
5
|
+
* via special-casing exists in at least one globals package.
|
|
6
|
+
*
|
|
7
|
+
* The principle: The emitter must not emit CLR mappings for types that
|
|
8
|
+
* aren't declared in the globals packages. If a type isn't in globals,
|
|
9
|
+
* TypeScript name resolution will fail first (which is correct behavior).
|
|
10
|
+
*
|
|
11
|
+
* Source of truth for special-cased identifiers:
|
|
12
|
+
* - packages/emitter/src/types/references.ts
|
|
13
|
+
*/
|
|
14
|
+
import { describe, it } from "mocha";
|
|
15
|
+
import { strict as assert } from "assert";
|
|
16
|
+
/**
|
|
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
|
+
*
|
|
20
|
+
* IMPORTANT: When adding new special-cases to the emitter, you MUST:
|
|
21
|
+
* 1. Add the type to this list
|
|
22
|
+
* 2. Ensure the type is declared in the appropriate globals package(s)
|
|
23
|
+
* 3. Update the assertions below
|
|
24
|
+
*/
|
|
25
|
+
const EMITTER_SPECIAL_CASES = {
|
|
26
|
+
// From references.ts:192 - Array<T> → List<T>
|
|
27
|
+
Array: { js: true, dotnet: true },
|
|
28
|
+
// From references.ts:204,217 - Promise<T> → Task<T>
|
|
29
|
+
Promise: { js: true, dotnet: true },
|
|
30
|
+
// From references.ts:236 - PromiseLike<T> → Task<T>
|
|
31
|
+
PromiseLike: { js: true, dotnet: true },
|
|
32
|
+
// From references.ts:232 - Error → Exception (JS mode only)
|
|
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"];
|
|
45
|
+
/**
|
|
46
|
+
* Types that are NOT in any globals package.
|
|
47
|
+
* These must NOT be special-cased because TS name resolution will fail first.
|
|
48
|
+
* If the emitter special-cased these, it would produce wrong output for code
|
|
49
|
+
* that can't even type-check.
|
|
50
|
+
*/
|
|
51
|
+
const TYPES_NOT_IN_ANY_GLOBALS = [
|
|
52
|
+
"Map", // Not in globals - must fail at TS name resolution
|
|
53
|
+
"Set", // Not in globals - must fail at TS name resolution
|
|
54
|
+
"WeakMap", // Not in globals
|
|
55
|
+
"WeakSet", // Not in globals
|
|
56
|
+
"Date", // Not in globals (uses System.DateTime via imports)
|
|
57
|
+
"parseInt", // Not in globals
|
|
58
|
+
"parseFloat", // Not in globals
|
|
59
|
+
"isNaN", // Not in globals
|
|
60
|
+
"isFinite", // Not in globals
|
|
61
|
+
];
|
|
62
|
+
/**
|
|
63
|
+
* Types that ARE in js-globals but are NOT special-cased by the emitter.
|
|
64
|
+
* 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
|
+
*/
|
|
70
|
+
const IN_JS_GLOBALS_NOT_SPECIAL_CASED = [
|
|
71
|
+
"console", // In js-globals, resolves via normal path
|
|
72
|
+
"Math", // In js-globals, resolves via normal path
|
|
73
|
+
"JSON", // In js-globals, resolves via normal path
|
|
74
|
+
"RegExp", // In js-globals (minimal), resolves via normal path
|
|
75
|
+
];
|
|
76
|
+
describe("Emitter-Globals Subset Invariant", () => {
|
|
77
|
+
describe("Special-cased types exist in appropriate globals", () => {
|
|
78
|
+
it("all JS-mode special cases are in js-globals", () => {
|
|
79
|
+
const jsSpecialCases = Object.entries(EMITTER_SPECIAL_CASES)
|
|
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");
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe("Types not in globals are not special-cased", () => {
|
|
98
|
+
it("Map is not special-cased (not in any globals)", () => {
|
|
99
|
+
assert.equal(EMITTER_SPECIAL_CASES["Map"], undefined, "Map must not be special-cased - it's not in globals, TS will fail first");
|
|
100
|
+
});
|
|
101
|
+
it("Set is not special-cased (not in any globals)", () => {
|
|
102
|
+
assert.equal(EMITTER_SPECIAL_CASES["Set"], undefined, "Set must not be special-cased - it's not in globals, TS will fail first");
|
|
103
|
+
});
|
|
104
|
+
it("no types outside globals are special-cased", () => {
|
|
105
|
+
for (const typeName of TYPES_NOT_IN_ANY_GLOBALS) {
|
|
106
|
+
assert.equal(EMITTER_SPECIAL_CASES[typeName], undefined, `${typeName} must not be special-cased - it's not in any globals package`);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
describe("JS-globals types correctly handled", () => {
|
|
111
|
+
it("console/Math/JSON are in js-globals but not special-cased (correct)", () => {
|
|
112
|
+
// These types ARE in js-globals and should NOT be special-cased.
|
|
113
|
+
// They resolve through normal type resolution, not hardcoded CLR mappings.
|
|
114
|
+
for (const typeName of IN_JS_GLOBALS_NOT_SPECIAL_CASED) {
|
|
115
|
+
assert.equal(EMITTER_SPECIAL_CASES[typeName], undefined, `${typeName} is in js-globals but should NOT be special-cased (uses normal resolution)`);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
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
|
+
it("documents source locations for special cases", () => {
|
|
126
|
+
// This is a documentation test - it reminds maintainers where to look
|
|
127
|
+
const sourceLocations = {
|
|
128
|
+
Array: "packages/emitter/src/types/references.ts:192",
|
|
129
|
+
Promise: "packages/emitter/src/types/references.ts:204,217",
|
|
130
|
+
PromiseLike: "packages/emitter/src/types/references.ts:236",
|
|
131
|
+
Error: "packages/emitter/src/types/references.ts:232",
|
|
132
|
+
};
|
|
133
|
+
assert.equal(Object.keys(sourceLocations).length, Object.keys(EMITTER_SPECIAL_CASES).length, "All special cases should have documented source locations");
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
//# sourceMappingURL=emitter-globals-subset.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter-globals-subset.test.js","sourceRoot":"","sources":["../../src/invariants/emitter-globals-subset.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contract Test: Numeric Proof System (Behavioral)
|
|
3
|
+
*
|
|
4
|
+
* These tests enforce the contract between the numeric proof pass (frontend)
|
|
5
|
+
* and the emitter (backend) using BEHAVIOR, not source code pattern matching.
|
|
6
|
+
*
|
|
7
|
+
* Key contract:
|
|
8
|
+
* 1. Only the proof pass determines whether an expression is proven Int32
|
|
9
|
+
* 2. The emitter checks IR markers (numericIntent) and ICEs if missing
|
|
10
|
+
* 3. TSN5107 is triggered based on accessKind, not heuristic name matching
|
|
11
|
+
* 4. TSN5109 is triggered when accessKind is unknown/missing (compiler bug)
|
|
12
|
+
*
|
|
13
|
+
* Test approach:
|
|
14
|
+
* - Create IR fixtures with specific accessKind values
|
|
15
|
+
* - Run proof pass and assert diagnostics or success
|
|
16
|
+
* - Run emitter and verify ICE behavior for unproven indices
|
|
17
|
+
*/
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=numeric-proof-contract.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"numeric-proof-contract.test.d.ts","sourceRoot":"","sources":["../../src/invariants/numeric-proof-contract.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
|