@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
package/dist/types/arrays.d.ts
CHANGED
|
@@ -1,19 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Array type emission
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* - origin: undefined → emit List<T>
|
|
7
|
-
*
|
|
8
|
-
* In js mode: always emit List<T> (JS semantics)
|
|
4
|
+
* All array types emit as native CLR arrays (T[]).
|
|
5
|
+
* List<T> is only used when explicitly requested via new List<T>().
|
|
9
6
|
*/
|
|
10
7
|
import { IrType } from "@tsonic/frontend";
|
|
11
8
|
import { EmitterContext } from "../types.js";
|
|
12
9
|
/**
|
|
13
|
-
* Emit array types
|
|
14
|
-
*
|
|
15
|
-
* - Explicit T[] annotation in dotnet mode → native T[]
|
|
16
|
-
* - Otherwise → List<T>
|
|
10
|
+
* Emit array types as native CLR arrays
|
|
17
11
|
*/
|
|
18
12
|
export declare const emitArrayType: (type: Extract<IrType, {
|
|
19
13
|
kind: "arrayType";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrays.d.ts","sourceRoot":"","sources":["../../src/types/arrays.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"arrays.d.ts","sourceRoot":"","sources":["../../src/types/arrays.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C;;GAEG;AACH,eAAO,MAAM,aAAa,GACxB,MAAM,OAAO,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC,EAC5C,SAAS,cAAc,KACtB,CAAC,MAAM,EAAE,cAAc,CAKzB,CAAC"}
|
package/dist/types/arrays.js
CHANGED
|
@@ -1,30 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Array type emission
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* - origin: undefined → emit List<T>
|
|
7
|
-
*
|
|
8
|
-
* In js mode: always emit List<T> (JS semantics)
|
|
4
|
+
* All array types emit as native CLR arrays (T[]).
|
|
5
|
+
* List<T> is only used when explicitly requested via new List<T>().
|
|
9
6
|
*/
|
|
10
7
|
import { emitType } from "./emitter.js";
|
|
11
8
|
/**
|
|
12
|
-
* Emit array types
|
|
13
|
-
*
|
|
14
|
-
* - Explicit T[] annotation in dotnet mode → native T[]
|
|
15
|
-
* - Otherwise → List<T>
|
|
9
|
+
* Emit array types as native CLR arrays
|
|
16
10
|
*/
|
|
17
11
|
export const emitArrayType = (type, context) => {
|
|
18
12
|
const [elementType, newContext] = emitType(type.elementType, context);
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
if (runtime === "dotnet" && type.origin === "explicit") {
|
|
22
|
-
return [`${elementType}[]`, newContext];
|
|
23
|
-
}
|
|
24
|
-
// Default: emit List<T> for JS semantics or inferred arrays
|
|
25
|
-
return [
|
|
26
|
-
`global::System.Collections.Generic.List<${elementType}>`,
|
|
27
|
-
newContext,
|
|
28
|
-
];
|
|
13
|
+
// Always emit native CLR array
|
|
14
|
+
return [`${elementType}[]`, newContext];
|
|
29
15
|
};
|
|
30
16
|
//# sourceMappingURL=arrays.js.map
|
package/dist/types/arrays.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrays.js","sourceRoot":"","sources":["../../src/types/arrays.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"arrays.js","sourceRoot":"","sources":["../../src/types/arrays.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,IAA4C,EAC5C,OAAuB,EACG,EAAE;IAC5B,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAEtE,+BAA+B;IAC/B,OAAO,CAAC,GAAG,WAAW,IAAI,EAAE,UAAU,CAAC,CAAC;AAC1C,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parameters.d.ts","sourceRoot":"","sources":["../../src/types/parameters.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"parameters.d.ts","sourceRoot":"","sources":["../../src/types/parameters.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAsC7C;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAC7B,YAAY,SAAS,eAAe,EAAE,GAAG,SAAS,EAClD,SAAS,cAAc,KACtB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,cAAc,CA0EnC,CAAC;AAwBF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAC5B,MAAM,MAAM,GAAG,SAAS,EACxB,YAAY,OAAO,EACnB,SAAS,cAAc,KACtB,CAAC,MAAM,EAAE,cAAc,CAiBzB,CAAC"}
|
package/dist/types/parameters.js
CHANGED
|
@@ -2,6 +2,32 @@
|
|
|
2
2
|
* Type parameter and parameter type emission
|
|
3
3
|
*/
|
|
4
4
|
import { emitType } from "./emitter.js";
|
|
5
|
+
const inferTypeParamConstraintKind = (tp) => {
|
|
6
|
+
// No constraint → unconstrained (can be class or struct in C# terms)
|
|
7
|
+
if (!tp.constraint)
|
|
8
|
+
return "unconstrained";
|
|
9
|
+
// Structural constraints are object-shape constraints (reference-like).
|
|
10
|
+
if (tp.isStructuralConstraint)
|
|
11
|
+
return "class";
|
|
12
|
+
// Direct markers
|
|
13
|
+
if (tp.constraint.kind === "referenceType" && tp.constraint.name === "struct") {
|
|
14
|
+
return "struct";
|
|
15
|
+
}
|
|
16
|
+
if (tp.constraint.kind === "referenceType" && tp.constraint.name === "object") {
|
|
17
|
+
return "class";
|
|
18
|
+
}
|
|
19
|
+
// Intersection constraints may include object/struct markers
|
|
20
|
+
if (tp.constraint.kind === "intersectionType") {
|
|
21
|
+
const hasStruct = tp.constraint.types.some((t) => t.kind === "referenceType" && t.name === "struct");
|
|
22
|
+
const hasObject = tp.constraint.types.some((t) => t.kind === "referenceType" && t.name === "object");
|
|
23
|
+
if (hasStruct)
|
|
24
|
+
return "struct";
|
|
25
|
+
if (hasObject)
|
|
26
|
+
return "class";
|
|
27
|
+
}
|
|
28
|
+
// Interface/class constraints are not enough to determine reference vs value.
|
|
29
|
+
return "unconstrained";
|
|
30
|
+
};
|
|
5
31
|
/**
|
|
6
32
|
* Emit C# type parameters with constraints
|
|
7
33
|
* Example: <T, U extends Foo> → <T, U> with where clauses
|
|
@@ -10,11 +36,20 @@ export const emitTypeParameters = (typeParams, context) => {
|
|
|
10
36
|
if (!typeParams || typeParams.length === 0) {
|
|
11
37
|
return ["", [], context];
|
|
12
38
|
}
|
|
39
|
+
// Track constraint kinds for type parameters in this scope.
|
|
40
|
+
// Used by union emission to decide whether `T | null` can be represented as `T?`.
|
|
41
|
+
const mergedConstraints = new Map(context.typeParamConstraints ?? []);
|
|
42
|
+
for (const tp of typeParams) {
|
|
43
|
+
mergedConstraints.set(tp.name, inferTypeParamConstraintKind(tp));
|
|
44
|
+
}
|
|
13
45
|
const paramNames = typeParams.map((tp) => tp.name).join(", ");
|
|
14
46
|
const typeParamsStr = `<${paramNames}>`;
|
|
15
47
|
// Build where clauses for constraints
|
|
16
48
|
const whereClauses = [];
|
|
17
|
-
let currentContext =
|
|
49
|
+
let currentContext = {
|
|
50
|
+
...context,
|
|
51
|
+
typeParamConstraints: mergedConstraints,
|
|
52
|
+
};
|
|
18
53
|
for (const tp of typeParams) {
|
|
19
54
|
if (tp.constraint) {
|
|
20
55
|
// Handle structural constraints specially - they generate adapter interfaces
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parameters.js","sourceRoot":"","sources":["../../src/types/parameters.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"parameters.js","sourceRoot":"","sources":["../../src/types/parameters.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ describe("Parameter modifiers (ref/out/in)", () => {
|
|
|
9
9
|
indentLevel: 0,
|
|
10
10
|
isStatic: false,
|
|
11
11
|
isAsync: false,
|
|
12
|
-
options: {
|
|
12
|
+
options: { rootNamespace: "Test" },
|
|
13
13
|
};
|
|
14
14
|
it("should emit out parameter with out modifier", () => {
|
|
15
15
|
const params = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parameters.test.js","sourceRoot":"","sources":["../../src/types/parameters.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAIrE,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,MAAM,WAAW,GAAmB;QAClC,WAAW,EAAE,CAAC;QACd,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"parameters.test.js","sourceRoot":"","sources":["../../src/types/parameters.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"references.d.ts","sourceRoot":"","sources":["../../src/types/references.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"references.d.ts","sourceRoot":"","sources":["../../src/types/references.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAsH7C;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAC5B,MAAM,OAAO,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,CAAC,EAChD,SAAS,cAAc,KACtB,CAAC,MAAM,EAAE,cAAc,CA8NzB,CAAC"}
|
package/dist/types/references.js
CHANGED
|
@@ -65,14 +65,32 @@ const getBindingClrName = (b) => {
|
|
|
65
65
|
return undefined;
|
|
66
66
|
};
|
|
67
67
|
/**
|
|
68
|
-
*
|
|
68
|
+
* Convert CLR metadata type names into C#-emittable type names.
|
|
69
69
|
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
* 3. Proper diagnostic reporting
|
|
70
|
+
* tsbindgen bindings use CLR "full names" that include:
|
|
71
|
+
* - Generic arity markers: `Dictionary`2`, `Func`3`, etc.
|
|
72
|
+
* - Nested type separators: `Outer+Inner`
|
|
74
73
|
*
|
|
75
|
-
*
|
|
74
|
+
* C# source code must not include arity markers, and nested types use `.`
|
|
75
|
+
* in source (e.g. `Outer.Inner`).
|
|
76
|
+
*/
|
|
77
|
+
const clrTypeNameToCSharp = (clr) => {
|
|
78
|
+
const prefix = "global::";
|
|
79
|
+
const hasGlobal = clr.startsWith(prefix);
|
|
80
|
+
const body = hasGlobal ? clr.slice(prefix.length) : clr;
|
|
81
|
+
const sanitized = body
|
|
82
|
+
// Strip generic arity markers (e.g. Dictionary`2 -> Dictionary)
|
|
83
|
+
.replace(/`\d+/g, "")
|
|
84
|
+
// CLR nested types use '+'; C# source uses '.'
|
|
85
|
+
.replace(/\+/g, ".");
|
|
86
|
+
return hasGlobal ? `${prefix}${sanitized}` : sanitized;
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Check if a type name indicates an unsupported support type.
|
|
90
|
+
*
|
|
91
|
+
* NOTE: The emitter does not have access to the TypeScript checker. Support types
|
|
92
|
+
* should be rejected during frontend IR building. This is a defensive guard in case
|
|
93
|
+
* unsupported types leak into IR.
|
|
76
94
|
*/
|
|
77
95
|
const checkUnsupportedSupportType = (typeName) => {
|
|
78
96
|
if (typeName === "TSUnsafePointer" ||
|
|
@@ -112,6 +130,9 @@ export const emitReferenceType = (type, context) => {
|
|
|
112
130
|
}
|
|
113
131
|
// If the type has a pre-resolved CLR type (from IR), use it
|
|
114
132
|
if (resolvedClrType) {
|
|
133
|
+
const qualifiedClr = CSHARP_PRIMITIVES.has(resolvedClrType)
|
|
134
|
+
? resolvedClrType
|
|
135
|
+
: toGlobalClr(resolvedClrType);
|
|
115
136
|
if (typeArguments && typeArguments.length > 0) {
|
|
116
137
|
const typeParams = [];
|
|
117
138
|
let currentContext = context;
|
|
@@ -120,9 +141,9 @@ export const emitReferenceType = (type, context) => {
|
|
|
120
141
|
typeParams.push(paramType);
|
|
121
142
|
currentContext = newContext;
|
|
122
143
|
}
|
|
123
|
-
return [`${
|
|
144
|
+
return [`${qualifiedClr}<${typeParams.join(", ")}>`, currentContext];
|
|
124
145
|
}
|
|
125
|
-
return [
|
|
146
|
+
return [qualifiedClr, context];
|
|
126
147
|
}
|
|
127
148
|
// Check if this type is imported - use pre-computed CLR name directly
|
|
128
149
|
const importBinding = context.importBindings?.get(name);
|
|
@@ -152,22 +173,18 @@ export const emitReferenceType = (type, context) => {
|
|
|
152
173
|
// Check for unsupported support types
|
|
153
174
|
const unsupportedError = checkUnsupportedSupportType(name);
|
|
154
175
|
if (unsupportedError) {
|
|
155
|
-
|
|
156
|
-
// For now, emit a comment to make the error visible in generated code
|
|
157
|
-
console.warn(`[Tsonic] ${unsupportedError}`);
|
|
158
|
-
return [`/* ERROR: ${unsupportedError} */ object`, context];
|
|
176
|
+
throw new Error(`[Tsonic] ${unsupportedError}`);
|
|
159
177
|
}
|
|
160
178
|
// Handle built-in types
|
|
179
|
+
// Array<T> emits as native T[] array, same as T[] syntax
|
|
180
|
+
// Users must explicitly use List<T> to get a List
|
|
161
181
|
if (name === "Array" && typeArguments && typeArguments.length > 0) {
|
|
162
182
|
const firstArg = typeArguments[0];
|
|
163
183
|
if (!firstArg) {
|
|
164
|
-
return [`
|
|
184
|
+
return [`object[]`, context];
|
|
165
185
|
}
|
|
166
186
|
const [elementType, newContext] = emitType(firstArg, context);
|
|
167
|
-
return [
|
|
168
|
-
`global::System.Collections.Generic.List<${elementType}>`,
|
|
169
|
-
newContext,
|
|
170
|
-
];
|
|
187
|
+
return [`${elementType}[]`, newContext];
|
|
171
188
|
}
|
|
172
189
|
if (name === "Promise" && typeArguments && typeArguments.length > 0) {
|
|
173
190
|
const firstArg = typeArguments[0];
|
|
@@ -184,43 +201,37 @@ export const emitReferenceType = (type, context) => {
|
|
|
184
201
|
if (name === "Promise") {
|
|
185
202
|
return ["global::System.Threading.Tasks.Task", context];
|
|
186
203
|
}
|
|
187
|
-
//
|
|
188
|
-
//
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
204
|
+
// Map core Span<T> to System.Span<T>.
|
|
205
|
+
// This is used by stackalloc<T>(n) and other span-based APIs.
|
|
206
|
+
if (name === "Span") {
|
|
207
|
+
if (!typeArguments || typeArguments.length !== 1) {
|
|
208
|
+
throw new Error(`ICE: Span must have exactly 1 type argument, got ${typeArguments?.length ?? 0}`);
|
|
209
|
+
}
|
|
210
|
+
const inner = typeArguments[0];
|
|
211
|
+
if (!inner) {
|
|
212
|
+
throw new Error("ICE: Span<T> missing type argument");
|
|
213
|
+
}
|
|
214
|
+
const [innerType, newContext] = emitType(inner, context);
|
|
215
|
+
return [`global::System.Span<${innerType}>`, newContext];
|
|
216
|
+
}
|
|
217
|
+
// Map core ptr<T> to C# unsafe pointer type: T*
|
|
218
|
+
if (name === "ptr") {
|
|
219
|
+
if (!typeArguments || typeArguments.length !== 1) {
|
|
220
|
+
throw new Error(`ICE: ptr must have exactly 1 type argument, got ${typeArguments?.length ?? 0}`);
|
|
221
|
+
}
|
|
222
|
+
const inner = typeArguments[0];
|
|
223
|
+
if (!inner) {
|
|
224
|
+
throw new Error("ICE: ptr<T> missing type argument");
|
|
225
|
+
}
|
|
226
|
+
const [innerType, newContext] = emitType(inner, context);
|
|
227
|
+
return [`${innerType}*`, newContext];
|
|
198
228
|
}
|
|
229
|
+
// NOTE: Map and Set must be explicitly imported (not ambient)
|
|
230
|
+
// Map PromiseLike to Task
|
|
199
231
|
if (name === "PromiseLike") {
|
|
200
232
|
// PromiseLike is in both globals packages - safe to map unconditionally
|
|
201
233
|
return ["global::System.Threading.Tasks.Task", context];
|
|
202
234
|
}
|
|
203
|
-
// Resolve external types via binding registry (must be fully qualified)
|
|
204
|
-
// This handles types from contextual inference (e.g., Action from Parallel.invoke)
|
|
205
|
-
const regBinding = context.bindingsRegistry?.get(name);
|
|
206
|
-
if (regBinding) {
|
|
207
|
-
const clr = getBindingClrName(regBinding);
|
|
208
|
-
if (!clr) {
|
|
209
|
-
throw new Error(`ICE: Binding for '${name}' has no CLR name`);
|
|
210
|
-
}
|
|
211
|
-
const qualified = toGlobalClr(clr);
|
|
212
|
-
if (typeArguments && typeArguments.length > 0) {
|
|
213
|
-
const typeParams = [];
|
|
214
|
-
let currentContext = context;
|
|
215
|
-
for (const typeArg of typeArguments) {
|
|
216
|
-
const [paramType, newContext] = emitType(typeArg, currentContext);
|
|
217
|
-
typeParams.push(paramType);
|
|
218
|
-
currentContext = newContext;
|
|
219
|
-
}
|
|
220
|
-
return [`${qualified}<${typeParams.join(", ")}>`, currentContext];
|
|
221
|
-
}
|
|
222
|
-
return [qualified, context];
|
|
223
|
-
}
|
|
224
235
|
// C# primitive types can be emitted directly
|
|
225
236
|
if (CSHARP_PRIMITIVES.has(name)) {
|
|
226
237
|
return [name, context];
|
|
@@ -229,8 +240,10 @@ export const emitReferenceType = (type, context) => {
|
|
|
229
240
|
if (context.typeParameters?.has(name)) {
|
|
230
241
|
return [name, context];
|
|
231
242
|
}
|
|
232
|
-
//
|
|
233
|
-
//
|
|
243
|
+
// IMPORTANT: Check local types BEFORE binding registry.
|
|
244
|
+
// Local types take precedence over .NET types with the same name.
|
|
245
|
+
// This ensures that a locally defined `Container<T>` is not resolved
|
|
246
|
+
// to `System.ComponentModel.Container` from the binding registry.
|
|
234
247
|
const localTypeInfo = context.localTypes?.get(name);
|
|
235
248
|
if (localTypeInfo) {
|
|
236
249
|
// Convert nested type names (Outer$Inner → Outer.Inner)
|
|
@@ -253,6 +266,28 @@ export const emitReferenceType = (type, context) => {
|
|
|
253
266
|
}
|
|
254
267
|
return [csharpName, context];
|
|
255
268
|
}
|
|
269
|
+
// Resolve external types via binding registry (must be fully qualified)
|
|
270
|
+
// This handles types from contextual inference (e.g., Action from Parallel.invoke)
|
|
271
|
+
// IMPORTANT: This is checked AFTER localTypes to ensure local types take precedence
|
|
272
|
+
const regBinding = context.bindingsRegistry?.get(name);
|
|
273
|
+
if (regBinding) {
|
|
274
|
+
const clr = getBindingClrName(regBinding);
|
|
275
|
+
if (!clr) {
|
|
276
|
+
throw new Error(`ICE: Binding for '${name}' has no CLR name`);
|
|
277
|
+
}
|
|
278
|
+
const qualified = toGlobalClr(clrTypeNameToCSharp(clr));
|
|
279
|
+
if (typeArguments && typeArguments.length > 0) {
|
|
280
|
+
const typeParams = [];
|
|
281
|
+
let currentContext = context;
|
|
282
|
+
for (const typeArg of typeArguments) {
|
|
283
|
+
const [paramType, newContext] = emitType(typeArg, currentContext);
|
|
284
|
+
typeParams.push(paramType);
|
|
285
|
+
currentContext = newContext;
|
|
286
|
+
}
|
|
287
|
+
return [`${qualified}<${typeParams.join(", ")}>`, currentContext];
|
|
288
|
+
}
|
|
289
|
+
return [qualified, context];
|
|
290
|
+
}
|
|
256
291
|
// Hard failure: unresolved external reference type
|
|
257
292
|
// This should never happen if the IR soundness gate is working correctly
|
|
258
293
|
throw new Error(`ICE: Unresolved reference type '${name}' (no resolvedClrType, no import binding, no registry binding, not local)`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"references.js","sourceRoot":"","sources":["../../src/types/references.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"references.js","sourceRoot":"","sources":["../../src/types/references.ts"],"names":[],"mappings":"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"}
|
|
@@ -89,14 +89,15 @@ describe("Reference Type Emission", () => {
|
|
|
89
89
|
});
|
|
90
90
|
});
|
|
91
91
|
describe("Known Builtin Types", () => {
|
|
92
|
-
it("should emit Array<T> as
|
|
92
|
+
it("should emit Array<T> as native T[] array", () => {
|
|
93
93
|
const module = createModuleWithType({
|
|
94
94
|
kind: "referenceType",
|
|
95
95
|
name: "Array",
|
|
96
96
|
typeArguments: [{ kind: "primitiveType", name: "number" }],
|
|
97
97
|
});
|
|
98
98
|
const result = emitModule(module);
|
|
99
|
-
expect(result).to.include("
|
|
99
|
+
expect(result).to.include("double[]");
|
|
100
|
+
expect(result).not.to.include("List");
|
|
100
101
|
});
|
|
101
102
|
it("should emit Promise<T> as Task<T>", () => {
|
|
102
103
|
const module = createModuleWithType({
|
|
@@ -107,30 +108,13 @@ describe("Reference Type Emission", () => {
|
|
|
107
108
|
const result = emitModule(module);
|
|
108
109
|
expect(result).to.include("global::System.Threading.Tasks.Task<string>");
|
|
109
110
|
});
|
|
110
|
-
it("should
|
|
111
|
+
it("should fail for Error type (not supported)", () => {
|
|
111
112
|
const module = createModuleWithType({
|
|
112
113
|
kind: "referenceType",
|
|
113
114
|
name: "Error",
|
|
114
115
|
});
|
|
115
|
-
//
|
|
116
|
-
|
|
117
|
-
expect(result).to.include("global::System.Exception");
|
|
118
|
-
});
|
|
119
|
-
it("should emit Error as System.Exception in js mode (explicit)", () => {
|
|
120
|
-
const module = createModuleWithType({
|
|
121
|
-
kind: "referenceType",
|
|
122
|
-
name: "Error",
|
|
123
|
-
});
|
|
124
|
-
const result = emitModule(module, { runtime: "js" });
|
|
125
|
-
expect(result).to.include("global::System.Exception");
|
|
126
|
-
});
|
|
127
|
-
it("should fail for Error in dotnet mode (not in base globals)", () => {
|
|
128
|
-
const module = createModuleWithType({
|
|
129
|
-
kind: "referenceType",
|
|
130
|
-
name: "Error",
|
|
131
|
-
});
|
|
132
|
-
// Error is not in base globals, so it should fail as unresolved
|
|
133
|
-
expect(() => emitModule(module, { runtime: "dotnet" })).to.throw("ICE: Unresolved reference type 'Error'");
|
|
116
|
+
// Error is not in globals, so it should fail as unresolved
|
|
117
|
+
expect(() => emitModule(module)).to.throw("ICE: Unresolved reference type 'Error'");
|
|
134
118
|
});
|
|
135
119
|
});
|
|
136
120
|
describe("Pre-resolved CLR Types", () => {
|
|
@@ -157,6 +141,30 @@ describe("Reference Type Emission", () => {
|
|
|
157
141
|
expect(result).to.include("global::System.Func<string, double>");
|
|
158
142
|
});
|
|
159
143
|
});
|
|
144
|
+
describe("Bindings Registry Types", () => {
|
|
145
|
+
it("should strip generic arity markers from CLR names", () => {
|
|
146
|
+
const module = createModuleWithType({
|
|
147
|
+
kind: "referenceType",
|
|
148
|
+
name: "Dictionary_2",
|
|
149
|
+
typeArguments: [
|
|
150
|
+
{ kind: "primitiveType", name: "int" },
|
|
151
|
+
{ kind: "primitiveType", name: "string" },
|
|
152
|
+
],
|
|
153
|
+
});
|
|
154
|
+
const dictionaryBinding = {
|
|
155
|
+
name: "System.Collections.Generic.Dictionary`2",
|
|
156
|
+
alias: "Dictionary_2",
|
|
157
|
+
kind: "class",
|
|
158
|
+
members: [],
|
|
159
|
+
};
|
|
160
|
+
const clrBindings = new Map([
|
|
161
|
+
["Dictionary_2", dictionaryBinding],
|
|
162
|
+
]);
|
|
163
|
+
const result = emitModule(module, { clrBindings });
|
|
164
|
+
expect(result).to.include("global::System.Collections.Generic.Dictionary<int, string>");
|
|
165
|
+
expect(result).to.not.include("Dictionary`2");
|
|
166
|
+
});
|
|
167
|
+
});
|
|
160
168
|
describe("Local Types", () => {
|
|
161
169
|
it("should emit local class types without qualification", () => {
|
|
162
170
|
const module = {
|
|
@@ -237,10 +245,10 @@ describe("Reference Type Emission", () => {
|
|
|
237
245
|
expect(result).to.include("IUser user");
|
|
238
246
|
});
|
|
239
247
|
});
|
|
240
|
-
describe("
|
|
241
|
-
it("should
|
|
248
|
+
describe("Array Indexing", () => {
|
|
249
|
+
it("should use native indexer for array indexing", () => {
|
|
242
250
|
// This test creates a module with array index access
|
|
243
|
-
//
|
|
251
|
+
// Should use native indexer, not JSRuntime.Array.get()
|
|
244
252
|
const module = {
|
|
245
253
|
kind: "module",
|
|
246
254
|
filePath: "/src/test.ts",
|
|
@@ -303,80 +311,12 @@ describe("Reference Type Emission", () => {
|
|
|
303
311
|
],
|
|
304
312
|
exports: [],
|
|
305
313
|
};
|
|
306
|
-
const result = emitModule(module
|
|
307
|
-
//
|
|
314
|
+
const result = emitModule(module);
|
|
315
|
+
// Output should NOT contain JSRuntime
|
|
308
316
|
expect(result).to.not.include("Tsonic.JSRuntime");
|
|
309
317
|
// Should use native indexer (no cast needed with proof marker)
|
|
310
318
|
expect(result).to.include("arr[0]");
|
|
311
319
|
});
|
|
312
|
-
it("should emit JSRuntime in js mode for array indexing", () => {
|
|
313
|
-
// Same module as above but in js mode
|
|
314
|
-
const module = {
|
|
315
|
-
kind: "module",
|
|
316
|
-
filePath: "/src/test.ts",
|
|
317
|
-
namespace: "Test",
|
|
318
|
-
className: "test",
|
|
319
|
-
isStaticContainer: true,
|
|
320
|
-
imports: [],
|
|
321
|
-
body: [
|
|
322
|
-
{
|
|
323
|
-
kind: "functionDeclaration",
|
|
324
|
-
name: "getFirst",
|
|
325
|
-
isExported: true,
|
|
326
|
-
isAsync: false,
|
|
327
|
-
isGenerator: false,
|
|
328
|
-
parameters: [
|
|
329
|
-
{
|
|
330
|
-
kind: "parameter",
|
|
331
|
-
pattern: { kind: "identifierPattern", name: "arr" },
|
|
332
|
-
type: {
|
|
333
|
-
kind: "arrayType",
|
|
334
|
-
elementType: { kind: "primitiveType", name: "number" },
|
|
335
|
-
},
|
|
336
|
-
isOptional: false,
|
|
337
|
-
isRest: false,
|
|
338
|
-
passing: "value",
|
|
339
|
-
},
|
|
340
|
-
],
|
|
341
|
-
returnType: { kind: "primitiveType", name: "number" },
|
|
342
|
-
body: {
|
|
343
|
-
kind: "blockStatement",
|
|
344
|
-
statements: [
|
|
345
|
-
{
|
|
346
|
-
kind: "returnStatement",
|
|
347
|
-
expression: {
|
|
348
|
-
kind: "memberAccess",
|
|
349
|
-
object: {
|
|
350
|
-
kind: "identifier",
|
|
351
|
-
name: "arr",
|
|
352
|
-
inferredType: {
|
|
353
|
-
kind: "arrayType",
|
|
354
|
-
elementType: { kind: "primitiveType", name: "number" },
|
|
355
|
-
},
|
|
356
|
-
},
|
|
357
|
-
property: {
|
|
358
|
-
kind: "literal",
|
|
359
|
-
value: 0,
|
|
360
|
-
// Proof marker: int literal
|
|
361
|
-
inferredType: {
|
|
362
|
-
kind: "primitiveType",
|
|
363
|
-
name: "int",
|
|
364
|
-
},
|
|
365
|
-
},
|
|
366
|
-
isComputed: true,
|
|
367
|
-
isOptional: false,
|
|
368
|
-
},
|
|
369
|
-
},
|
|
370
|
-
],
|
|
371
|
-
},
|
|
372
|
-
},
|
|
373
|
-
],
|
|
374
|
-
exports: [],
|
|
375
|
-
};
|
|
376
|
-
const result = emitModule(module, { runtime: "js" });
|
|
377
|
-
// In js mode, output should use JSRuntime.Array.get()
|
|
378
|
-
expect(result).to.include("global::Tsonic.JSRuntime.Array.get");
|
|
379
|
-
});
|
|
380
320
|
});
|
|
381
321
|
});
|
|
382
322
|
//# sourceMappingURL=references.test.js.map
|