@tsonic/emitter 0.0.72 → 0.0.74

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 (207) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/adapter-generator.d.ts.map +1 -1
  3. package/dist/adapter-generator.js +2 -1
  4. package/dist/adapter-generator.js.map +1 -1
  5. package/dist/constants.d.ts +3 -2
  6. package/dist/constants.d.ts.map +1 -1
  7. package/dist/constants.js +15 -6
  8. package/dist/constants.js.map +1 -1
  9. package/dist/core/format/attributes.d.ts.map +1 -1
  10. package/dist/core/format/attributes.js +5 -56
  11. package/dist/core/format/attributes.js.map +1 -1
  12. package/dist/core/format/attributes.test.js +1 -1
  13. package/dist/core/format/attributes.test.js.map +1 -1
  14. package/dist/core/format/backend-ast/builders.d.ts +13 -0
  15. package/dist/core/format/backend-ast/builders.d.ts.map +1 -0
  16. package/dist/core/format/backend-ast/builders.js +169 -0
  17. package/dist/core/format/backend-ast/builders.js.map +1 -0
  18. package/dist/core/format/backend-ast/builders.test.d.ts +2 -0
  19. package/dist/core/format/backend-ast/builders.test.d.ts.map +1 -0
  20. package/dist/core/format/backend-ast/builders.test.js +258 -0
  21. package/dist/core/format/backend-ast/builders.test.js.map +1 -0
  22. package/dist/core/format/backend-ast/index.d.ts +3 -2
  23. package/dist/core/format/backend-ast/index.d.ts.map +1 -1
  24. package/dist/core/format/backend-ast/index.js +2 -1
  25. package/dist/core/format/backend-ast/index.js.map +1 -1
  26. package/dist/core/format/backend-ast/invariants.test.d.ts +2 -0
  27. package/dist/core/format/backend-ast/invariants.test.d.ts.map +1 -0
  28. package/dist/core/format/backend-ast/invariants.test.js +72 -0
  29. package/dist/core/format/backend-ast/invariants.test.js.map +1 -0
  30. package/dist/core/format/backend-ast/printer.d.ts +1 -1
  31. package/dist/core/format/backend-ast/printer.d.ts.map +1 -1
  32. package/dist/core/format/backend-ast/printer.js +362 -119
  33. package/dist/core/format/backend-ast/printer.js.map +1 -1
  34. package/dist/core/format/backend-ast/printer.test.d.ts +2 -0
  35. package/dist/core/format/backend-ast/printer.test.d.ts.map +1 -0
  36. package/dist/core/format/backend-ast/printer.test.js +796 -0
  37. package/dist/core/format/backend-ast/printer.test.js.map +1 -0
  38. package/dist/core/format/backend-ast/types.d.ts +66 -14
  39. package/dist/core/format/backend-ast/types.d.ts.map +1 -1
  40. package/dist/core/format/backend-ast/utils.d.ts +12 -8
  41. package/dist/core/format/backend-ast/utils.d.ts.map +1 -1
  42. package/dist/core/format/backend-ast/utils.js +222 -19
  43. package/dist/core/format/backend-ast/utils.js.map +1 -1
  44. package/dist/core/format/backend-ast/utils.test.d.ts +2 -0
  45. package/dist/core/format/backend-ast/utils.test.d.ts.map +1 -0
  46. package/dist/core/format/backend-ast/utils.test.js +142 -0
  47. package/dist/core/format/backend-ast/utils.test.js.map +1 -0
  48. package/dist/core/format/module-emitter/assembly.d.ts +2 -2
  49. package/dist/core/format/module-emitter/assembly.d.ts.map +1 -1
  50. package/dist/core/format/module-emitter/assembly.js +7 -3
  51. package/dist/core/format/module-emitter/assembly.js.map +1 -1
  52. package/dist/core/format/module-emitter/header.d.ts +2 -1
  53. package/dist/core/format/module-emitter/header.d.ts.map +1 -1
  54. package/dist/core/format/module-emitter/header.js +2 -2
  55. package/dist/core/format/module-emitter/header.js.map +1 -1
  56. package/dist/core/format/module-emitter/orchestrator.js +1 -1
  57. package/dist/core/format/module-emitter/orchestrator.js.map +1 -1
  58. package/dist/core/format/module-emitter/static-container.d.ts.map +1 -1
  59. package/dist/core/format/module-emitter/static-container.js +3 -5
  60. package/dist/core/format/module-emitter/static-container.js.map +1 -1
  61. package/dist/core/module-emitter.test.js +1 -0
  62. package/dist/core/module-emitter.test.js.map +1 -1
  63. package/dist/core/semantic/boolean-context.d.ts.map +1 -1
  64. package/dist/core/semantic/boolean-context.js +45 -49
  65. package/dist/core/semantic/boolean-context.js.map +1 -1
  66. package/dist/core/semantic/imports.d.ts.map +1 -1
  67. package/dist/core/semantic/imports.js +25 -15
  68. package/dist/core/semantic/imports.js.map +1 -1
  69. package/dist/core/semantic/imports.test.js +43 -0
  70. package/dist/core/semantic/imports.test.js.map +1 -1
  71. package/dist/core/semantic/type-resolution.d.ts +1 -0
  72. package/dist/core/semantic/type-resolution.d.ts.map +1 -1
  73. package/dist/core/semantic/type-resolution.js +166 -5
  74. package/dist/core/semantic/type-resolution.js.map +1 -1
  75. package/dist/core/semantic/type-resolution.test.js +35 -0
  76. package/dist/core/semantic/type-resolution.test.js.map +1 -1
  77. package/dist/emitter-types/core.d.ts +24 -10
  78. package/dist/emitter-types/core.d.ts.map +1 -1
  79. package/dist/emitter.d.ts.map +1 -1
  80. package/dist/emitter.js +124 -44
  81. package/dist/emitter.js.map +1 -1
  82. package/dist/expression-emitter.d.ts.map +1 -1
  83. package/dist/expression-emitter.js +797 -17
  84. package/dist/expression-emitter.js.map +1 -1
  85. package/dist/expressions/access.d.ts.map +1 -1
  86. package/dist/expressions/access.js +65 -25
  87. package/dist/expressions/access.js.map +1 -1
  88. package/dist/expressions/calls/call-analysis.d.ts +0 -10
  89. package/dist/expressions/calls/call-analysis.d.ts.map +1 -1
  90. package/dist/expressions/calls/call-analysis.js +3 -62
  91. package/dist/expressions/calls/call-analysis.js.map +1 -1
  92. package/dist/expressions/calls/call-emitter.d.ts.map +1 -1
  93. package/dist/expressions/calls/call-emitter.js +97 -196
  94. package/dist/expressions/calls/call-emitter.js.map +1 -1
  95. package/dist/expressions/calls/new-emitter.d.ts.map +1 -1
  96. package/dist/expressions/calls/new-emitter.js +36 -69
  97. package/dist/expressions/calls/new-emitter.js.map +1 -1
  98. package/dist/expressions/collections.d.ts +3 -0
  99. package/dist/expressions/collections.d.ts.map +1 -1
  100. package/dist/expressions/collections.js +238 -57
  101. package/dist/expressions/collections.js.map +1 -1
  102. package/dist/expressions/functions.d.ts.map +1 -1
  103. package/dist/expressions/functions.js +1 -7
  104. package/dist/expressions/functions.js.map +1 -1
  105. package/dist/expressions/identifiers.d.ts.map +1 -1
  106. package/dist/expressions/identifiers.js +24 -38
  107. package/dist/expressions/identifiers.js.map +1 -1
  108. package/dist/expressions/index.test.js +245 -0
  109. package/dist/expressions/index.test.js.map +1 -1
  110. package/dist/expressions/literals.d.ts.map +1 -1
  111. package/dist/expressions/literals.js +9 -41
  112. package/dist/expressions/literals.js.map +1 -1
  113. package/dist/expressions/operators/assignment-emitter.d.ts.map +1 -1
  114. package/dist/expressions/operators/assignment-emitter.js +2 -6
  115. package/dist/expressions/operators/assignment-emitter.js.map +1 -1
  116. package/dist/expressions/operators/binary-emitter.d.ts.map +1 -1
  117. package/dist/expressions/operators/binary-emitter.js +102 -77
  118. package/dist/expressions/operators/binary-emitter.js.map +1 -1
  119. package/dist/expressions/operators/logical-emitter.d.ts.map +1 -1
  120. package/dist/expressions/operators/logical-emitter.js +1 -3
  121. package/dist/expressions/operators/logical-emitter.js.map +1 -1
  122. package/dist/expressions/operators/unary-emitter.d.ts.map +1 -1
  123. package/dist/expressions/operators/unary-emitter.js +9 -20
  124. package/dist/expressions/operators/unary-emitter.js.map +1 -1
  125. package/dist/expressions/other.d.ts.map +1 -1
  126. package/dist/expressions/other.js +57 -4
  127. package/dist/expressions/other.js.map +1 -1
  128. package/dist/generator-exchange.d.ts.map +1 -1
  129. package/dist/generator-exchange.js +3 -2
  130. package/dist/generator-exchange.js.map +1 -1
  131. package/dist/generator-wrapper.d.ts.map +1 -1
  132. package/dist/generator-wrapper.js +27 -56
  133. package/dist/generator-wrapper.js.map +1 -1
  134. package/dist/integration.test.js +393 -5
  135. package/dist/integration.test.js.map +1 -1
  136. package/dist/json-aot-generic.test.js +3 -0
  137. package/dist/json-aot-generic.test.js.map +1 -1
  138. package/dist/patterns.d.ts.map +1 -1
  139. package/dist/patterns.js +19 -40
  140. package/dist/patterns.js.map +1 -1
  141. package/dist/specialization/type-aliases.test.js +8 -0
  142. package/dist/specialization/type-aliases.test.js.map +1 -1
  143. package/dist/statements/classes/members/methods.d.ts.map +1 -1
  144. package/dist/statements/classes/members/methods.js +5 -22
  145. package/dist/statements/classes/members/methods.js.map +1 -1
  146. package/dist/statements/classes/parameters.d.ts.map +1 -1
  147. package/dist/statements/classes/parameters.js +2 -1
  148. package/dist/statements/classes/parameters.js.map +1 -1
  149. package/dist/statements/classes/properties.d.ts.map +1 -1
  150. package/dist/statements/classes/properties.js +5 -16
  151. package/dist/statements/classes/properties.js.map +1 -1
  152. package/dist/statements/control/conditionals/guard-analysis.d.ts +44 -1
  153. package/dist/statements/control/conditionals/guard-analysis.d.ts.map +1 -1
  154. package/dist/statements/control/conditionals/guard-analysis.js +301 -125
  155. package/dist/statements/control/conditionals/guard-analysis.js.map +1 -1
  156. package/dist/statements/control/conditionals/if-emitter.d.ts.map +1 -1
  157. package/dist/statements/control/conditionals/if-emitter.js +182 -53
  158. package/dist/statements/control/conditionals/if-emitter.js.map +1 -1
  159. package/dist/statements/control/exceptions.d.ts.map +1 -1
  160. package/dist/statements/control/exceptions.js +2 -4
  161. package/dist/statements/control/exceptions.js.map +1 -1
  162. package/dist/statements/control/loops.d.ts.map +1 -1
  163. package/dist/statements/control/loops.js +3 -5
  164. package/dist/statements/control/loops.js.map +1 -1
  165. package/dist/statements/declarations/classes.d.ts.map +1 -1
  166. package/dist/statements/declarations/classes.js +2 -4
  167. package/dist/statements/declarations/classes.js.map +1 -1
  168. package/dist/statements/declarations/functions.d.ts.map +1 -1
  169. package/dist/statements/declarations/functions.js +38 -79
  170. package/dist/statements/declarations/functions.js.map +1 -1
  171. package/dist/statements/declarations/interfaces-mutable-storage.test.js +10 -2
  172. package/dist/statements/declarations/interfaces-mutable-storage.test.js.map +1 -1
  173. package/dist/statements/declarations/interfaces.d.ts.map +1 -1
  174. package/dist/statements/declarations/interfaces.js +4 -12
  175. package/dist/statements/declarations/interfaces.js.map +1 -1
  176. package/dist/statements/declarations/type-aliases.d.ts.map +1 -1
  177. package/dist/statements/declarations/type-aliases.js +5 -9
  178. package/dist/statements/declarations/type-aliases.js.map +1 -1
  179. package/dist/statements/declarations/variables.d.ts.map +1 -1
  180. package/dist/statements/declarations/variables.js +55 -51
  181. package/dist/statements/declarations/variables.js.map +1 -1
  182. package/dist/statements/index.test.js +1026 -0
  183. package/dist/statements/index.test.js.map +1 -1
  184. package/dist/types/dictionaries.d.ts.map +1 -1
  185. package/dist/types/dictionaries.js +5 -5
  186. package/dist/types/dictionaries.js.map +1 -1
  187. package/dist/types/functions.d.ts.map +1 -1
  188. package/dist/types/functions.js +5 -25
  189. package/dist/types/functions.js.map +1 -1
  190. package/dist/types/primitives.d.ts.map +1 -1
  191. package/dist/types/primitives.js.map +1 -1
  192. package/dist/types/references.d.ts.map +1 -1
  193. package/dist/types/references.js +65 -128
  194. package/dist/types/references.js.map +1 -1
  195. package/dist/types/references.test.js +170 -46
  196. package/dist/types/references.test.js.map +1 -1
  197. package/dist/types/tuples.d.ts.map +1 -1
  198. package/dist/types/tuples.js +7 -17
  199. package/dist/types/tuples.js.map +1 -1
  200. package/dist/types/unions.d.ts.map +1 -1
  201. package/dist/types/unions.js +2 -5
  202. package/dist/types/unions.js.map +1 -1
  203. package/package.json +2 -2
  204. package/dist/expressions/parentheses.d.ts +0 -4
  205. package/dist/expressions/parentheses.d.ts.map +0 -1
  206. package/dist/expressions/parentheses.js +0 -91
  207. package/dist/expressions/parentheses.js.map +0 -1
