@tsonic/emitter 0.0.73 → 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 (200) 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 +16 -15
  68. package/dist/core/semantic/imports.js.map +1 -1
  69. package/dist/core/semantic/imports.test.js.map +1 -1
  70. package/dist/core/semantic/type-resolution.js +1 -2
  71. package/dist/core/semantic/type-resolution.js.map +1 -1
  72. package/dist/emitter-types/core.d.ts +19 -10
  73. package/dist/emitter-types/core.d.ts.map +1 -1
  74. package/dist/emitter.d.ts.map +1 -1
  75. package/dist/emitter.js +124 -44
  76. package/dist/emitter.js.map +1 -1
  77. package/dist/expression-emitter.d.ts.map +1 -1
  78. package/dist/expression-emitter.js +24 -43
  79. package/dist/expression-emitter.js.map +1 -1
  80. package/dist/expressions/access.d.ts.map +1 -1
  81. package/dist/expressions/access.js +11 -28
  82. package/dist/expressions/access.js.map +1 -1
  83. package/dist/expressions/calls/call-analysis.d.ts +0 -10
  84. package/dist/expressions/calls/call-analysis.d.ts.map +1 -1
  85. package/dist/expressions/calls/call-analysis.js +3 -62
  86. package/dist/expressions/calls/call-analysis.js.map +1 -1
  87. package/dist/expressions/calls/call-emitter.d.ts.map +1 -1
  88. package/dist/expressions/calls/call-emitter.js +89 -151
  89. package/dist/expressions/calls/call-emitter.js.map +1 -1
  90. package/dist/expressions/calls/new-emitter.d.ts.map +1 -1
  91. package/dist/expressions/calls/new-emitter.js +36 -69
  92. package/dist/expressions/calls/new-emitter.js.map +1 -1
  93. package/dist/expressions/collections.d.ts +3 -0
  94. package/dist/expressions/collections.d.ts.map +1 -1
  95. package/dist/expressions/collections.js +43 -70
  96. package/dist/expressions/collections.js.map +1 -1
  97. package/dist/expressions/functions.d.ts.map +1 -1
  98. package/dist/expressions/functions.js +1 -7
  99. package/dist/expressions/functions.js.map +1 -1
  100. package/dist/expressions/identifiers.d.ts.map +1 -1
  101. package/dist/expressions/identifiers.js +23 -44
  102. package/dist/expressions/identifiers.js.map +1 -1
  103. package/dist/expressions/index.test.js +128 -0
  104. package/dist/expressions/index.test.js.map +1 -1
  105. package/dist/expressions/literals.d.ts.map +1 -1
  106. package/dist/expressions/literals.js +9 -41
  107. package/dist/expressions/literals.js.map +1 -1
  108. package/dist/expressions/operators/assignment-emitter.d.ts.map +1 -1
  109. package/dist/expressions/operators/assignment-emitter.js +2 -6
  110. package/dist/expressions/operators/assignment-emitter.js.map +1 -1
  111. package/dist/expressions/operators/binary-emitter.d.ts.map +1 -1
  112. package/dist/expressions/operators/binary-emitter.js +16 -32
  113. package/dist/expressions/operators/binary-emitter.js.map +1 -1
  114. package/dist/expressions/operators/logical-emitter.d.ts.map +1 -1
  115. package/dist/expressions/operators/logical-emitter.js +1 -3
  116. package/dist/expressions/operators/logical-emitter.js.map +1 -1
  117. package/dist/expressions/operators/unary-emitter.d.ts.map +1 -1
  118. package/dist/expressions/operators/unary-emitter.js +9 -20
  119. package/dist/expressions/operators/unary-emitter.js.map +1 -1
  120. package/dist/expressions/other.d.ts.map +1 -1
  121. package/dist/expressions/other.js +6 -11
  122. package/dist/expressions/other.js.map +1 -1
  123. package/dist/generator-exchange.d.ts.map +1 -1
  124. package/dist/generator-exchange.js +3 -2
  125. package/dist/generator-exchange.js.map +1 -1
  126. package/dist/generator-wrapper.d.ts.map +1 -1
  127. package/dist/generator-wrapper.js +27 -56
  128. package/dist/generator-wrapper.js.map +1 -1
  129. package/dist/integration.test.js +1 -1
  130. package/dist/integration.test.js.map +1 -1
  131. package/dist/json-aot-generic.test.js +3 -0
  132. package/dist/json-aot-generic.test.js.map +1 -1
  133. package/dist/patterns.d.ts.map +1 -1
  134. package/dist/patterns.js +19 -40
  135. package/dist/patterns.js.map +1 -1
  136. package/dist/statements/classes/members/methods.d.ts.map +1 -1
  137. package/dist/statements/classes/members/methods.js +3 -9
  138. package/dist/statements/classes/members/methods.js.map +1 -1
  139. package/dist/statements/classes/parameters.d.ts.map +1 -1
  140. package/dist/statements/classes/parameters.js +2 -1
  141. package/dist/statements/classes/parameters.js.map +1 -1
  142. package/dist/statements/classes/properties.d.ts.map +1 -1
  143. package/dist/statements/classes/properties.js +5 -16
  144. package/dist/statements/classes/properties.js.map +1 -1
  145. package/dist/statements/control/conditionals/guard-analysis.d.ts +2 -1
  146. package/dist/statements/control/conditionals/guard-analysis.d.ts.map +1 -1
  147. package/dist/statements/control/conditionals/guard-analysis.js +19 -6
  148. package/dist/statements/control/conditionals/guard-analysis.js.map +1 -1
  149. package/dist/statements/control/conditionals/if-emitter.d.ts.map +1 -1
  150. package/dist/statements/control/conditionals/if-emitter.js +14 -9
  151. package/dist/statements/control/conditionals/if-emitter.js.map +1 -1
  152. package/dist/statements/control/exceptions.d.ts.map +1 -1
  153. package/dist/statements/control/exceptions.js +2 -4
  154. package/dist/statements/control/exceptions.js.map +1 -1
  155. package/dist/statements/control/loops.d.ts.map +1 -1
  156. package/dist/statements/control/loops.js +3 -5
  157. package/dist/statements/control/loops.js.map +1 -1
  158. package/dist/statements/declarations/classes.d.ts.map +1 -1
  159. package/dist/statements/declarations/classes.js +2 -4
  160. package/dist/statements/declarations/classes.js.map +1 -1
  161. package/dist/statements/declarations/functions.d.ts.map +1 -1
  162. package/dist/statements/declarations/functions.js +36 -66
  163. package/dist/statements/declarations/functions.js.map +1 -1
  164. package/dist/statements/declarations/interfaces-mutable-storage.test.js +10 -2
  165. package/dist/statements/declarations/interfaces-mutable-storage.test.js.map +1 -1
  166. package/dist/statements/declarations/interfaces.d.ts.map +1 -1
  167. package/dist/statements/declarations/interfaces.js +4 -12
  168. package/dist/statements/declarations/interfaces.js.map +1 -1
  169. package/dist/statements/declarations/type-aliases.d.ts.map +1 -1
  170. package/dist/statements/declarations/type-aliases.js +3 -8
  171. package/dist/statements/declarations/type-aliases.js.map +1 -1
  172. package/dist/statements/declarations/variables.d.ts.map +1 -1
  173. package/dist/statements/declarations/variables.js +39 -37
  174. package/dist/statements/declarations/variables.js.map +1 -1
  175. package/dist/statements/index.test.js +94 -8
  176. package/dist/statements/index.test.js.map +1 -1
  177. package/dist/types/dictionaries.d.ts.map +1 -1
  178. package/dist/types/dictionaries.js +5 -5
  179. package/dist/types/dictionaries.js.map +1 -1
  180. package/dist/types/functions.d.ts.map +1 -1
  181. package/dist/types/functions.js +5 -25
  182. package/dist/types/functions.js.map +1 -1
  183. package/dist/types/primitives.d.ts.map +1 -1
  184. package/dist/types/primitives.js.map +1 -1
  185. package/dist/types/references.d.ts.map +1 -1
  186. package/dist/types/references.js +65 -132
  187. package/dist/types/references.js.map +1 -1
  188. package/dist/types/references.test.js +63 -51
  189. package/dist/types/references.test.js.map +1 -1
  190. package/dist/types/tuples.d.ts.map +1 -1
  191. package/dist/types/tuples.js +7 -17
  192. package/dist/types/tuples.js.map +1 -1
  193. package/dist/types/unions.d.ts.map +1 -1
  194. package/dist/types/unions.js +2 -5
  195. package/dist/types/unions.js.map +1 -1
  196. package/package.json +2 -2
  197. package/dist/expressions/parentheses.d.ts +0 -4
  198. package/dist/expressions/parentheses.d.ts.map +0 -1
  199. package/dist/expressions/parentheses.js +0 -91
  200. package/dist/expressions/parentheses.js.map +0 -1
