@tsonic/emitter 0.0.6 → 0.0.12
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/array.test.js +6 -6
- package/dist/array.test.js.map +1 -1
- package/dist/core/imports.test.js +6 -3
- package/dist/core/imports.test.js.map +1 -1
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/type-compatibility.d.ts +26 -0
- package/dist/core/type-compatibility.d.ts.map +1 -0
- package/dist/core/type-compatibility.js +109 -0
- package/dist/core/type-compatibility.js.map +1 -0
- package/dist/core/type-resolution.d.ts +81 -1
- package/dist/core/type-resolution.d.ts.map +1 -1
- package/dist/core/type-resolution.js +258 -0
- package/dist/core/type-resolution.js.map +1 -1
- package/dist/core/type-resolution.test.js +110 -1
- package/dist/core/type-resolution.test.js.map +1 -1
- package/dist/emitter-types/context.d.ts.map +1 -1
- package/dist/emitter-types/context.js +21 -1
- package/dist/emitter-types/context.js.map +1 -1
- package/dist/emitter-types/core.d.ts +26 -0
- package/dist/emitter-types/core.d.ts.map +1 -1
- package/dist/emitter-types/identifiers.d.ts.map +1 -1
- package/dist/emitter-types/identifiers.js +4 -43
- package/dist/emitter-types/identifiers.js.map +1 -1
- package/dist/emitter-types/index.d.ts +1 -1
- package/dist/emitter-types/index.d.ts.map +1 -1
- package/dist/emitter-types/index.js.map +1 -1
- package/dist/expression-emitter.d.ts.map +1 -1
- package/dist/expression-emitter.js +48 -0
- package/dist/expression-emitter.js.map +1 -1
- package/dist/expressions/access.d.ts.map +1 -1
- package/dist/expressions/access.js +97 -13
- package/dist/expressions/access.js.map +1 -1
- package/dist/expressions/calls.d.ts.map +1 -1
- package/dist/expressions/calls.js +5 -1
- package/dist/expressions/calls.js.map +1 -1
- package/dist/expressions/collections.d.ts +3 -2
- package/dist/expressions/collections.d.ts.map +1 -1
- package/dist/expressions/collections.js +214 -24
- package/dist/expressions/collections.js.map +1 -1
- package/dist/expressions/functions.d.ts +2 -2
- package/dist/expressions/functions.d.ts.map +1 -1
- package/dist/expressions/functions.js +81 -38
- package/dist/expressions/functions.js.map +1 -1
- package/dist/expressions/identifiers.d.ts.map +1 -1
- package/dist/expressions/identifiers.js +27 -7
- package/dist/expressions/identifiers.js.map +1 -1
- package/dist/expressions/index.test.js +189 -4
- package/dist/expressions/index.test.js.map +1 -1
- package/dist/expressions/literals.d.ts +4 -6
- package/dist/expressions/literals.d.ts.map +1 -1
- package/dist/expressions/literals.js +41 -17
- package/dist/expressions/literals.js.map +1 -1
- package/dist/expressions/literals.test.js +41 -0
- package/dist/expressions/literals.test.js.map +1 -1
- package/dist/expressions/operators.d.ts +4 -0
- package/dist/expressions/operators.d.ts.map +1 -1
- package/dist/expressions/operators.js +145 -12
- package/dist/expressions/operators.js.map +1 -1
- package/dist/expressions/other.d.ts.map +1 -1
- package/dist/expressions/other.js +9 -2
- package/dist/expressions/other.js.map +1 -1
- package/dist/generator-exchange.d.ts +1 -1
- package/dist/generator-exchange.d.ts.map +1 -1
- package/dist/generator-exchange.js +15 -4
- package/dist/generator-exchange.js.map +1 -1
- package/dist/generator-wrapper.d.ts +84 -0
- package/dist/generator-wrapper.d.ts.map +1 -0
- package/dist/generator-wrapper.js +312 -0
- package/dist/generator-wrapper.js.map +1 -0
- package/dist/generator-wrapper.test.d.ts +12 -0
- package/dist/generator-wrapper.test.d.ts.map +1 -0
- package/dist/generator-wrapper.test.js +179 -0
- package/dist/generator-wrapper.test.js.map +1 -0
- package/dist/generator.test.js +596 -6
- package/dist/generator.test.js.map +1 -1
- package/dist/golden-tests/config-parser.d.ts.map +1 -1
- package/dist/golden-tests/config-parser.js +81 -11
- package/dist/golden-tests/config-parser.js.map +1 -1
- package/dist/golden-tests/discovery.d.ts.map +1 -1
- package/dist/golden-tests/discovery.js +15 -5
- package/dist/golden-tests/discovery.js.map +1 -1
- package/dist/golden-tests/runner.d.ts.map +1 -1
- package/dist/golden-tests/runner.js +62 -7
- package/dist/golden-tests/runner.js.map +1 -1
- package/dist/golden-tests/types.d.ts +11 -1
- package/dist/golden-tests/types.d.ts.map +1 -1
- package/dist/hierarchical-bindings.test.js +2 -2
- package/dist/hierarchical-bindings.test.js.map +1 -1
- package/dist/integration.test.js +49 -2
- package/dist/integration.test.js.map +1 -1
- package/dist/invariants/emitter-globals-subset.test.d.ts +15 -0
- package/dist/invariants/emitter-globals-subset.test.d.ts.map +1 -0
- package/dist/invariants/emitter-globals-subset.test.js +137 -0
- package/dist/invariants/emitter-globals-subset.test.js.map +1 -0
- package/dist/invariants/numeric-proof-contract.test.d.ts +19 -0
- package/dist/invariants/numeric-proof-contract.test.d.ts.map +1 -0
- package/dist/invariants/numeric-proof-contract.test.js +560 -0
- package/dist/invariants/numeric-proof-contract.test.js.map +1 -0
- package/dist/specialization/generic-functions.test.js +10 -0
- package/dist/specialization/generic-functions.test.js.map +1 -1
- package/dist/specialization/substitution.d.ts.map +1 -1
- package/dist/specialization/substitution.js +7 -0
- package/dist/specialization/substitution.js.map +1 -1
- package/dist/statement-emitter.d.ts.map +1 -1
- package/dist/statement-emitter.js +5 -1
- package/dist/statement-emitter.js.map +1 -1
- package/dist/statements/blocks.d.ts +39 -1
- package/dist/statements/blocks.d.ts.map +1 -1
- package/dist/statements/blocks.js +129 -3
- package/dist/statements/blocks.js.map +1 -1
- package/dist/statements/classes/members/methods.d.ts.map +1 -1
- package/dist/statements/classes/members/methods.js +3 -1
- package/dist/statements/classes/members/methods.js.map +1 -1
- package/dist/statements/control/conditionals.d.ts.map +1 -1
- package/dist/statements/control/conditionals.js +215 -1
- package/dist/statements/control/conditionals.js.map +1 -1
- package/dist/statements/control/loops.d.ts +6 -0
- package/dist/statements/control/loops.d.ts.map +1 -1
- package/dist/statements/control/loops.js +9 -2
- 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 +13 -5
- 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 +91 -25
- package/dist/statements/declarations/functions.js.map +1 -1
- package/dist/statements/declarations/interfaces.d.ts.map +1 -1
- package/dist/statements/declarations/interfaces.js +11 -1
- 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 +11 -1
- package/dist/statements/declarations/type-aliases.js.map +1 -1
- package/dist/statements/index.test.js +165 -3
- package/dist/statements/index.test.js.map +1 -1
- package/dist/types/arrays.d.ts +10 -1
- package/dist/types/arrays.d.ts.map +1 -1
- package/dist/types/arrays.js +16 -1
- package/dist/types/arrays.js.map +1 -1
- package/dist/types/dictionaries.d.ts +3 -2
- package/dist/types/dictionaries.d.ts.map +1 -1
- package/dist/types/dictionaries.js +14 -8
- package/dist/types/dictionaries.js.map +1 -1
- package/dist/types/emitter.d.ts.map +1 -1
- package/dist/types/emitter.js +3 -0
- package/dist/types/emitter.js.map +1 -1
- package/dist/types/index.test.js +5 -2
- package/dist/types/index.test.js.map +1 -1
- package/dist/types/references.d.ts.map +1 -1
- package/dist/types/references.js +128 -29
- package/dist/types/references.js.map +1 -1
- package/dist/types/references.test.d.ts +11 -0
- package/dist/types/references.test.d.ts.map +1 -0
- package/dist/types/references.test.js +384 -0
- package/dist/types/references.test.js.map +1 -0
- package/dist/types/tuples.d.ts +23 -0
- package/dist/types/tuples.d.ts.map +1 -0
- package/dist/types/tuples.js +54 -0
- package/dist/types/tuples.js.map +1 -0
- package/dist/types/unions.test.js +62 -15
- package/dist/types/unions.test.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generator Wrapper Class Generator
|
|
3
|
+
* Per spec/13-generators.md - Generate wrapper classes for bidirectional communication
|
|
4
|
+
*
|
|
5
|
+
* For TypeScript: function* accumulator(start = 0): Generator<number, void, number> { }
|
|
6
|
+
*
|
|
7
|
+
* Generates:
|
|
8
|
+
* 1. Exchange class: accumulator_exchange { Input?, Output }
|
|
9
|
+
* 2. Wrapper class: accumulator_Generator { next(), return(), throw() }
|
|
10
|
+
* 3. Core method: accumulator_core(exchange) returning IEnumerable<exchange>
|
|
11
|
+
* 4. Public method: accumulator(start = 0) returning accumulator_Generator
|
|
12
|
+
*/
|
|
13
|
+
import { IrFunctionDeclaration, IrType } from "@tsonic/frontend";
|
|
14
|
+
import { EmitterContext } from "./types.js";
|
|
15
|
+
/**
|
|
16
|
+
* Extract Generator type arguments from a return type
|
|
17
|
+
* Generator<T, TReturn, TNext> -> { yieldType: T, returnType: TReturn, nextType: TNext }
|
|
18
|
+
*/
|
|
19
|
+
export declare const extractGeneratorTypeArgs: (returnType: IrType | undefined, context: EmitterContext) => {
|
|
20
|
+
yieldType: string;
|
|
21
|
+
returnType: string;
|
|
22
|
+
nextType: string;
|
|
23
|
+
hasNextType: boolean;
|
|
24
|
+
newContext: EmitterContext;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Generate wrapper class for a generator function
|
|
28
|
+
*
|
|
29
|
+
* Example for: function* accumulator(start = 0): Generator<number, void, number>
|
|
30
|
+
*
|
|
31
|
+
* public sealed class accumulator_Generator
|
|
32
|
+
* {
|
|
33
|
+
* private readonly global::System.Collections.Generic.IEnumerator<accumulator_exchange> _enumerator;
|
|
34
|
+
* private readonly accumulator_exchange _exchange;
|
|
35
|
+
* private bool _done = false;
|
|
36
|
+
*
|
|
37
|
+
* public accumulator_Generator(global::System.Collections.Generic.IEnumerable<accumulator_exchange> enumerable, accumulator_exchange exchange)
|
|
38
|
+
* {
|
|
39
|
+
* _enumerator = enumerable.GetEnumerator();
|
|
40
|
+
* _exchange = exchange;
|
|
41
|
+
* }
|
|
42
|
+
*
|
|
43
|
+
* public global::Tsonic.Runtime.IteratorResult<double> next(double? value = default)
|
|
44
|
+
* {
|
|
45
|
+
* if (_done) return new global::Tsonic.Runtime.IteratorResult<double>(default!, true);
|
|
46
|
+
* _exchange.Input = value;
|
|
47
|
+
* if (_enumerator.MoveNext())
|
|
48
|
+
* {
|
|
49
|
+
* return new global::Tsonic.Runtime.IteratorResult<double>(_exchange.Output, false);
|
|
50
|
+
* }
|
|
51
|
+
* _done = true;
|
|
52
|
+
* return new global::Tsonic.Runtime.IteratorResult<double>(default!, true);
|
|
53
|
+
* }
|
|
54
|
+
*
|
|
55
|
+
* public global::Tsonic.Runtime.IteratorResult<double> @return(TReturn value = default!)
|
|
56
|
+
* {
|
|
57
|
+
* _done = true;
|
|
58
|
+
* _returnValue = value;
|
|
59
|
+
* _wasExternallyTerminated = true;
|
|
60
|
+
* _enumerator.Dispose();
|
|
61
|
+
* return new global::Tsonic.Runtime.IteratorResult<double>(default!, true);
|
|
62
|
+
* }
|
|
63
|
+
*
|
|
64
|
+
* public global::Tsonic.Runtime.IteratorResult<double> @throw(object e)
|
|
65
|
+
* {
|
|
66
|
+
* _done = true;
|
|
67
|
+
* _enumerator.Dispose();
|
|
68
|
+
* if (e is global::System.Exception ex) throw ex;
|
|
69
|
+
* throw new global::System.Exception(e?.ToString() ?? "Unknown error");
|
|
70
|
+
* }
|
|
71
|
+
* }
|
|
72
|
+
*/
|
|
73
|
+
export declare const generateWrapperClass: (func: IrFunctionDeclaration, context: EmitterContext) => [string, EmitterContext];
|
|
74
|
+
/**
|
|
75
|
+
* Check if a generator function needs bidirectional support
|
|
76
|
+
* (i.e., has TNext type parameter that isn't undefined)
|
|
77
|
+
*/
|
|
78
|
+
export declare const needsBidirectionalSupport: (func: IrFunctionDeclaration) => boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Check if a generator function has a return type (TReturn is not void/undefined)
|
|
81
|
+
* This determines whether we need to capture the return value via closure
|
|
82
|
+
*/
|
|
83
|
+
export declare const hasGeneratorReturnType: (func: IrFunctionDeclaration) => boolean;
|
|
84
|
+
//# sourceMappingURL=generator-wrapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator-wrapper.d.ts","sourceRoot":"","sources":["../src/generator-wrapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAqB,MAAM,YAAY,CAAC;AAG/D;;;GAGG;AACH,eAAO,MAAM,wBAAwB,GACnC,YAAY,MAAM,GAAG,SAAS,EAC9B,SAAS,cAAc,KACtB;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,cAAc,CAAC;CA4D5B,CAAC;AAKF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,eAAO,MAAM,oBAAoB,GAC/B,MAAM,qBAAqB,EAC3B,SAAS,cAAc,KACtB,CAAC,MAAM,EAAE,cAAc,CAwNzB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,yBAAyB,GACpC,MAAM,qBAAqB,KAC1B,OAqBF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GACjC,MAAM,qBAAqB,KAC1B,OAuBF,CAAC"}
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generator Wrapper Class Generator
|
|
3
|
+
* Per spec/13-generators.md - Generate wrapper classes for bidirectional communication
|
|
4
|
+
*
|
|
5
|
+
* For TypeScript: function* accumulator(start = 0): Generator<number, void, number> { }
|
|
6
|
+
*
|
|
7
|
+
* Generates:
|
|
8
|
+
* 1. Exchange class: accumulator_exchange { Input?, Output }
|
|
9
|
+
* 2. Wrapper class: accumulator_Generator { next(), return(), throw() }
|
|
10
|
+
* 3. Core method: accumulator_core(exchange) returning IEnumerable<exchange>
|
|
11
|
+
* 4. Public method: accumulator(start = 0) returning accumulator_Generator
|
|
12
|
+
*/
|
|
13
|
+
import { getIndent, indent } from "./types.js";
|
|
14
|
+
import { emitType } from "./type-emitter.js";
|
|
15
|
+
/**
|
|
16
|
+
* Extract Generator type arguments from a return type
|
|
17
|
+
* Generator<T, TReturn, TNext> -> { yieldType: T, returnType: TReturn, nextType: TNext }
|
|
18
|
+
*/
|
|
19
|
+
export const extractGeneratorTypeArgs = (returnType, context) => {
|
|
20
|
+
let yieldType = "object";
|
|
21
|
+
let retType = "void";
|
|
22
|
+
let nextType = "object";
|
|
23
|
+
let hasNextType = false;
|
|
24
|
+
let currentContext = context;
|
|
25
|
+
if (returnType?.kind === "referenceType") {
|
|
26
|
+
const typeRef = returnType;
|
|
27
|
+
// Generator<Yield, Return, Next> or AsyncGenerator<Yield, Return, Next>
|
|
28
|
+
if (typeRef.typeArguments && typeRef.typeArguments.length > 0) {
|
|
29
|
+
const yieldTypeArg = typeRef.typeArguments[0];
|
|
30
|
+
if (yieldTypeArg) {
|
|
31
|
+
const [yt, ctx1] = emitType(yieldTypeArg, currentContext);
|
|
32
|
+
currentContext = ctx1;
|
|
33
|
+
yieldType = yt;
|
|
34
|
+
}
|
|
35
|
+
if (typeRef.typeArguments.length > 1) {
|
|
36
|
+
const returnTypeArg = typeRef.typeArguments[1];
|
|
37
|
+
if (returnTypeArg &&
|
|
38
|
+
returnTypeArg.kind !== "voidType" &&
|
|
39
|
+
!(returnTypeArg.kind === "primitiveType" &&
|
|
40
|
+
returnTypeArg.name === "undefined")) {
|
|
41
|
+
const [rt, ctx2] = emitType(returnTypeArg, currentContext);
|
|
42
|
+
currentContext = ctx2;
|
|
43
|
+
retType = rt;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (typeRef.typeArguments.length > 2) {
|
|
47
|
+
const nextTypeArg = typeRef.typeArguments[2];
|
|
48
|
+
if (nextTypeArg &&
|
|
49
|
+
!(nextTypeArg.kind === "primitiveType" &&
|
|
50
|
+
nextTypeArg.name === "undefined")) {
|
|
51
|
+
const [nt, ctx3] = emitType(nextTypeArg, currentContext);
|
|
52
|
+
currentContext = ctx3;
|
|
53
|
+
nextType = nt;
|
|
54
|
+
hasNextType = true;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
yieldType,
|
|
61
|
+
returnType: retType,
|
|
62
|
+
nextType,
|
|
63
|
+
hasNextType,
|
|
64
|
+
newContext: currentContext,
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
// Note: IteratorResult<T> is now defined in Tsonic.Runtime.Generators
|
|
68
|
+
// Use global::Tsonic.Runtime.IteratorResult<T> in generated code
|
|
69
|
+
/**
|
|
70
|
+
* Generate wrapper class for a generator function
|
|
71
|
+
*
|
|
72
|
+
* Example for: function* accumulator(start = 0): Generator<number, void, number>
|
|
73
|
+
*
|
|
74
|
+
* public sealed class accumulator_Generator
|
|
75
|
+
* {
|
|
76
|
+
* private readonly global::System.Collections.Generic.IEnumerator<accumulator_exchange> _enumerator;
|
|
77
|
+
* private readonly accumulator_exchange _exchange;
|
|
78
|
+
* private bool _done = false;
|
|
79
|
+
*
|
|
80
|
+
* public accumulator_Generator(global::System.Collections.Generic.IEnumerable<accumulator_exchange> enumerable, accumulator_exchange exchange)
|
|
81
|
+
* {
|
|
82
|
+
* _enumerator = enumerable.GetEnumerator();
|
|
83
|
+
* _exchange = exchange;
|
|
84
|
+
* }
|
|
85
|
+
*
|
|
86
|
+
* public global::Tsonic.Runtime.IteratorResult<double> next(double? value = default)
|
|
87
|
+
* {
|
|
88
|
+
* if (_done) return new global::Tsonic.Runtime.IteratorResult<double>(default!, true);
|
|
89
|
+
* _exchange.Input = value;
|
|
90
|
+
* if (_enumerator.MoveNext())
|
|
91
|
+
* {
|
|
92
|
+
* return new global::Tsonic.Runtime.IteratorResult<double>(_exchange.Output, false);
|
|
93
|
+
* }
|
|
94
|
+
* _done = true;
|
|
95
|
+
* return new global::Tsonic.Runtime.IteratorResult<double>(default!, true);
|
|
96
|
+
* }
|
|
97
|
+
*
|
|
98
|
+
* public global::Tsonic.Runtime.IteratorResult<double> @return(TReturn value = default!)
|
|
99
|
+
* {
|
|
100
|
+
* _done = true;
|
|
101
|
+
* _returnValue = value;
|
|
102
|
+
* _wasExternallyTerminated = true;
|
|
103
|
+
* _enumerator.Dispose();
|
|
104
|
+
* return new global::Tsonic.Runtime.IteratorResult<double>(default!, true);
|
|
105
|
+
* }
|
|
106
|
+
*
|
|
107
|
+
* public global::Tsonic.Runtime.IteratorResult<double> @throw(object e)
|
|
108
|
+
* {
|
|
109
|
+
* _done = true;
|
|
110
|
+
* _enumerator.Dispose();
|
|
111
|
+
* if (e is global::System.Exception ex) throw ex;
|
|
112
|
+
* throw new global::System.Exception(e?.ToString() ?? "Unknown error");
|
|
113
|
+
* }
|
|
114
|
+
* }
|
|
115
|
+
*/
|
|
116
|
+
export const generateWrapperClass = (func, context) => {
|
|
117
|
+
const ind = getIndent(context);
|
|
118
|
+
const bodyInd = getIndent(indent(context));
|
|
119
|
+
const innerInd = getIndent(indent(indent(context)));
|
|
120
|
+
const parts = [];
|
|
121
|
+
let currentContext = context;
|
|
122
|
+
const wrapperName = `${func.name}_Generator`;
|
|
123
|
+
const exchangeName = `${func.name}_exchange`;
|
|
124
|
+
// Extract type arguments
|
|
125
|
+
const { yieldType, returnType, nextType, hasNextType, newContext } = extractGeneratorTypeArgs(func.returnType, currentContext);
|
|
126
|
+
currentContext = newContext;
|
|
127
|
+
// Use yieldType for IteratorResult
|
|
128
|
+
const resultType = yieldType;
|
|
129
|
+
parts.push(`${ind}public sealed class ${wrapperName}`);
|
|
130
|
+
parts.push(`${ind}{`);
|
|
131
|
+
// Private fields
|
|
132
|
+
const enumeratorType = func.isAsync
|
|
133
|
+
? `global::System.Collections.Generic.IAsyncEnumerator<${exchangeName}>`
|
|
134
|
+
: `global::System.Collections.Generic.IEnumerator<${exchangeName}>`;
|
|
135
|
+
parts.push(`${bodyInd}private readonly ${enumeratorType} _enumerator;`);
|
|
136
|
+
parts.push(`${bodyInd}private readonly ${exchangeName} _exchange;`);
|
|
137
|
+
// Return value getter - captures TReturn from generator return statements (natural completion)
|
|
138
|
+
const hasReturnType = returnType !== "void";
|
|
139
|
+
if (hasReturnType) {
|
|
140
|
+
parts.push(`${bodyInd}private readonly global::System.Func<${returnType}> _getReturnValue;`);
|
|
141
|
+
// Field for external termination via @return(value)
|
|
142
|
+
parts.push(`${bodyInd}private ${returnType} _returnValue = default!;`);
|
|
143
|
+
parts.push(`${bodyInd}private bool _wasExternallyTerminated = false;`);
|
|
144
|
+
}
|
|
145
|
+
parts.push(`${bodyInd}private bool _done = false;`);
|
|
146
|
+
parts.push("");
|
|
147
|
+
// Constructor
|
|
148
|
+
const enumerableType = func.isAsync
|
|
149
|
+
? `global::System.Collections.Generic.IAsyncEnumerable<${exchangeName}>`
|
|
150
|
+
: `global::System.Collections.Generic.IEnumerable<${exchangeName}>`;
|
|
151
|
+
// Constructor signature includes return value getter if TReturn is not void
|
|
152
|
+
const constructorParams = hasReturnType
|
|
153
|
+
? `${enumerableType} enumerable, ${exchangeName} exchange, global::System.Func<${returnType}> getReturnValue`
|
|
154
|
+
: `${enumerableType} enumerable, ${exchangeName} exchange`;
|
|
155
|
+
parts.push(`${bodyInd}public ${wrapperName}(${constructorParams})`);
|
|
156
|
+
parts.push(`${bodyInd}{`);
|
|
157
|
+
parts.push(`${innerInd}_enumerator = enumerable.${func.isAsync ? "GetAsyncEnumerator()" : "GetEnumerator()"};`);
|
|
158
|
+
parts.push(`${innerInd}_exchange = exchange;`);
|
|
159
|
+
if (hasReturnType) {
|
|
160
|
+
parts.push(`${innerInd}_getReturnValue = getReturnValue;`);
|
|
161
|
+
}
|
|
162
|
+
parts.push(`${bodyInd}}`);
|
|
163
|
+
parts.push("");
|
|
164
|
+
// next() method
|
|
165
|
+
const nextReturnType = func.isAsync
|
|
166
|
+
? `global::System.Threading.Tasks.Task<global::Tsonic.Runtime.IteratorResult<${resultType}>>`
|
|
167
|
+
: `global::Tsonic.Runtime.IteratorResult<${resultType}>`;
|
|
168
|
+
const nextParamType = hasNextType ? `${nextType}?` : "object?";
|
|
169
|
+
const asyncKeyword = func.isAsync ? "async " : "";
|
|
170
|
+
const awaitKeyword = func.isAsync ? "await " : "";
|
|
171
|
+
const moveNextMethod = func.isAsync ? "MoveNextAsync()" : "MoveNext()";
|
|
172
|
+
parts.push(`${bodyInd}public ${asyncKeyword}${nextReturnType} next(${nextParamType} value = default)`);
|
|
173
|
+
parts.push(`${bodyInd}{`);
|
|
174
|
+
// When already done, return cached result (with TReturn value if available)
|
|
175
|
+
// Note: JS IteratorResult has value: TYield | TReturn on completion
|
|
176
|
+
// We use default! for the value since the consumer should check done first
|
|
177
|
+
parts.push(`${innerInd}if (_done) return new global::Tsonic.Runtime.IteratorResult<${resultType}>(default!, true);`);
|
|
178
|
+
parts.push(`${innerInd}_exchange.Input = value;`);
|
|
179
|
+
parts.push(`${innerInd}if (${awaitKeyword}_enumerator.${moveNextMethod})`);
|
|
180
|
+
parts.push(`${innerInd}{`);
|
|
181
|
+
parts.push(`${innerInd} return new global::Tsonic.Runtime.IteratorResult<${resultType}>(_exchange.Output, false);`);
|
|
182
|
+
parts.push(`${innerInd}}`);
|
|
183
|
+
parts.push(`${innerInd}_done = true;`);
|
|
184
|
+
// When iterator completes, return default! for the value
|
|
185
|
+
// The return value can be accessed via the returnValue property if TReturn is not void
|
|
186
|
+
// Note: JavaScript IteratorResult has value: TYield | TReturn, but C# can't represent this union
|
|
187
|
+
parts.push(`${innerInd}return new global::Tsonic.Runtime.IteratorResult<${resultType}>(default!, true);`);
|
|
188
|
+
parts.push(`${bodyInd}}`);
|
|
189
|
+
parts.push("");
|
|
190
|
+
// returnValue property - provides access to TReturn when generator completes
|
|
191
|
+
if (hasReturnType) {
|
|
192
|
+
parts.push(`${bodyInd}/// <summary>`);
|
|
193
|
+
parts.push(`${bodyInd}/// Gets the return value of the generator after it completes.`);
|
|
194
|
+
parts.push(`${bodyInd}/// Only valid after the generator is done (next() returned done=true).`);
|
|
195
|
+
parts.push(`${bodyInd}/// If terminated via @return(value), returns that value.`);
|
|
196
|
+
parts.push(`${bodyInd}/// Otherwise, returns the value from the generator's return statement.`);
|
|
197
|
+
parts.push(`${bodyInd}/// </summary>`);
|
|
198
|
+
parts.push(`${bodyInd}public ${returnType} returnValue => _wasExternallyTerminated ? _returnValue : _getReturnValue();`);
|
|
199
|
+
parts.push("");
|
|
200
|
+
}
|
|
201
|
+
// return() method - use @ prefix since 'return' is a C# keyword
|
|
202
|
+
// Per JS spec: return(value) takes TReturn, not TYield
|
|
203
|
+
// The returned IteratorResult still uses TYield for type consistency with next()
|
|
204
|
+
const returnReturnType = func.isAsync
|
|
205
|
+
? `global::System.Threading.Tasks.Task<global::Tsonic.Runtime.IteratorResult<${resultType}>>`
|
|
206
|
+
: `global::Tsonic.Runtime.IteratorResult<${resultType}>`;
|
|
207
|
+
// Parameter type is TReturn (returnType), not TYield (resultType)
|
|
208
|
+
// For void-return generators, use object? since return() can be called with no argument
|
|
209
|
+
const returnParamType = returnType !== "void" ? returnType : "object?";
|
|
210
|
+
parts.push(`${bodyInd}/// <summary>`);
|
|
211
|
+
parts.push(`${bodyInd}/// Terminates the generator and sets the return value.`);
|
|
212
|
+
parts.push(`${bodyInd}/// </summary>`);
|
|
213
|
+
parts.push(`${bodyInd}/// <param name="value">The return value (TReturn type)</param>`);
|
|
214
|
+
parts.push(`${bodyInd}/// <returns>IteratorResult with done=true and default TYield value</returns>`);
|
|
215
|
+
parts.push(`${bodyInd}/// <remarks>`);
|
|
216
|
+
parts.push(`${bodyInd}/// NOTE: The passed value does NOT appear in the returned IteratorResult.value.`);
|
|
217
|
+
parts.push(`${bodyInd}/// C# cannot represent JavaScript's TYield | TReturn union type.`);
|
|
218
|
+
parts.push(`${bodyInd}/// Access the return value via the 'returnValue' property after calling this method.`);
|
|
219
|
+
parts.push(`${bodyInd}/// </remarks>`);
|
|
220
|
+
parts.push(`${bodyInd}public ${asyncKeyword}${returnReturnType} @return(${returnParamType} value = default!)`);
|
|
221
|
+
parts.push(`${bodyInd}{`);
|
|
222
|
+
parts.push(`${innerInd}_done = true;`);
|
|
223
|
+
// If TReturn is not void, capture the return value for the returnValue property
|
|
224
|
+
if (hasReturnType) {
|
|
225
|
+
parts.push(`${innerInd}_returnValue = value;`);
|
|
226
|
+
parts.push(`${innerInd}_wasExternallyTerminated = true;`);
|
|
227
|
+
}
|
|
228
|
+
if (func.isAsync) {
|
|
229
|
+
parts.push(`${innerInd}await _enumerator.DisposeAsync();`);
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
parts.push(`${innerInd}_enumerator.Dispose();`);
|
|
233
|
+
}
|
|
234
|
+
// Return IteratorResult with default TYield (since we're returning TReturn via returnValue property)
|
|
235
|
+
parts.push(`${innerInd}return new global::Tsonic.Runtime.IteratorResult<${resultType}>(default!, true);`);
|
|
236
|
+
parts.push(`${bodyInd}}`);
|
|
237
|
+
parts.push("");
|
|
238
|
+
// throw() method - use @ prefix since 'throw' is a C# keyword
|
|
239
|
+
// NOTE: Unlike JavaScript, this does NOT inject the exception at the suspended
|
|
240
|
+
// yield point. C# iterators don't support resumption with exceptions.
|
|
241
|
+
// This method terminates the generator and throws the exception externally.
|
|
242
|
+
// This is a semantic limitation - JS generators can catch thrown exceptions
|
|
243
|
+
// inside try/catch around yield, but our C# implementation cannot.
|
|
244
|
+
const throwReturnType = func.isAsync
|
|
245
|
+
? `global::System.Threading.Tasks.Task<global::Tsonic.Runtime.IteratorResult<${resultType}>>`
|
|
246
|
+
: `global::Tsonic.Runtime.IteratorResult<${resultType}>`;
|
|
247
|
+
parts.push(`${bodyInd}/// <summary>`);
|
|
248
|
+
parts.push(`${bodyInd}/// Terminates the generator and throws the provided exception.`);
|
|
249
|
+
parts.push(`${bodyInd}/// NOTE: Unlike JavaScript, this does NOT inject the exception at the`);
|
|
250
|
+
parts.push(`${bodyInd}/// suspended yield point. The exception is thrown externally after`);
|
|
251
|
+
parts.push(`${bodyInd}/// disposing the enumerator. This is a limitation of C# iterators.`);
|
|
252
|
+
parts.push(`${bodyInd}/// </summary>`);
|
|
253
|
+
parts.push(`${bodyInd}public ${throwReturnType} @throw(object e)`);
|
|
254
|
+
parts.push(`${bodyInd}{`);
|
|
255
|
+
parts.push(`${innerInd}_done = true;`);
|
|
256
|
+
if (func.isAsync) {
|
|
257
|
+
parts.push(`${innerInd}_enumerator.DisposeAsync().AsTask().Wait();`);
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
parts.push(`${innerInd}_enumerator.Dispose();`);
|
|
261
|
+
}
|
|
262
|
+
parts.push(`${innerInd}if (e is global::System.Exception ex) throw ex;`);
|
|
263
|
+
parts.push(`${innerInd}throw new global::System.Exception(e?.ToString() ?? "Unknown error");`);
|
|
264
|
+
parts.push(`${bodyInd}}`);
|
|
265
|
+
parts.push(`${ind}}`);
|
|
266
|
+
return [parts.join("\n"), currentContext];
|
|
267
|
+
};
|
|
268
|
+
/**
|
|
269
|
+
* Check if a generator function needs bidirectional support
|
|
270
|
+
* (i.e., has TNext type parameter that isn't undefined)
|
|
271
|
+
*/
|
|
272
|
+
export const needsBidirectionalSupport = (func) => {
|
|
273
|
+
if (!func.isGenerator)
|
|
274
|
+
return false;
|
|
275
|
+
if (func.returnType?.kind === "referenceType") {
|
|
276
|
+
const typeRef = func.returnType;
|
|
277
|
+
if (typeRef.typeArguments && typeRef.typeArguments.length > 2) {
|
|
278
|
+
const nextTypeArg = typeRef.typeArguments[2];
|
|
279
|
+
// Check if TNext is not undefined
|
|
280
|
+
if (nextTypeArg &&
|
|
281
|
+
!(nextTypeArg.kind === "primitiveType" &&
|
|
282
|
+
nextTypeArg.name === "undefined")) {
|
|
283
|
+
return true;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return false;
|
|
288
|
+
};
|
|
289
|
+
/**
|
|
290
|
+
* Check if a generator function has a return type (TReturn is not void/undefined)
|
|
291
|
+
* This determines whether we need to capture the return value via closure
|
|
292
|
+
*/
|
|
293
|
+
export const hasGeneratorReturnType = (func) => {
|
|
294
|
+
if (!func.isGenerator)
|
|
295
|
+
return false;
|
|
296
|
+
if (func.returnType?.kind === "referenceType") {
|
|
297
|
+
const typeRef = func.returnType;
|
|
298
|
+
// TReturn is the second type argument: Generator<Yield, Return, Next>
|
|
299
|
+
if (typeRef.typeArguments && typeRef.typeArguments.length > 1) {
|
|
300
|
+
const returnTypeArg = typeRef.typeArguments[1];
|
|
301
|
+
// Check if TReturn is not void/undefined
|
|
302
|
+
if (returnTypeArg &&
|
|
303
|
+
returnTypeArg.kind !== "voidType" &&
|
|
304
|
+
!(returnTypeArg.kind === "primitiveType" &&
|
|
305
|
+
returnTypeArg.name === "undefined")) {
|
|
306
|
+
return true;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
return false;
|
|
311
|
+
};
|
|
312
|
+
//# sourceMappingURL=generator-wrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator-wrapper.js","sourceRoot":"","sources":["../src/generator-wrapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for Generator Wrapper emission
|
|
3
|
+
*
|
|
4
|
+
* Tests:
|
|
5
|
+
* - extractGeneratorTypeArgs type extraction
|
|
6
|
+
* - needsBidirectionalSupport detection
|
|
7
|
+
* - generateWrapperClass output
|
|
8
|
+
*
|
|
9
|
+
* Note: IteratorResult<T> is now in Tsonic.Runtime, not emitted per-module
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=generator-wrapper.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator-wrapper.test.d.ts","sourceRoot":"","sources":["../src/generator-wrapper.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for Generator Wrapper emission
|
|
3
|
+
*
|
|
4
|
+
* Tests:
|
|
5
|
+
* - extractGeneratorTypeArgs type extraction
|
|
6
|
+
* - needsBidirectionalSupport detection
|
|
7
|
+
* - generateWrapperClass output
|
|
8
|
+
*
|
|
9
|
+
* Note: IteratorResult<T> is now in Tsonic.Runtime, not emitted per-module
|
|
10
|
+
*/
|
|
11
|
+
import { describe, it } from "mocha";
|
|
12
|
+
import { expect } from "chai";
|
|
13
|
+
import { extractGeneratorTypeArgs, needsBidirectionalSupport, generateWrapperClass, } from "./generator-wrapper.js";
|
|
14
|
+
import { createContext } from "./types.js";
|
|
15
|
+
/**
|
|
16
|
+
* Helper to create a generator function declaration
|
|
17
|
+
*/
|
|
18
|
+
const createGeneratorFunc = (name, returnType, options = {}) => ({
|
|
19
|
+
kind: "functionDeclaration",
|
|
20
|
+
name,
|
|
21
|
+
parameters: [],
|
|
22
|
+
returnType,
|
|
23
|
+
body: { kind: "blockStatement", statements: [] },
|
|
24
|
+
isAsync: options.isAsync ?? false,
|
|
25
|
+
isGenerator: true,
|
|
26
|
+
isExported: true,
|
|
27
|
+
});
|
|
28
|
+
/**
|
|
29
|
+
* Helper to create a Generator<Y, R, N> type
|
|
30
|
+
*/
|
|
31
|
+
const createGeneratorType = (yieldType, returnType, nextType) => ({
|
|
32
|
+
kind: "referenceType",
|
|
33
|
+
name: "Generator",
|
|
34
|
+
typeArguments: [yieldType, returnType, nextType],
|
|
35
|
+
});
|
|
36
|
+
describe("Generator Wrapper", () => {
|
|
37
|
+
describe("extractGeneratorTypeArgs", () => {
|
|
38
|
+
it("should extract yield type from Generator<number, void, undefined>", () => {
|
|
39
|
+
const returnType = createGeneratorType({ kind: "primitiveType", name: "number" }, { kind: "voidType" }, { kind: "primitiveType", name: "undefined" });
|
|
40
|
+
const context = createContext({ rootNamespace: "Test" });
|
|
41
|
+
const result = extractGeneratorTypeArgs(returnType, context);
|
|
42
|
+
expect(result.yieldType).to.equal("double");
|
|
43
|
+
expect(result.returnType).to.equal("void");
|
|
44
|
+
expect(result.hasNextType).to.be.false;
|
|
45
|
+
});
|
|
46
|
+
it("should extract all types from Generator<string, number, boolean>", () => {
|
|
47
|
+
const returnType = createGeneratorType({ kind: "primitiveType", name: "string" }, { kind: "primitiveType", name: "number" }, { kind: "primitiveType", name: "boolean" });
|
|
48
|
+
const context = createContext({ rootNamespace: "Test" });
|
|
49
|
+
const result = extractGeneratorTypeArgs(returnType, context);
|
|
50
|
+
expect(result.yieldType).to.equal("string");
|
|
51
|
+
expect(result.returnType).to.equal("double");
|
|
52
|
+
expect(result.nextType).to.equal("bool");
|
|
53
|
+
expect(result.hasNextType).to.be.true;
|
|
54
|
+
});
|
|
55
|
+
it("should handle Generator with only yield type", () => {
|
|
56
|
+
const returnType = {
|
|
57
|
+
kind: "referenceType",
|
|
58
|
+
name: "Generator",
|
|
59
|
+
typeArguments: [{ kind: "primitiveType", name: "number" }],
|
|
60
|
+
};
|
|
61
|
+
const context = createContext({ rootNamespace: "Test" });
|
|
62
|
+
const result = extractGeneratorTypeArgs(returnType, context);
|
|
63
|
+
expect(result.yieldType).to.equal("double");
|
|
64
|
+
expect(result.returnType).to.equal("void");
|
|
65
|
+
expect(result.hasNextType).to.be.false;
|
|
66
|
+
});
|
|
67
|
+
it("should handle non-Generator return type", () => {
|
|
68
|
+
const returnType = { kind: "primitiveType", name: "number" };
|
|
69
|
+
const context = createContext({ rootNamespace: "Test" });
|
|
70
|
+
const result = extractGeneratorTypeArgs(returnType, context);
|
|
71
|
+
expect(result.yieldType).to.equal("object");
|
|
72
|
+
expect(result.returnType).to.equal("void");
|
|
73
|
+
expect(result.hasNextType).to.be.false;
|
|
74
|
+
});
|
|
75
|
+
it("should handle undefined return type", () => {
|
|
76
|
+
const context = createContext({ rootNamespace: "Test" });
|
|
77
|
+
const result = extractGeneratorTypeArgs(undefined, context);
|
|
78
|
+
expect(result.yieldType).to.equal("object");
|
|
79
|
+
expect(result.returnType).to.equal("void");
|
|
80
|
+
expect(result.hasNextType).to.be.false;
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe("needsBidirectionalSupport", () => {
|
|
84
|
+
it("should return true for Generator<number, void, number>", () => {
|
|
85
|
+
const func = createGeneratorFunc("test", createGeneratorType({ kind: "primitiveType", name: "number" }, { kind: "voidType" }, { kind: "primitiveType", name: "number" }));
|
|
86
|
+
expect(needsBidirectionalSupport(func)).to.be.true;
|
|
87
|
+
});
|
|
88
|
+
it("should return false for Generator<number, void, undefined>", () => {
|
|
89
|
+
const func = createGeneratorFunc("test", createGeneratorType({ kind: "primitiveType", name: "number" }, { kind: "voidType" }, { kind: "primitiveType", name: "undefined" }));
|
|
90
|
+
expect(needsBidirectionalSupport(func)).to.be.false;
|
|
91
|
+
});
|
|
92
|
+
it("should return false for Generator with only yield type", () => {
|
|
93
|
+
const func = createGeneratorFunc("test", {
|
|
94
|
+
kind: "referenceType",
|
|
95
|
+
name: "Generator",
|
|
96
|
+
typeArguments: [{ kind: "primitiveType", name: "number" }],
|
|
97
|
+
});
|
|
98
|
+
expect(needsBidirectionalSupport(func)).to.be.false;
|
|
99
|
+
});
|
|
100
|
+
it("should return false for non-generator functions", () => {
|
|
101
|
+
const func = {
|
|
102
|
+
kind: "functionDeclaration",
|
|
103
|
+
name: "test",
|
|
104
|
+
parameters: [],
|
|
105
|
+
returnType: { kind: "primitiveType", name: "number" },
|
|
106
|
+
body: { kind: "blockStatement", statements: [] },
|
|
107
|
+
isAsync: false,
|
|
108
|
+
isGenerator: false,
|
|
109
|
+
isExported: true,
|
|
110
|
+
};
|
|
111
|
+
expect(needsBidirectionalSupport(func)).to.be.false;
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
// Note: generateIteratorResultStruct tests removed - IteratorResult<T> is now in Tsonic.Runtime
|
|
115
|
+
describe("generateWrapperClass", () => {
|
|
116
|
+
it("should generate wrapper class for sync generator", () => {
|
|
117
|
+
const func = createGeneratorFunc("counter", createGeneratorType({ kind: "primitiveType", name: "number" }, { kind: "voidType" }, { kind: "primitiveType", name: "number" }));
|
|
118
|
+
const context = createContext({ rootNamespace: "Test" });
|
|
119
|
+
const [code] = generateWrapperClass(func, context);
|
|
120
|
+
// Class declaration
|
|
121
|
+
expect(code).to.include("public sealed class counter_Generator");
|
|
122
|
+
// Private fields
|
|
123
|
+
expect(code).to.include("private readonly");
|
|
124
|
+
expect(code).to.include("IEnumerator<counter_exchange>");
|
|
125
|
+
expect(code).to.include("_enumerator");
|
|
126
|
+
expect(code).to.include("counter_exchange _exchange");
|
|
127
|
+
expect(code).to.include("bool _done = false");
|
|
128
|
+
// Constructor
|
|
129
|
+
expect(code).to.include("public counter_Generator(");
|
|
130
|
+
expect(code).to.include("IEnumerable<counter_exchange> enumerable");
|
|
131
|
+
expect(code).to.include("GetEnumerator()");
|
|
132
|
+
// next() method
|
|
133
|
+
expect(code).to.include("public global::Tsonic.Runtime.IteratorResult<double> next(");
|
|
134
|
+
expect(code).to.include("double? value = default");
|
|
135
|
+
expect(code).to.include("_exchange.Input = value");
|
|
136
|
+
expect(code).to.include("MoveNext()");
|
|
137
|
+
expect(code).to.include("_exchange.Output");
|
|
138
|
+
// return() method - takes object when TReturn is void
|
|
139
|
+
expect(code).to.include("public global::Tsonic.Runtime.IteratorResult<double> @return(");
|
|
140
|
+
expect(code).to.include("Dispose()");
|
|
141
|
+
// throw() method
|
|
142
|
+
expect(code).to.include("public global::Tsonic.Runtime.IteratorResult<double> @throw(object e)");
|
|
143
|
+
expect(code).to.include("System.Exception");
|
|
144
|
+
});
|
|
145
|
+
it("should generate async wrapper class for async generator", () => {
|
|
146
|
+
const func = createGeneratorFunc("asyncCounter", {
|
|
147
|
+
kind: "referenceType",
|
|
148
|
+
name: "AsyncGenerator",
|
|
149
|
+
typeArguments: [
|
|
150
|
+
{ kind: "primitiveType", name: "number" },
|
|
151
|
+
{ kind: "voidType" },
|
|
152
|
+
{ kind: "primitiveType", name: "number" },
|
|
153
|
+
],
|
|
154
|
+
}, { isAsync: true });
|
|
155
|
+
const context = createContext({ rootNamespace: "Test" });
|
|
156
|
+
const [code] = generateWrapperClass(func, context);
|
|
157
|
+
// Async class
|
|
158
|
+
expect(code).to.include("public sealed class asyncCounter_Generator");
|
|
159
|
+
// Async enumerator
|
|
160
|
+
expect(code).to.include("IAsyncEnumerator<asyncCounter_exchange>");
|
|
161
|
+
expect(code).to.include("IAsyncEnumerable<asyncCounter_exchange>");
|
|
162
|
+
expect(code).to.include("GetAsyncEnumerator()");
|
|
163
|
+
// Async next() method
|
|
164
|
+
expect(code).to.include("public async global::System.Threading.Tasks.Task<global::Tsonic.Runtime.IteratorResult<double>> next(");
|
|
165
|
+
expect(code).to.include("await _enumerator.MoveNextAsync()");
|
|
166
|
+
// Async return() method
|
|
167
|
+
expect(code).to.include("public async");
|
|
168
|
+
expect(code).to.include("DisposeAsync()");
|
|
169
|
+
});
|
|
170
|
+
it("should use correct type for non-number yield type", () => {
|
|
171
|
+
const func = createGeneratorFunc("stringGen", createGeneratorType({ kind: "primitiveType", name: "string" }, { kind: "voidType" }, { kind: "primitiveType", name: "string" }));
|
|
172
|
+
const context = createContext({ rootNamespace: "Test" });
|
|
173
|
+
const [code] = generateWrapperClass(func, context);
|
|
174
|
+
expect(code).to.include("global::Tsonic.Runtime.IteratorResult<string>");
|
|
175
|
+
expect(code).to.include("string? value = default");
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
//# sourceMappingURL=generator-wrapper.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator-wrapper.test.js","sourceRoot":"","sources":["../src/generator-wrapper.test.ts"],"names":[],"mappings":"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"}
|