@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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/adapter-generator.d.ts.map +1 -1
- package/dist/adapter-generator.js +2 -1
- package/dist/adapter-generator.js.map +1 -1
- package/dist/constants.d.ts +3 -2
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +15 -6
- package/dist/constants.js.map +1 -1
- package/dist/core/format/attributes.d.ts.map +1 -1
- package/dist/core/format/attributes.js +5 -56
- package/dist/core/format/attributes.js.map +1 -1
- package/dist/core/format/attributes.test.js +1 -1
- package/dist/core/format/attributes.test.js.map +1 -1
- package/dist/core/format/backend-ast/builders.d.ts +13 -0
- package/dist/core/format/backend-ast/builders.d.ts.map +1 -0
- package/dist/core/format/backend-ast/builders.js +169 -0
- package/dist/core/format/backend-ast/builders.js.map +1 -0
- package/dist/core/format/backend-ast/builders.test.d.ts +2 -0
- package/dist/core/format/backend-ast/builders.test.d.ts.map +1 -0
- package/dist/core/format/backend-ast/builders.test.js +258 -0
- package/dist/core/format/backend-ast/builders.test.js.map +1 -0
- package/dist/core/format/backend-ast/index.d.ts +3 -2
- package/dist/core/format/backend-ast/index.d.ts.map +1 -1
- package/dist/core/format/backend-ast/index.js +2 -1
- package/dist/core/format/backend-ast/index.js.map +1 -1
- package/dist/core/format/backend-ast/invariants.test.d.ts +2 -0
- package/dist/core/format/backend-ast/invariants.test.d.ts.map +1 -0
- package/dist/core/format/backend-ast/invariants.test.js +72 -0
- package/dist/core/format/backend-ast/invariants.test.js.map +1 -0
- package/dist/core/format/backend-ast/printer.d.ts +1 -1
- package/dist/core/format/backend-ast/printer.d.ts.map +1 -1
- package/dist/core/format/backend-ast/printer.js +362 -119
- package/dist/core/format/backend-ast/printer.js.map +1 -1
- package/dist/core/format/backend-ast/printer.test.d.ts +2 -0
- package/dist/core/format/backend-ast/printer.test.d.ts.map +1 -0
- package/dist/core/format/backend-ast/printer.test.js +796 -0
- package/dist/core/format/backend-ast/printer.test.js.map +1 -0
- package/dist/core/format/backend-ast/types.d.ts +66 -14
- package/dist/core/format/backend-ast/types.d.ts.map +1 -1
- package/dist/core/format/backend-ast/utils.d.ts +12 -8
- package/dist/core/format/backend-ast/utils.d.ts.map +1 -1
- package/dist/core/format/backend-ast/utils.js +222 -19
- package/dist/core/format/backend-ast/utils.js.map +1 -1
- package/dist/core/format/backend-ast/utils.test.d.ts +2 -0
- package/dist/core/format/backend-ast/utils.test.d.ts.map +1 -0
- package/dist/core/format/backend-ast/utils.test.js +142 -0
- package/dist/core/format/backend-ast/utils.test.js.map +1 -0
- package/dist/core/format/module-emitter/assembly.d.ts +2 -2
- package/dist/core/format/module-emitter/assembly.d.ts.map +1 -1
- package/dist/core/format/module-emitter/assembly.js +7 -3
- package/dist/core/format/module-emitter/assembly.js.map +1 -1
- package/dist/core/format/module-emitter/header.d.ts +2 -1
- package/dist/core/format/module-emitter/header.d.ts.map +1 -1
- package/dist/core/format/module-emitter/header.js +2 -2
- package/dist/core/format/module-emitter/header.js.map +1 -1
- package/dist/core/format/module-emitter/orchestrator.js +1 -1
- package/dist/core/format/module-emitter/orchestrator.js.map +1 -1
- package/dist/core/format/module-emitter/static-container.d.ts.map +1 -1
- package/dist/core/format/module-emitter/static-container.js +3 -5
- package/dist/core/format/module-emitter/static-container.js.map +1 -1
- package/dist/core/module-emitter.test.js +1 -0
- package/dist/core/module-emitter.test.js.map +1 -1
- package/dist/core/semantic/boolean-context.d.ts.map +1 -1
- package/dist/core/semantic/boolean-context.js +45 -49
- package/dist/core/semantic/boolean-context.js.map +1 -1
- package/dist/core/semantic/imports.d.ts.map +1 -1
- package/dist/core/semantic/imports.js +16 -15
- package/dist/core/semantic/imports.js.map +1 -1
- package/dist/core/semantic/imports.test.js.map +1 -1
- package/dist/core/semantic/type-resolution.js +1 -2
- package/dist/core/semantic/type-resolution.js.map +1 -1
- package/dist/emitter-types/core.d.ts +19 -10
- package/dist/emitter-types/core.d.ts.map +1 -1
- package/dist/emitter.d.ts.map +1 -1
- package/dist/emitter.js +124 -44
- package/dist/emitter.js.map +1 -1
- package/dist/expression-emitter.d.ts.map +1 -1
- package/dist/expression-emitter.js +24 -43
- package/dist/expression-emitter.js.map +1 -1
- package/dist/expressions/access.d.ts.map +1 -1
- package/dist/expressions/access.js +11 -28
- package/dist/expressions/access.js.map +1 -1
- package/dist/expressions/calls/call-analysis.d.ts +0 -10
- package/dist/expressions/calls/call-analysis.d.ts.map +1 -1
- package/dist/expressions/calls/call-analysis.js +3 -62
- package/dist/expressions/calls/call-analysis.js.map +1 -1
- package/dist/expressions/calls/call-emitter.d.ts.map +1 -1
- package/dist/expressions/calls/call-emitter.js +89 -151
- package/dist/expressions/calls/call-emitter.js.map +1 -1
- package/dist/expressions/calls/new-emitter.d.ts.map +1 -1
- package/dist/expressions/calls/new-emitter.js +36 -69
- package/dist/expressions/calls/new-emitter.js.map +1 -1
- package/dist/expressions/collections.d.ts +3 -0
- package/dist/expressions/collections.d.ts.map +1 -1
- package/dist/expressions/collections.js +43 -70
- package/dist/expressions/collections.js.map +1 -1
- package/dist/expressions/functions.d.ts.map +1 -1
- package/dist/expressions/functions.js +1 -7
- package/dist/expressions/functions.js.map +1 -1
- package/dist/expressions/identifiers.d.ts.map +1 -1
- package/dist/expressions/identifiers.js +23 -44
- package/dist/expressions/identifiers.js.map +1 -1
- package/dist/expressions/index.test.js +128 -0
- package/dist/expressions/index.test.js.map +1 -1
- package/dist/expressions/literals.d.ts.map +1 -1
- package/dist/expressions/literals.js +9 -41
- package/dist/expressions/literals.js.map +1 -1
- package/dist/expressions/operators/assignment-emitter.d.ts.map +1 -1
- package/dist/expressions/operators/assignment-emitter.js +2 -6
- package/dist/expressions/operators/assignment-emitter.js.map +1 -1
- package/dist/expressions/operators/binary-emitter.d.ts.map +1 -1
- package/dist/expressions/operators/binary-emitter.js +16 -32
- package/dist/expressions/operators/binary-emitter.js.map +1 -1
- package/dist/expressions/operators/logical-emitter.d.ts.map +1 -1
- package/dist/expressions/operators/logical-emitter.js +1 -3
- package/dist/expressions/operators/logical-emitter.js.map +1 -1
- package/dist/expressions/operators/unary-emitter.d.ts.map +1 -1
- package/dist/expressions/operators/unary-emitter.js +9 -20
- package/dist/expressions/operators/unary-emitter.js.map +1 -1
- package/dist/expressions/other.d.ts.map +1 -1
- package/dist/expressions/other.js +6 -11
- package/dist/expressions/other.js.map +1 -1
- package/dist/generator-exchange.d.ts.map +1 -1
- package/dist/generator-exchange.js +3 -2
- package/dist/generator-exchange.js.map +1 -1
- package/dist/generator-wrapper.d.ts.map +1 -1
- package/dist/generator-wrapper.js +27 -56
- package/dist/generator-wrapper.js.map +1 -1
- package/dist/integration.test.js +1 -1
- package/dist/integration.test.js.map +1 -1
- package/dist/json-aot-generic.test.js +3 -0
- package/dist/json-aot-generic.test.js.map +1 -1
- package/dist/patterns.d.ts.map +1 -1
- package/dist/patterns.js +19 -40
- package/dist/patterns.js.map +1 -1
- package/dist/statements/classes/members/methods.d.ts.map +1 -1
- package/dist/statements/classes/members/methods.js +3 -9
- package/dist/statements/classes/members/methods.js.map +1 -1
- package/dist/statements/classes/parameters.d.ts.map +1 -1
- package/dist/statements/classes/parameters.js +2 -1
- package/dist/statements/classes/parameters.js.map +1 -1
- package/dist/statements/classes/properties.d.ts.map +1 -1
- package/dist/statements/classes/properties.js +5 -16
- package/dist/statements/classes/properties.js.map +1 -1
- package/dist/statements/control/conditionals/guard-analysis.d.ts +2 -1
- package/dist/statements/control/conditionals/guard-analysis.d.ts.map +1 -1
- package/dist/statements/control/conditionals/guard-analysis.js +19 -6
- package/dist/statements/control/conditionals/guard-analysis.js.map +1 -1
- package/dist/statements/control/conditionals/if-emitter.d.ts.map +1 -1
- package/dist/statements/control/conditionals/if-emitter.js +14 -9
- package/dist/statements/control/conditionals/if-emitter.js.map +1 -1
- package/dist/statements/control/exceptions.d.ts.map +1 -1
- package/dist/statements/control/exceptions.js +2 -4
- package/dist/statements/control/exceptions.js.map +1 -1
- package/dist/statements/control/loops.d.ts.map +1 -1
- package/dist/statements/control/loops.js +3 -5
- package/dist/statements/control/loops.js.map +1 -1
- package/dist/statements/declarations/classes.d.ts.map +1 -1
- package/dist/statements/declarations/classes.js +2 -4
- package/dist/statements/declarations/classes.js.map +1 -1
- package/dist/statements/declarations/functions.d.ts.map +1 -1
- package/dist/statements/declarations/functions.js +36 -66
- package/dist/statements/declarations/functions.js.map +1 -1
- package/dist/statements/declarations/interfaces-mutable-storage.test.js +10 -2
- package/dist/statements/declarations/interfaces-mutable-storage.test.js.map +1 -1
- package/dist/statements/declarations/interfaces.d.ts.map +1 -1
- package/dist/statements/declarations/interfaces.js +4 -12
- package/dist/statements/declarations/interfaces.js.map +1 -1
- package/dist/statements/declarations/type-aliases.d.ts.map +1 -1
- package/dist/statements/declarations/type-aliases.js +3 -8
- package/dist/statements/declarations/type-aliases.js.map +1 -1
- package/dist/statements/declarations/variables.d.ts.map +1 -1
- package/dist/statements/declarations/variables.js +39 -37
- package/dist/statements/declarations/variables.js.map +1 -1
- package/dist/statements/index.test.js +94 -8
- package/dist/statements/index.test.js.map +1 -1
- package/dist/types/dictionaries.d.ts.map +1 -1
- package/dist/types/dictionaries.js +5 -5
- package/dist/types/dictionaries.js.map +1 -1
- package/dist/types/functions.d.ts.map +1 -1
- package/dist/types/functions.js +5 -25
- package/dist/types/functions.js.map +1 -1
- package/dist/types/primitives.d.ts.map +1 -1
- package/dist/types/primitives.js.map +1 -1
- package/dist/types/references.d.ts.map +1 -1
- package/dist/types/references.js +65 -132
- package/dist/types/references.js.map +1 -1
- package/dist/types/references.test.js +63 -51
- package/dist/types/references.test.js.map +1 -1
- package/dist/types/tuples.d.ts.map +1 -1
- package/dist/types/tuples.js +7 -17
- package/dist/types/tuples.js.map +1 -1
- package/dist/types/unions.d.ts.map +1 -1
- package/dist/types/unions.js +2 -5
- package/dist/types/unions.js.map +1 -1
- package/package.json +2 -2
- package/dist/expressions/parentheses.d.ts +0 -4
- package/dist/expressions/parentheses.d.ts.map +0 -1
- package/dist/expressions/parentheses.js +0 -91
- 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,
|
|
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
|
-
|
|
204
|
-
|
|
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"
|
|
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) =>
|
|
350
|
-
|
|
351
|
-
|
|
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
|
-
?
|
|
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
|
-
?
|
|
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: "
|
|
575
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
748
|
-
identifier: "global::System.Linq.Enumerable.Concat",
|
|
755
|
+
...identifierExpression("global::System.Linq.Enumerable.Concat"),
|
|
749
756
|
},
|
|
750
|
-
arguments: [concatAst,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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: "
|
|
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
|
|
1399
|
-
|
|
1400
|
-
|
|
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: "
|
|
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([
|
|
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:
|
|
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;
|