@tsonic/emitter 0.0.72 → 0.0.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +25 -15
- package/dist/core/semantic/imports.js.map +1 -1
- package/dist/core/semantic/imports.test.js +43 -0
- package/dist/core/semantic/imports.test.js.map +1 -1
- package/dist/core/semantic/type-resolution.d.ts +1 -0
- package/dist/core/semantic/type-resolution.d.ts.map +1 -1
- package/dist/core/semantic/type-resolution.js +166 -5
- package/dist/core/semantic/type-resolution.js.map +1 -1
- package/dist/core/semantic/type-resolution.test.js +35 -0
- package/dist/core/semantic/type-resolution.test.js.map +1 -1
- package/dist/emitter-types/core.d.ts +24 -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 +797 -17
- package/dist/expression-emitter.js.map +1 -1
- package/dist/expressions/access.d.ts.map +1 -1
- package/dist/expressions/access.js +65 -25
- 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 +97 -196
- 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 +238 -57
- 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 +24 -38
- package/dist/expressions/identifiers.js.map +1 -1
- package/dist/expressions/index.test.js +245 -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 +102 -77
- 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 +57 -4
- 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 +393 -5
- 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/specialization/type-aliases.test.js +8 -0
- package/dist/specialization/type-aliases.test.js.map +1 -1
- package/dist/statements/classes/members/methods.d.ts.map +1 -1
- package/dist/statements/classes/members/methods.js +5 -22
- 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 +44 -1
- package/dist/statements/control/conditionals/guard-analysis.d.ts.map +1 -1
- package/dist/statements/control/conditionals/guard-analysis.js +301 -125
- 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 +182 -53
- 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 +38 -79
- 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 +5 -9
- 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 +55 -51
- package/dist/statements/declarations/variables.js.map +1 -1
- package/dist/statements/index.test.js +1026 -0
- 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 -128
- package/dist/types/references.js.map +1 -1
- package/dist/types/references.test.js +170 -46
- 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
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { emitTypeAst } from "../type-emitter.js";
|
|
5
5
|
import { escapeCSharpIdentifier } from "../emitter-types/index.js";
|
|
6
|
-
import {
|
|
6
|
+
import { identifierExpression } from "../core/format/backend-ast/builders.js";
|
|
7
|
+
import { stableIdentifierSuffixFromTypeAst } from "../core/format/backend-ast/utils.js";
|
|
7
8
|
/**
|
|
8
9
|
* Emit an identifier as CSharpExpressionAst
|
|
9
10
|
*/
|
|
@@ -26,7 +27,7 @@ export const emitIdentifier = (expr, context, expectedType) => {
|
|
|
26
27
|
// TypeScript `super` maps to C# `base` for member access/calls.
|
|
27
28
|
// (`super()` constructor calls are handled separately in constructor emission.)
|
|
28
29
|
if (expr.name === "super") {
|
|
29
|
-
return [
|
|
30
|
+
return [identifierExpression("base"), context];
|
|
30
31
|
}
|
|
31
32
|
// Narrowing remap for union type guards
|
|
32
33
|
// - "rename": account -> account__1_3 (if-statements with temp var)
|
|
@@ -36,48 +37,45 @@ export const emitIdentifier = (expr, context, expectedType) => {
|
|
|
36
37
|
if (narrowed) {
|
|
37
38
|
if (narrowed.kind === "rename") {
|
|
38
39
|
return [
|
|
39
|
-
|
|
40
|
-
kind: "identifierExpression",
|
|
41
|
-
identifier: escapeCSharpIdentifier(narrowed.name),
|
|
42
|
-
},
|
|
40
|
+
identifierExpression(escapeCSharpIdentifier(narrowed.name)),
|
|
43
41
|
context,
|
|
44
42
|
];
|
|
45
43
|
}
|
|
46
|
-
else {
|
|
44
|
+
else if (narrowed.kind === "expr") {
|
|
47
45
|
// kind === "expr" - emit pre-built AST (e.g., parenthesized AsN() call)
|
|
48
46
|
return [narrowed.exprAst, context];
|
|
49
47
|
}
|
|
48
|
+
return [identifierExpression(escapeCSharpIdentifier(expr.name)), context];
|
|
50
49
|
}
|
|
51
50
|
}
|
|
52
51
|
// Lexical remap for locals/parameters (prevents C# CS0136 shadowing errors).
|
|
53
52
|
const remappedLocal = context.localNameMap?.get(expr.name);
|
|
54
53
|
if (remappedLocal) {
|
|
55
|
-
return [
|
|
56
|
-
{ kind: "identifierExpression", identifier: remappedLocal },
|
|
57
|
-
context,
|
|
58
|
-
];
|
|
54
|
+
return [identifierExpression(remappedLocal), context];
|
|
59
55
|
}
|
|
60
56
|
// Check if this identifier is from an import
|
|
61
57
|
if (context.importBindings) {
|
|
62
58
|
const binding = context.importBindings.get(expr.name);
|
|
63
59
|
if (binding) {
|
|
64
60
|
// Imported identifier - always use fully-qualified reference
|
|
65
|
-
|
|
66
|
-
if (binding.member) {
|
|
61
|
+
if (binding.kind === "value") {
|
|
67
62
|
// Value import with member - Container.member
|
|
63
|
+
return [
|
|
64
|
+
identifierExpression(`${binding.clrName}.${binding.member}`),
|
|
65
|
+
context,
|
|
66
|
+
];
|
|
67
|
+
}
|
|
68
|
+
if (binding.kind === "type") {
|
|
68
69
|
return [
|
|
69
70
|
{
|
|
70
|
-
kind: "
|
|
71
|
-
|
|
71
|
+
kind: "typeReferenceExpression",
|
|
72
|
+
type: binding.typeAst,
|
|
72
73
|
},
|
|
73
74
|
context,
|
|
74
75
|
];
|
|
75
76
|
}
|
|
76
|
-
//
|
|
77
|
-
return [
|
|
78
|
-
{ kind: "identifierExpression", identifier: binding.clrName },
|
|
79
|
-
context,
|
|
80
|
-
];
|
|
77
|
+
// Namespace import - use precomputed container name directly
|
|
78
|
+
return [identifierExpression(binding.clrName), context];
|
|
81
79
|
}
|
|
82
80
|
}
|
|
83
81
|
// Static module members (functions/fields) in the current file's container class.
|
|
@@ -88,34 +86,25 @@ export const emitIdentifier = (expr, context, expectedType) => {
|
|
|
88
86
|
if (context.moduleStaticClassName &&
|
|
89
87
|
context.className !== context.moduleStaticClassName) {
|
|
90
88
|
return [
|
|
91
|
-
{
|
|
92
|
-
kind: "identifierExpression",
|
|
93
|
-
identifier: `${context.moduleStaticClassName}.${memberName}`,
|
|
94
|
-
},
|
|
89
|
+
identifierExpression(`${context.moduleStaticClassName}.${memberName}`),
|
|
95
90
|
context,
|
|
96
91
|
];
|
|
97
92
|
}
|
|
98
|
-
return [
|
|
93
|
+
return [identifierExpression(memberName), context];
|
|
99
94
|
}
|
|
100
95
|
// Use custom C# name from binding if specified (with global:: prefix)
|
|
101
96
|
if (expr.csharpName && expr.resolvedAssembly) {
|
|
102
97
|
const fqn = `global::${expr.resolvedAssembly}.${expr.csharpName}`;
|
|
103
|
-
return [
|
|
98
|
+
return [identifierExpression(fqn), context];
|
|
104
99
|
}
|
|
105
100
|
// Use resolved binding if available (from binding manifest) with global:: prefix
|
|
106
101
|
// resolvedClrType is already the full CLR type name, just add global::
|
|
107
102
|
if (expr.resolvedClrType) {
|
|
108
103
|
const fqn = `global::${expr.resolvedClrType}`;
|
|
109
|
-
return [
|
|
104
|
+
return [identifierExpression(fqn), context];
|
|
110
105
|
}
|
|
111
106
|
// Fallback: use identifier as-is (escape C# keywords)
|
|
112
|
-
return [
|
|
113
|
-
{
|
|
114
|
-
kind: "identifierExpression",
|
|
115
|
-
identifier: escapeCSharpIdentifier(expr.name),
|
|
116
|
-
},
|
|
117
|
-
context,
|
|
118
|
-
];
|
|
107
|
+
return [identifierExpression(escapeCSharpIdentifier(expr.name)), context];
|
|
119
108
|
};
|
|
120
109
|
/**
|
|
121
110
|
* Emit type arguments as CSharpTypeAst[]
|
|
@@ -160,10 +149,7 @@ export const generateSpecializedName = (baseName, typeArgs, context) => {
|
|
|
160
149
|
for (const typeArg of typeArgs) {
|
|
161
150
|
const [typeAst, newContext] = emitTypeAst(typeArg, currentContext);
|
|
162
151
|
currentContext = newContext;
|
|
163
|
-
|
|
164
|
-
// Sanitize type name for use in identifier (remove <>, ?, etc.)
|
|
165
|
-
const sanitized = typeName.replace(/[<>?,\s]/g, "_").replace(/\./g, "_");
|
|
166
|
-
typeNames.push(sanitized);
|
|
152
|
+
typeNames.push(stableIdentifierSuffixFromTypeAst(typeAst));
|
|
167
153
|
}
|
|
168
154
|
const specializedName = `${baseName}__${typeNames.join("__")}`;
|
|
169
155
|
return [specializedName, currentContext];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identifiers.js","sourceRoot":"","sources":["../../src/expressions/identifiers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"identifiers.js","sourceRoot":"","sources":["../../src/expressions/identifiers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1698,6 +1698,48 @@ describe("Expression Emission", () => {
|
|
|
1698
1698
|
const result = emitModule(module);
|
|
1699
1699
|
expect(result).to.include("new global::Tsonic.JSRuntime.JSArray<int>(maybeNums).length");
|
|
1700
1700
|
});
|
|
1701
|
+
it("should preserve resolved CLR identity for source-bound array element types", () => {
|
|
1702
|
+
const module = {
|
|
1703
|
+
kind: "module",
|
|
1704
|
+
filePath: "/src/test.ts",
|
|
1705
|
+
namespace: "MyApp",
|
|
1706
|
+
className: "test",
|
|
1707
|
+
isStaticContainer: true,
|
|
1708
|
+
imports: [],
|
|
1709
|
+
body: [
|
|
1710
|
+
{
|
|
1711
|
+
kind: "expressionStatement",
|
|
1712
|
+
expression: {
|
|
1713
|
+
kind: "memberAccess",
|
|
1714
|
+
object: {
|
|
1715
|
+
kind: "identifier",
|
|
1716
|
+
name: "attachments",
|
|
1717
|
+
inferredType: {
|
|
1718
|
+
kind: "arrayType",
|
|
1719
|
+
elementType: {
|
|
1720
|
+
kind: "referenceType",
|
|
1721
|
+
name: "Acme.Core.Attachment",
|
|
1722
|
+
resolvedClrType: "Acme.Core.Attachment",
|
|
1723
|
+
},
|
|
1724
|
+
},
|
|
1725
|
+
},
|
|
1726
|
+
property: "length",
|
|
1727
|
+
isComputed: false,
|
|
1728
|
+
isOptional: false,
|
|
1729
|
+
memberBinding: {
|
|
1730
|
+
kind: "property",
|
|
1731
|
+
assembly: "Tsonic.JSRuntime",
|
|
1732
|
+
type: "Tsonic.JSRuntime.JSArray`1",
|
|
1733
|
+
member: "length",
|
|
1734
|
+
},
|
|
1735
|
+
},
|
|
1736
|
+
},
|
|
1737
|
+
],
|
|
1738
|
+
exports: [],
|
|
1739
|
+
};
|
|
1740
|
+
const result = emitModule(module);
|
|
1741
|
+
expect(result).to.include("new global::Tsonic.JSRuntime.JSArray<global::Acme.Core.Attachment>(attachments).length");
|
|
1742
|
+
});
|
|
1701
1743
|
it("should emit array wrapper property access for ReadonlyArray receivers", () => {
|
|
1702
1744
|
const module = {
|
|
1703
1745
|
kind: "module",
|
|
@@ -1766,6 +1808,81 @@ describe("Expression Emission", () => {
|
|
|
1766
1808
|
const result = emitModule(module);
|
|
1767
1809
|
expect(result).to.include("value.length");
|
|
1768
1810
|
});
|
|
1811
|
+
it("should emit CLR Length for structural array length without member binding", () => {
|
|
1812
|
+
const module = {
|
|
1813
|
+
kind: "module",
|
|
1814
|
+
filePath: "/src/test.ts",
|
|
1815
|
+
namespace: "MyApp",
|
|
1816
|
+
className: "test",
|
|
1817
|
+
isStaticContainer: true,
|
|
1818
|
+
imports: [],
|
|
1819
|
+
body: [
|
|
1820
|
+
{
|
|
1821
|
+
kind: "expressionStatement",
|
|
1822
|
+
expression: {
|
|
1823
|
+
kind: "memberAccess",
|
|
1824
|
+
object: {
|
|
1825
|
+
kind: "identifier",
|
|
1826
|
+
name: "channels",
|
|
1827
|
+
inferredType: {
|
|
1828
|
+
kind: "arrayType",
|
|
1829
|
+
elementType: {
|
|
1830
|
+
kind: "referenceType",
|
|
1831
|
+
name: "Acme.Core.Channel",
|
|
1832
|
+
resolvedClrType: "Acme.Core.Channel",
|
|
1833
|
+
},
|
|
1834
|
+
},
|
|
1835
|
+
},
|
|
1836
|
+
property: "length",
|
|
1837
|
+
isComputed: false,
|
|
1838
|
+
isOptional: false,
|
|
1839
|
+
},
|
|
1840
|
+
},
|
|
1841
|
+
],
|
|
1842
|
+
exports: [],
|
|
1843
|
+
};
|
|
1844
|
+
const result = emitModule(module);
|
|
1845
|
+
expect(result).to.include("channels.Length");
|
|
1846
|
+
expect(result).to.not.include("channels.length");
|
|
1847
|
+
});
|
|
1848
|
+
it("should emit CLR Count for structural dictionary count without member binding", () => {
|
|
1849
|
+
const module = {
|
|
1850
|
+
kind: "module",
|
|
1851
|
+
filePath: "/src/test.ts",
|
|
1852
|
+
namespace: "MyApp",
|
|
1853
|
+
className: "test",
|
|
1854
|
+
isStaticContainer: true,
|
|
1855
|
+
imports: [],
|
|
1856
|
+
body: [
|
|
1857
|
+
{
|
|
1858
|
+
kind: "expressionStatement",
|
|
1859
|
+
expression: {
|
|
1860
|
+
kind: "memberAccess",
|
|
1861
|
+
object: {
|
|
1862
|
+
kind: "identifier",
|
|
1863
|
+
name: "items",
|
|
1864
|
+
inferredType: {
|
|
1865
|
+
kind: "dictionaryType",
|
|
1866
|
+
keyType: { kind: "primitiveType", name: "string" },
|
|
1867
|
+
valueType: {
|
|
1868
|
+
kind: "referenceType",
|
|
1869
|
+
name: "Acme.Core.Channel",
|
|
1870
|
+
resolvedClrType: "Acme.Core.Channel",
|
|
1871
|
+
},
|
|
1872
|
+
},
|
|
1873
|
+
},
|
|
1874
|
+
property: "Length",
|
|
1875
|
+
isComputed: false,
|
|
1876
|
+
isOptional: false,
|
|
1877
|
+
},
|
|
1878
|
+
},
|
|
1879
|
+
],
|
|
1880
|
+
exports: [],
|
|
1881
|
+
};
|
|
1882
|
+
const result = emitModule(module);
|
|
1883
|
+
expect(result).to.include("items.Count");
|
|
1884
|
+
expect(result).to.not.include("items.Length");
|
|
1885
|
+
});
|
|
1769
1886
|
it("should project CLR Union_n member access deterministically", () => {
|
|
1770
1887
|
const unionReference = {
|
|
1771
1888
|
kind: "referenceType",
|
|
@@ -2344,6 +2461,134 @@ describe("Expression Emission", () => {
|
|
|
2344
2461
|
const result = emitModule(module);
|
|
2345
2462
|
expect(result).to.include("dict.Remove(key);");
|
|
2346
2463
|
});
|
|
2464
|
+
it("should hard-fail unsupported delete targets instead of emitting comment placeholders", () => {
|
|
2465
|
+
const module = {
|
|
2466
|
+
kind: "module",
|
|
2467
|
+
filePath: "/src/test.ts",
|
|
2468
|
+
namespace: "MyApp",
|
|
2469
|
+
className: "test",
|
|
2470
|
+
isStaticContainer: true,
|
|
2471
|
+
imports: [],
|
|
2472
|
+
body: [
|
|
2473
|
+
{
|
|
2474
|
+
kind: "expressionStatement",
|
|
2475
|
+
expression: {
|
|
2476
|
+
kind: "unary",
|
|
2477
|
+
operator: "delete",
|
|
2478
|
+
expression: {
|
|
2479
|
+
kind: "memberAccess",
|
|
2480
|
+
object: {
|
|
2481
|
+
kind: "identifier",
|
|
2482
|
+
name: "obj",
|
|
2483
|
+
inferredType: { kind: "referenceType", name: "Thing" },
|
|
2484
|
+
},
|
|
2485
|
+
property: "value",
|
|
2486
|
+
isComputed: false,
|
|
2487
|
+
isOptional: false,
|
|
2488
|
+
},
|
|
2489
|
+
},
|
|
2490
|
+
},
|
|
2491
|
+
],
|
|
2492
|
+
exports: [],
|
|
2493
|
+
};
|
|
2494
|
+
expect(() => emitModule(module)).to.throw("ICE: Unsupported delete target reached emitter");
|
|
2495
|
+
});
|
|
2496
|
+
it("should hard-fail compound destructuring assignments instead of emitting fake identifiers", () => {
|
|
2497
|
+
const module = {
|
|
2498
|
+
kind: "module",
|
|
2499
|
+
filePath: "/src/test.ts",
|
|
2500
|
+
namespace: "MyApp",
|
|
2501
|
+
className: "test",
|
|
2502
|
+
isStaticContainer: true,
|
|
2503
|
+
imports: [],
|
|
2504
|
+
body: [
|
|
2505
|
+
{
|
|
2506
|
+
kind: "expressionStatement",
|
|
2507
|
+
expression: {
|
|
2508
|
+
kind: "assignment",
|
|
2509
|
+
operator: "+=",
|
|
2510
|
+
left: {
|
|
2511
|
+
kind: "arrayPattern",
|
|
2512
|
+
elements: [
|
|
2513
|
+
{
|
|
2514
|
+
pattern: {
|
|
2515
|
+
kind: "identifierPattern",
|
|
2516
|
+
name: "x",
|
|
2517
|
+
},
|
|
2518
|
+
},
|
|
2519
|
+
],
|
|
2520
|
+
},
|
|
2521
|
+
right: { kind: "literal", value: 1 },
|
|
2522
|
+
},
|
|
2523
|
+
},
|
|
2524
|
+
],
|
|
2525
|
+
exports: [],
|
|
2526
|
+
};
|
|
2527
|
+
expect(() => emitModule(module)).to.throw("ICE: Compound assignment to array/object destructuring pattern reached emitter");
|
|
2528
|
+
});
|
|
2529
|
+
it("should hard-fail object spreads that reach emission without inferred source types", () => {
|
|
2530
|
+
const module = {
|
|
2531
|
+
kind: "module",
|
|
2532
|
+
filePath: "/src/test.ts",
|
|
2533
|
+
namespace: "MyApp",
|
|
2534
|
+
className: "test",
|
|
2535
|
+
isStaticContainer: true,
|
|
2536
|
+
imports: [],
|
|
2537
|
+
body: [
|
|
2538
|
+
{
|
|
2539
|
+
kind: "interfaceDeclaration",
|
|
2540
|
+
name: "Target",
|
|
2541
|
+
typeParameters: [],
|
|
2542
|
+
extends: [],
|
|
2543
|
+
members: [
|
|
2544
|
+
{
|
|
2545
|
+
kind: "propertySignature",
|
|
2546
|
+
name: "count",
|
|
2547
|
+
type: { kind: "primitiveType", name: "number" },
|
|
2548
|
+
isOptional: false,
|
|
2549
|
+
isReadonly: false,
|
|
2550
|
+
},
|
|
2551
|
+
],
|
|
2552
|
+
isExported: false,
|
|
2553
|
+
isStruct: false,
|
|
2554
|
+
},
|
|
2555
|
+
{
|
|
2556
|
+
kind: "variableDeclaration",
|
|
2557
|
+
declarationKind: "const",
|
|
2558
|
+
isExported: false,
|
|
2559
|
+
declarations: [
|
|
2560
|
+
{
|
|
2561
|
+
kind: "variableDeclarator",
|
|
2562
|
+
name: { kind: "identifierPattern", name: "value" },
|
|
2563
|
+
type: { kind: "referenceType", name: "Target" },
|
|
2564
|
+
initializer: {
|
|
2565
|
+
kind: "object",
|
|
2566
|
+
hasSpreads: true,
|
|
2567
|
+
inferredType: { kind: "referenceType", name: "Target" },
|
|
2568
|
+
properties: [
|
|
2569
|
+
{
|
|
2570
|
+
kind: "spread",
|
|
2571
|
+
expression: {
|
|
2572
|
+
kind: "identifier",
|
|
2573
|
+
name: "source",
|
|
2574
|
+
},
|
|
2575
|
+
},
|
|
2576
|
+
{
|
|
2577
|
+
kind: "property",
|
|
2578
|
+
key: "count",
|
|
2579
|
+
value: { kind: "literal", value: 1 },
|
|
2580
|
+
shorthand: false,
|
|
2581
|
+
},
|
|
2582
|
+
],
|
|
2583
|
+
},
|
|
2584
|
+
},
|
|
2585
|
+
],
|
|
2586
|
+
},
|
|
2587
|
+
],
|
|
2588
|
+
exports: [],
|
|
2589
|
+
};
|
|
2590
|
+
expect(() => emitModule(module)).to.throw("ICE: Object spread source");
|
|
2591
|
+
});
|
|
2347
2592
|
it("should infer arrow function return type from inferredType", () => {
|
|
2348
2593
|
const module = {
|
|
2349
2594
|
kind: "module",
|