@tsonic/emitter 0.0.14 → 0.0.16

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 (242) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/adapter-generator.js +3 -3
  3. package/dist/adapter-generator.js.map +1 -1
  4. package/dist/array.test.d.ts +1 -1
  5. package/dist/array.test.js +18 -17
  6. package/dist/array.test.js.map +1 -1
  7. package/dist/core/attributes.test.js +2 -2
  8. package/dist/core/attributes.test.js.map +1 -1
  9. package/dist/core/imports.d.ts.map +1 -1
  10. package/dist/core/imports.js +7 -12
  11. package/dist/core/imports.js.map +1 -1
  12. package/dist/core/local-types.d.ts.map +1 -1
  13. package/dist/core/local-types.js +12 -0
  14. package/dist/core/local-types.js.map +1 -1
  15. package/dist/core/module-emitter/orchestrator.d.ts.map +1 -1
  16. package/dist/core/module-emitter/orchestrator.js +15 -2
  17. package/dist/core/module-emitter/orchestrator.js.map +1 -1
  18. package/dist/core/module-emitter/static-container.d.ts.map +1 -1
  19. package/dist/core/module-emitter/static-container.js +30 -4
  20. package/dist/core/module-emitter/static-container.js.map +1 -1
  21. package/dist/core/module-emitter.test.js +6 -6
  22. package/dist/core/module-map.d.ts.map +1 -1
  23. package/dist/core/module-map.js +42 -0
  24. package/dist/core/module-map.js.map +1 -1
  25. package/dist/core/naming-collisions.d.ts +4 -0
  26. package/dist/core/naming-collisions.d.ts.map +1 -0
  27. package/dist/core/naming-collisions.js +191 -0
  28. package/dist/core/naming-collisions.js.map +1 -0
  29. package/dist/core/type-member-index.d.ts +4 -0
  30. package/dist/core/type-member-index.d.ts.map +1 -0
  31. package/dist/core/type-member-index.js +62 -0
  32. package/dist/core/type-member-index.js.map +1 -0
  33. package/dist/core/unsafe.d.ts +11 -0
  34. package/dist/core/unsafe.d.ts.map +1 -0
  35. package/dist/core/unsafe.js +264 -0
  36. package/dist/core/unsafe.js.map +1 -0
  37. package/dist/emitter-types/context.d.ts +1 -1
  38. package/dist/emitter-types/context.d.ts.map +1 -1
  39. package/dist/emitter-types/context.js +5 -3
  40. package/dist/emitter-types/context.js.map +1 -1
  41. package/dist/emitter-types/core.d.ts +45 -2
  42. package/dist/emitter-types/core.d.ts.map +1 -1
  43. package/dist/emitter-types/fqn.d.ts +0 -7
  44. package/dist/emitter-types/fqn.d.ts.map +1 -1
  45. package/dist/emitter-types/fqn.js +0 -8
  46. package/dist/emitter-types/fqn.js.map +1 -1
  47. package/dist/emitter-types/index.d.ts +1 -1
  48. package/dist/emitter-types/index.d.ts.map +1 -1
  49. package/dist/emitter-types/index.js.map +1 -1
  50. package/dist/emitter.d.ts.map +1 -1
  51. package/dist/emitter.js +12 -1
  52. package/dist/emitter.js.map +1 -1
  53. package/dist/expression-emitter.d.ts.map +1 -1
  54. package/dist/expression-emitter.js +255 -73
  55. package/dist/expression-emitter.js.map +1 -1
  56. package/dist/expressions/access.d.ts +3 -1
  57. package/dist/expressions/access.d.ts.map +1 -1
  58. package/dist/expressions/access.js +144 -50
  59. package/dist/expressions/access.js.map +1 -1
  60. package/dist/expressions/calls.d.ts.map +1 -1
  61. package/dist/expressions/calls.js +266 -88
  62. package/dist/expressions/calls.js.map +1 -1
  63. package/dist/expressions/collections.d.ts.map +1 -1
  64. package/dist/expressions/collections.js +169 -57
  65. package/dist/expressions/collections.js.map +1 -1
  66. package/dist/expressions/functions.d.ts.map +1 -1
  67. package/dist/expressions/functions.js +30 -10
  68. package/dist/expressions/functions.js.map +1 -1
  69. package/dist/expressions/identifiers.d.ts.map +1 -1
  70. package/dist/expressions/identifiers.js +11 -30
  71. package/dist/expressions/identifiers.js.map +1 -1
  72. package/dist/expressions/index.test.js +89 -200
  73. package/dist/expressions/index.test.js.map +1 -1
  74. package/dist/expressions/literals.d.ts +4 -5
  75. package/dist/expressions/literals.d.ts.map +1 -1
  76. package/dist/expressions/literals.js +94 -15
  77. package/dist/expressions/literals.js.map +1 -1
  78. package/dist/expressions/operators.d.ts +0 -4
  79. package/dist/expressions/operators.d.ts.map +1 -1
  80. package/dist/expressions/operators.js +84 -24
  81. package/dist/expressions/operators.js.map +1 -1
  82. package/dist/expressions/other.d.ts.map +1 -1
  83. package/dist/expressions/other.js +21 -3
  84. package/dist/expressions/other.js.map +1 -1
  85. package/dist/expressions/parentheses.d.ts +4 -0
  86. package/dist/expressions/parentheses.d.ts.map +1 -0
  87. package/dist/expressions/parentheses.js +83 -0
  88. package/dist/expressions/parentheses.js.map +1 -0
  89. package/dist/extension-methods.test.d.ts +5 -0
  90. package/dist/extension-methods.test.d.ts.map +1 -0
  91. package/dist/extension-methods.test.js +110 -0
  92. package/dist/extension-methods.test.js.map +1 -0
  93. package/dist/generator-exchange.d.ts.map +1 -1
  94. package/dist/generator-exchange.js +5 -2
  95. package/dist/generator-exchange.js.map +1 -1
  96. package/dist/generator-wrapper.d.ts.map +1 -1
  97. package/dist/generator-wrapper.js +13 -7
  98. package/dist/generator-wrapper.js.map +1 -1
  99. package/dist/generator-wrapper.test.js +12 -12
  100. package/dist/generator-wrapper.test.js.map +1 -1
  101. package/dist/generator.test.js +42 -42
  102. package/dist/generator.test.js.map +1 -1
  103. package/dist/golden-tests/discovery.d.ts +6 -11
  104. package/dist/golden-tests/discovery.d.ts.map +1 -1
  105. package/dist/golden-tests/discovery.js +14 -79
  106. package/dist/golden-tests/discovery.js.map +1 -1
  107. package/dist/golden-tests/index.d.ts +1 -1
  108. package/dist/golden-tests/index.d.ts.map +1 -1
  109. package/dist/golden-tests/index.js.map +1 -1
  110. package/dist/golden-tests/runner.d.ts.map +1 -1
  111. package/dist/golden-tests/runner.js +6 -7
  112. package/dist/golden-tests/runner.js.map +1 -1
  113. package/dist/golden-tests/types.d.ts +0 -7
  114. package/dist/golden-tests/types.d.ts.map +1 -1
  115. package/dist/golden.test.d.ts +3 -10
  116. package/dist/golden.test.d.ts.map +1 -1
  117. package/dist/golden.test.js +8 -24
  118. package/dist/golden.test.js.map +1 -1
  119. package/dist/hierarchical-bindings.test.js +18 -12
  120. package/dist/hierarchical-bindings.test.js.map +1 -1
  121. package/dist/integration.test.js +76 -35
  122. package/dist/integration.test.js.map +1 -1
  123. package/dist/invariants/emitter-globals-subset.test.d.ts +1 -1
  124. package/dist/invariants/emitter-globals-subset.test.js +34 -74
  125. package/dist/invariants/emitter-globals-subset.test.js.map +1 -1
  126. package/dist/invariants/numeric-proof-contract.test.js +3 -3
  127. package/dist/invariants/numeric-proof-contract.test.js.map +1 -1
  128. package/dist/naming-policy.d.ts +5 -0
  129. package/dist/naming-policy.d.ts.map +1 -0
  130. package/dist/naming-policy.js +10 -0
  131. package/dist/naming-policy.js.map +1 -0
  132. package/dist/patterns.d.ts +98 -0
  133. package/dist/patterns.d.ts.map +1 -0
  134. package/dist/patterns.js +366 -0
  135. package/dist/patterns.js.map +1 -0
  136. package/dist/patterns.test.d.ts +15 -0
  137. package/dist/patterns.test.d.ts.map +1 -0
  138. package/dist/patterns.test.js +1262 -0
  139. package/dist/patterns.test.js.map +1 -0
  140. package/dist/specialization/generation.d.ts.map +1 -1
  141. package/dist/specialization/generation.js +2 -2
  142. package/dist/specialization/generation.js.map +1 -1
  143. package/dist/specialization/generic-classes.test.js +1 -1
  144. package/dist/specialization/generic-functions.test.js +6 -6
  145. package/dist/specialization/interfaces.test.js +5 -5
  146. package/dist/specialization/substitution.d.ts.map +1 -1
  147. package/dist/specialization/substitution.js +4 -0
  148. package/dist/specialization/substitution.js.map +1 -1
  149. package/dist/specialization/type-aliases.test.js +6 -6
  150. package/dist/specialization/type-aliases.test.js.map +1 -1
  151. package/dist/statement-emitter.d.ts.map +1 -1
  152. package/dist/statement-emitter.js +1 -1
  153. package/dist/statement-emitter.js.map +1 -1
  154. package/dist/statements/blocks.d.ts.map +1 -1
  155. package/dist/statements/blocks.js +14 -45
  156. package/dist/statements/blocks.js.map +1 -1
  157. package/dist/statements/classes/index.d.ts +1 -1
  158. package/dist/statements/classes/index.d.ts.map +1 -1
  159. package/dist/statements/classes/index.js +1 -1
  160. package/dist/statements/classes/index.js.map +1 -1
  161. package/dist/statements/classes/inline-types.d.ts +1 -1
  162. package/dist/statements/classes/inline-types.d.ts.map +1 -1
  163. package/dist/statements/classes/inline-types.js +15 -5
  164. package/dist/statements/classes/inline-types.js.map +1 -1
  165. package/dist/statements/classes/members/constructors.d.ts.map +1 -1
  166. package/dist/statements/classes/members/constructors.js +40 -14
  167. package/dist/statements/classes/members/constructors.js.map +1 -1
  168. package/dist/statements/classes/members/methods.d.ts.map +1 -1
  169. package/dist/statements/classes/members/methods.js +62 -25
  170. package/dist/statements/classes/members/methods.js.map +1 -1
  171. package/dist/statements/classes/members/orchestrator.d.ts.map +1 -1
  172. package/dist/statements/classes/members/orchestrator.js +1 -3
  173. package/dist/statements/classes/members/orchestrator.js.map +1 -1
  174. package/dist/statements/classes/members/properties.d.ts.map +1 -1
  175. package/dist/statements/classes/members/properties.js +70 -10
  176. package/dist/statements/classes/members/properties.js.map +1 -1
  177. package/dist/statements/classes/parameters.d.ts +43 -1
  178. package/dist/statements/classes/parameters.d.ts.map +1 -1
  179. package/dist/statements/classes/parameters.js +73 -13
  180. package/dist/statements/classes/parameters.js.map +1 -1
  181. package/dist/statements/classes/properties.d.ts.map +1 -1
  182. package/dist/statements/classes/properties.js +6 -7
  183. package/dist/statements/classes/properties.js.map +1 -1
  184. package/dist/statements/classes.d.ts +1 -1
  185. package/dist/statements/classes.d.ts.map +1 -1
  186. package/dist/statements/classes.js +1 -1
  187. package/dist/statements/classes.js.map +1 -1
  188. package/dist/statements/control/conditionals.d.ts.map +1 -1
  189. package/dist/statements/control/conditionals.js +193 -23
  190. package/dist/statements/control/conditionals.js.map +1 -1
  191. package/dist/statements/control/loops.d.ts.map +1 -1
  192. package/dist/statements/control/loops.js +25 -5
  193. package/dist/statements/control/loops.js.map +1 -1
  194. package/dist/statements/declarations/classes.d.ts.map +1 -1
  195. package/dist/statements/declarations/classes.js +150 -12
  196. package/dist/statements/declarations/classes.js.map +1 -1
  197. package/dist/statements/declarations/enums.d.ts.map +1 -1
  198. package/dist/statements/declarations/enums.js +2 -1
  199. package/dist/statements/declarations/enums.js.map +1 -1
  200. package/dist/statements/declarations/functions.d.ts.map +1 -1
  201. package/dist/statements/declarations/functions.js +44 -19
  202. package/dist/statements/declarations/functions.js.map +1 -1
  203. package/dist/statements/declarations/interfaces.d.ts.map +1 -1
  204. package/dist/statements/declarations/interfaces.js +71 -10
  205. package/dist/statements/declarations/interfaces.js.map +1 -1
  206. package/dist/statements/declarations/structs.test.js +5 -5
  207. package/dist/statements/declarations/type-aliases.d.ts.map +1 -1
  208. package/dist/statements/declarations/type-aliases.js +24 -5
  209. package/dist/statements/declarations/type-aliases.js.map +1 -1
  210. package/dist/statements/declarations/variables.d.ts.map +1 -1
  211. package/dist/statements/declarations/variables.js +194 -37
  212. package/dist/statements/declarations/variables.js.map +1 -1
  213. package/dist/statements/index.test.js +7 -5
  214. package/dist/statements/index.test.js.map +1 -1
  215. package/dist/type-assertion.test.js +1 -1
  216. package/dist/types/arrays.d.ts +3 -9
  217. package/dist/types/arrays.d.ts.map +1 -1
  218. package/dist/types/arrays.js +5 -19
  219. package/dist/types/arrays.js.map +1 -1
  220. package/dist/types/emitter.d.ts.map +1 -1
  221. package/dist/types/emitter.js +3 -2
  222. package/dist/types/emitter.js.map +1 -1
  223. package/dist/types/index.test.js +3 -3
  224. package/dist/types/parameters.d.ts +1 -1
  225. package/dist/types/parameters.d.ts.map +1 -1
  226. package/dist/types/parameters.js +77 -8
  227. package/dist/types/parameters.js.map +1 -1
  228. package/dist/types/parameters.test.js +1 -1
  229. package/dist/types/parameters.test.js.map +1 -1
  230. package/dist/types/references.d.ts.map +1 -1
  231. package/dist/types/references.js +126 -55
  232. package/dist/types/references.js.map +1 -1
  233. package/dist/types/references.test.js +46 -106
  234. package/dist/types/references.test.js.map +1 -1
  235. package/dist/types/unions.d.ts.map +1 -1
  236. package/dist/types/unions.js +20 -0
  237. package/dist/types/unions.js.map +1 -1
  238. package/dist/types/unions.test.js +9 -9
  239. package/dist/types.d.ts +1 -1
  240. package/dist/types.d.ts.map +1 -1
  241. package/dist/types.js.map +1 -1
  242. package/package.json +3 -3