@@ -3,7 +3,8 @@
3
3
  */
4
4
  import { emitTypeAst } from "../type-emitter.js";
5
5
  import { escapeCSharpIdentifier } from "../emitter-types/index.js";
6
- import { renderTypeAst } from "../core/format/backend-ast/utils.js";
6
+ import { identifierExpression } from "../core/format/backend-ast/builders.js";
7
+ import { stableIdentifierSuffixFromTypeAst } from "../core/format/backend-ast/utils.js";
7
8
  /**
8
9
  * Emit an identifier as CSharpExpressionAst
9
10
  */
@@ -26,7 +27,7 @@ export const emitIdentifier = (expr, context, expectedType) => {
26
27
  // TypeScript `super` maps to C# `base` for member access/calls.
27
28
  // (`super()` constructor calls are handled separately in constructor emission.)
28
29
  if (expr.name === "super") {
29
- return [{ kind: "identifierExpression", identifier: "base" }, context];
30
+ return [identifierExpression("base"), context];
30
31
  }
31
32
  // Narrowing remap for union type guards
32
33
  // - "rename": account -> account__1_3 (if-statements with temp var)
@@ -36,48 +37,45 @@ export const emitIdentifier = (expr, context, expectedType) => {
36
37
  if (narrowed) {
37
38
  if (narrowed.kind === "rename") {
38
39
  return [
39
- {
40
- kind: "identifierExpression",
41
- identifier: escapeCSharpIdentifier(narrowed.name),
42
- },
40
+ identifierExpression(escapeCSharpIdentifier(narrowed.name)),
43
41
  context,
44
42
  ];
45
43
  }
46
- else {
44
+ else if (narrowed.kind === "expr") {
47
45
  // kind === "expr" - emit pre-built AST (e.g., parenthesized AsN() call)
48
46
  return [narrowed.exprAst, context];
49
47
  }
48
+ return [identifierExpression(escapeCSharpIdentifier(expr.name)), context];
50
49
  }
51
50
  }
52
51
  // Lexical remap for locals/parameters (prevents C# CS0136 shadowing errors).
53
52
  const remappedLocal = context.localNameMap?.get(expr.name);
54
53
  if (remappedLocal) {
55
- return [
56
- { kind: "identifierExpression", identifier: remappedLocal },
57
- context,
58
- ];
54
+ return [identifierExpression(remappedLocal), context];
59
55
  }
60
56
  // Check if this identifier is from an import
61
57
  if (context.importBindings) {
62
58
  const binding = context.importBindings.get(expr.name);
63
59
  if (binding) {
64
60
  // Imported identifier - always use fully-qualified reference
65
- // Use pre-computed clrName directly (all resolution done when building binding)
66
- if (binding.member) {
61
+ if (binding.kind === "value") {
67
62
  // Value import with member - Container.member
63
+ return [
64
+ identifierExpression(`${binding.clrName}.${binding.member}`),
65
+ context,
66
+ ];
67
+ }
68
+ if (binding.kind === "type") {
68
69
  return [
69
70
  {
70
- kind: "identifierExpression",
71
- identifier: `${binding.clrName}.${binding.member}`,
71
+ kind: "typeReferenceExpression",
72
+ type: binding.typeAst,
72
73
  },
73
74
  context,
74
75
  ];
75
76
  }
76
- // Type, namespace, or default import - use clrName directly
77
- return [
78
- { kind: "identifierExpression", identifier: binding.clrName },
79
- context,
80
- ];
77
+ // Namespace import - use precomputed container name directly
78
+ return [identifierExpression(binding.clrName), context];
81
79
  }
82
80
  }
83
81
  // Static module members (functions/fields) in the current file's container class.
@@ -88,34 +86,25 @@ export const emitIdentifier = (expr, context, expectedType) => {
88
86
  if (context.moduleStaticClassName &&
89
87
  context.className !== context.moduleStaticClassName) {
90
88
  return [
91
- {
92
- kind: "identifierExpression",
93
- identifier: `${context.moduleStaticClassName}.${memberName}`,
94
- },
89
+ identifierExpression(`${context.moduleStaticClassName}.${memberName}`),
95
90
  context,
96
91
  ];
97
92
  }
98
- return [{ kind: "identifierExpression", identifier: memberName }, context];
93
+ return [identifierExpression(memberName), context];
99
94
  }
100
95
  // Use custom C# name from binding if specified (with global:: prefix)
101
96
  if (expr.csharpName && expr.resolvedAssembly) {
102
97
  const fqn = `global::${expr.resolvedAssembly}.${expr.csharpName}`;
103
- return [{ kind: "identifierExpression", identifier: fqn }, context];
98
+ return [identifierExpression(fqn), context];
104
99
  }
105
100
  // Use resolved binding if available (from binding manifest) with global:: prefix
106
101
  // resolvedClrType is already the full CLR type name, just add global::
107
102
  if (expr.resolvedClrType) {
108
103
  const fqn = `global::${expr.resolvedClrType}`;
109
- return [{ kind: "identifierExpression", identifier: fqn }, context];
104
+ return [identifierExpression(fqn), context];
110
105
  }
111
106
  // Fallback: use identifier as-is (escape C# keywords)
112
- return [
113
- {
114
- kind: "identifierExpression",
115
- identifier: escapeCSharpIdentifier(expr.name),
116
- },
117
- context,
118
- ];
107
+ return [identifierExpression(escapeCSharpIdentifier(expr.name)), context];
119
108
  };
120
109
  /**
121
110
  * Emit type arguments as CSharpTypeAst[]
@@ -160,10 +149,7 @@ export const generateSpecializedName = (baseName, typeArgs, context) => {
160
149
  for (const typeArg of typeArgs) {
161
150
  const [typeAst, newContext] = emitTypeAst(typeArg, currentContext);
162
151
  currentContext = newContext;
163
- const typeName = renderTypeAst(typeAst);
164
- // Sanitize type name for use in identifier (remove <>, ?, etc.)
165
- const sanitized = typeName.replace(/[<>?,\s]/g, "_").replace(/\./g, "_");
166
- typeNames.push(sanitized);
152
+ typeNames.push(stableIdentifierSuffixFromTypeAst(typeAst));
167
153
  }
168
154
  const specializedName = `${baseName}__${typeNames.join("__")}`;
169
155
  return [specializedName, currentContext];
@@ -1 +1 @@
1
- {"version":3,"file":"identifiers.js","sourceRoot":"","sources":["../../src/expressions/identifiers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"identifiers.js","sourceRoot":"","sources":["../../src/expressions/identifiers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,iCAAiC,EAAE,MAAM,qCAAqC,CAAC;AAMxF;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,IAAmD,EACnD,OAAuB,EACvB,YAAqB,EACkB,EAAE;IACzC,wCAAwC;IACxC,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC9B,IACE,YAAY,EAAE,IAAI,KAAK,mBAAmB;YAC1C,CAAC,YAAY,EAAE,IAAI,KAAK,eAAe;gBACrC,YAAY,CAAC,IAAI,KAAK,WAAW,CAAC,EACpC,CAAC;YACD,OAAO;gBACL;oBACE,IAAI,EAAE,mBAAmB;oBACzB,IAAI,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,QAAQ,EAAE;iBACpD;gBACD,OAAO;aACR,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,gEAAgE;IAChE,gFAAgF;IAChF,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,OAAO,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,wCAAwC;IACxC,oEAAoE;IACpE,qEAAqE;IACrE,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC/B,OAAO;oBACL,oBAAoB,CAAC,sBAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;oBAC3D,OAAO;iBACR,CAAC;YACJ,CAAC;iBAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACpC,wEAAwE;gBACxE,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACrC,CAAC;YAED,OAAO,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,MAAM,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3D,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,CAAC,oBAAoB,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAED,6CAA6C;IAC7C,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,OAAO,EAAE,CAAC;YACZ,6DAA6D;YAC7D,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC7B,8CAA8C;gBAC9C,OAAO;oBACL,oBAAoB,CAAC,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oBAC5D,OAAO;iBACR,CAAC;YACJ,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC5B,OAAO;oBACL;wBACE,IAAI,EAAE,yBAAyB;wBAC/B,IAAI,EAAE,OAAO,CAAC,OAAO;qBACtB;oBACD,OAAO;iBACR,CAAC;YACJ,CAAC;YACD,6DAA6D;YAC7D,OAAO,CAAC,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,kFAAkF;IAClF,2EAA2E;IAC3E,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,UAAU,GAAG,sBAAsB,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAClE,IACE,OAAO,CAAC,qBAAqB;YAC7B,OAAO,CAAC,SAAS,KAAK,OAAO,CAAC,qBAAqB,EACnD,CAAC;YACD,OAAO;gBACL,oBAAoB,CAAC,GAAG,OAAO,CAAC,qBAAqB,IAAI,UAAU,EAAE,CAAC;gBACtE,OAAO;aACR,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,oBAAoB,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;IAED,sEAAsE;IACtE,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,WAAW,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QAClE,OAAO,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,iFAAiF;IACjF,uEAAuE;IACvE,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,WAAW,IAAI,CAAC,eAAe,EAAE,CAAC;QAC9C,OAAO,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,sDAAsD;IACtD,OAAO,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC5E,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,QAA2B,EAC3B,OAAuB,EACY,EAAE;IACrC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,cAAc,GAAG,OAAO,CAAC;IAC7B,MAAM,QAAQ,GAAoB,EAAE,CAAC;IAErC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,WAAW,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACnE,cAAc,GAAG,UAAU,CAAC;QAC5B,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;AACpC,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,QAA2B,EAC3B,OAAuB,EACqB,EAAE;IAC9C,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,cAAc,GAAG,OAAO,CAAC;IAC7B,MAAM,QAAQ,GAAoB,EAAE,CAAC;IAErC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,WAAW,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACnE,cAAc,GAAG,UAAU,CAAC;QAC5B,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;AACpC,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,QAAgB,EAChB,QAA2B,EAC3B,OAAuB,EACG,EAAE;IAC5B,IAAI,cAAc,GAAG,OAAO,CAAC;IAC7B,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,WAAW,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACnE,cAAc,GAAG,UAAU,CAAC;QAC5B,SAAS,CAAC,IAAI,CAAC,iCAAiC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,eAAe,GAAG,GAAG,QAAQ,KAAK,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC/D,OAAO,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;AAC3C,CAAC,CAAC"}
@@ -1698,6 +1698,48 @@ describe("Expression Emission", () => {
1698
1698
  const result = emitModule(module);
1699
1699
  expect(result).to.include("new global::Tsonic.JSRuntime.JSArray<int>(maybeNums).length");
1700
1700
  });
1701
+ it("should preserve resolved CLR identity for source-bound array element types", () => {
1702
+ const module = {
1703
+ kind: "module",
1704
+ filePath: "/src/test.ts",
1705
+ namespace: "MyApp",
1706
+ className: "test",
1707
+ isStaticContainer: true,
1708
+ imports: [],
1709
+ body: [
1710
+ {
1711
+ kind: "expressionStatement",
1712
+ expression: {
1713
+ kind: "memberAccess",
1714
+ object: {
1715
+ kind: "identifier",
1716
+ name: "attachments",
1717
+ inferredType: {
1718
+ kind: "arrayType",
1719
+ elementType: {
1720
+ kind: "referenceType",
1721
+ name: "Acme.Core.Attachment",
1722
+ resolvedClrType: "Acme.Core.Attachment",
1723
+ },
1724
+ },
1725
+ },
1726
+ property: "length",
1727
+ isComputed: false,
1728
+ isOptional: false,
1729
+ memberBinding: {
1730
+ kind: "property",
1731
+ assembly: "Tsonic.JSRuntime",
1732
+ type: "Tsonic.JSRuntime.JSArray`1",
1733
+ member: "length",
1734
+ },
1735
+ },
1736
+ },
1737
+ ],
1738
+ exports: [],
1739
+ };
1740
+ const result = emitModule(module);
1741
+ expect(result).to.include("new global::Tsonic.JSRuntime.JSArray<global::Acme.Core.Attachment>(attachments).length");
1742
+ });
1701
1743
  it("should emit array wrapper property access for ReadonlyArray receivers", () => {
1702
1744
  const module = {
1703
1745
  kind: "module",
@@ -1766,6 +1808,81 @@ describe("Expression Emission", () => {
1766
1808
  const result = emitModule(module);
1767
1809
  expect(result).to.include("value.length");
1768
1810
  });
1811
+ it("should emit CLR Length for structural array length without member binding", () => {
1812
+ const module = {
1813
+ kind: "module",
1814
+ filePath: "/src/test.ts",
1815
+ namespace: "MyApp",
1816
+ className: "test",
1817
+ isStaticContainer: true,
1818
+ imports: [],
1819
+ body: [
1820
+ {
1821
+ kind: "expressionStatement",
1822
+ expression: {
1823
+ kind: "memberAccess",
1824
+ object: {
1825
+ kind: "identifier",
1826
+ name: "channels",
1827
+ inferredType: {
1828
+ kind: "arrayType",
1829
+ elementType: {
1830
+ kind: "referenceType",
1831
+ name: "Acme.Core.Channel",
1832
+ resolvedClrType: "Acme.Core.Channel",
1833
+ },
1834
+ },
1835
+ },
1836
+ property: "length",
1837
+ isComputed: false,
1838
+ isOptional: false,
1839
+ },
1840
+ },
1841
+ ],
1842
+ exports: [],
1843
+ };
1844
+ const result = emitModule(module);
1845
+ expect(result).to.include("channels.Length");
1846
+ expect(result).to.not.include("channels.length");
1847
+ });
1848
+ it("should emit CLR Count for structural dictionary count without member binding", () => {
1849
+ const module = {
1850
+ kind: "module",
1851
+ filePath: "/src/test.ts",
1852
+ namespace: "MyApp",
1853
+ className: "test",
1854
+ isStaticContainer: true,
1855
+ imports: [],
1856
+ body: [
1857
+ {
1858
+ kind: "expressionStatement",
1859
+ expression: {
1860
+ kind: "memberAccess",
1861
+ object: {
1862
+ kind: "identifier",
1863
+ name: "items",
1864
+ inferredType: {
1865
+ kind: "dictionaryType",
1866
+ keyType: { kind: "primitiveType", name: "string" },
1867
+ valueType: {
1868
+ kind: "referenceType",
1869
+ name: "Acme.Core.Channel",
1870
+ resolvedClrType: "Acme.Core.Channel",
1871
+ },
1872
+ },
1873
+ },
1874
+ property: "Length",
1875
+ isComputed: false,
1876
+ isOptional: false,
1877
+ },
1878
+ },
1879
+ ],
1880
+ exports: [],
1881
+ };
1882
+ const result = emitModule(module);
1883
+ expect(result).to.include("items.Count");
1884
+ expect(result).to.not.include("items.Length");
1885
+ });
1769
1886
  it("should project CLR Union_n member access deterministically", () => {
1770
1887
  const unionReference = {
1771
1888
  kind: "referenceType",
@@ -2344,6 +2461,134 @@ describe("Expression Emission", () => {
2344
2461
  const result = emitModule(module);
2345
2462
  expect(result).to.include("dict.Remove(key);");
2346
2463
  });
2464
+ it("should hard-fail unsupported delete targets instead of emitting comment placeholders", () => {
2465
+ const module = {
2466
+ kind: "module",
2467
+ filePath: "/src/test.ts",
2468
+ namespace: "MyApp",
2469
+ className: "test",
2470
+ isStaticContainer: true,
2471
+ imports: [],
2472
+ body: [
2473
+ {
2474
+ kind: "expressionStatement",
2475
+ expression: {
2476
+ kind: "unary",
2477
+ operator: "delete",
2478
+ expression: {
2479
+ kind: "memberAccess",
2480
+ object: {
2481
+ kind: "identifier",
2482
+ name: "obj",
2483
+ inferredType: { kind: "referenceType", name: "Thing" },
2484
+ },
2485
+ property: "value",
2486
+ isComputed: false,
2487
+ isOptional: false,
2488
+ },
2489
+ },
2490
+ },
2491
+ ],
2492
+ exports: [],
2493
+ };
2494
+ expect(() => emitModule(module)).to.throw("ICE: Unsupported delete target reached emitter");
2495
+ });
2496
+ it("should hard-fail compound destructuring assignments instead of emitting fake identifiers", () => {
2497
+ const module = {
2498
+ kind: "module",
2499
+ filePath: "/src/test.ts",
2500
+ namespace: "MyApp",
2501
+ className: "test",
2502
+ isStaticContainer: true,
2503
+ imports: [],
2504
+ body: [
2505
+ {
2506
+ kind: "expressionStatement",
2507
+ expression: {
2508
+ kind: "assignment",
2509
+ operator: "+=",
2510
+ left: {
2511
+ kind: "arrayPattern",
2512
+ elements: [
2513
+ {
2514
+ pattern: {
2515
+ kind: "identifierPattern",
2516
+ name: "x",
2517
+ },
2518
+ },
2519
+ ],
2520
+ },
2521
+ right: { kind: "literal", value: 1 },
2522
+ },
2523
+ },
2524
+ ],
2525
+ exports: [],
2526
+ };
2527
+ expect(() => emitModule(module)).to.throw("ICE: Compound assignment to array/object destructuring pattern reached emitter");
2528
+ });
2529
+ it("should hard-fail object spreads that reach emission without inferred source types", () => {
2530
+ const module = {
2531
+ kind: "module",
2532
+ filePath: "/src/test.ts",
2533
+ namespace: "MyApp",
2534
+ className: "test",
2535
+ isStaticContainer: true,
2536
+ imports: [],
2537
+ body: [
2538
+ {
2539
+ kind: "interfaceDeclaration",
2540
+ name: "Target",
2541
+ typeParameters: [],
2542
+ extends: [],
2543
+ members: [
2544
+ {
2545
+ kind: "propertySignature",
2546
+ name: "count",
2547
+ type: { kind: "primitiveType", name: "number" },
2548
+ isOptional: false,
2549
+ isReadonly: false,
2550
+ },
2551
+ ],
2552
+ isExported: false,
2553
+ isStruct: false,
2554
+ },
2555
+ {
2556
+ kind: "variableDeclaration",
2557
+ declarationKind: "const",
2558
+ isExported: false,
2559
+ declarations: [
2560
+ {
2561
+ kind: "variableDeclarator",
2562
+ name: { kind: "identifierPattern", name: "value" },
2563
+ type: { kind: "referenceType", name: "Target" },
2564
+ initializer: {
2565
+ kind: "object",
2566
+ hasSpreads: true,
2567
+ inferredType: { kind: "referenceType", name: "Target" },
2568
+ properties: [
2569
+ {
2570
+ kind: "spread",
2571
+ expression: {
2572
+ kind: "identifier",
2573
+ name: "source",
2574
+ },
2575
+ },
2576
+ {
2577
+ kind: "property",
2578
+ key: "count",
2579
+ value: { kind: "literal", value: 1 },
2580
+ shorthand: false,
2581
+ },
2582
+ ],
2583
+ },
2584
+ },
2585
+ ],
2586
+ },
2587
+ ],
2588
+ exports: [],
2589
+ };
2590
+ expect(() => emitModule(module)).to.throw("ICE: Object spread source");
2591
+ });
2347
2592
  it("should infer arrow function return type from inferredType", () => {
2348
2593
  const module = {
2349
2594
  kind: "module",