@tsonic/emitter 0.0.14 → 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 +248 -70
- 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 +177 -37
- 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
|
@@ -39,13 +39,6 @@ export declare const FQN: {
|
|
|
39
39
|
readonly DynamicObject: "global::Tsonic.Runtime.DynamicObject";
|
|
40
40
|
readonly Union: (types: string) => string;
|
|
41
41
|
};
|
|
42
|
-
readonly TsonicJSRuntime: {
|
|
43
|
-
readonly Array: "global::Tsonic.JSRuntime.Array";
|
|
44
|
-
readonly String: "global::Tsonic.JSRuntime.String";
|
|
45
|
-
readonly Number: "global::Tsonic.JSRuntime.Number";
|
|
46
|
-
readonly Math: "global::Tsonic.JSRuntime.Math";
|
|
47
|
-
readonly Console: "global::Tsonic.JSRuntime.Console";
|
|
48
|
-
};
|
|
49
42
|
readonly Func: (typeArgs: string) => string;
|
|
50
43
|
readonly Action: "global::System.Action";
|
|
51
44
|
readonly ActionOf: (typeArgs: string) => string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fqn.d.ts","sourceRoot":"","sources":["../../src/emitter-types/fqn.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,WAAW,MAAM,EAAE,UAAU,MAAM,KAAG,MAEnE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,GAC1B,WAAW,MAAM,EACjB,UAAU,MAAM,EAChB,QAAQ,MAAM,KACb,MAEF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,SAAS,GAAI,eAAe,MAAM,KAAG,MAEjD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,GAAG;;;;;;;;iCAWM,MAAM;mCAEJ,MAAM,aAAa,MAAM;wCAEpB,MAAM;;kCAKZ,MAAM;;;gCAMV,MAAM
|
|
1
|
+
{"version":3,"file":"fqn.d.ts","sourceRoot":"","sources":["../../src/emitter-types/fqn.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,WAAW,MAAM,EAAE,UAAU,MAAM,KAAG,MAEnE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,GAC1B,WAAW,MAAM,EACjB,UAAU,MAAM,EAChB,QAAQ,MAAM,KACb,MAEF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,SAAS,GAAI,eAAe,MAAM,KAAG,MAEjD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,GAAG;;;;;;;;iCAWM,MAAM;mCAEJ,MAAM,aAAa,MAAM;wCAEpB,MAAM;;kCAKZ,MAAM;;;gCAMV,MAAM;;8BAIN,MAAM;;kCAEF,MAAM;CACnB,CAAC"}
|
|
@@ -49,14 +49,6 @@ export const FQN = {
|
|
|
49
49
|
DynamicObject: "global::Tsonic.Runtime.DynamicObject",
|
|
50
50
|
Union: (types) => `global::Tsonic.Runtime.Union<${types}>`,
|
|
51
51
|
},
|
|
52
|
-
// Tsonic.JSRuntime
|
|
53
|
-
TsonicJSRuntime: {
|
|
54
|
-
Array: "global::Tsonic.JSRuntime.Array",
|
|
55
|
-
String: "global::Tsonic.JSRuntime.String",
|
|
56
|
-
Number: "global::Tsonic.JSRuntime.Number",
|
|
57
|
-
Math: "global::Tsonic.JSRuntime.Math",
|
|
58
|
-
Console: "global::Tsonic.JSRuntime.Console",
|
|
59
|
-
},
|
|
60
52
|
// System.Func delegates
|
|
61
53
|
Func: (typeArgs) => `global::System.Func<${typeArgs}>`,
|
|
62
54
|
Action: "global::System.Action",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fqn.js","sourceRoot":"","sources":["../../src/emitter-types/fqn.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAiB,EAAE,QAAgB,EAAU,EAAE;IAC3E,OAAO,WAAW,SAAS,IAAI,QAAQ,EAAE,CAAC;AAC5C,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,SAAiB,EACjB,QAAgB,EAChB,MAAc,EACN,EAAE;IACV,OAAO,WAAW,SAAS,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;AACtD,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,aAAqB,EAAU,EAAE;IACzD,OAAO,WAAW,aAAa,EAAE,CAAC;AACpC,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,eAAe;IACf,MAAM,EAAE,uBAAuB;IAC/B,MAAM,EAAE,uBAAuB;IAC/B,KAAK,EAAE,sBAAsB;IAC7B,KAAK,EAAE,sBAAsB;IAC7B,MAAM,EAAE,uBAAuB;IAC/B,OAAO,EAAE,wBAAwB;IACjC,IAAI,EAAE,MAAM;IAEZ,6BAA6B;IAC7B,IAAI,EAAE,CAAC,WAAmB,EAAE,EAAE,CAC5B,2CAA2C,WAAW,GAAG;IAC3D,UAAU,EAAE,CAAC,OAAe,EAAE,SAAiB,EAAE,EAAE,CACjD,iDAAiD,OAAO,KAAK,SAAS,GAAG;IAC3E,WAAW,EAAE,CAAC,WAAmB,EAAE,EAAE,CACnC,kDAAkD,WAAW,GAAG;IAElE,yBAAyB;IACzB,IAAI,EAAE,qCAAqC;IAC3C,MAAM,EAAE,CAAC,UAAkB,EAAE,EAAE,CAC7B,uCAAuC,UAAU,GAAG;IAEtD,iBAAiB;IACjB,aAAa,EAAE;QACb,aAAa,EAAE,sCAAsC;QACrD,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,gCAAgC,KAAK,GAAG;KACnE;IAED,
|
|
1
|
+
{"version":3,"file":"fqn.js","sourceRoot":"","sources":["../../src/emitter-types/fqn.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAiB,EAAE,QAAgB,EAAU,EAAE;IAC3E,OAAO,WAAW,SAAS,IAAI,QAAQ,EAAE,CAAC;AAC5C,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,SAAiB,EACjB,QAAgB,EAChB,MAAc,EACN,EAAE;IACV,OAAO,WAAW,SAAS,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;AACtD,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,aAAqB,EAAU,EAAE;IACzD,OAAO,WAAW,aAAa,EAAE,CAAC;AACpC,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,eAAe;IACf,MAAM,EAAE,uBAAuB;IAC/B,MAAM,EAAE,uBAAuB;IAC/B,KAAK,EAAE,sBAAsB;IAC7B,KAAK,EAAE,sBAAsB;IAC7B,MAAM,EAAE,uBAAuB;IAC/B,OAAO,EAAE,wBAAwB;IACjC,IAAI,EAAE,MAAM;IAEZ,6BAA6B;IAC7B,IAAI,EAAE,CAAC,WAAmB,EAAE,EAAE,CAC5B,2CAA2C,WAAW,GAAG;IAC3D,UAAU,EAAE,CAAC,OAAe,EAAE,SAAiB,EAAE,EAAE,CACjD,iDAAiD,OAAO,KAAK,SAAS,GAAG;IAC3E,WAAW,EAAE,CAAC,WAAmB,EAAE,EAAE,CACnC,kDAAkD,WAAW,GAAG;IAElE,yBAAyB;IACzB,IAAI,EAAE,qCAAqC;IAC3C,MAAM,EAAE,CAAC,UAAkB,EAAE,EAAE,CAC7B,uCAAuC,UAAU,GAAG;IAEtD,iBAAiB;IACjB,aAAa,EAAE;QACb,aAAa,EAAE,sCAAsC;QACrD,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,gCAAgC,KAAK,GAAG;KACnE;IAED,wBAAwB;IACxB,IAAI,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,uBAAuB,QAAQ,GAAG;IAC9D,MAAM,EAAE,uBAAuB;IAC/B,QAAQ,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,yBAAyB,QAAQ,GAAG;CAC5D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expression-emitter.d.ts","sourceRoot":"","sources":["../src/expression-emitter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,YAAY,EACZ,MAAM,
|
|
1
|
+
{"version":3,"file":"expression-emitter.d.ts","sourceRoot":"","sources":["../src/expression-emitter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,YAAY,EACZ,MAAM,EAKP,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAgW5D;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GACzB,MAAM,YAAY,EAClB,SAAS,cAAc,EACvB,eAAe,MAAM,KACpB,CAAC,cAAc,EAAE,cAAc,CA6FjC,CAAC;AAGF,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,8BAA8B,CAAC"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Main dispatcher - delegates to specialized modules
|
|
4
4
|
*/
|
|
5
5
|
import { emitType } from "./type-emitter.js";
|
|
6
|
+
import { substituteTypeArgs } from "./core/type-resolution.js";
|
|
6
7
|
// Import expression emitters from specialized modules
|
|
7
8
|
import { emitLiteral } from "./expressions/literals.js";
|
|
8
9
|
import { emitIdentifier } from "./expressions/identifiers.js";
|
|
@@ -12,6 +13,133 @@ import { emitCall, emitNew } from "./expressions/calls.js";
|
|
|
12
13
|
import { emitBinary, emitLogical, emitUnary, emitUpdate, emitAssignment, emitConditional, } from "./expressions/operators.js";
|
|
13
14
|
import { emitFunctionExpression, emitArrowFunction, } from "./expressions/functions.js";
|
|
14
15
|
import { emitTemplateLiteral, emitSpread, emitAwait, } from "./expressions/other.js";
|
|
16
|
+
const getBareTypeParameterName = (type, context) => {
|
|
17
|
+
if (type.kind === "typeParameterType")
|
|
18
|
+
return type.name;
|
|
19
|
+
if (type.kind === "referenceType" &&
|
|
20
|
+
(context.typeParameters?.has(type.name) ?? false) &&
|
|
21
|
+
(!type.typeArguments || type.typeArguments.length === 0)) {
|
|
22
|
+
return type.name;
|
|
23
|
+
}
|
|
24
|
+
return undefined;
|
|
25
|
+
};
|
|
26
|
+
const getUnconstrainedNullishTypeParamName = (type, context) => {
|
|
27
|
+
if (type.kind !== "unionType")
|
|
28
|
+
return undefined;
|
|
29
|
+
const nonNullTypes = type.types.filter((t) => !(t.kind === "primitiveType" &&
|
|
30
|
+
(t.name === "null" || t.name === "undefined")));
|
|
31
|
+
if (nonNullTypes.length !== 1)
|
|
32
|
+
return undefined;
|
|
33
|
+
const nonNull = nonNullTypes[0];
|
|
34
|
+
if (!nonNull)
|
|
35
|
+
return undefined;
|
|
36
|
+
const typeParamName = getBareTypeParameterName(nonNull, context);
|
|
37
|
+
if (!typeParamName)
|
|
38
|
+
return undefined;
|
|
39
|
+
const constraintKind = context.typeParamConstraints?.get(typeParamName) ?? "unconstrained";
|
|
40
|
+
return constraintKind === "unconstrained" ? typeParamName : undefined;
|
|
41
|
+
};
|
|
42
|
+
const maybeCastNullishTypeParam = (expr, fragment, context, expectedType) => {
|
|
43
|
+
if (!expectedType)
|
|
44
|
+
return [fragment, context];
|
|
45
|
+
if (!expr.inferredType)
|
|
46
|
+
return [fragment, context];
|
|
47
|
+
const expectedTypeParam = getBareTypeParameterName(expectedType, context);
|
|
48
|
+
if (!expectedTypeParam)
|
|
49
|
+
return [fragment, context];
|
|
50
|
+
const unionTypeParam = getUnconstrainedNullishTypeParamName(expr.inferredType, context);
|
|
51
|
+
if (!unionTypeParam)
|
|
52
|
+
return [fragment, context];
|
|
53
|
+
if (unionTypeParam !== expectedTypeParam)
|
|
54
|
+
return [fragment, context];
|
|
55
|
+
const [typeName, newContext] = emitType(expectedType, context);
|
|
56
|
+
return [{ text: `(${typeName})${fragment.text}` }, newContext];
|
|
57
|
+
};
|
|
58
|
+
const getNullableUnionBaseType = (type) => {
|
|
59
|
+
if (type.kind !== "unionType")
|
|
60
|
+
return undefined;
|
|
61
|
+
const nonNullTypes = type.types.filter((t) => !(t.kind === "primitiveType" &&
|
|
62
|
+
(t.name === "null" || t.name === "undefined")));
|
|
63
|
+
if (nonNullTypes.length !== 1)
|
|
64
|
+
return undefined;
|
|
65
|
+
return nonNullTypes[0];
|
|
66
|
+
};
|
|
67
|
+
const isNonNullableValueType = (type) => {
|
|
68
|
+
if (type.kind === "primitiveType") {
|
|
69
|
+
return (type.name === "number" ||
|
|
70
|
+
type.name === "int" ||
|
|
71
|
+
type.name === "boolean" ||
|
|
72
|
+
type.name === "char");
|
|
73
|
+
}
|
|
74
|
+
if (type.kind === "referenceType") {
|
|
75
|
+
// C# primitive aliases represented as reference types via @tsonic/core.
|
|
76
|
+
// Keep this list strict — we only unwrap when `.Value` exists.
|
|
77
|
+
return (type.name === "sbyte" ||
|
|
78
|
+
type.name === "short" ||
|
|
79
|
+
type.name === "int" ||
|
|
80
|
+
type.name === "long" ||
|
|
81
|
+
type.name === "nint" ||
|
|
82
|
+
type.name === "int128" ||
|
|
83
|
+
type.name === "byte" ||
|
|
84
|
+
type.name === "ushort" ||
|
|
85
|
+
type.name === "uint" ||
|
|
86
|
+
type.name === "ulong" ||
|
|
87
|
+
type.name === "nuint" ||
|
|
88
|
+
type.name === "uint128" ||
|
|
89
|
+
type.name === "half" ||
|
|
90
|
+
type.name === "float" ||
|
|
91
|
+
type.name === "double" ||
|
|
92
|
+
type.name === "decimal" ||
|
|
93
|
+
type.name === "bool" ||
|
|
94
|
+
type.name === "char");
|
|
95
|
+
}
|
|
96
|
+
return false;
|
|
97
|
+
};
|
|
98
|
+
const isSameTypeForNullableUnwrap = (base, expected) => {
|
|
99
|
+
if (base.kind !== expected.kind)
|
|
100
|
+
return false;
|
|
101
|
+
if (base.kind === "primitiveType" && expected.kind === "primitiveType") {
|
|
102
|
+
return base.name === expected.name;
|
|
103
|
+
}
|
|
104
|
+
if (base.kind === "referenceType" && expected.kind === "referenceType") {
|
|
105
|
+
// This unwrap is only for Nullable<T> value types, so keep matching strict.
|
|
106
|
+
return (base.name === expected.name &&
|
|
107
|
+
(base.typeArguments?.length ?? 0) === 0 &&
|
|
108
|
+
(expected.typeArguments?.length ?? 0) === 0);
|
|
109
|
+
}
|
|
110
|
+
return false;
|
|
111
|
+
};
|
|
112
|
+
const maybeUnwrapNullableValueType = (expr, fragment, context, expectedType) => {
|
|
113
|
+
if (!expectedType)
|
|
114
|
+
return [fragment, context];
|
|
115
|
+
if (!expr.inferredType)
|
|
116
|
+
return [fragment, context];
|
|
117
|
+
// Only unwrap direct nullable values. For composite expressions (e.g. `a ?? b`)
|
|
118
|
+
// C# nullish coalescing already produces a non-nullable result when the
|
|
119
|
+
// fallback is non-nullable, so adding `.Value` is incorrect.
|
|
120
|
+
if (expr.kind !== "identifier" && expr.kind !== "memberAccess") {
|
|
121
|
+
return [fragment, context];
|
|
122
|
+
}
|
|
123
|
+
// If a narrowing pass already rewrote this identifier (e.g., `id` → `id.Value`
|
|
124
|
+
// or `id` → `id__n`), don't apply a second Nullable<T> unwrap.
|
|
125
|
+
if (expr.kind === "identifier" &&
|
|
126
|
+
(context.narrowedBindings?.has(expr.name) ?? false)) {
|
|
127
|
+
return [fragment, context];
|
|
128
|
+
}
|
|
129
|
+
const nullableBase = getNullableUnionBaseType(expr.inferredType);
|
|
130
|
+
if (!nullableBase)
|
|
131
|
+
return [fragment, context];
|
|
132
|
+
// Only unwrap when the expected type is a non-nullable value type and
|
|
133
|
+
// the expression is a nullable union of that exact base type.
|
|
134
|
+
if (!isNonNullableValueType(expectedType))
|
|
135
|
+
return [fragment, context];
|
|
136
|
+
if (!isSameTypeForNullableUnwrap(nullableBase, expectedType)) {
|
|
137
|
+
return [fragment, context];
|
|
138
|
+
}
|
|
139
|
+
const needsParens = expr.kind !== "identifier" && expr.kind !== "memberAccess";
|
|
140
|
+
const inner = needsParens ? `(${fragment.text})` : fragment.text;
|
|
141
|
+
return [{ text: `${inner}.Value` }, context];
|
|
142
|
+
};
|
|
15
143
|
/**
|
|
16
144
|
* Emit a numeric narrowing expression.
|
|
17
145
|
*
|
|
@@ -33,22 +161,12 @@ const emitNumericNarrowing = (expr, context) => {
|
|
|
33
161
|
);
|
|
34
162
|
return [innerCode, newContext];
|
|
35
163
|
}
|
|
36
|
-
//
|
|
37
|
-
//
|
|
38
|
-
//
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
expr.proof.source.type === "parameter" ||
|
|
43
|
-
expr.proof.source.type === "narrowing") {
|
|
44
|
-
const [innerCode, newContext] = emitExpression(expr.expression, context
|
|
45
|
-
// No expectedType - the expression produces the target type naturally
|
|
46
|
-
);
|
|
47
|
-
return [innerCode, newContext];
|
|
48
|
-
}
|
|
49
|
-
// For dotnetReturn and other proof types, emit without forcing a cast
|
|
50
|
-
const [innerCode, newContext] = emitExpression(expr.expression, context);
|
|
51
|
-
return [innerCode, newContext];
|
|
164
|
+
// Numeric narrowings represent explicit user intent (`x as int`, `x as long`).
|
|
165
|
+
// Even when the conversion is proven sound, C# generic inference can become
|
|
166
|
+
// ambiguous without an explicit cast (e.g., choosing between `int` and `long`).
|
|
167
|
+
const [innerCode, ctx1] = emitExpression(expr.expression, context);
|
|
168
|
+
const [typeName, ctx2] = emitType(expr.inferredType, ctx1);
|
|
169
|
+
return [{ text: `(${typeName})${innerCode.text}` }, ctx2];
|
|
52
170
|
}
|
|
53
171
|
// HARD GATE: No proof means the proof pass failed to catch an unprovable narrowing.
|
|
54
172
|
// This is an internal compiler error - the proof pass should have aborted compilation.
|
|
@@ -66,13 +184,55 @@ const emitNumericNarrowing = (expr, context) => {
|
|
|
66
184
|
*/
|
|
67
185
|
const emitTypeAssertion = (expr, context) => {
|
|
68
186
|
const [innerCode, ctx1] = emitExpression(expr.expression, context);
|
|
69
|
-
const
|
|
187
|
+
const resolveRuntimeCastTarget = (target, ctx) => {
|
|
188
|
+
// 1) Resolve local type aliases for runtime casting.
|
|
189
|
+
// TypeScript type aliases have no runtime representation in C#, except for
|
|
190
|
+
// object-literal aliases which we synthesize as classes (`Foo__Alias`).
|
|
191
|
+
if (target.kind === "referenceType" && ctx.localTypes) {
|
|
192
|
+
const typeInfo = ctx.localTypes.get(target.name);
|
|
193
|
+
if (typeInfo?.kind === "typeAlias") {
|
|
194
|
+
if (typeInfo.type.kind !== "objectType") {
|
|
195
|
+
const substituted = target.typeArguments && target.typeArguments.length > 0
|
|
196
|
+
? substituteTypeArgs(typeInfo.type, typeInfo.typeParameters, target.typeArguments)
|
|
197
|
+
: typeInfo.type;
|
|
198
|
+
return resolveRuntimeCastTarget(substituted, ctx);
|
|
199
|
+
}
|
|
200
|
+
// objectType aliases are emitted as `Name__Alias` by emitReferenceType
|
|
201
|
+
return target;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// 2) Erase tsbindgen extension-method wrapper types at runtime:
|
|
205
|
+
// ExtensionMethods<TShape> is type-only; values are just TShape.
|
|
206
|
+
if (target.kind === "referenceType" && target.typeArguments?.length) {
|
|
207
|
+
const importBinding = ctx.importBindings?.get(target.name);
|
|
208
|
+
const clrName = importBinding?.kind === "type" ? importBinding.clrName : "";
|
|
209
|
+
if (clrName.endsWith(".ExtensionMethods")) {
|
|
210
|
+
const shape = target.typeArguments[0];
|
|
211
|
+
if (shape)
|
|
212
|
+
return resolveRuntimeCastTarget(shape, ctx);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// 3) Intersection types have no C# cast target; cast to the first runtime-like constituent.
|
|
216
|
+
if (target.kind === "intersectionType") {
|
|
217
|
+
for (const part of target.types) {
|
|
218
|
+
const resolved = resolveRuntimeCastTarget(part, ctx);
|
|
219
|
+
if (resolved.kind !== "intersectionType" && resolved.kind !== "objectType") {
|
|
220
|
+
return resolved;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
const fallback = target.types[0];
|
|
224
|
+
return fallback ? resolveRuntimeCastTarget(fallback, ctx) : target;
|
|
225
|
+
}
|
|
226
|
+
return target;
|
|
227
|
+
};
|
|
228
|
+
const runtimeTarget = resolveRuntimeCastTarget(expr.targetType, ctx1);
|
|
229
|
+
const [typeName, ctx2] = emitType(runtimeTarget, ctx1);
|
|
70
230
|
return [{ text: `(${typeName})${innerCode.text}` }, ctx2];
|
|
71
231
|
};
|
|
72
232
|
/**
|
|
73
|
-
* Emit a
|
|
233
|
+
* Emit a trycast expression.
|
|
74
234
|
*
|
|
75
|
-
* TypeScript `
|
|
235
|
+
* TypeScript `trycast<T>(x)` becomes C# `x as T` (safe cast).
|
|
76
236
|
* This returns null if the cast fails instead of throwing.
|
|
77
237
|
*/
|
|
78
238
|
const emitTryCast = (expr, context) => {
|
|
@@ -80,6 +240,19 @@ const emitTryCast = (expr, context) => {
|
|
|
80
240
|
const [typeName, ctx2] = emitType(expr.targetType, ctx1);
|
|
81
241
|
return [{ text: `${innerCode.text} as ${typeName}` }, ctx2];
|
|
82
242
|
};
|
|
243
|
+
/**
|
|
244
|
+
* Emit a stackalloc expression.
|
|
245
|
+
*
|
|
246
|
+
* TypeScript `stackalloc<T>(n)` becomes C# `stackalloc T[n]`.
|
|
247
|
+
*/
|
|
248
|
+
const emitStackAlloc = (expr, context) => {
|
|
249
|
+
const [elementTypeName, ctx1] = emitType(expr.elementType, context);
|
|
250
|
+
const [sizeFrag, ctx2] = emitExpression(expr.size, ctx1, {
|
|
251
|
+
kind: "primitiveType",
|
|
252
|
+
name: "int",
|
|
253
|
+
});
|
|
254
|
+
return [{ text: `stackalloc ${elementTypeName}[${sizeFrag.text}]` }, ctx2];
|
|
255
|
+
};
|
|
83
256
|
/**
|
|
84
257
|
* Emit a C# expression from an IR expression
|
|
85
258
|
* @param expr The IR expression to emit
|
|
@@ -87,57 +260,62 @@ const emitTryCast = (expr, context) => {
|
|
|
87
260
|
* @param expectedType Optional expected type for contextual typing (e.g., array element type inference)
|
|
88
261
|
*/
|
|
89
262
|
export const emitExpression = (expr, context, expectedType) => {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
263
|
+
const [fragment, newContext] = (() => {
|
|
264
|
+
switch (expr.kind) {
|
|
265
|
+
case "literal":
|
|
266
|
+
// Pass expectedType for null → default conversion in generic contexts
|
|
267
|
+
// Numeric literals use raw lexeme (no contextual widening under new spec)
|
|
268
|
+
return emitLiteral(expr, context, expectedType);
|
|
269
|
+
case "identifier":
|
|
270
|
+
return emitIdentifier(expr, context);
|
|
271
|
+
case "array":
|
|
272
|
+
return emitArray(expr, context, expectedType);
|
|
273
|
+
case "object":
|
|
274
|
+
return emitObject(expr, context, expectedType);
|
|
275
|
+
case "memberAccess":
|
|
276
|
+
return emitMemberAccess(expr, context);
|
|
277
|
+
case "call":
|
|
278
|
+
return emitCall(expr, context);
|
|
279
|
+
case "new":
|
|
280
|
+
return emitNew(expr, context);
|
|
281
|
+
case "binary":
|
|
282
|
+
return emitBinary(expr, context, expectedType);
|
|
283
|
+
case "logical":
|
|
284
|
+
return emitLogical(expr, context);
|
|
285
|
+
case "unary":
|
|
286
|
+
return emitUnary(expr, context, expectedType);
|
|
287
|
+
case "update":
|
|
288
|
+
return emitUpdate(expr, context);
|
|
289
|
+
case "assignment":
|
|
290
|
+
return emitAssignment(expr, context);
|
|
291
|
+
case "conditional":
|
|
292
|
+
return emitConditional(expr, context, expectedType);
|
|
293
|
+
case "functionExpression":
|
|
294
|
+
return emitFunctionExpression(expr, context);
|
|
295
|
+
case "arrowFunction":
|
|
296
|
+
return emitArrowFunction(expr, context);
|
|
297
|
+
case "templateLiteral":
|
|
298
|
+
return emitTemplateLiteral(expr, context);
|
|
299
|
+
case "spread":
|
|
300
|
+
return emitSpread(expr, context);
|
|
301
|
+
case "await":
|
|
302
|
+
return emitAwait(expr, context);
|
|
303
|
+
case "this":
|
|
304
|
+
return [{ text: "this" }, context];
|
|
305
|
+
case "numericNarrowing":
|
|
306
|
+
return emitNumericNarrowing(expr, context);
|
|
307
|
+
case "typeAssertion":
|
|
308
|
+
return emitTypeAssertion(expr, context);
|
|
309
|
+
case "trycast":
|
|
310
|
+
return emitTryCast(expr, context);
|
|
311
|
+
case "stackalloc":
|
|
312
|
+
return emitStackAlloc(expr, context);
|
|
313
|
+
default:
|
|
314
|
+
throw new Error(`Unhandled IR expression kind: ${String(expr.kind)}`);
|
|
315
|
+
}
|
|
316
|
+
})();
|
|
317
|
+
const [castedFrag, castedContext] = maybeCastNullishTypeParam(expr, fragment, newContext, expectedType);
|
|
318
|
+
return maybeUnwrapNullableValueType(expr, castedFrag, castedContext, expectedType);
|
|
141
319
|
};
|
|
142
320
|
// Re-export commonly used functions for backward compatibility
|
|
143
321
|
export { emitTypeArguments, generateSpecializedName, } from "./expressions/identifiers.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expression-emitter.js","sourceRoot":"","sources":["../src/expression-emitter.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"expression-emitter.js","sourceRoot":"","sources":["../src/expression-emitter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"access.d.ts","sourceRoot":"","sources":["../../src/expressions/access.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"access.d.ts","sourceRoot":"","sources":["../../src/expressions/access.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAe,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAkH7D;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAC3B,MAAM,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,CAAC,EACrD,SAAS,cAAc,KACtB,CAAC,cAAc,EAAE,cAAc,CAkLjC,CAAC"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import { emitExpression } from "../expression-emitter.js";
|
|
5
5
|
import { isExplicitViewProperty, extractInterfaceNameFromView, } from "@tsonic/frontend/types/explicit-views.js";
|
|
6
6
|
import { escapeCSharpIdentifier } from "../emitter-types/index.js";
|
|
7
|
+
import { emitType } from "../type-emitter.js";
|
|
7
8
|
import { resolveTypeAlias, stripNullish, getAllPropertySignatures, } from "../core/type-resolution.js";
|
|
8
9
|
// ============================================================================
|
|
9
10
|
// CONTRACT: Emitter ONLY consumes proof markers.
|
|
@@ -42,7 +43,19 @@ const hasInt32Proof = (expr) => {
|
|
|
42
43
|
* Check if an expression represents a static type reference (not an instance)
|
|
43
44
|
* Static type references are: namespace.Type or direct Type identifiers that resolve to types
|
|
44
45
|
*/
|
|
45
|
-
const isStaticTypeReference = (expr) => {
|
|
46
|
+
const isStaticTypeReference = (expr, context) => {
|
|
47
|
+
// Imported CLR types/modules are always static receivers in emitted C#.
|
|
48
|
+
// This is true even when the frontend did not attach an inferredType for the identifier.
|
|
49
|
+
if (expr.object.kind === "identifier") {
|
|
50
|
+
const importBinding = context.importBindings?.get(expr.object.name);
|
|
51
|
+
if (importBinding)
|
|
52
|
+
return true;
|
|
53
|
+
// If this isn't an import and we don't have a receiver type, default to instance.
|
|
54
|
+
// This prevents CLR-bound instance property accesses (e.g. `x.expression`) from
|
|
55
|
+
// incorrectly becoming `Type.Expression`.
|
|
56
|
+
if (!expr.object.inferredType)
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
46
59
|
// If the object is an identifier that's a type name (e.g., Console, Enumerable)
|
|
47
60
|
// we need to check if the member binding's type matches what would be
|
|
48
61
|
// accessed statically. For instance access, the object would be a variable.
|
|
@@ -69,6 +82,7 @@ const isStaticTypeReference = (expr) => {
|
|
|
69
82
|
if (objectType?.kind === "referenceType" ||
|
|
70
83
|
objectType?.kind === "arrayType" ||
|
|
71
84
|
objectType?.kind === "intersectionType" ||
|
|
85
|
+
objectType?.kind === "unionType" ||
|
|
72
86
|
objectType?.kind === "primitiveType" ||
|
|
73
87
|
objectType?.kind === "literalType") {
|
|
74
88
|
return false;
|
|
@@ -84,7 +98,7 @@ export const emitMemberAccess = (expr, context) => {
|
|
|
84
98
|
if (expr.memberBinding) {
|
|
85
99
|
const { type, member } = expr.memberBinding;
|
|
86
100
|
// Determine if this is a static or instance member access
|
|
87
|
-
if (isStaticTypeReference(expr)) {
|
|
101
|
+
if (isStaticTypeReference(expr, context)) {
|
|
88
102
|
// Static access: emit full CLR type and member with global:: prefix
|
|
89
103
|
const text = `global::${type}.${member}`;
|
|
90
104
|
return [{ text }, context];
|
|
@@ -98,28 +112,16 @@ export const emitMemberAccess = (expr, context) => {
|
|
|
98
112
|
}
|
|
99
113
|
}
|
|
100
114
|
const [objectFrag, newContext] = emitExpression(expr.object, context);
|
|
101
|
-
// Default runtime to "js" when not specified
|
|
102
|
-
const runtime = context.options.runtime ?? "js";
|
|
103
115
|
if (expr.isComputed) {
|
|
104
116
|
// Check if this is array index access
|
|
105
117
|
const objectType = expr.object.inferredType;
|
|
106
118
|
const isArrayType = objectType?.kind === "arrayType";
|
|
107
|
-
//
|
|
108
|
-
// In dotnet mode, use native CLR indexer (no JSRuntime exists)
|
|
109
|
-
if (isArrayType && runtime === "js") {
|
|
110
|
-
const indexContext = { ...newContext, isArrayIndex: true };
|
|
111
|
-
const [propFrag, contextWithIndex] = emitExpression(expr.property, indexContext);
|
|
112
|
-
const finalContext = { ...contextWithIndex, isArrayIndex: false };
|
|
113
|
-
const text = `global::Tsonic.JSRuntime.Array.get(${objectFrag.text}, ${propFrag.text})`;
|
|
114
|
-
return [{ text }, finalContext];
|
|
115
|
-
}
|
|
116
|
-
// In dotnet mode, arrays use native List<T> indexer
|
|
119
|
+
// TypeScript array access - unified for both js and dotnet modes
|
|
117
120
|
// HARD GATE: Index must be proven Int32 (validated by proof pass)
|
|
118
|
-
if (isArrayType
|
|
121
|
+
if (isArrayType) {
|
|
119
122
|
const indexContext = { ...newContext, isArrayIndex: true };
|
|
120
123
|
const [propFrag, contextWithIndex] = emitExpression(expr.property, indexContext);
|
|
121
124
|
const finalContext = { ...contextWithIndex, isArrayIndex: false };
|
|
122
|
-
const accessor = expr.isOptional ? "?[" : "[";
|
|
123
125
|
const indexExpr = expr.property;
|
|
124
126
|
if (!hasInt32Proof(indexExpr)) {
|
|
125
127
|
// ICE: Unproven index should have been caught by proof pass (TSN5107)
|
|
@@ -127,7 +129,8 @@ export const emitMemberAccess = (expr, context) => {
|
|
|
127
129
|
`Expression '${propFrag.text}' has no Int32 proof. ` +
|
|
128
130
|
`This should have been caught by the numeric proof pass (TSN5107).`);
|
|
129
131
|
}
|
|
130
|
-
|
|
132
|
+
// Use native CLR indexer
|
|
133
|
+
const text = `${objectFrag.text}${expr.isOptional ? "?[" : "["}${propFrag.text}]`;
|
|
131
134
|
return [{ text }, finalContext];
|
|
132
135
|
}
|
|
133
136
|
// CLR indexer access (non-TS-array types like List<T>, string, Dictionary, etc.)
|
|
@@ -191,30 +194,23 @@ export const emitMemberAccess = (expr, context) => {
|
|
|
191
194
|
}
|
|
192
195
|
}
|
|
193
196
|
}
|
|
194
|
-
//
|
|
195
|
-
// In dotnet mode, C# arrays use .Length (capital L)
|
|
197
|
+
// Array.length → .Length (C# arrays use .Length property)
|
|
196
198
|
if (isArrayType && prop === "length") {
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
return [{ text }, newContext];
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
// dotnet mode: C# arrays have .Length property
|
|
203
|
-
const text = `${objectFrag.text}.Length`;
|
|
204
|
-
return [{ text }, newContext];
|
|
205
|
-
}
|
|
199
|
+
const text = `${objectFrag.text}.Length`;
|
|
200
|
+
return [{ text }, newContext];
|
|
206
201
|
}
|
|
207
202
|
// Check if this is a string type
|
|
208
203
|
const isStringType = objectType?.kind === "primitiveType" && objectType.name === "string";
|
|
209
|
-
//
|
|
210
|
-
// In dotnet mode, C# strings use .Length (capital L)
|
|
204
|
+
// String.length → .Length (C# strings use .Length property)
|
|
211
205
|
if (isStringType && prop === "length") {
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
206
|
+
const text = `${objectFrag.text}.Length`;
|
|
207
|
+
return [{ text }, newContext];
|
|
208
|
+
}
|
|
209
|
+
// Span<T>.length → .Length (C# Span<T> uses .Length)
|
|
210
|
+
if (prop === "length" && objectType) {
|
|
211
|
+
const resolved = resolveTypeAlias(stripNullish(objectType), context);
|
|
212
|
+
if (resolved.kind === "referenceType" &&
|
|
213
|
+
(resolved.name === "Span" || resolved.resolvedClrType?.endsWith("System.Span"))) {
|
|
218
214
|
const text = `${objectFrag.text}.Length`;
|
|
219
215
|
return [{ text }, newContext];
|
|
220
216
|
}
|
|
@@ -224,10 +220,10 @@ export const emitMemberAccess = (expr, context) => {
|
|
|
224
220
|
const interfaceName = extractInterfaceNameFromView(prop);
|
|
225
221
|
if (interfaceName) {
|
|
226
222
|
// Emit as C# interface cast: ((IInterface)obj)
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
const text = `((${
|
|
230
|
-
return [{ text },
|
|
223
|
+
const interfaceType = { kind: "referenceType", name: interfaceName };
|
|
224
|
+
const [interfaceTypeStr, ctxAfterType] = emitType(interfaceType, newContext);
|
|
225
|
+
const text = `((${interfaceTypeStr})${objectFrag.text})`;
|
|
226
|
+
return [{ text }, ctxAfterType];
|
|
231
227
|
}
|
|
232
228
|
}
|
|
233
229
|
// Regular property access
|