@@ -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,134 @@ 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
+ import { formatCastOperandText } from "./expressions/parentheses.js";
17
+ const getBareTypeParameterName = (type, context) => {
18
+ if (type.kind === "typeParameterType")
19
+ return type.name;
20
+ if (type.kind === "referenceType" &&
21
+ (context.typeParameters?.has(type.name) ?? false) &&
22
+ (!type.typeArguments || type.typeArguments.length === 0)) {
23
+ return type.name;
24
+ }
25
+ return undefined;
26
+ };
27
+ const getUnconstrainedNullishTypeParamName = (type, context) => {
28
+ if (type.kind !== "unionType")
29
+ return undefined;
30
+ const nonNullTypes = type.types.filter((t) => !(t.kind === "primitiveType" &&
31
+ (t.name === "null" || t.name === "undefined")));
32
+ if (nonNullTypes.length !== 1)
33
+ return undefined;
34
+ const nonNull = nonNullTypes[0];
35
+ if (!nonNull)
36
+ return undefined;
37
+ const typeParamName = getBareTypeParameterName(nonNull, context);
38
+ if (!typeParamName)
39
+ return undefined;
40
+ const constraintKind = context.typeParamConstraints?.get(typeParamName) ?? "unconstrained";
41
+ return constraintKind === "unconstrained" ? typeParamName : undefined;
42
+ };
43
+ const maybeCastNullishTypeParam = (expr, fragment, context, expectedType) => {
44
+ if (!expectedType)
45
+ return [fragment, context];
46
+ if (!expr.inferredType)
47
+ return [fragment, context];
48
+ const expectedTypeParam = getBareTypeParameterName(expectedType, context);
49
+ if (!expectedTypeParam)
50
+ return [fragment, context];
51
+ const unionTypeParam = getUnconstrainedNullishTypeParamName(expr.inferredType, context);
52
+ if (!unionTypeParam)
53
+ return [fragment, context];
54
+ if (unionTypeParam !== expectedTypeParam)
55
+ return [fragment, context];
56
+ const [typeName, newContext] = emitType(expectedType, context);
57
+ return [{ text: `(${typeName})${fragment.text}` }, newContext];
58
+ };
59
+ const getNullableUnionBaseType = (type) => {
60
+ if (type.kind !== "unionType")
61
+ return undefined;
62
+ const nonNullTypes = type.types.filter((t) => !(t.kind === "primitiveType" &&
63
+ (t.name === "null" || t.name === "undefined")));
64
+ if (nonNullTypes.length !== 1)
65
+ return undefined;
66
+ return nonNullTypes[0];
67
+ };
68
+ const isNonNullableValueType = (type) => {
69
+ if (type.kind === "primitiveType") {
70
+ return (type.name === "number" ||
71
+ type.name === "int" ||
72
+ type.name === "boolean" ||
73
+ type.name === "char");
74
+ }
75
+ if (type.kind === "referenceType") {
76
+ // C# primitive aliases represented as reference types via @tsonic/core.
77
+ // Keep this list strict — we only unwrap when `.Value` exists.
78
+ return (type.name === "sbyte" ||
79
+ type.name === "short" ||
80
+ type.name === "int" ||
81
+ type.name === "long" ||
82
+ type.name === "nint" ||
83
+ type.name === "int128" ||
84
+ type.name === "byte" ||
85
+ type.name === "ushort" ||
86
+ type.name === "uint" ||
87
+ type.name === "ulong" ||
88
+ type.name === "nuint" ||
89
+ type.name === "uint128" ||
90
+ type.name === "half" ||
91
+ type.name === "float" ||
92
+ type.name === "double" ||
93
+ type.name === "decimal" ||
94
+ type.name === "bool" ||
95
+ type.name === "char");
96
+ }
97
+ return false;
98
+ };
99
+ const isSameTypeForNullableUnwrap = (base, expected) => {
100
+ if (base.kind !== expected.kind)
101
+ return false;
102
+ if (base.kind === "primitiveType" && expected.kind === "primitiveType") {
103
+ return base.name === expected.name;
104
+ }
105
+ if (base.kind === "referenceType" && expected.kind === "referenceType") {
106
+ // This unwrap is only for Nullable<T> value types, so keep matching strict.
107
+ return (base.name === expected.name &&
108
+ (base.typeArguments?.length ?? 0) === 0 &&
109
+ (expected.typeArguments?.length ?? 0) === 0);
110
+ }
111
+ return false;
112
+ };
113
+ const maybeUnwrapNullableValueType = (expr, fragment, context, expectedType) => {
114
+ if (!expectedType)
115
+ return [fragment, context];
116
+ if (!expr.inferredType)
117
+ return [fragment, context];
118
+ // Only unwrap direct nullable values. For composite expressions (e.g. `a ?? b`)
119
+ // C# nullish coalescing already produces a non-nullable result when the
120
+ // fallback is non-nullable, so adding `.Value` is incorrect.
121
+ if (expr.kind !== "identifier" && expr.kind !== "memberAccess") {
122
+ return [fragment, context];
123
+ }
124
+ // If a narrowing pass already rewrote this identifier (e.g., `id` → `id.Value`
125
+ // or `id` → `id__n`), don't apply a second Nullable<T> unwrap.
126
+ if (expr.kind === "identifier" &&
127
+ (context.narrowedBindings?.has(expr.name) ?? false)) {
128
+ return [fragment, context];
129
+ }
130
+ const nullableBase = getNullableUnionBaseType(expr.inferredType);
131
+ if (!nullableBase)
132
+ return [fragment, context];
133
+ // Only unwrap when the expected type is a non-nullable value type and
134
+ // the expression is a nullable union of that exact base type.
135
+ if (!isNonNullableValueType(expectedType))
136
+ return [fragment, context];
137
+ if (!isSameTypeForNullableUnwrap(nullableBase, expectedType)) {
138
+ return [fragment, context];
139
+ }
140
+ const needsParens = expr.kind !== "identifier" && expr.kind !== "memberAccess";
141
+ const inner = needsParens ? `(${fragment.text})` : fragment.text;
142
+ return [{ text: `${inner}.Value` }, context];
143
+ };
15
144
  /**
16
145
  * Emit a numeric narrowing expression.
17
146
  *
@@ -33,22 +162,13 @@ const emitNumericNarrowing = (expr, context) => {
33
162
  );
34
163
  return [innerCode, newContext];
35
164
  }
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];
165
+ // Numeric narrowings represent explicit user intent (`x as int`, `x as long`).
166
+ // Even when the conversion is proven sound, C# generic inference can become
167
+ // ambiguous without an explicit cast (e.g., choosing between `int` and `long`).
168
+ const [innerCode, ctx1] = emitExpression(expr.expression, context);
169
+ const [typeName, ctx2] = emitType(expr.inferredType, ctx1);
170
+ const operandText = formatCastOperandText(expr.expression, innerCode.text);
171
+ return [{ text: `(${typeName})${operandText}` }, ctx2];
52
172
  }
53
173
  // HARD GATE: No proof means the proof pass failed to catch an unprovable narrowing.
54
174
  // This is an internal compiler error - the proof pass should have aborted compilation.
@@ -65,20 +185,77 @@ const emitNumericNarrowing = (expr, context) => {
65
185
  * This is a checked cast that throws InvalidCastException on failure.
66
186
  */
