@tsonic/frontend 0.0.4 → 0.0.11
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/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/ir/builder/exports.d.ts.map +1 -1
- package/dist/ir/builder/exports.js +8 -6
- package/dist/ir/builder/exports.js.map +1 -1
- package/dist/ir/builder/imports.d.ts.map +1 -1
- package/dist/ir/builder/imports.js +6 -6
- package/dist/ir/builder/imports.js.map +1 -1
- package/dist/ir/builder/statements.d.ts +7 -1
- package/dist/ir/builder/statements.d.ts.map +1 -1
- package/dist/ir/builder/statements.js +18 -5
- package/dist/ir/builder/statements.js.map +1 -1
- package/dist/ir/builder.test.js +70 -5
- package/dist/ir/builder.test.js.map +1 -1
- package/dist/ir/converters/anonymous-synthesis.d.ts +76 -0
- package/dist/ir/converters/anonymous-synthesis.d.ts.map +1 -0
- package/dist/ir/converters/anonymous-synthesis.js +307 -0
- package/dist/ir/converters/anonymous-synthesis.js.map +1 -0
- package/dist/ir/converters/expressions/access.d.ts.map +1 -1
- package/dist/ir/converters/expressions/access.js +65 -2
- package/dist/ir/converters/expressions/access.js.map +1 -1
- package/dist/ir/converters/expressions/calls.d.ts.map +1 -1
- package/dist/ir/converters/expressions/calls.js +96 -1
- package/dist/ir/converters/expressions/calls.js.map +1 -1
- package/dist/ir/converters/expressions/collections.d.ts +3 -0
- package/dist/ir/converters/expressions/collections.d.ts.map +1 -1
- package/dist/ir/converters/expressions/collections.js +43 -2
- package/dist/ir/converters/expressions/collections.js.map +1 -1
- package/dist/ir/converters/expressions/functions.d.ts.map +1 -1
- package/dist/ir/converters/expressions/functions.js +52 -5
- package/dist/ir/converters/expressions/functions.js.map +1 -1
- package/dist/ir/converters/expressions/helpers.d.ts +10 -0
- package/dist/ir/converters/expressions/helpers.d.ts.map +1 -1
- package/dist/ir/converters/expressions/helpers.js +173 -7
- package/dist/ir/converters/expressions/helpers.js.map +1 -1
- package/dist/ir/converters/expressions/index.d.ts +1 -1
- package/dist/ir/converters/expressions/index.d.ts.map +1 -1
- package/dist/ir/converters/expressions/index.js +1 -1
- package/dist/ir/converters/expressions/index.js.map +1 -1
- package/dist/ir/converters/expressions/literals.d.ts.map +1 -1
- package/dist/ir/converters/expressions/literals.js +2 -1
- package/dist/ir/converters/expressions/literals.js.map +1 -1
- package/dist/ir/converters/expressions/numeric-recovery.test.d.ts +14 -0
- package/dist/ir/converters/expressions/numeric-recovery.test.d.ts.map +1 -0
- package/dist/ir/converters/expressions/numeric-recovery.test.js +286 -0
- package/dist/ir/converters/expressions/numeric-recovery.test.js.map +1 -0
- package/dist/ir/converters/expressions/operators.d.ts.map +1 -1
- package/dist/ir/converters/expressions/operators.js +16 -2
- package/dist/ir/converters/expressions/operators.js.map +1 -1
- package/dist/ir/converters/expressions/other.d.ts.map +1 -1
- package/dist/ir/converters/expressions/other.js +4 -1
- package/dist/ir/converters/expressions/other.js.map +1 -1
- package/dist/ir/converters/statements/control/conditionals.d.ts.map +1 -1
- package/dist/ir/converters/statements/control/conditionals.js +4 -6
- package/dist/ir/converters/statements/control/conditionals.js.map +1 -1
- package/dist/ir/converters/statements/control/loops.d.ts.map +1 -1
- package/dist/ir/converters/statements/control/loops.js +6 -5
- package/dist/ir/converters/statements/control/loops.js.map +1 -1
- package/dist/ir/converters/statements/declarations/interfaces.d.ts +4 -3
- package/dist/ir/converters/statements/declarations/interfaces.d.ts.map +1 -1
- package/dist/ir/converters/statements/declarations/interfaces.js +55 -1
- package/dist/ir/converters/statements/declarations/interfaces.js.map +1 -1
- package/dist/ir/converters/statements/declarations/type-aliases.d.ts +8 -3
- package/dist/ir/converters/statements/declarations/type-aliases.d.ts.map +1 -1
- package/dist/ir/converters/statements/declarations/type-aliases.js +12 -2
- package/dist/ir/converters/statements/declarations/type-aliases.js.map +1 -1
- package/dist/ir/converters/synthetic-types.d.ts +38 -0
- package/dist/ir/converters/synthetic-types.d.ts.map +1 -0
- package/dist/ir/converters/synthetic-types.js +123 -0
- package/dist/ir/converters/synthetic-types.js.map +1 -0
- package/dist/ir/expression-converter.d.ts.map +1 -1
- package/dist/ir/expression-converter.js +81 -9
- package/dist/ir/expression-converter.js.map +1 -1
- package/dist/ir/statement-converter.d.ts +16 -1
- package/dist/ir/statement-converter.d.ts.map +1 -1
- package/dist/ir/statement-converter.js +32 -0
- package/dist/ir/statement-converter.js.map +1 -1
- package/dist/ir/type-converter/arrays.d.ts.map +1 -1
- package/dist/ir/type-converter/arrays.js +1 -0
- package/dist/ir/type-converter/arrays.js.map +1 -1
- package/dist/ir/type-converter/index.d.ts +1 -1
- package/dist/ir/type-converter/index.d.ts.map +1 -1
- package/dist/ir/type-converter/index.js +1 -1
- package/dist/ir/type-converter/index.js.map +1 -1
- package/dist/ir/type-converter/inference.d.ts +12 -0
- package/dist/ir/type-converter/inference.d.ts.map +1 -1
- package/dist/ir/type-converter/inference.js +172 -23
- package/dist/ir/type-converter/inference.js.map +1 -1
- package/dist/ir/type-converter/literals.d.ts.map +1 -1
- package/dist/ir/type-converter/literals.js +2 -1
- package/dist/ir/type-converter/literals.js.map +1 -1
- package/dist/ir/type-converter/objects.d.ts.map +1 -1
- package/dist/ir/type-converter/objects.js +2 -1
- package/dist/ir/type-converter/objects.js.map +1 -1
- package/dist/ir/type-converter/orchestrator.d.ts +2 -2
- package/dist/ir/type-converter/orchestrator.d.ts.map +1 -1
- package/dist/ir/type-converter/orchestrator.js +55 -1
- package/dist/ir/type-converter/orchestrator.js.map +1 -1
- package/dist/ir/type-converter/references.d.ts.map +1 -1
- package/dist/ir/type-converter/references.js +14 -18
- package/dist/ir/type-converter/references.js.map +1 -1
- package/dist/ir/type-converter.d.ts +1 -1
- package/dist/ir/type-converter.d.ts.map +1 -1
- package/dist/ir/type-converter.js +1 -1
- package/dist/ir/type-converter.js.map +1 -1
- package/dist/ir/types/expressions.d.ts +110 -1
- package/dist/ir/types/expressions.d.ts.map +1 -1
- package/dist/ir/types/guards.d.ts.map +1 -1
- package/dist/ir/types/guards.js +2 -0
- package/dist/ir/types/guards.js.map +1 -1
- package/dist/ir/types/index.d.ts +5 -3
- package/dist/ir/types/index.d.ts.map +1 -1
- package/dist/ir/types/index.js +1 -0
- package/dist/ir/types/index.js.map +1 -1
- package/dist/ir/types/ir-types.d.ts +33 -1
- package/dist/ir/types/ir-types.d.ts.map +1 -1
- package/dist/ir/types/numeric-kind.d.ts +68 -0
- package/dist/ir/types/numeric-kind.d.ts.map +1 -0
- package/dist/ir/types/numeric-kind.js +170 -0
- package/dist/ir/types/numeric-kind.js.map +1 -0
- package/dist/ir/types/statements.d.ts +38 -1
- package/dist/ir/types/statements.d.ts.map +1 -1
- package/dist/ir/types.d.ts +2 -1
- package/dist/ir/types.d.ts.map +1 -1
- package/dist/ir/types.js +2 -0
- package/dist/ir/types.js.map +1 -1
- package/dist/ir/validation/index.d.ts +7 -0
- package/dist/ir/validation/index.d.ts.map +1 -0
- package/dist/ir/validation/index.js +7 -0
- package/dist/ir/validation/index.js.map +1 -0
- package/dist/ir/validation/numeric-invariants.test.d.ts +15 -0
- package/dist/ir/validation/numeric-invariants.test.d.ts.map +1 -0
- package/dist/ir/validation/numeric-invariants.test.js +598 -0
- package/dist/ir/validation/numeric-invariants.test.js.map +1 -0
- package/dist/ir/validation/numeric-proof-pass.d.ts +37 -0
- package/dist/ir/validation/numeric-proof-pass.d.ts.map +1 -0
- package/dist/ir/validation/numeric-proof-pass.js +889 -0
- package/dist/ir/validation/numeric-proof-pass.js.map +1 -0
- package/dist/ir/validation/soundness-gate.d.ts +26 -0
- package/dist/ir/validation/soundness-gate.d.ts.map +1 -0
- package/dist/ir/validation/soundness-gate.js +551 -0
- package/dist/ir/validation/soundness-gate.js.map +1 -0
- package/dist/ir/validation/soundness-gate.test.d.ts +13 -0
- package/dist/ir/validation/soundness-gate.test.d.ts.map +1 -0
- package/dist/ir/validation/soundness-gate.test.js +315 -0
- package/dist/ir/validation/soundness-gate.test.js.map +1 -0
- package/dist/ir/validation/yield-lowering-pass.d.ts +40 -0
- package/dist/ir/validation/yield-lowering-pass.d.ts.map +1 -0
- package/dist/ir/validation/yield-lowering-pass.js +548 -0
- package/dist/ir/validation/yield-lowering-pass.js.map +1 -0
- package/dist/ir/validation/yield-lowering-pass.test.d.ts +12 -0
- package/dist/ir/validation/yield-lowering-pass.test.d.ts.map +1 -0
- package/dist/ir/validation/yield-lowering-pass.test.js +761 -0
- package/dist/ir/validation/yield-lowering-pass.test.js.map +1 -0
- package/dist/program/bindings.d.ts +5 -0
- package/dist/program/bindings.d.ts.map +1 -1
- package/dist/program/bindings.js +12 -1
- package/dist/program/bindings.js.map +1 -1
- package/dist/program/dependency-graph.d.ts +3 -0
- package/dist/program/dependency-graph.d.ts.map +1 -1
- package/dist/program/dependency-graph.js +28 -4
- package/dist/program/dependency-graph.js.map +1 -1
- package/dist/program/index.d.ts +1 -1
- package/dist/program/index.d.ts.map +1 -1
- package/dist/program/index.js.map +1 -1
- package/dist/program.d.ts +1 -0
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js.map +1 -1
- package/dist/resolver/clr-bindings-resolver.d.ts +9 -0
- package/dist/resolver/clr-bindings-resolver.d.ts.map +1 -1
- package/dist/resolver/clr-bindings-resolver.js +52 -3
- package/dist/resolver/clr-bindings-resolver.js.map +1 -1
- package/dist/types/diagnostic.d.ts +1 -1
- package/dist/types/diagnostic.d.ts.map +1 -1
- package/dist/types/diagnostic.js.map +1 -1
- package/dist/validation/static-safety.d.ts +6 -1
- package/dist/validation/static-safety.d.ts.map +1 -1
- package/dist/validation/static-safety.js +144 -36
- package/dist/validation/static-safety.js.map +1 -1
- package/dist/validation/unsupported-utility-types.d.ts +38 -0
- package/dist/validation/unsupported-utility-types.d.ts.map +1 -0
- package/dist/validation/unsupported-utility-types.js +53 -0
- package/dist/validation/unsupported-utility-types.js.map +1 -0
- package/dist/validator.test.js +304 -14
- package/dist/validator.test.js.map +1 -1
- package/package.json +1 -1
- package/dist/types/parameter-modifiers.d.ts +0 -55
- package/dist/types/parameter-modifiers.d.ts.map +0 -1
- package/dist/types/parameter-modifiers.js +0 -148
- package/dist/types/parameter-modifiers.js.map +0 -1
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Operator expression converters (binary, unary, update, assignment)
|
|
3
3
|
*/
|
|
4
4
|
import * as ts from "typescript";
|
|
5
|
-
import { getInferredType, convertBinaryOperator, isAssignmentOperator, } from "./helpers.js";
|
|
5
|
+
import { getInferredType, getSourceSpan, convertBinaryOperator, isAssignmentOperator, } from "./helpers.js";
|
|
6
6
|
import { convertExpression } from "../../expression-converter.js";
|
|
7
7
|
/**
|
|
8
8
|
* Convert binary expression (including logical and assignment)
|
|
@@ -10,16 +10,22 @@ import { convertExpression } from "../../expression-converter.js";
|
|
|
10
10
|
export const convertBinaryExpression = (node, checker) => {
|
|
11
11
|
const operator = convertBinaryOperator(node.operatorToken);
|
|
12
12
|
const inferredType = getInferredType(node, checker);
|
|
13
|
+
const sourceSpan = getSourceSpan(node);
|
|
13
14
|
// Handle assignment separately
|
|
14
15
|
if (isAssignmentOperator(node.operatorToken)) {
|
|
15
16
|
return {
|
|
16
17
|
kind: "assignment",
|
|
17
18
|
operator: operator,
|
|
18
19
|
left: ts.isIdentifier(node.left)
|
|
19
|
-
? {
|
|
20
|
+
? {
|
|
21
|
+
kind: "identifier",
|
|
22
|
+
name: node.left.text,
|
|
23
|
+
sourceSpan: getSourceSpan(node.left),
|
|
24
|
+
}
|
|
20
25
|
: convertExpression(node.left, checker),
|
|
21
26
|
right: convertExpression(node.right, checker),
|
|
22
27
|
inferredType,
|
|
28
|
+
sourceSpan,
|
|
23
29
|
};
|
|
24
30
|
}
|
|
25
31
|
// Handle logical operators
|
|
@@ -30,6 +36,7 @@ export const convertBinaryExpression = (node, checker) => {
|
|
|
30
36
|
left: convertExpression(node.left, checker),
|
|
31
37
|
right: convertExpression(node.right, checker),
|
|
32
38
|
inferredType,
|
|
39
|
+
sourceSpan,
|
|
33
40
|
};
|
|
34
41
|
}
|
|
35
42
|
// Regular binary expression
|
|
@@ -39,6 +46,7 @@ export const convertBinaryExpression = (node, checker) => {
|
|
|
39
46
|
left: convertExpression(node.left, checker),
|
|
40
47
|
right: convertExpression(node.right, checker),
|
|
41
48
|
inferredType,
|
|
49
|
+
sourceSpan,
|
|
42
50
|
};
|
|
43
51
|
};
|
|
44
52
|
/**
|
|
@@ -46,6 +54,7 @@ export const convertBinaryExpression = (node, checker) => {
|
|
|
46
54
|
*/
|
|
47
55
|
export const convertUnaryExpression = (node, checker) => {
|
|
48
56
|
const inferredType = getInferredType(node, checker);
|
|
57
|
+
const sourceSpan = getSourceSpan(node);
|
|
49
58
|
// Check if it's an increment/decrement (++ or --)
|
|
50
59
|
if (node.operator === ts.SyntaxKind.PlusPlusToken ||
|
|
51
60
|
node.operator === ts.SyntaxKind.MinusMinusToken) {
|
|
@@ -55,6 +64,7 @@ export const convertUnaryExpression = (node, checker) => {
|
|
|
55
64
|
prefix: true,
|
|
56
65
|
expression: convertExpression(node.operand, checker),
|
|
57
66
|
inferredType,
|
|
67
|
+
sourceSpan,
|
|
58
68
|
};
|
|
59
69
|
}
|
|
60
70
|
// Handle regular unary operators
|
|
@@ -78,6 +88,7 @@ export const convertUnaryExpression = (node, checker) => {
|
|
|
78
88
|
operator,
|
|
79
89
|
expression: convertExpression(node.operand, checker),
|
|
80
90
|
inferredType,
|
|
91
|
+
sourceSpan,
|
|
81
92
|
};
|
|
82
93
|
};
|
|
83
94
|
/**
|
|
@@ -85,6 +96,7 @@ export const convertUnaryExpression = (node, checker) => {
|
|
|
85
96
|
*/
|
|
86
97
|
export const convertUpdateExpression = (node, checker) => {
|
|
87
98
|
const inferredType = getInferredType(node, checker);
|
|
99
|
+
const sourceSpan = getSourceSpan(node);
|
|
88
100
|
if (ts.isPrefixUnaryExpression(node)) {
|
|
89
101
|
// Check if it's an increment or decrement
|
|
90
102
|
if (node.operator === ts.SyntaxKind.PlusPlusToken ||
|
|
@@ -95,6 +107,7 @@ export const convertUpdateExpression = (node, checker) => {
|
|
|
95
107
|
prefix: true,
|
|
96
108
|
expression: convertExpression(node.operand, checker),
|
|
97
109
|
inferredType,
|
|
110
|
+
sourceSpan,
|
|
98
111
|
};
|
|
99
112
|
}
|
|
100
113
|
}
|
|
@@ -106,6 +119,7 @@ export const convertUpdateExpression = (node, checker) => {
|
|
|
106
119
|
prefix: false,
|
|
107
120
|
expression: convertExpression(postfix.operand, checker),
|
|
108
121
|
inferredType,
|
|
122
|
+
sourceSpan,
|
|
109
123
|
};
|
|
110
124
|
};
|
|
111
125
|
//# sourceMappingURL=operators.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operators.js","sourceRoot":"","sources":["../../../../src/ir/converters/expressions/operators.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAQjC,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,IAAyB,EACzB,OAAuB,EACT,EAAE;IAChB,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3D,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"operators.js","sourceRoot":"","sources":["../../../../src/ir/converters/expressions/operators.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"other.d.ts","sourceRoot":"","sources":["../../../../src/ir/converters/expressions/other.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EACL,uBAAuB,EACvB,2BAA2B,EAE5B,MAAM,gBAAgB,CAAC;AAIxB;;GAEG;AACH,eAAO,MAAM,4BAA4B,GACvC,MAAM,EAAE,CAAC,qBAAqB,EAC9B,SAAS,EAAE,CAAC,WAAW,KACtB,
|
|
1
|
+
{"version":3,"file":"other.d.ts","sourceRoot":"","sources":["../../../../src/ir/converters/expressions/other.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EACL,uBAAuB,EACvB,2BAA2B,EAE5B,MAAM,gBAAgB,CAAC;AAIxB;;GAEG;AACH,eAAO,MAAM,4BAA4B,GACvC,MAAM,EAAE,CAAC,qBAAqB,EAC9B,SAAS,EAAE,CAAC,WAAW,KACtB,uBASF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,GACjC,MAAM,EAAE,CAAC,kBAAkB,GAAG,EAAE,CAAC,6BAA6B,EAC9D,SAAS,EAAE,CAAC,WAAW,KACtB,2BA0BF,CAAC"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Miscellaneous expression converters (conditional, template literals)
|
|
3
3
|
*/
|
|
4
4
|
import * as ts from "typescript";
|
|
5
|
-
import { getInferredType } from "./helpers.js";
|
|
5
|
+
import { getInferredType, getSourceSpan } from "./helpers.js";
|
|
6
6
|
import { convertExpression } from "../../expression-converter.js";
|
|
7
7
|
/**
|
|
8
8
|
* Convert conditional (ternary) expression
|
|
@@ -14,6 +14,7 @@ export const convertConditionalExpression = (node, checker) => {
|
|
|
14
14
|
whenTrue: convertExpression(node.whenTrue, checker),
|
|
15
15
|
whenFalse: convertExpression(node.whenFalse, checker),
|
|
16
16
|
inferredType: getInferredType(node, checker),
|
|
17
|
+
sourceSpan: getSourceSpan(node),
|
|
17
18
|
};
|
|
18
19
|
};
|
|
19
20
|
/**
|
|
@@ -26,6 +27,7 @@ export const convertTemplateLiteral = (node, checker) => {
|
|
|
26
27
|
quasis: [node.text],
|
|
27
28
|
expressions: [],
|
|
28
29
|
inferredType: getInferredType(node, checker),
|
|
30
|
+
sourceSpan: getSourceSpan(node),
|
|
29
31
|
};
|
|
30
32
|
}
|
|
31
33
|
const quasis = [node.head.text];
|
|
@@ -39,6 +41,7 @@ export const convertTemplateLiteral = (node, checker) => {
|
|
|
39
41
|
quasis,
|
|
40
42
|
expressions,
|
|
41
43
|
inferredType: getInferredType(node, checker),
|
|
44
|
+
sourceSpan: getSourceSpan(node),
|
|
42
45
|
};
|
|
43
46
|
};
|
|
44
47
|
//# sourceMappingURL=other.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"other.js","sourceRoot":"","sources":["../../../../src/ir/converters/expressions/other.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAMjC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"other.js","sourceRoot":"","sources":["../../../../src/ir/converters/expressions/other.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAMjC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE;;GAEG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,IAA8B,EAC9B,OAAuB,EACE,EAAE;IAC3B,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,SAAS,EAAE,iBAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC;QACrD,QAAQ,EAAE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC;QACnD,SAAS,EAAE,iBAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC;QACrD,YAAY,EAAE,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC;QAC5C,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC;KAChC,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,IAA8D,EAC9D,OAAuB,EACM,EAAE;IAC/B,IAAI,EAAE,CAAC,+BAA+B,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,OAAO;YACL,IAAI,EAAE,iBAAiB;YACvB,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;YACnB,WAAW,EAAE,EAAE;YACf,YAAY,EAAE,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC;YAC5C,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC;SAChC,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAmB,EAAE,CAAC;IAEvC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAClC,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,MAAM;QACN,WAAW;QACX,YAAY,EAAE,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC;QAC5C,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC;KAChC,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conditionals.d.ts","sourceRoot":"","sources":["../../../../../src/ir/converters/statements/control/conditionals.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,
|
|
1
|
+
{"version":3,"file":"conditionals.d.ts","sourceRoot":"","sources":["../../../../../src/ir/converters/statements/control/conditionals.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,YAAY,EACb,MAAM,mBAAmB,CAAC;AAQ3B;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAC7B,MAAM,EAAE,CAAC,WAAW,EACpB,SAAS,EAAE,CAAC,WAAW,KACtB,aAYF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,GACjC,MAAM,EAAE,CAAC,eAAe,EACxB,SAAS,EAAE,CAAC,WAAW,KACtB,iBAQF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAC5B,MAAM,EAAE,CAAC,mBAAmB,EAC5B,SAAS,EAAE,CAAC,WAAW,KACtB,YAUF,CAAC"}
|
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import * as ts from "typescript";
|
|
5
5
|
import { convertExpression } from "../../../expression-converter.js";
|
|
6
|
-
import { convertStatement } from "../../../statement-converter.js";
|
|
6
|
+
import { convertStatementSingle, flattenStatementResult, convertStatement, } from "../../../statement-converter.js";
|
|
7
7
|
/**
|
|
8
8
|
* Convert if statement
|
|
9
9
|
*/
|
|
10
10
|
export const convertIfStatement = (node, checker) => {
|
|
11
|
-
const thenStmt =
|
|
11
|
+
const thenStmt = convertStatementSingle(node.thenStatement, checker);
|
|
12
12
|
const elseStmt = node.elseStatement
|
|
13
|
-
?
|
|
13
|
+
? convertStatementSingle(node.elseStatement, checker)
|
|
14
14
|
: undefined;
|
|
15
15
|
return {
|
|
16
16
|
kind: "ifStatement",
|
|
@@ -38,9 +38,7 @@ export const convertSwitchCase = (node, checker) => {
|
|
|
38
38
|
test: ts.isCaseClause(node)
|
|
39
39
|
? convertExpression(node.expression, checker)
|
|
40
40
|
: undefined,
|
|
41
|
-
statements: node.statements
|
|
42
|
-
.map((s) => convertStatement(s, checker))
|
|
43
|
-
.filter((s) => s !== null),
|
|
41
|
+
statements: node.statements.flatMap((s) => flattenStatementResult(convertStatement(s, checker))),
|
|
44
42
|
};
|
|
45
43
|
};
|
|
46
44
|
//# sourceMappingURL=conditionals.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conditionals.js","sourceRoot":"","sources":["../../../../../src/ir/converters/statements/control/conditionals.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"conditionals.js","sourceRoot":"","sources":["../../../../../src/ir/converters/statements/control/conditionals.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAMjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,iCAAiC,CAAC;AAEzC;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,IAAoB,EACpB,OAAuB,EACR,EAAE;IACjB,MAAM,QAAQ,GAAG,sBAAsB,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa;QACjC,CAAC,CAAC,sBAAsB,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC;QACrD,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,SAAS,EAAE,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;QACtD,aAAa,EAAE,QAAQ,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE;QACrD,aAAa,EAAE,QAAQ,IAAI,SAAS;KACrC,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,IAAwB,EACxB,OAAuB,EACJ,EAAE;IACrB,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,UAAU,EAAE,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;QACvD,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAC3C,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CACnC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,IAA4B,EAC5B,OAAuB,EACT,EAAE;IAChB,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC;YACzB,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;YAC7C,CAAC,CAAC,SAAS;QACb,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CACxC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CACrD;KACF,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loops.d.ts","sourceRoot":"","sources":["../../../../../src/ir/converters/statements/control/loops.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAM3B;;GAEG;AACH,eAAO,MAAM,qBAAqB,GAChC,MAAM,EAAE,CAAC,cAAc,EACvB,SAAS,EAAE,CAAC,WAAW,KACtB,gBAOF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAC9B,MAAM,EAAE,CAAC,YAAY,EACrB,SAAS,EAAE,CAAC,WAAW,KACtB,cAiBF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,qBAAqB,GAChC,MAAM,EAAE,CAAC,cAAc,EACvB,SAAS,EAAE,CAAC,WAAW,KACtB,
|
|
1
|
+
{"version":3,"file":"loops.d.ts","sourceRoot":"","sources":["../../../../../src/ir/converters/statements/control/loops.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAM3B;;GAEG;AACH,eAAO,MAAM,qBAAqB,GAChC,MAAM,EAAE,CAAC,cAAc,EACvB,SAAS,EAAE,CAAC,WAAW,KACtB,gBAOF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAC9B,MAAM,EAAE,CAAC,YAAY,EACrB,SAAS,EAAE,CAAC,WAAW,KACtB,cAiBF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,qBAAqB,GAChC,MAAM,EAAE,CAAC,cAAc,EACvB,SAAS,EAAE,CAAC,WAAW,KACtB,gBAiBF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,qBAAqB,GAChC,MAAM,EAAE,CAAC,cAAc,EACvB,SAAS,EAAE,CAAC,WAAW,KACtB,cAaF,CAAC"}
|
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
import * as ts from "typescript";
|
|
5
5
|
import { convertExpression } from "../../../expression-converter.js";
|
|
6
6
|
import { convertBindingName } from "../../../type-converter.js";
|
|
7
|
-
import {
|
|
7
|
+
import { convertStatementSingle } from "../../../statement-converter.js";
|
|
8
8
|
import { convertVariableDeclarationList } from "../helpers.js";
|
|
9
9
|
/**
|
|
10
10
|
* Convert while statement
|
|
11
11
|
*/
|
|
12
12
|
export const convertWhileStatement = (node, checker) => {
|
|
13
|
-
const body =
|
|
13
|
+
const body = convertStatementSingle(node.statement, checker);
|
|
14
14
|
return {
|
|
15
15
|
kind: "whileStatement",
|
|
16
16
|
condition: convertExpression(node.expression, checker),
|
|
@@ -21,7 +21,7 @@ export const convertWhileStatement = (node, checker) => {
|
|
|
21
21
|
* Convert for statement
|
|
22
22
|
*/
|
|
23
23
|
export const convertForStatement = (node, checker) => {
|
|
24
|
-
const body =
|
|
24
|
+
const body = convertStatementSingle(node.statement, checker);
|
|
25
25
|
return {
|
|
26
26
|
kind: "forStatement",
|
|
27
27
|
initializer: node.initializer
|
|
@@ -48,12 +48,13 @@ export const convertForOfStatement = (node, checker) => {
|
|
|
48
48
|
const variable = ts.isVariableDeclarationList(node.initializer)
|
|
49
49
|
? convertBindingName(firstDecl?.name ?? ts.factory.createIdentifier("_"))
|
|
50
50
|
: convertBindingName(node.initializer);
|
|
51
|
-
const body =
|
|
51
|
+
const body = convertStatementSingle(node.statement, checker);
|
|
52
52
|
return {
|
|
53
53
|
kind: "forOfStatement",
|
|
54
54
|
variable,
|
|
55
55
|
expression: convertExpression(node.expression, checker),
|
|
56
56
|
body: body ?? { kind: "emptyStatement" },
|
|
57
|
+
isAwait: !!node.awaitModifier,
|
|
57
58
|
};
|
|
58
59
|
};
|
|
59
60
|
/**
|
|
@@ -62,7 +63,7 @@ export const convertForOfStatement = (node, checker) => {
|
|
|
62
63
|
export const convertForInStatement = (node, checker) => {
|
|
63
64
|
// Note: for...in needs special handling in C# - variable extraction will be handled in emitter
|
|
64
65
|
// We'll need to extract the variable info in the emitter phase
|
|
65
|
-
const body =
|
|
66
|
+
const body = convertStatementSingle(node.statement, checker);
|
|
66
67
|
// Note: for...in needs special handling in C#
|
|
67
68
|
return {
|
|
68
69
|
kind: "forStatement",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loops.js","sourceRoot":"","sources":["../../../../../src/ir/converters/statements/control/loops.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAMjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"loops.js","sourceRoot":"","sources":["../../../../../src/ir/converters/statements/control/loops.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,14 +2,15 @@
|
|
|
2
2
|
* Interface declaration converter
|
|
3
3
|
*/
|
|
4
4
|
import * as ts from "typescript";
|
|
5
|
-
import { IrInterfaceDeclaration, IrInterfaceMember } from "../../../types.js";
|
|
5
|
+
import { IrInterfaceDeclaration, IrInterfaceMember, IrTypeAliasDeclaration } from "../../../types.js";
|
|
6
6
|
/**
|
|
7
7
|
* Convert interface member
|
|
8
8
|
*/
|
|
9
9
|
export declare const convertInterfaceMember: (node: ts.TypeElement, checker: ts.TypeChecker) => IrInterfaceMember | null;
|
|
10
10
|
/**
|
|
11
11
|
* Convert interface declaration
|
|
12
|
-
* Returns null for marker interfaces that should be filtered out
|
|
12
|
+
* Returns null for marker interfaces that should be filtered out.
|
|
13
|
+
* Returns a type alias for index-signature-only interfaces (lowered to Dictionary).
|
|
13
14
|
*/
|
|
14
|
-
export declare const convertInterfaceDeclaration: (node: ts.InterfaceDeclaration, checker: ts.TypeChecker) => IrInterfaceDeclaration | null;
|
|
15
|
+
export declare const convertInterfaceDeclaration: (node: ts.InterfaceDeclaration, checker: ts.TypeChecker) => IrInterfaceDeclaration | IrTypeAliasDeclaration | null;
|
|
15
16
|
//# sourceMappingURL=interfaces.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../../../src/ir/converters/statements/declarations/interfaces.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../../../src/ir/converters/statements/declarations/interfaces.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,sBAAsB,EAEvB,MAAM,mBAAmB,CAAC;AAS3B;;GAEG;AACH,eAAO,MAAM,sBAAsB,GACjC,MAAM,EAAE,CAAC,WAAW,EACpB,SAAS,EAAE,CAAC,WAAW,KACtB,iBAAiB,GAAG,IAwBtB,CAAC;AAyFF;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,GACtC,MAAM,EAAE,CAAC,oBAAoB,EAC7B,SAAS,EAAE,CAAC,WAAW,KACtB,sBAAsB,GAAG,sBAAsB,GAAG,IA0DpD,CAAC"}
|
|
@@ -35,6 +35,43 @@ const isStructMarker = (typeRef, checker) => {
|
|
|
35
35
|
const symbol = checker.getSymbolAtLocation(typeRef.expression);
|
|
36
36
|
return symbol?.escapedName === "struct" || symbol?.escapedName === "Struct";
|
|
37
37
|
};
|
|
38
|
+
/**
|
|
39
|
+
* Check if an interface has only index signatures (no property/method members).
|
|
40
|
+
* Returns the dictionary type info if so, undefined otherwise.
|
|
41
|
+
*
|
|
42
|
+
* This handles interfaces like:
|
|
43
|
+
* interface NumberIndexed { [key: number]: string; }
|
|
44
|
+
*
|
|
45
|
+
* These should be lowered to type aliases for Dictionary<K, V>.
|
|
46
|
+
*/
|
|
47
|
+
const extractIndexSignatureOnlyInterface = (node, checker) => {
|
|
48
|
+
const members = node.members;
|
|
49
|
+
// Must have exactly one member
|
|
50
|
+
if (members.length !== 1) {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
const member = members[0];
|
|
54
|
+
if (!member || !ts.isIndexSignatureDeclaration(member)) {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
// Extract key type from the index signature parameter
|
|
58
|
+
const param = member.parameters[0];
|
|
59
|
+
if (!param || !param.type) {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
const keyType = convertType(param.type, checker);
|
|
63
|
+
// Only allow string or number keys (enforced by TSN7413)
|
|
64
|
+
if (keyType.kind !== "primitiveType" ||
|
|
65
|
+
(keyType.name !== "string" && keyType.name !== "number")) {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
// Extract value type
|
|
69
|
+
if (!member.type) {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
const valueType = convertType(member.type, checker);
|
|
73
|
+
return { keyType, valueType };
|
|
74
|
+
};
|
|
38
75
|
/**
|
|
39
76
|
* Check if an interface declaration IS the struct marker itself (should be filtered out)
|
|
40
77
|
*/
|
|
@@ -57,13 +94,30 @@ const isMarkerInterface = (node) => {
|
|
|
57
94
|
};
|
|
58
95
|
/**
|
|
59
96
|
* Convert interface declaration
|
|
60
|
-
* Returns null for marker interfaces that should be filtered out
|
|
97
|
+
* Returns null for marker interfaces that should be filtered out.
|
|
98
|
+
* Returns a type alias for index-signature-only interfaces (lowered to Dictionary).
|
|
61
99
|
*/
|
|
62
100
|
export const convertInterfaceDeclaration = (node, checker) => {
|
|
63
101
|
// Filter out marker interfaces completely
|
|
64
102
|
if (isMarkerInterface(node)) {
|
|
65
103
|
return null;
|
|
66
104
|
}
|
|
105
|
+
// Check for index-signature-only interface → lower to type alias for dictionary
|
|
106
|
+
const dictInfo = extractIndexSignatureOnlyInterface(node, checker);
|
|
107
|
+
if (dictInfo) {
|
|
108
|
+
return {
|
|
109
|
+
kind: "typeAliasDeclaration",
|
|
110
|
+
name: node.name.text,
|
|
111
|
+
typeParameters: convertTypeParameters(node.typeParameters, checker),
|
|
112
|
+
type: {
|
|
113
|
+
kind: "dictionaryType",
|
|
114
|
+
keyType: dictInfo.keyType,
|
|
115
|
+
valueType: dictInfo.valueType,
|
|
116
|
+
},
|
|
117
|
+
isExported: hasExportModifier(node),
|
|
118
|
+
isStruct: false,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
67
121
|
// Detect struct marker in extends clause
|
|
68
122
|
let isStruct = false;
|
|
69
123
|
const extendsClause = node.heritageClauses?.find((h) => h.token === ts.SyntaxKind.ExtendsKeyword);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../../../src/ir/converters/statements/declarations/interfaces.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../../../src/ir/converters/statements/declarations/interfaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,9 +2,14 @@
|
|
|
2
2
|
* Type alias declaration converter
|
|
3
3
|
*/
|
|
4
4
|
import * as ts from "typescript";
|
|
5
|
-
import {
|
|
5
|
+
import { IrStatement } from "../../../types.js";
|
|
6
6
|
/**
|
|
7
|
-
* Convert type alias declaration
|
|
7
|
+
* Convert type alias declaration.
|
|
8
|
+
*
|
|
9
|
+
* If the type alias is a union of object literals, this generates synthetic
|
|
10
|
+
* interface declarations and rewrites the type alias to reference them.
|
|
11
|
+
*
|
|
12
|
+
* @returns Array of statements: [synthetic interfaces..., type alias]
|
|
8
13
|
*/
|
|
9
|
-
export declare const convertTypeAliasDeclaration: (node: ts.TypeAliasDeclaration, checker: ts.TypeChecker) =>
|
|
14
|
+
export declare const convertTypeAliasDeclaration: (node: ts.TypeAliasDeclaration, checker: ts.TypeChecker) => readonly IrStatement[];
|
|
10
15
|
//# sourceMappingURL=type-aliases.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type-aliases.d.ts","sourceRoot":"","sources":["../../../../../src/ir/converters/statements/declarations/type-aliases.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"type-aliases.d.ts","sourceRoot":"","sources":["../../../../../src/ir/converters/statements/declarations/type-aliases.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,WAAW,EAA0B,MAAM,mBAAmB,CAAC;AAKxE;;;;;;;GAOG;AACH,eAAO,MAAM,2BAA2B,GACtC,MAAM,EAAE,CAAC,oBAAoB,EAC7B,SAAS,EAAE,CAAC,WAAW,KACtB,SAAS,WAAW,EAetB,CAAC"}
|
|
@@ -3,11 +3,17 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { convertType } from "../../../type-converter.js";
|
|
5
5
|
import { hasExportModifier, convertTypeParameters } from "../helpers.js";
|
|
6
|
+
import { processTypeAliasForSynthetics } from "../../synthetic-types.js";
|
|
6
7
|
/**
|
|
7
|
-
* Convert type alias declaration
|
|
8
|
+
* Convert type alias declaration.
|
|
9
|
+
*
|
|
10
|
+
* If the type alias is a union of object literals, this generates synthetic
|
|
11
|
+
* interface declarations and rewrites the type alias to reference them.
|
|
12
|
+
*
|
|
13
|
+
* @returns Array of statements: [synthetic interfaces..., type alias]
|
|
8
14
|
*/
|
|
9
15
|
export const convertTypeAliasDeclaration = (node, checker) => {
|
|
10
|
-
|
|
16
|
+
const baseAlias = {
|
|
11
17
|
kind: "typeAliasDeclaration",
|
|
12
18
|
name: node.name.text,
|
|
13
19
|
typeParameters: convertTypeParameters(node.typeParameters, checker),
|
|
@@ -15,5 +21,9 @@ export const convertTypeAliasDeclaration = (node, checker) => {
|
|
|
15
21
|
isExported: hasExportModifier(node),
|
|
16
22
|
isStruct: false, // Type aliases are not structs by default
|
|
17
23
|
};
|
|
24
|
+
// Process for synthetic type generation (union of object literals)
|
|
25
|
+
const result = processTypeAliasForSynthetics(baseAlias);
|
|
26
|
+
// Return synthetics first, then the (possibly rewritten) type alias
|
|
27
|
+
return [...result.syntheticInterfaces, result.typeAlias];
|
|
18
28
|
};
|
|
19
29
|
//# sourceMappingURL=type-aliases.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type-aliases.js","sourceRoot":"","sources":["../../../../../src/ir/converters/statements/declarations/type-aliases.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEzE
|
|
1
|
+
{"version":3,"file":"type-aliases.js","sourceRoot":"","sources":["../../../../../src/ir/converters/statements/declarations/type-aliases.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AAEzE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,IAA6B,EAC7B,OAAuB,EACC,EAAE;IAC1B,MAAM,SAAS,GAA2B;QACxC,IAAI,EAAE,sBAAsB;QAC5B,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;QACpB,cAAc,EAAE,qBAAqB,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC;QACnE,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC;QACrC,UAAU,EAAE,iBAAiB,CAAC,IAAI,CAAC;QACnC,QAAQ,EAAE,KAAK,EAAE,0CAA0C;KAC5D,CAAC;IAEF,mEAAmE;IACnE,MAAM,MAAM,GAAG,6BAA6B,CAAC,SAAS,CAAC,CAAC;IAExD,oEAAoE;IACpE,OAAO,CAAC,GAAG,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;AAC3D,CAAC,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Synthetic Type Generation for Union-of-Object-Literals
|
|
3
|
+
*
|
|
4
|
+
* When a type alias contains a union of object literal types, we generate
|
|
5
|
+
* synthetic nominal interfaces for each object member. This enables:
|
|
6
|
+
* - TSN7403 compliance (object literals have contextual nominal types)
|
|
7
|
+
* - Proper C# emission (nominal types instead of anonymous objects)
|
|
8
|
+
*
|
|
9
|
+
* Example:
|
|
10
|
+
* type Result<T, E> = { ok: true; value: T } | { ok: false; error: E };
|
|
11
|
+
*
|
|
12
|
+
* Generates:
|
|
13
|
+
* interface Result__0<T, E> { ok: true; value: T }
|
|
14
|
+
* interface Result__1<T, E> { ok: false; error: E }
|
|
15
|
+
* type Result<T, E> = Result__0<T, E> | Result__1<T, E>
|
|
16
|
+
*/
|
|
17
|
+
import { IrInterfaceDeclaration, IrTypeAliasDeclaration } from "../types.js";
|
|
18
|
+
/**
|
|
19
|
+
* Result of processing a type alias for synthetic type generation
|
|
20
|
+
*/
|
|
21
|
+
export type SyntheticTypeResult = {
|
|
22
|
+
/** The (possibly rewritten) type alias declaration */
|
|
23
|
+
readonly typeAlias: IrTypeAliasDeclaration;
|
|
24
|
+
/** Generated synthetic interface declarations (empty if no rewriting needed) */
|
|
25
|
+
readonly syntheticInterfaces: readonly IrInterfaceDeclaration[];
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Process a type alias declaration and generate synthetic interfaces if needed.
|
|
29
|
+
*
|
|
30
|
+
* If the type alias is a union containing object literal types, this will:
|
|
31
|
+
* 1. Generate a synthetic interface for each object literal member
|
|
32
|
+
* 2. Rewrite the union to use reference types to the synthetics
|
|
33
|
+
* 3. Return both the rewritten alias and the synthetic interfaces
|
|
34
|
+
*
|
|
35
|
+
* If no object literals are found, returns the original alias unchanged.
|
|
36
|
+
*/
|
|
37
|
+
export declare const processTypeAliasForSynthetics: (typeAlias: IrTypeAliasDeclaration) => SyntheticTypeResult;
|
|
38
|
+
//# sourceMappingURL=synthetic-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synthetic-types.d.ts","sourceRoot":"","sources":["../../../src/ir/converters/synthetic-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAIL,sBAAsB,EACtB,sBAAsB,EAGvB,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,sDAAsD;IACtD,QAAQ,CAAC,SAAS,EAAE,sBAAsB,CAAC;IAC3C,gFAAgF;IAChF,QAAQ,CAAC,mBAAmB,EAAE,SAAS,sBAAsB,EAAE,CAAC;CACjE,CAAC;AAyEF;;;;;;;;;GASG;AACH,eAAO,MAAM,6BAA6B,GACxC,WAAW,sBAAsB,KAChC,mBA2DF,CAAC"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Synthetic Type Generation for Union-of-Object-Literals
|
|
3
|
+
*
|
|
4
|
+
* When a type alias contains a union of object literal types, we generate
|
|
5
|
+
* synthetic nominal interfaces for each object member. This enables:
|
|
6
|
+
* - TSN7403 compliance (object literals have contextual nominal types)
|
|
7
|
+
* - Proper C# emission (nominal types instead of anonymous objects)
|
|
8
|
+
*
|
|
9
|
+
* Example:
|
|
10
|
+
* type Result<T, E> = { ok: true; value: T } | { ok: false; error: E };
|
|
11
|
+
*
|
|
12
|
+
* Generates:
|
|
13
|
+
* interface Result__0<T, E> { ok: true; value: T }
|
|
14
|
+
* interface Result__1<T, E> { ok: false; error: E }
|
|
15
|
+
* type Result<T, E> = Result__0<T, E> | Result__1<T, E>
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Check if a type is an object type (inline object literal)
|
|
19
|
+
*/
|
|
20
|
+
const isObjectType = (type) => type.kind === "objectType";
|
|
21
|
+
/**
|
|
22
|
+
* Check if a union type contains any object literal types
|
|
23
|
+
*/
|
|
24
|
+
const unionContainsObjectTypes = (union) => union.types.some(isObjectType);
|
|
25
|
+
/**
|
|
26
|
+
* Generate a synthetic interface name for a union member
|
|
27
|
+
*
|
|
28
|
+
* Format: {AliasName}__{index}
|
|
29
|
+
* Example: Result__0, Result__1
|
|
30
|
+
*/
|
|
31
|
+
const generateSyntheticName = (aliasName, index) => `${aliasName}__${index}`;
|
|
32
|
+
/**
|
|
33
|
+
* Create type arguments from type parameters (for referencing synthetics)
|
|
34
|
+
*
|
|
35
|
+
* Example: [T, E] type params -> [{ kind: "typeParameterType", name: "T" }, ...]
|
|
36
|
+
*/
|
|
37
|
+
const typeParamsToTypeArgs = (typeParams) => {
|
|
38
|
+
if (!typeParams || typeParams.length === 0) {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
return typeParams.map((tp) => ({
|
|
42
|
+
kind: "typeParameterType",
|
|
43
|
+
name: tp.name,
|
|
44
|
+
}));
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Create a synthetic interface declaration from an object type
|
|
48
|
+
*/
|
|
49
|
+
const createSyntheticInterface = (objectType, name, typeParameters, isExported) => ({
|
|
50
|
+
kind: "interfaceDeclaration",
|
|
51
|
+
name,
|
|
52
|
+
typeParameters,
|
|
53
|
+
extends: [],
|
|
54
|
+
members: objectType.members,
|
|
55
|
+
isExported,
|
|
56
|
+
isStruct: false,
|
|
57
|
+
});
|
|
58
|
+
/**
|
|
59
|
+
* Create a reference type to a synthetic interface
|
|
60
|
+
*/
|
|
61
|
+
const createSyntheticReference = (name, typeArgs) => ({
|
|
62
|
+
kind: "referenceType",
|
|
63
|
+
name,
|
|
64
|
+
typeArguments: typeArgs,
|
|
65
|
+
});
|
|
66
|
+
/**
|
|
67
|
+
* Process a type alias declaration and generate synthetic interfaces if needed.
|
|
68
|
+
*
|
|
69
|
+
* If the type alias is a union containing object literal types, this will:
|
|
70
|
+
* 1. Generate a synthetic interface for each object literal member
|
|
71
|
+
* 2. Rewrite the union to use reference types to the synthetics
|
|
72
|
+
* 3. Return both the rewritten alias and the synthetic interfaces
|
|
73
|
+
*
|
|
74
|
+
* If no object literals are found, returns the original alias unchanged.
|
|
75
|
+
*/
|
|
76
|
+
export const processTypeAliasForSynthetics = (typeAlias) => {
|
|
77
|
+
const { type, name, typeParameters, isExported } = typeAlias;
|
|
78
|
+
// Only process union types
|
|
79
|
+
if (type.kind !== "unionType") {
|
|
80
|
+
return { typeAlias, syntheticInterfaces: [] };
|
|
81
|
+
}
|
|
82
|
+
const union = type;
|
|
83
|
+
// Check if union contains any object types
|
|
84
|
+
if (!unionContainsObjectTypes(union)) {
|
|
85
|
+
return { typeAlias, syntheticInterfaces: [] };
|
|
86
|
+
}
|
|
87
|
+
// Generate synthetic interfaces and rewrite union members
|
|
88
|
+
const syntheticInterfaces = [];
|
|
89
|
+
const rewrittenUnionTypes = [];
|
|
90
|
+
const typeArgs = typeParamsToTypeArgs(typeParameters);
|
|
91
|
+
let objectIndex = 0;
|
|
92
|
+
for (const memberType of union.types) {
|
|
93
|
+
if (isObjectType(memberType)) {
|
|
94
|
+
// Generate synthetic interface for this object type
|
|
95
|
+
const syntheticName = generateSyntheticName(name, objectIndex);
|
|
96
|
+
const syntheticInterface = createSyntheticInterface(memberType, syntheticName, typeParameters, isExported // Synthetic interfaces inherit export status
|
|
97
|
+
);
|
|
98
|
+
syntheticInterfaces.push(syntheticInterface);
|
|
99
|
+
// Replace object type with reference to synthetic
|
|
100
|
+
const reference = createSyntheticReference(syntheticName, typeArgs);
|
|
101
|
+
rewrittenUnionTypes.push(reference);
|
|
102
|
+
objectIndex++;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
// Keep non-object types as-is
|
|
106
|
+
rewrittenUnionTypes.push(memberType);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Create rewritten type alias with new union
|
|
110
|
+
const rewrittenUnion = {
|
|
111
|
+
kind: "unionType",
|
|
112
|
+
types: rewrittenUnionTypes,
|
|
113
|
+
};
|
|
114
|
+
const rewrittenAlias = {
|
|
115
|
+
...typeAlias,
|
|
116
|
+
type: rewrittenUnion,
|
|
117
|
+
};
|
|
118
|
+
return {
|
|
119
|
+
typeAlias: rewrittenAlias,
|
|
120
|
+
syntheticInterfaces,
|
|
121
|
+
};
|
|
122
|
+
};
|
|
123
|
+
//# sourceMappingURL=synthetic-types.js.map
|