@@ -7,10 +7,11 @@ import { emitTypeArgumentsAst, generateSpecializedName, } from "../identifiers.j
7
7
  import { emitTypeAst } from "../../type-emitter.js";
8
8
  import { emitMemberAccess } from "../access.js";
9
9
  import { isLValue, getPassingModifierFromCast, isJsonSerializerCall, isGlobalJsonCall, isInstanceMemberAccess, shouldEmitFluentExtensionCall, getTypeNamespace, registerJsonAotExpressionTypes, registerJsonAotType, needsIntCast, isPromiseChainMethod, isAsyncWrapperType, } from "./call-analysis.js";
10
- import { extractCalleeNameFromAst } from "../../core/format/backend-ast/utils.js";
10
+ import { extractCalleeNameFromAst, getIdentifierTypeLeafName, } from "../../core/format/backend-ast/utils.js";
11
11
  import { resolveImportPath } from "../../core/semantic/index.js";
12
12
  import { containsTypeParameter } from "../../core/semantic/type-resolution.js";
13
13
  import { allocateLocalName } from "../../core/format/local-names.js";
14
+ import { identifierExpression, identifierType, nullLiteral, stringLiteral, } from "../../core/format/backend-ast/builders.js";
14
15
  /**
15
16
  * Wrap an expression AST with an optional argument modifier (ref/out/in).
16
17
  */