67
187
  const emitTypeAssertion = (expr, context) => {
68
- const [innerCode, ctx1] = emitExpression(expr.expression, context);
69
- const [typeName, ctx2] = emitType(expr.targetType, ctx1);
70
- return [{ text: `(${typeName})${innerCode.text}` }, ctx2];
188
+ const [innerCode, ctx1] = emitExpression(expr.expression, context, expr.targetType);
189
+ const resolveRuntimeCastTarget = (target, ctx) => {
190
+ // 1) Resolve local type aliases for runtime casting.
191
+ // TypeScript type aliases have no runtime representation in C#, except for
192
+ // object-literal aliases which we synthesize as classes (`Foo__Alias`).
193
+ if (target.kind === "referenceType" && ctx.localTypes) {
194
+ const typeInfo = ctx.localTypes.get(target.name);
195
+ if (typeInfo?.kind === "typeAlias") {
196
+ if (typeInfo.type.kind !== "objectType") {
197
+ const substituted = target.typeArguments && target.typeArguments.length > 0
198
+ ? substituteTypeArgs(typeInfo.type, typeInfo.typeParameters, target.typeArguments)
199
+ : typeInfo.type;
200
+ return resolveRuntimeCastTarget(substituted, ctx);
201
+ }
202
+ // objectType aliases are emitted as `Name__Alias` by emitReferenceType
203
+ return target;
204
+ }
205
+ }
206
+ // 2) Erase tsbindgen extension-method wrapper types at runtime:
207
+ // ExtensionMethods<TShape> is type-only; values are just TShape.
208
+ if (target.kind === "referenceType" && target.typeArguments?.length) {
209
+ const importBinding = ctx.importBindings?.get(target.name);
210
+ const clrName = importBinding?.kind === "type" ? importBinding.clrName : "";
211
+ if (clrName.endsWith(".ExtensionMethods")) {
212
+ const shape = target.typeArguments[0];
213
+ if (shape)
214
+ return resolveRuntimeCastTarget(shape, ctx);
215
+ }
216
+ }
217
+ // 3) Intersection types have no C# cast target; cast to the first runtime-like constituent.
218
+ if (target.kind === "intersectionType") {
219
+ for (const part of target.types) {
220
+ const resolved = resolveRuntimeCastTarget(part, ctx);
221
+ if (resolved.kind !== "intersectionType" && resolved.kind !== "objectType") {
222
+ return resolved;
223
+ }
224
+ }
225
+ const fallback = target.types[0];
226
+ return fallback ? resolveRuntimeCastTarget(fallback, ctx) : target;
227
+ }
228
+ return target;
229
+ };
230
+ const runtimeTarget = resolveRuntimeCastTarget(expr.targetType, ctx1);
231
+ const [typeName, ctx2] = emitType(runtimeTarget, ctx1);
232
+ const operandText = formatCastOperandText(expr.expression, innerCode.text);
233
+ return [{ text: `(${typeName})${operandText}` }, ctx2];
71
234
  };
