@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.
Files changed (184) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/array.test.d.ts +1 -1
  3. package/dist/array.test.js +17 -16
  4. package/dist/array.test.js.map +1 -1
  5. package/dist/core/attributes.test.js +2 -2
  6. package/dist/core/attributes.test.js.map +1 -1
  7. package/dist/core/imports.d.ts.map +1 -1
  8. package/dist/core/imports.js +1 -9
  9. package/dist/core/imports.js.map +1 -1
  10. package/dist/core/module-emitter/static-container.d.ts.map +1 -1
  11. package/dist/core/module-emitter/static-container.js +3 -1
  12. package/dist/core/module-emitter/static-container.js.map +1 -1
  13. package/dist/core/unsafe.d.ts +11 -0
  14. package/dist/core/unsafe.d.ts.map +1 -0
  15. package/dist/core/unsafe.js +264 -0
  16. package/dist/core/unsafe.js.map +1 -0
  17. package/dist/emitter-types/context.d.ts +1 -1
  18. package/dist/emitter-types/context.d.ts.map +1 -1
  19. package/dist/emitter-types/context.js +4 -3
  20. package/dist/emitter-types/context.js.map +1 -1
  21. package/dist/emitter-types/core.d.ts +4 -2
  22. package/dist/emitter-types/core.d.ts.map +1 -1
  23. package/dist/emitter-types/fqn.d.ts +0 -7
  24. package/dist/emitter-types/fqn.d.ts.map +1 -1
  25. package/dist/emitter-types/fqn.js +0 -8
  26. package/dist/emitter-types/fqn.js.map +1 -1
  27. package/dist/expression-emitter.d.ts.map +1 -1
  28. package/dist/expression-emitter.js +248 -70
  29. package/dist/expression-emitter.js.map +1 -1
  30. package/dist/expressions/access.d.ts.map +1 -1
  31. package/dist/expressions/access.js +36 -40
  32. package/dist/expressions/access.js.map +1 -1
  33. package/dist/expressions/calls.d.ts.map +1 -1
  34. package/dist/expressions/calls.js +233 -70
  35. package/dist/expressions/calls.js.map +1 -1
  36. package/dist/expressions/collections.d.ts.map +1 -1
  37. package/dist/expressions/collections.js +37 -41
  38. package/dist/expressions/collections.js.map +1 -1
  39. package/dist/expressions/functions.d.ts.map +1 -1
  40. package/dist/expressions/functions.js +30 -10
  41. package/dist/expressions/functions.js.map +1 -1
  42. package/dist/expressions/identifiers.d.ts.map +1 -1
  43. package/dist/expressions/identifiers.js +5 -30
  44. package/dist/expressions/identifiers.js.map +1 -1
  45. package/dist/expressions/index.test.js +87 -198
  46. package/dist/expressions/index.test.js.map +1 -1
  47. package/dist/expressions/literals.d.ts +4 -5
  48. package/dist/expressions/literals.d.ts.map +1 -1
  49. package/dist/expressions/literals.js +62 -15
  50. package/dist/expressions/literals.js.map +1 -1
  51. package/dist/expressions/operators.d.ts +0 -4
  52. package/dist/expressions/operators.d.ts.map +1 -1
  53. package/dist/expressions/operators.js +49 -19
  54. package/dist/expressions/operators.js.map +1 -1
  55. package/dist/expressions/other.d.ts.map +1 -1
  56. package/dist/expressions/other.js +21 -3
  57. package/dist/expressions/other.js.map +1 -1
  58. package/dist/extension-methods.test.d.ts +5 -0
  59. package/dist/extension-methods.test.d.ts.map +1 -0
  60. package/dist/extension-methods.test.js +110 -0
  61. package/dist/extension-methods.test.js.map +1 -0
  62. package/dist/generator-exchange.d.ts.map +1 -1
  63. package/dist/generator-exchange.js +2 -1
  64. package/dist/generator-exchange.js.map +1 -1
  65. package/dist/generator.test.js +9 -9
  66. package/dist/generator.test.js.map +1 -1
  67. package/dist/golden-tests/discovery.d.ts +6 -11
  68. package/dist/golden-tests/discovery.d.ts.map +1 -1
  69. package/dist/golden-tests/discovery.js +14 -79
  70. package/dist/golden-tests/discovery.js.map +1 -1
  71. package/dist/golden-tests/index.d.ts +1 -1
  72. package/dist/golden-tests/index.d.ts.map +1 -1
  73. package/dist/golden-tests/index.js.map +1 -1
  74. package/dist/golden-tests/runner.d.ts.map +1 -1
  75. package/dist/golden-tests/runner.js +6 -7
  76. package/dist/golden-tests/runner.js.map +1 -1
  77. package/dist/golden-tests/types.d.ts +0 -7
  78. package/dist/golden-tests/types.d.ts.map +1 -1
  79. package/dist/golden.test.d.ts +3 -10
  80. package/dist/golden.test.d.ts.map +1 -1
  81. package/dist/golden.test.js +8 -24
  82. package/dist/golden.test.js.map +1 -1
  83. package/dist/hierarchical-bindings.test.js +17 -11
  84. package/dist/hierarchical-bindings.test.js.map +1 -1
  85. package/dist/integration.test.js +61 -20
  86. package/dist/integration.test.js.map +1 -1
  87. package/dist/invariants/emitter-globals-subset.test.d.ts +1 -1
  88. package/dist/invariants/emitter-globals-subset.test.js +34 -74
  89. package/dist/invariants/emitter-globals-subset.test.js.map +1 -1
  90. package/dist/invariants/numeric-proof-contract.test.js +3 -3
  91. package/dist/invariants/numeric-proof-contract.test.js.map +1 -1
  92. package/dist/patterns.d.ts +98 -0
  93. package/dist/patterns.d.ts.map +1 -0
  94. package/dist/patterns.js +366 -0
  95. package/dist/patterns.js.map +1 -0
  96. package/dist/patterns.test.d.ts +15 -0
  97. package/dist/patterns.test.d.ts.map +1 -0
  98. package/dist/patterns.test.js +1262 -0
  99. package/dist/patterns.test.js.map +1 -0
  100. package/dist/specialization/generation.d.ts.map +1 -1
  101. package/dist/specialization/generation.js +2 -2
  102. package/dist/specialization/generation.js.map +1 -1
  103. package/dist/specialization/substitution.d.ts.map +1 -1
  104. package/dist/specialization/substitution.js +4 -0
  105. package/dist/specialization/substitution.js.map +1 -1
  106. package/dist/specialization/type-aliases.test.js +1 -1
  107. package/dist/specialization/type-aliases.test.js.map +1 -1
  108. package/dist/statement-emitter.d.ts.map +1 -1
  109. package/dist/statement-emitter.js +1 -1
  110. package/dist/statement-emitter.js.map +1 -1
  111. package/dist/statements/blocks.d.ts.map +1 -1
  112. package/dist/statements/blocks.js +14 -45
  113. package/dist/statements/blocks.js.map +1 -1
  114. package/dist/statements/classes/index.d.ts +1 -1
  115. package/dist/statements/classes/index.d.ts.map +1 -1
  116. package/dist/statements/classes/index.js +1 -1
  117. package/dist/statements/classes/index.js.map +1 -1
  118. package/dist/statements/classes/inline-types.d.ts.map +1 -1
  119. package/dist/statements/classes/inline-types.js +11 -1
  120. package/dist/statements/classes/inline-types.js.map +1 -1
  121. package/dist/statements/classes/members/constructors.d.ts.map +1 -1
  122. package/dist/statements/classes/members/constructors.js +30 -12
  123. package/dist/statements/classes/members/constructors.js.map +1 -1
  124. package/dist/statements/classes/members/methods.d.ts.map +1 -1
  125. package/dist/statements/classes/members/methods.js +51 -23
  126. package/dist/statements/classes/members/methods.js.map +1 -1
  127. package/dist/statements/classes/members/orchestrator.d.ts.map +1 -1
  128. package/dist/statements/classes/members/orchestrator.js +1 -3
  129. package/dist/statements/classes/members/orchestrator.js.map +1 -1
  130. package/dist/statements/classes/members/properties.d.ts.map +1 -1
  131. package/dist/statements/classes/members/properties.js +56 -9
  132. package/dist/statements/classes/members/properties.js.map +1 -1
  133. package/dist/statements/classes/parameters.d.ts +43 -1
  134. package/dist/statements/classes/parameters.d.ts.map +1 -1
  135. package/dist/statements/classes/parameters.js +73 -13
  136. package/dist/statements/classes/parameters.js.map +1 -1
  137. package/dist/statements/classes/properties.d.ts.map +1 -1
  138. package/dist/statements/classes/properties.js +1 -1
  139. package/dist/statements/classes/properties.js.map +1 -1
  140. package/dist/statements/classes.d.ts +1 -1
  141. package/dist/statements/classes.d.ts.map +1 -1
  142. package/dist/statements/classes.js +1 -1
  143. package/dist/statements/classes.js.map +1 -1
  144. package/dist/statements/control/conditionals.d.ts.map +1 -1
  145. package/dist/statements/control/conditionals.js +78 -23
  146. package/dist/statements/control/conditionals.js.map +1 -1
  147. package/dist/statements/control/loops.d.ts.map +1 -1
  148. package/dist/statements/control/loops.js +25 -5
  149. package/dist/statements/control/loops.js.map +1 -1
  150. package/dist/statements/declarations/classes.d.ts.map +1 -1
  151. package/dist/statements/declarations/classes.js +128 -10
  152. package/dist/statements/declarations/classes.js.map +1 -1
  153. package/dist/statements/declarations/functions.d.ts.map +1 -1
  154. package/dist/statements/declarations/functions.js +28 -12
  155. package/dist/statements/declarations/functions.js.map +1 -1
  156. package/dist/statements/declarations/interfaces.d.ts.map +1 -1
  157. package/dist/statements/declarations/interfaces.js +50 -7
  158. package/dist/statements/declarations/interfaces.js.map +1 -1
  159. package/dist/statements/declarations/type-aliases.d.ts.map +1 -1
  160. package/dist/statements/declarations/type-aliases.js +6 -1
  161. package/dist/statements/declarations/type-aliases.js.map +1 -1
  162. package/dist/statements/declarations/variables.d.ts.map +1 -1
  163. package/dist/statements/declarations/variables.js +177 -37
  164. package/dist/statements/declarations/variables.js.map +1 -1
  165. package/dist/statements/index.test.js +7 -5
  166. package/dist/statements/index.test.js.map +1 -1
  167. package/dist/types/arrays.d.ts +3 -9
  168. package/dist/types/arrays.d.ts.map +1 -1
  169. package/dist/types/arrays.js +5 -19
  170. package/dist/types/arrays.js.map +1 -1
  171. package/dist/types/parameters.d.ts.map +1 -1
  172. package/dist/types/parameters.js +36 -1
  173. package/dist/types/parameters.js.map +1 -1
  174. package/dist/types/parameters.test.js +1 -1
  175. package/dist/types/parameters.test.js.map +1 -1
  176. package/dist/types/references.d.ts.map +1 -1
  177. package/dist/types/references.js +86 -51
  178. package/dist/types/references.js.map +1 -1
  179. package/dist/types/references.test.js +35 -95
  180. package/dist/types/references.test.js.map +1 -1
  181. package/dist/types/unions.d.ts.map +1 -1
  182. package/dist/types/unions.js +20 -0
  183. package/dist/types/unions.js.map +1 -1
  184. 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;;;;;;;;;8BAaN,MAAM;;kCAEF,MAAM;CACnB,CAAC"}
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,mBAAmB;IACnB,eAAe,EAAE;QACf,KAAK,EAAE,gCAAgC;QACvC,MAAM,EAAE,iCAAiC;QACzC,MAAM,EAAE,iCAAiC;QACzC,IAAI,EAAE,+BAA+B;QACrC,OAAO,EAAE,kCAAkC;KAC5C;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
+ {"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,EAIP,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAuH5D;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GACzB,MAAM,YAAY,EAClB,SAAS,cAAc,EACvB,eAAe,MAAM,KACpB,CAAC,cAAc,EAAE,cAAc,CA0EjC,CAAC;AAGF,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,8BAA8B,CAAC"}
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
- // For binary/unary ops, variables, and parameters that already produce the
37
- // target type, emit without expectedType to avoid redundant casts.
38
- // The proof confirms the expression produces the correct type naturally.
39
- if (expr.proof.source.type === "binaryOp" ||
40
- expr.proof.source.type === "unaryOp" ||
41
- expr.proof.source.type === "variable" ||
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 [typeName, ctx2] = emitType(expr.targetType, ctx1);
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 tryCast expression.
233
+ * Emit a trycast expression.
74
234
  *
75
- * TypeScript `tryCast<T>(x)` becomes C# `x as T` (safe cast).
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
- switch (expr.kind) {
91
- case "literal":
92
- // Pass expectedType for null → default conversion in generic contexts
93
- // Numeric literals use raw lexeme (no contextual widening under new spec)
94
- return emitLiteral(expr, context, expectedType);
95
- case "identifier":
96
- return emitIdentifier(expr, context);
97
- case "array":
98
- return emitArray(expr, context, expectedType);
99
- case "object":
100
- return emitObject(expr, context, expectedType);
101
- case "memberAccess":
102
- return emitMemberAccess(expr, context);
103
- case "call":
104
- return emitCall(expr, context);
105
- case "new":
106
- return emitNew(expr, context);
107
- case "binary":
108
- return emitBinary(expr, context, expectedType);
109
- case "logical":
110
- return emitLogical(expr, context);
111
- case "unary":
112
- return emitUnary(expr, context, expectedType);
113
- case "update":
114
- return emitUpdate(expr, context);
115
- case "assignment":
116
- return emitAssignment(expr, context);
117
- case "conditional":
118
- return emitConditional(expr, context, expectedType);
119
- case "functionExpression":
120
- return emitFunctionExpression(expr, context);
121
- case "arrowFunction":
122
- return emitArrowFunction(expr, context);
123
- case "templateLiteral":
124
- return emitTemplateLiteral(expr, context);
125
- case "spread":
126
- return emitSpread(expr, context);
127
- case "await":
128
- return emitAwait(expr, context);
129
- case "this":
130
- return [{ text: "this" }, context];
131
- case "numericNarrowing":
132
- return emitNumericNarrowing(expr, context);
133
- case "typeAssertion":
134
- return emitTypeAssertion(expr, context);
135
- case "tryCast":
136
- return emitTryCast(expr, context);
137
- default:
138
- // Fallback for unhandled expressions
139
- return [{ text: "/* TODO: unhandled expression */" }, context];
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,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAmG7D;;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,CAiMjC,CAAC"}
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
- // In JS mode, use Tsonic.JSRuntime.Array.get() for JS semantics (auto-grow, sparse arrays)
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 && runtime === "dotnet") {
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
- const text = `${objectFrag.text}${accessor}${propFrag.text}]`;
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
- // In JS runtime mode, rewrite array.length → global::Tsonic.JSRuntime.Array.length(array)
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
- if (runtime === "js") {
198
- const text = `global::Tsonic.JSRuntime.Array.length(${objectFrag.text})`;
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
- // In JS runtime mode, rewrite string.length → global::Tsonic.JSRuntime.String.length(string)
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
- if (runtime === "js") {
213
- const text = `global::Tsonic.JSRuntime.String.length(${objectFrag.text})`;
214
- return [{ text }, newContext];
215
- }
216
- else {
217
- // dotnet mode: C# strings have .Length property
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
- // TODO: Need to look up full interface name from metadata
228
- // For now, use the extracted short name
229
- const text = `((${interfaceName})${objectFrag.text})`;
230
- return [{ text }, newContext];
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