@@ -94,6 +95,9 @@ const captureAssignableArrayTarget = (expr, context) => {
94
95
  kind: "identifierExpression",
95
96
  identifier: indexTemp.emittedName,
96
97
  };
98
+ const indexArgument = receiverAst.arguments[0];
99
+ if (!indexArgument)
100
+ return undefined;
97
101
  return {
98
102
  readExpression: {
99
103
  kind: "elementAccessExpression",
@@ -107,7 +111,7 @@ const captureAssignableArrayTarget = (expr, context) => {
107
111
  },
108
112
  setupStatements: [
109
113
  createVarLocal(objectTemp.emittedName, receiverAst.expression),
110
- createVarLocal(indexTemp.emittedName, receiverAst.arguments[0]),
114
+ createVarLocal(indexTemp.emittedName, indexArgument),
111
115
  ],
112
116
  context: indexTemp.context,
113
117
  };
@@ -199,11 +203,9 @@ const emitArrayMutationInteropCall = (expr, context) => {
199
203
  ...captured.setupStatements,
200
204
  createVarLocal(wrapperTemp.emittedName, {
201
205
  kind: "objectCreationExpression",
202
- type: {
203
- kind: "identifierType",
204
- name: "global::Tsonic.JSRuntime.JSArray",
205
- typeArguments: [elementTypeAst],
206
- },
206
+ type: identifierType("global::Tsonic.JSRuntime.JSArray", [
207
+ elementTypeAst,
208
+ ]),
207
209
  arguments: [captured.readExpression],
208
210
  }),
209
211
  createVarLocal(resultTemp.emittedName, mutationCall),
@@ -280,11 +282,7 @@ const emitArrayWrapperInteropCall = (expr, context) => {
280
282
  }
281
283
  const wrapperAst = {
282
284
  kind: "objectCreationExpression",
283
- type: {
284
- kind: "identifierType",
285
- name: `global::${stripClrGenericArity(bindingType)}`,
286
- typeArguments,
287
- },
285
+ type: identifierType(`global::${stripClrGenericArity(bindingType)}`, typeArguments),
288
286
  arguments: [receiverAst],
289
287
  };
290
288
  const [argAsts, argContext] = emitCallArguments(expr.arguments, expr, currentContext);
@@ -314,20 +312,19 @@ const emitArrayWrapperInteropCall = (expr, context) => {
314
312
  currentContext,
315
313
  ];
316
314
  };
317
- const isTaskTypeAst = (typeAst) => {
318
- if (typeAst.kind !== "identifierType")
319
- return false;
320
- const simple = typeAst.name.includes(".")
321
- ? typeAst.name.slice(typeAst.name.lastIndexOf(".") + 1)
322
- : typeAst.name;
323
- return simple === "Task";
324
- };
315
+ const isTaskTypeAst = (typeAst) => getIdentifierTypeLeafName(typeAst) === "Task";
325
316
  const containsVoidTypeAst = (typeAst) => {
326
317
  if (typeAst.kind === "predefinedType" && typeAst.keyword === "void") {
327
318
  return true;
328
319
  }
329
320
  if (typeAst.kind === "identifierType") {
330
- if (typeAst.name === "void" || typeAst.name.endsWith(".void")) {
321
+ if (typeAst.name === "void") {
322
+ return true;
323
+ }
324
+ return (typeAst.typeArguments ?? []).some((t) => containsVoidTypeAst(t));
325
+ }
326
+ if (typeAst.kind === "qualifiedIdentifierType") {
327
+ if (getIdentifierTypeLeafName(typeAst) === "void") {
331
328
  return true;
332
329
  }
333
330
  return (typeAst.typeArguments ?? []).some((t) => containsVoidTypeAst(t));
@@ -346,9 +343,18 @@ const containsVoidTypeAst = (typeAst) => {
346
343
  }
347
344
  return false;
348
345
  };
349
- const getTaskResultType = (typeAst) => isTaskTypeAst(typeAst) && typeAst.typeArguments?.length === 1
350
- ? typeAst.typeArguments[0]
351
- : undefined;
346
+ const getTaskResultType = (typeAst) => {
347
+ if (!isTaskTypeAst(typeAst)) {
348
+ return undefined;
349
+ }
350
+ if (typeAst.kind !== "identifierType" &&
351
+ typeAst.kind !== "qualifiedIdentifierType") {
352
+ return undefined;
353
+ }
354
+ return typeAst.typeArguments?.length === 1
355
+ ? typeAst.typeArguments[0]
356
+ : undefined;
357
+ };
352
358
  const callbackParameterCount = (callbackExpr) => {
353
359
  if (callbackExpr.kind === "arrowFunction" ||
354
360
  callbackExpr.kind === "functionExpression") {
@@ -442,28 +448,15 @@ const buildDelegateType = (parameterTypes, returnType) => {
442
448
  const isVoidReturn = returnType?.kind === "predefinedType" && returnType.keyword === "void";
443
449
  if (returnType === undefined) {
444
450
  return parameterTypes.length === 0
445
- ? { kind: "identifierType", name: "global::System.Action" }
446
- : {
447
- kind: "identifierType",
448
- name: "global::System.Action",
449
- typeArguments: parameterTypes,
450
- };
451
+ ? identifierType("global::System.Action")
452
+ : identifierType("global::System.Action", parameterTypes);
451
453
  }
452
- if (isVoidReturn ||
453
- (returnType.kind === "identifierType" && returnType.name === "void")) {
454
+ if (isVoidReturn || getIdentifierTypeLeafName(returnType) === "void") {
454
455
  return parameterTypes.length === 0
455
- ? { kind: "identifierType", name: "global::System.Action" }
456
- : {
457
- kind: "identifierType",
458
- name: "global::System.Action",
459
- typeArguments: parameterTypes,
460
- };
456
+ ? identifierType("global::System.Action")
457
+ : identifierType("global::System.Action", parameterTypes);
461
458
  }
462
- return {
463
- kind: "identifierType",
464
- name: "global::System.Func",
465
- typeArguments: [...parameterTypes, returnType],
466
- };
459
+ return identifierType("global::System.Func", [...parameterTypes, returnType]);
467
460
  };
468
461
  const isVoidOrUnknownIrType = (type) => type === undefined ||
469
462
  type.kind === "voidType" ||
@@ -571,8 +564,8 @@ const emitFunctionValueCallArguments = (args, signature, expr, context) => {
571
564
  ? parameter.type.elementType
572
565
  : undefined;
573
566
  let elementTypeAst = {
574
- kind: "identifierType",
575
- name: "object",
567
+ kind: "predefinedType",
568
+ keyword: "object",
576
569
  };
577
570
  if (restElementType) {
578
571
  const [emittedType, typeCtx] = emitTypeAst(restElementType, currentContext);
@@ -729,8 +722,7 @@ const emitFlattenedRestArguments = (restArgs, restElementType, context) => {
729
722
  {
730
723
  kind: "invocationExpression",
731
724
  expression: {
732
- kind: "identifierExpression",
733
- identifier: "global::System.Array.Empty",
725
+ ...identifierExpression("global::System.Array.Empty"),
734
726
  },
735
727
  typeArguments: [elementTypeAst],
736
728
  arguments: [],
@@ -739,15 +731,30 @@ const emitFlattenedRestArguments = (restArgs, restElementType, context) => {
739
731
  currentContext,
740
732
  ];
741
733
  }
742
- let concatAst = segments[0];
734
+ const firstSegment = segments[0];
735
+ if (!firstSegment) {
736
+ return [
737
+ [
738
+ {
739
+ kind: "arrayCreationExpression",
740
+ elementType: elementTypeAst,
741
+ initializer: [],
742
+ },
743
+ ],
744
+ currentContext,
745
+ ];
746
+ }
747
+ let concatAst = firstSegment;
743
748
  for (let index = 1; index < segments.length; index++) {
749
+ const segment = segments[index];
750
+ if (!segment)
751
+ continue;
744
752
  concatAst = {
745
753
  kind: "invocationExpression",
746
754
  expression: {
747
- kind: "identifierExpression",
748
- identifier: "global::System.Linq.Enumerable.Concat",
755
+ ...identifierExpression("global::System.Linq.Enumerable.Concat"),
749
756
  },
750
- arguments: [concatAst, segments[index]],
757
+ arguments: [concatAst, segment],
751
758
  };
752
759
  }
753
760
  return [
@@ -755,8 +762,7 @@ const emitFlattenedRestArguments = (restArgs, restElementType, context) => {
755
762
  {
756
763
  kind: "invocationExpression",
757
764
  expression: {
758
- kind: "identifierExpression",
759
- identifier: "global::System.Linq.Enumerable.ToArray",
765
+ ...identifierExpression("global::System.Linq.Enumerable.ToArray"),
760
766
  },
761
767
  arguments: [concatAst],
762
768
  },
@@ -849,25 +855,15 @@ const mergePromiseChainResultIrTypes = (...types) => {
849
855
  };
850
856
  };
851
857
  const buildTaskTypeAst = (resultType) => resultType
852
- ? {
853
- kind: "identifierType",
854
- name: "global::System.Threading.Tasks.Task",
855
- typeArguments: [resultType],
856
- }
857
- : {
858
- kind: "identifierType",
859
- name: "global::System.Threading.Tasks.Task",
860
- };
858
+ ? identifierType("global::System.Threading.Tasks.Task", [resultType])
859
+ : identifierType("global::System.Threading.Tasks.Task");
861
860
  const buildTaskRunInvocation = (outputTaskType, body, isAsync) => {
862
861
  const resultType = getTaskResultType(outputTaskType);
863
862
  return {
864
863
  kind: "invocationExpression",
865
864
  expression: {
866
865
  kind: "memberAccessExpression",
867
- expression: {
868
- kind: "identifierExpression",
869
- identifier: "global::System.Threading.Tasks.Task",
870
- },
866
+ expression: identifierExpression("global::System.Threading.Tasks.Task"),
871
867
  memberName: "Run",
872
868
  },
873
869
  arguments: [
@@ -883,35 +879,22 @@ const buildTaskRunInvocation = (outputTaskType, body, isAsync) => {
883
879
  };
884
880
  const buildCompletedTaskAst = () => ({
885
881
  kind: "memberAccessExpression",
886
- expression: {
887
- kind: "identifierExpression",
888
- identifier: "global::System.Threading.Tasks.Task",
889
- },
882
+ expression: identifierExpression("global::System.Threading.Tasks.Task"),
890
883
  memberName: "CompletedTask",
891
884
  });
892
885
  const buildPromiseRejectedExceptionAst = (reasonAst) => {
893
- const reasonExpr = reasonAst ??
894
- {
895
- kind: "literalExpression",
896
- text: "null",
897
- };
886
+ const reasonExpr = reasonAst ?? nullLiteral();
898
887
  return {
899
888
  kind: "binaryExpression",
900
889
  operatorToken: "??",
901
890
  left: {
902
891
  kind: "asExpression",
903
892
  expression: reasonExpr,
904
- type: {
905
- kind: "identifierType",
906
- name: "global::System.Exception",
907
- },
893
+ type: identifierType("global::System.Exception"),
908
894
  },
909
895
  right: {
910
896
  kind: "objectCreationExpression",
911
- type: {
912
- kind: "identifierType",
913
- name: "global::System.Exception",
914
- },
897
+ type: identifierType("global::System.Exception"),
915
898
  arguments: [
916
899
  {
917
900
  kind: "binaryExpression",
@@ -926,8 +909,7 @@ const buildPromiseRejectedExceptionAst = (reasonAst) => {
926
909
  arguments: [],
927
910
  },
928
911
  right: {
929
- kind: "literalExpression",
930
- text: '"Promise rejected"',
912
+ ...stringLiteral("Promise rejected"),
931
913
  },
932
914
  },
933
915
  ],
@@ -1063,10 +1045,7 @@ const emitPromiseNormalizedTaskAst = (valueAst, valueType, resultTypeAst, contex
1063
1045
  kind: "invocationExpression",
1064
1046
  expression: {
1065
1047
  kind: "memberAccessExpression",
1066
- expression: {
1067
- kind: "identifierExpression",
1068
- identifier: "global::System.Threading.Tasks.Task",
1069
- },
1048
+ expression: identifierExpression("global::System.Threading.Tasks.Task"),
1070
1049
  memberName: "FromResult",
1071
1050
  },
1072
1051
  typeArguments: [resultTypeAst],
@@ -1108,10 +1087,7 @@ const emitPromiseStaticCall = (expr, context) => {
1108
1087
  kind: "invocationExpression",
1109
1088
  expression: {
1110
1089
  kind: "memberAccessExpression",
1111
- expression: {
1112
- kind: "identifierExpression",
1113
- identifier: "global::System.Threading.Tasks.Task",
1114
- },
1090
+ expression: identifierExpression("global::System.Threading.Tasks.Task"),
1115
1091
  memberName: "FromException",
1116
1092
  },
1117
1093
  typeArguments: outputResultType ? [outputResultType] : undefined,
@@ -1140,10 +1116,7 @@ const emitPromiseStaticCall = (expr, context) => {
1140
1116
  currentContext = normalizedTaskContext;
1141
1117
  normalizedValuesAst = {
1142
1118
  kind: "invocationExpression",
1143
- expression: {
1144
- kind: "identifierExpression",
1145
- identifier: "global::System.Linq.Enumerable.Select",
1146
- },
1119
+ expression: identifierExpression("global::System.Linq.Enumerable.Select"),
1147
1120
  arguments: [
1148
1121
  valuesAst,
1149
1122
  {
@@ -1166,10 +1139,7 @@ const emitPromiseStaticCall = (expr, context) => {
1166
1139
  kind: "invocationExpression",
1167
1140
  expression: {
1168
1141
  kind: "memberAccessExpression",
1169
- expression: {
1170
- kind: "identifierExpression",
1171
- identifier: "global::System.Threading.Tasks.Task",
1172
- },
1142
+ expression: identifierExpression("global::System.Threading.Tasks.Task"),
1173
1143
  memberName: "WhenAll",
1174
1144
  },
1175
1145
  arguments: [normalizedValuesAst],
@@ -1181,10 +1151,7 @@ const emitPromiseStaticCall = (expr, context) => {
1181
1151
  kind: "invocationExpression",
1182
1152
  expression: {
1183
1153
  kind: "memberAccessExpression",
1184
- expression: {
1185
- kind: "identifierExpression",
1186
- identifier: "global::System.Threading.Tasks.Task",
1187
- },
1154
+ expression: identifierExpression("global::System.Threading.Tasks.Task"),
1188
1155
  memberName: "WhenAny",
1189
1156
  },
1190
1157
  arguments: [normalizedValuesAst],
@@ -1262,18 +1229,14 @@ const buildDynamicImportContainerType = (targetModule) => {
1262
1229
  const containerName = targetModule.hasTypeCollision
1263
1230
  ? `${targetModule.className}__Module`
1264
1231
  : targetModule.className;
1265
- return {
1266
- kind: "identifierType",
1267
- name: `global::${targetModule.namespace}.${containerName}`,
1268
- };
1232
+ return identifierType(`global::${targetModule.namespace}.${containerName}`);
1269
1233
  };
1270
1234
  const buildRunClassConstructorExpression = (containerType) => ({
1271
1235
  kind: "invocationExpression",
1272
1236
  expression: {
1273
1237
  kind: "memberAccessExpression",
1274
1238
  expression: {
1275
- kind: "identifierExpression",
1276
- identifier: "global::System.Runtime.CompilerServices.RuntimeHelpers",
1239
+ ...identifierExpression("global::System.Runtime.CompilerServices.RuntimeHelpers"),
1277
1240
  },
1278
1241
  memberName: "RunClassConstructor",
1279
1242
  },
@@ -1297,10 +1260,7 @@ const emitDynamicImportCall = (expr, context) => {
1297
1260
  return null;
1298
1261
  const completedTaskExpr = {
1299
1262
  kind: "memberAccessExpression",
1300
- expression: {
1301
- kind: "identifierExpression",
1302
- identifier: "global::System.Threading.Tasks.Task",
1303
- },
1263
+ expression: identifierExpression("global::System.Threading.Tasks.Task"),
1304
1264
  memberName: "CompletedTask",
1305
1265
  };
1306
1266
  const targetModule = resolveDynamicImportTargetModule(specifier, context);
@@ -1315,10 +1275,7 @@ const emitDynamicImportCall = (expr, context) => {
1315
1275
  kind: "invocationExpression",
1316
1276
  expression: {
1317
1277
  kind: "memberAccessExpression",
1318
- expression: {
1319
- kind: "identifierExpression",
1320
- identifier: "global::System.Threading.Tasks.Task",
1321
- },
1278
+ expression: identifierExpression("global::System.Threading.Tasks.Task"),
1322
1279
  memberName: "Run",
1323
1280
  },
1324
1281
  arguments: [
@@ -1347,7 +1304,7 @@ const emitDynamicImportCall = (expr, context) => {
1347
1304
  ? [
1348
1305
  {
1349
1306
  kind: "objectCreationExpression",
1350
- type: { kind: "identifierType", name: "object" },
1307
+ type: { kind: "predefinedType", keyword: "object" },
1351
1308
  arguments: [],
1352
1309
  },
1353
1310
  currentContext,
@@ -1395,10 +1352,9 @@ const emitPromiseThenCatchFinally = (expr, context) => {
1395
1352
  : expr.inferredType;
1396
1353
  const [rawOutputTaskType, outputTaskCtx] = emitTypeAst(outputTypeHint ?? { kind: "referenceType", name: "Task" }, currentContext);
1397
1354
  currentContext = outputTaskCtx;
1398
- const defaultOutputTaskType = isTaskTypeAst(rawOutputTaskType) &&
1399
- rawOutputTaskType.typeArguments?.length === 1 &&
1400
- containsVoidTypeAst(rawOutputTaskType.typeArguments[0])
1401
- ? { kind: "identifierType", name: "global::System.Threading.Tasks.Task" }
1355
+ const rawOutputTaskResultType = getTaskResultType(rawOutputTaskType);
1356
+ const defaultOutputTaskType = rawOutputTaskResultType && containsVoidTypeAst(rawOutputTaskResultType)
1357
+ ? identifierType("global::System.Threading.Tasks.Task")
1402
1358
  : rawOutputTaskType;
1403
1359
  const [sourceTaskType, sourceTaskCtx] = emitTypeAst(expr.callee.object.inferredType ?? { kind: "referenceType", name: "Task" }, currentContext);
1404
1360
  currentContext = sourceTaskCtx;
@@ -1471,7 +1427,7 @@ const emitPromiseThenCatchFinally = (expr, context) => {
1471
1427
  : {
1472
1428
  kind: "localDeclarationStatement",
1473
1429
  modifiers: [],
1474
- type: { kind: "identifierType", name: "var" },
1430
+ type: { kind: "varType" },
1475
1431
  declarators: [
1476
1432
  {
1477
1433
  name: valueIdent,
@@ -1579,7 +1535,7 @@ const emitPromiseThenCatchFinally = (expr, context) => {
1579
1535
  const callbackCallee = rejectedAst.kind === "lambdaExpression"
1580
1536
  ? {
1581
1537
  kind: "castExpression",
1582
- type: buildDelegateType([{ kind: "identifierType", name: "global::System.Exception" }], callbackReturnTypeAst),
1538
+ type: buildDelegateType([identifierType("global::System.Exception")], callbackReturnTypeAst),
1583
1539
  expression: rejectedAst,
1584
1540
  }
1585
1541
  : rejectedAst;
@@ -1644,10 +1600,7 @@ const emitPromiseThenCatchFinally = (expr, context) => {
1644
1600
  body: { kind: "blockStatement", statements: thenStatements },
1645
1601
  catches: [
1646
1602
  {
1647
- type: {
1648
- kind: "identifierType",
1649
- name: "global::System.Exception",
1650
- },
1603
+ type: identifierType("global::System.Exception"),
1651
1604
  identifier: exIdent,
1652
1605
  body: {
1653
1606
  kind: "blockStatement",
@@ -1677,7 +1630,7 @@ const emitPromiseThenCatchFinally = (expr, context) => {
1677
1630
  ];
1678
1631
  const catches = [
1679
1632
  {
1680
- type: { kind: "identifierType", name: "global::System.Exception" },
1633
+ type: identifierType("global::System.Exception"),
1681
1634
  identifier: exIdent,
1682
1635
  body: {
1683
1636
  kind: "blockStatement",
@@ -1817,10 +1770,7 @@ const emitJsRuntimeJsonParseCall = (expr, context, typeArgument) => {
1817
1770
  kind: "invocationExpression",
1818
1771
  expression: {
1819
1772
  kind: "memberAccessExpression",
1820
- expression: {
1821
- kind: "identifierExpression",
1822
- identifier: "global::Tsonic.JSRuntime.JSON",
1823
- },
1773
+ expression: identifierExpression("global::Tsonic.JSRuntime.JSON"),
1824
1774
  memberName: "parse",
1825
1775
  },
1826
1776
  arguments: argAsts,
@@ -1878,19 +1828,13 @@ const emitJsonSerializerCall = (expr, context, method, deserializeTypeOverride)
1878
1828
  // unknown and should emit plain JsonSerializer calls without requiring the
1879
1829
  // generated TsonicJson helper.
1880
1830
  if (context.options.jsonAotRegistry?.needsJsonAot) {
1881
- argAsts.push({
1882
- kind: "identifierExpression",
1883
- identifier: "TsonicJson.Options",
1884
- });
1831
+ argAsts.push(identifierExpression("TsonicJson.Options"));
1885
1832
  }
1886
1833
  const invocation = {
1887
1834
  kind: "invocationExpression",
1888
1835
  expression: {
1889
1836
  kind: "memberAccessExpression",
1890
- expression: {
1891
- kind: "identifierExpression",
1892
- identifier: "global::System.Text.Json.JsonSerializer",
1893
- },
1837
+ expression: identifierExpression("global::System.Text.Json.JsonSerializer"),
1894
1838
  memberName: method,
1895
1839
  },
1896
1840
  arguments: argAsts,
@@ -2055,10 +1999,7 @@ export const emitCall = (expr, context) => {
2055
1999
  ];
2056
2000
  const invocation = {
2057
2001
  kind: "invocationExpression",
2058
- expression: {
2059
- kind: "identifierExpression",
2060
- identifier: finalCalleeName,
2061
- },
2002
+ expression: identifierExpression(finalCalleeName),
2062
2003
  arguments: allArgAsts,
2063
2004
  typeArguments: typeArgAsts.length > 0 ? typeArgAsts : undefined,
2064
2005
  };
@@ -2066,10 +2007,7 @@ export const emitCall = (expr, context) => {
2066
2007
  const callAst = expr.inferredType?.kind === "arrayType"
2067
2008
  ? {
2068
2009
  kind: "invocationExpression",
2069
- expression: {
2070
- kind: "identifierExpression",
2071
- identifier: "global::System.Linq.Enumerable.ToArray",
2072
- },
2010
+ expression: identifierExpression("global::System.Linq.Enumerable.ToArray"),
2073
2011
  arguments: [invocation],
2074
2012
  }
2075
2013
  : invocation;