72
235
  /**
73
- * Emit a tryCast expression.
236
+ * Emit a trycast expression.
74
237
  *
75
- * TypeScript `tryCast<T>(x)` becomes C# `x as T` (safe cast).
238
+ * TypeScript `trycast<T>(x)` becomes C# `x as T` (safe cast).
76
239
  * This returns null if the cast fails instead of throwing.
77
240
  */
78
241
  const emitTryCast = (expr, context) => {
79
242
  const [innerCode, ctx1] = emitExpression(expr.expression, context);
80
243
  const [typeName, ctx2] = emitType(expr.targetType, ctx1);
81
- return [{ text: `${innerCode.text} as ${typeName}` }, ctx2];
244
+ const operandText = formatCastOperandText(expr.expression, innerCode.text);
245
+ return [{ text: `${operandText} as ${typeName}` }, ctx2];
246
+ };
247
+ /**
248
+ * Emit a stackalloc expression.
249
+ *
250
+ * TypeScript `stackalloc<T>(n)` becomes C# `stackalloc T[n]`.
251
+ */
252
+ const emitStackAlloc = (expr, context) => {
253
+ const [elementTypeName, ctx1] = emitType(expr.elementType, context);
254
+ const [sizeFrag, ctx2] = emitExpression(expr.size, ctx1, {
255
+ kind: "primitiveType",
256
+ name: "int",
257
+ });
258
+ return [{ text: `stackalloc ${elementTypeName}[${sizeFrag.text}]` }, ctx2];
82
259
  };
83
260
  /**
84
261
  * Emit a C# expression from an IR expression
@@ -87,57 +264,62 @@ const emitTryCast = (expr, context) => {
87
264
  * @param expectedType Optional expected type for contextual typing (e.g., array element type inference)
88
265
  */
89
266
  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
- }
267
+ const [fragment, newContext] = (() => {
268
+ switch (expr.kind) {
269
+ case "literal":
270
+ // Pass expectedType for null default conversion in generic contexts
271
+ // Numeric literals use raw lexeme (no contextual widening under new spec)
272
+ return emitLiteral(expr, context, expectedType);
273
+ case "identifier":
274
+ return emitIdentifier(expr, context);
275
+ case "array":
276
+ return emitArray(expr, context, expectedType);
277
+ case "object":
278
+ return emitObject(expr, context, expectedType);
279
+ case "memberAccess":
280
+ return emitMemberAccess(expr, context);
281
+ case "call":
282
+ return emitCall(expr, context);
283
+ case "new":
284
+ return emitNew(expr, context);
285
+ case "binary":
286
+ return emitBinary(expr, context, expectedType);
287
+ case "logical":
288
+ return emitLogical(expr, context);
289
+ case "unary":
290
+ return emitUnary(expr, context, expectedType);
291
+ case "update":
292
+ return emitUpdate(expr, context);
293
+ case "assignment":
294
+ return emitAssignment(expr, context);
295
+ case "conditional":
296
+ return emitConditional(expr, context, expectedType);
297
+ case "functionExpression":
298
+ return emitFunctionExpression(expr, context);
299
+ case "arrowFunction":
300
+ return emitArrowFunction(expr, context);
301
+ case "templateLiteral":
302
+ return emitTemplateLiteral(expr, context);
303
+ case "spread":
304
+ return emitSpread(expr, context);
305
+ case "await":
306
+ return emitAwait(expr, context);
307
+ case "this":
308
+ return [{ text: "this" }, context];
309
+ case "numericNarrowing":
310
+ return emitNumericNarrowing(expr, context);
311
+ case "typeAssertion":
312
+ return emitTypeAssertion(expr, context);
313
+ case "trycast":
314
+ return emitTryCast(expr, context);
315
+ case "stackalloc":
316
+ return emitStackAlloc(expr, context);
317
+ default:
318
+ throw new Error(`Unhandled IR expression kind: ${String(expr.kind)}`);
319
+ }
320
+ })();
321
+ const [castedFrag, castedContext] = maybeCastNullishTypeParam(expr, fragment, newContext, expectedType);
322
+ return maybeUnwrapNullableValueType(expr, castedFrag, castedContext, expectedType);
141
323
  };
142
324
  // Re-export commonly used functions for backward compatibility
143
325
  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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"}
@@ -3,10 +3,12 @@
3
3
  */
4
4
  import { IrExpression } from "@tsonic/frontend";
5
5
  import { EmitterContext, CSharpFragment } from "../types.js";
6
+ type MemberAccessUsage = "value" | "call";
6
7
  /**
7
8
  * Emit a member access expression (dot notation or bracket notation)
8
9
  */
9
10
  export declare const emitMemberAccess: (expr: Extract<IrExpression, {
10
11
  kind: "memberAccess";
11
- }>, context: EmitterContext) => [CSharpFragment, EmitterContext];
12
+ }>, context: EmitterContext, usage?: MemberAccessUsage) => [CSharpFragment, EmitterContext];
13
+ export {};
12
14
  //# sourceMappingURL=access.d.ts.map
@@ -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;AA2D7D,KAAK,iBAAiB,GAAG,OAAO,GAAG,MAAM,CAAC;AAqM1C;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAC3B,MAAM,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,CAAC,EACrD,SAAS,cAAc,EACvB,QAAO,iBAA2B,KACjC,CAAC,cAAc,EAAE,cAAc,CAoMjC,CAAC"}