@tsonic/emitter 0.0.77 → 0.0.78

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/array.test.js +5 -1
  3. package/dist/array.test.js.map +1 -1
  4. package/dist/core/module-emitter-cases/static-containers.test.js +2 -1
  5. package/dist/core/module-emitter-cases/static-containers.test.js.map +1 -1
  6. package/dist/core/semantic/array-expected-types.js +1 -1
  7. package/dist/core/semantic/array-expected-types.js.map +1 -1
  8. package/dist/core/semantic/assignment-flow.d.ts.map +1 -1
  9. package/dist/core/semantic/assignment-flow.js +2 -1
  10. package/dist/core/semantic/assignment-flow.js.map +1 -1
  11. package/dist/core/semantic/direct-value-surfaces.js +2 -1
  12. package/dist/core/semantic/direct-value-surfaces.js.map +1 -1
  13. package/dist/core/semantic/instanceof-predicate-refinements.js +1 -1
  14. package/dist/core/semantic/instanceof-predicate-refinements.js.map +1 -1
  15. package/dist/core/semantic/mutable-storage-helpers.d.ts.map +1 -1
  16. package/dist/core/semantic/mutable-storage-helpers.js +3 -2
  17. package/dist/core/semantic/mutable-storage-helpers.js.map +1 -1
  18. package/dist/core/semantic/narrowed-expression-types.js +1 -1
  19. package/dist/core/semantic/narrowed-expression-types.js.map +1 -1
  20. package/dist/core/semantic/narrowed-union-resolution.js +1 -1
  21. package/dist/core/semantic/narrowed-union-resolution.js.map +1 -1
  22. package/dist/core/semantic/nullable-typeof-refinements.d.ts.map +1 -1
  23. package/dist/core/semantic/nullable-typeof-refinements.js +8 -31
  24. package/dist/core/semantic/nullable-typeof-refinements.js.map +1 -1
  25. package/dist/core/semantic/runtime-union-frame.d.ts +6 -0
  26. package/dist/core/semantic/runtime-union-frame.d.ts.map +1 -0
  27. package/dist/core/semantic/runtime-union-frame.js +130 -0
  28. package/dist/core/semantic/runtime-union-frame.js.map +1 -0
  29. package/dist/core/semantic/runtime-unions.d.ts +3 -4
  30. package/dist/core/semantic/runtime-unions.d.ts.map +1 -1
  31. package/dist/core/semantic/runtime-unions.js +4 -129
  32. package/dist/core/semantic/runtime-unions.js.map +1 -1
  33. package/dist/core/semantic/semantic-union-members.js +1 -1
  34. package/dist/core/semantic/semantic-union-members.js.map +1 -1
  35. package/dist/core/semantic/storage-types.d.ts +3 -0
  36. package/dist/core/semantic/storage-types.d.ts.map +1 -1
  37. package/dist/core/semantic/storage-types.js +13 -2
  38. package/dist/core/semantic/storage-types.js.map +1 -1
  39. package/dist/core/semantic/surface-member-semantics.d.ts +14 -0
  40. package/dist/core/semantic/surface-member-semantics.d.ts.map +1 -0
  41. package/dist/core/semantic/surface-member-semantics.js +41 -0
  42. package/dist/core/semantic/surface-member-semantics.js.map +1 -0
  43. package/dist/core/semantic/ternary-guards.d.ts +1 -1
  44. package/dist/core/semantic/ternary-guards.d.ts.map +1 -1
  45. package/dist/core/semantic/ternary-guards.js +2 -1
  46. package/dist/core/semantic/ternary-guards.js.map +1 -1
  47. package/dist/core/semantic/typeof-comparison.d.ts +14 -0
  48. package/dist/core/semantic/typeof-comparison.d.ts.map +1 -0
  49. package/dist/core/semantic/typeof-comparison.js +47 -0
  50. package/dist/core/semantic/typeof-comparison.js.map +1 -0
  51. package/dist/core/semantic/union-semantics.js +1 -1
  52. package/dist/core/semantic/union-semantics.js.map +1 -1
  53. package/dist/emitter-types/context.d.ts.map +1 -1
  54. package/dist/emitter-types/context.js +1 -0
  55. package/dist/emitter-types/context.js.map +1 -1
  56. package/dist/expressions/access-binding.d.ts.map +1 -1
  57. package/dist/expressions/access-binding.js +18 -32
  58. package/dist/expressions/access-binding.js.map +1 -1
  59. package/dist/expressions/access-computed.d.ts.map +1 -1
  60. package/dist/expressions/access-computed.js +3 -7
  61. package/dist/expressions/access-computed.js.map +1 -1
  62. package/dist/expressions/access-function-length.d.ts +13 -0
  63. package/dist/expressions/access-function-length.d.ts.map +1 -0
  64. package/dist/expressions/access-function-length.js +115 -0
  65. package/dist/expressions/access-function-length.js.map +1 -0
  66. package/dist/expressions/access-length.d.ts +2 -4
  67. package/dist/expressions/access-length.d.ts.map +1 -1
  68. package/dist/expressions/access-length.js +7 -23
  69. package/dist/expressions/access-length.js.map +1 -1
  70. package/dist/expressions/access-length.test.js +17 -0
  71. package/dist/expressions/access-length.test.js.map +1 -1
  72. package/dist/expressions/access-resolution-receivers.d.ts.map +1 -1
  73. package/dist/expressions/access-resolution-receivers.js +10 -12
  74. package/dist/expressions/access-resolution-receivers.js.map +1 -1
  75. package/dist/expressions/access.d.ts.map +1 -1
  76. package/dist/expressions/access.js +7 -19
  77. package/dist/expressions/access.js.map +1 -1
  78. package/dist/expressions/architecture-invariants.test.js +94 -0
  79. package/dist/expressions/architecture-invariants.test.js.map +1 -1
  80. package/dist/expressions/awaitable-adaptation.d.ts +15 -0
  81. package/dist/expressions/awaitable-adaptation.d.ts.map +1 -0
  82. package/dist/expressions/awaitable-adaptation.js +174 -0
  83. package/dist/expressions/awaitable-adaptation.js.map +1 -0
  84. package/dist/expressions/calls/call-arguments-emit.d.ts.map +1 -1
  85. package/dist/expressions/calls/call-arguments-emit.js +20 -2
  86. package/dist/expressions/calls/call-arguments-emit.js.map +1 -1
  87. package/dist/expressions/calls/call-arguments-helpers.js +2 -2
  88. package/dist/expressions/calls/call-arguments-helpers.js.map +1 -1
  89. package/dist/expressions/calls/call-array-interop.d.ts +1 -1
  90. package/dist/expressions/calls/call-array-interop.d.ts.map +1 -1
  91. package/dist/expressions/calls/call-array-interop.js +1 -1
  92. package/dist/expressions/calls/call-array-interop.js.map +1 -1
  93. package/dist/expressions/calls/call-array-mutation.d.ts +0 -1
  94. package/dist/expressions/calls/call-array-mutation.d.ts.map +1 -1
  95. package/dist/expressions/calls/call-array-mutation.js +5 -7
  96. package/dist/expressions/calls/call-array-mutation.js.map +1 -1
  97. package/dist/expressions/calls/call-array-wrapper.d.ts.map +1 -1
  98. package/dist/expressions/calls/call-array-wrapper.js +3 -8
  99. package/dist/expressions/calls/call-array-wrapper.js.map +1 -1
  100. package/dist/expressions/expected-type-adaptation.d.ts.map +1 -1
  101. package/dist/expressions/expected-type-adaptation.js +15 -1
  102. package/dist/expressions/expected-type-adaptation.js.map +1 -1
  103. package/dist/expressions/identifier-storage/broad-storage-target.d.ts +4 -0
  104. package/dist/expressions/identifier-storage/broad-storage-target.d.ts.map +1 -0
  105. package/dist/expressions/identifier-storage/broad-storage-target.js +26 -0
  106. package/dist/expressions/identifier-storage/broad-storage-target.js.map +1 -0
  107. package/dist/expressions/identifier-storage/implicit-storage.d.ts +14 -0
  108. package/dist/expressions/identifier-storage/implicit-storage.d.ts.map +1 -0
  109. package/dist/expressions/identifier-storage/implicit-storage.js +44 -0
  110. package/dist/expressions/identifier-storage/implicit-storage.js.map +1 -0
  111. package/dist/expressions/identifier-storage/materialized-narrowed.d.ts +7 -0
  112. package/dist/expressions/identifier-storage/materialized-narrowed.d.ts.map +1 -0
  113. package/dist/expressions/identifier-storage/materialized-narrowed.js +92 -0
  114. package/dist/expressions/identifier-storage/materialized-narrowed.js.map +1 -0
  115. package/dist/expressions/identifier-storage/narrowed-storage-compatible.d.ts +14 -0
  116. package/dist/expressions/identifier-storage/narrowed-storage-compatible.d.ts.map +1 -0
  117. package/dist/expressions/identifier-storage/narrowed-storage-compatible.js +168 -0
  118. package/dist/expressions/identifier-storage/narrowed-storage-compatible.js.map +1 -0
  119. package/dist/expressions/identifier-storage/reified-storage.d.ts +7 -0
  120. package/dist/expressions/identifier-storage/reified-storage.d.ts.map +1 -0
  121. package/dist/expressions/identifier-storage/reified-storage.js +25 -0
  122. package/dist/expressions/identifier-storage/reified-storage.js.map +1 -0
  123. package/dist/expressions/identifier-storage/runtime-subset.d.ts +14 -0
  124. package/dist/expressions/identifier-storage/runtime-subset.d.ts.map +1 -0
  125. package/dist/expressions/identifier-storage/runtime-subset.js +100 -0
  126. package/dist/expressions/identifier-storage/runtime-subset.js.map +1 -0
  127. package/dist/expressions/identifier-storage/storage-compatible.d.ts +10 -0
  128. package/dist/expressions/identifier-storage/storage-compatible.d.ts.map +1 -0
  129. package/dist/expressions/identifier-storage/storage-compatible.js +76 -0
  130. package/dist/expressions/identifier-storage/storage-compatible.js.map +1 -0
  131. package/dist/expressions/identifier-storage/storage-surface-match.d.ts +4 -0
  132. package/dist/expressions/identifier-storage/storage-surface-match.d.ts.map +1 -0
  133. package/dist/expressions/identifier-storage/storage-surface-match.js +95 -0
  134. package/dist/expressions/identifier-storage/storage-surface-match.js.map +1 -0
  135. package/dist/expressions/identifier-storage/storage-surface-shared.d.ts +12 -0
  136. package/dist/expressions/identifier-storage/storage-surface-shared.d.ts.map +1 -0
  137. package/dist/expressions/identifier-storage/storage-surface-shared.js +77 -0
  138. package/dist/expressions/identifier-storage/storage-surface-shared.js.map +1 -0
  139. package/dist/expressions/identifier-storage/storage-surface.d.ts +9 -0
  140. package/dist/expressions/identifier-storage/storage-surface.d.ts.map +1 -0
  141. package/dist/expressions/identifier-storage/storage-surface.js +9 -0
  142. package/dist/expressions/identifier-storage/storage-surface.js.map +1 -0
  143. package/dist/expressions/identifier-storage.d.ts +1 -47
  144. package/dist/expressions/identifier-storage.d.ts.map +1 -1
  145. package/dist/expressions/identifier-storage.js +1 -652
  146. package/dist/expressions/identifier-storage.js.map +1 -1
  147. package/dist/expressions/index-cases/array-wrapper-recursion-b.test.js +7 -1
  148. package/dist/expressions/index-cases/array-wrapper-recursion-b.test.js.map +1 -1
  149. package/dist/expressions/index-cases/array-wrapper-recursion-c.test.js +4 -1
  150. package/dist/expressions/index-cases/array-wrapper-recursion-c.test.js.map +1 -1
  151. package/dist/expressions/index-cases/helpers.d.ts +1 -0
  152. package/dist/expressions/index-cases/helpers.d.ts.map +1 -1
  153. package/dist/expressions/index-cases/helpers.js +28 -0
  154. package/dist/expressions/index-cases/helpers.js.map +1 -1
  155. package/dist/expressions/index-cases/string-and-array-fallbacks-a.test.js +18 -9
  156. package/dist/expressions/index-cases/string-and-array-fallbacks-a.test.js.map +1 -1
  157. package/dist/expressions/index-cases/string-and-array-fallbacks-b.test.js +5 -5
  158. package/dist/expressions/index-cases/string-and-array-fallbacks-b.test.js.map +1 -1
  159. package/dist/expressions/lambda-body.js +3 -3
  160. package/dist/expressions/lambda-body.js.map +1 -1
  161. package/dist/expressions/operators/binary-special-ops.d.ts.map +1 -1
  162. package/dist/expressions/operators/binary-special-ops.js +4 -30
  163. package/dist/expressions/operators/binary-special-ops.js.map +1 -1
  164. package/dist/expressions/runtime-union-adaptation-upcast.d.ts +1 -1
  165. package/dist/expressions/runtime-union-adaptation-upcast.d.ts.map +1 -1
  166. package/dist/expressions/runtime-union-adaptation-upcast.js +13 -0
  167. package/dist/expressions/runtime-union-adaptation-upcast.js.map +1 -1
  168. package/dist/integration-cases/may14-downstream-contracts.test.js +372 -0
  169. package/dist/integration-cases/may14-downstream-contracts.test.js.map +1 -1
  170. package/dist/statements/classes/members/properties.d.ts.map +1 -1
  171. package/dist/statements/classes/members/properties.js +2 -3
  172. package/dist/statements/classes/members/properties.js.map +1 -1
  173. package/dist/statements/control/conditionals/branch-context.js +3 -3
  174. package/dist/statements/control/conditionals/branch-context.js.map +1 -1
  175. package/dist/statements/control/conditionals/guard-extraction.d.ts.map +1 -1
  176. package/dist/statements/control/conditionals/guard-extraction.js +7 -32
  177. package/dist/statements/control/conditionals/guard-extraction.js.map +1 -1
  178. package/dist/statements/control/loops.js +2 -2
  179. package/dist/statements/control/loops.js.map +1 -1
  180. package/dist/types/unions.js +2 -1
  181. package/dist/types/unions.js.map +1 -1
  182. package/package.json +2 -2
  183. package/dist/core/semantic/js-array-surface-members.d.ts +0 -4
  184. package/dist/core/semantic/js-array-surface-members.d.ts.map +0 -1
  185. package/dist/core/semantic/js-array-surface-members.js +0 -32
  186. package/dist/core/semantic/js-array-surface-members.js.map +0 -1
@@ -1,653 +1,2 @@
1
- import { emitTypeAst } from "../type-emitter.js";
2
- import { escapeCSharpIdentifier } from "../emitter-types/index.js";
3
- import { identifierExpression } from "../core/format/backend-ast/builders.js";
4
- import { sameTypeAstSurface, stableTypeKeyFromAst, stripNullableTypeAst, } from "../core/format/backend-ast/utils.js";
5
- import { matchesExpectedEmissionType, matchesSemanticExpectedType, requiresValueTypeMaterialization, } from "../core/semantic/expected-type-matching.js";
6
- import { materializeDirectNarrowingAst } from "../core/semantic/materialized-narrowing.js";
7
- import { tryBuildRuntimeMaterializationAst, } from "../core/semantic/runtime-reification.js";
8
- import { buildRuntimeUnionLayout, buildRuntimeUnionTypeAst, getCanonicalRuntimeUnionMembers, } from "../core/semantic/runtime-unions.js";
9
- import { buildRuntimeUnionFactoryCallAst } from "../core/semantic/runtime-union-projection.js";
10
- import { resolveEffectiveExpressionType } from "../core/semantic/narrowed-expression-types.js";
11
- import { tryResolveRuntimeUnionMemberType } from "../core/semantic/narrowed-expression-types.js";
12
- import { normalizeStructuralEmissionType, resolveTypeAlias, stripNullish, } from "../core/semantic/type-resolution.js";
13
- import { resolveDirectValueSurfaceType } from "../core/semantic/direct-value-surfaces.js";
14
- import { adaptStorageErasedValueAst } from "../core/semantic/storage-erased-adaptation.js";
15
- import { resolveStructuralReferenceType } from "../core/semantic/structural-shape-matching.js";
16
- import { willCarryAsRuntimeUnion } from "../core/semantic/union-semantics.js";
17
- import { isStorageErasedBroadObjectPassThroughType } from "../core/semantic/broad-object-types.js";
18
- import { runtimeUnionAliasReferencesMatch } from "../core/semantic/runtime-union-alias-identity.js";
19
- import { referenceTypeHasClrIdentity } from "../core/semantic/clr-type-identity.js";
20
- import { getArrayElementType, getDictionaryValueType, isSameNominalType, } from "./structural-type-shapes.js";
21
- import { describeIrTypeForDiagnostics } from "../core/semantic/deterministic-type-keys.js";
22
- import { isExactExpressionToType } from "./exact-comparison.js";
23
- const SYSTEM_OBJECT_CLR_NAMES = new Set([
24
- "System.Object",
25
- "global::System.Object",
26
- ]);
27
- const buildStorageSurfaceDiagnosticContext = (actualType, expectedType, strippedActual, strippedExpected, context) => `[storage-surface originalActual=${describeIrTypeForDiagnostics(actualType, context)} originalExpected=${describeIrTypeForDiagnostics(expectedType, context)} actual=${describeIrTypeForDiagnostics(strippedActual, context)} expected=${describeIrTypeForDiagnostics(strippedExpected, context)}]`;
28
- const isSystemObjectReferenceType = (type) => type.kind === "referenceType" &&
29
- (type.name === "object" ||
30
- referenceTypeHasClrIdentity(type, SYSTEM_OBJECT_CLR_NAMES));
31
- const getStorageIdentifierAst = (expr, context) => {
32
- const remappedLocal = context.localNameMap?.get(expr.name);
33
- if (remappedLocal) {
34
- return identifierExpression(remappedLocal);
35
- }
36
- if (context.localValueTypes?.has(expr.name)) {
37
- return identifierExpression(escapeCSharpIdentifier(expr.name));
38
- }
39
- return undefined;
40
- };
41
- const needsStructuralCollectionMaterialization = (actualType, expectedType, context) => {
42
- if (!actualType || !expectedType) {
43
- return false;
44
- }
45
- const actualArrayElement = getArrayElementType(actualType, context);
46
- const expectedArrayElement = getArrayElementType(expectedType, context);
47
- if (actualArrayElement && expectedArrayElement) {
48
- const actualStructuralElement = resolveStructuralReferenceType(actualArrayElement, context) ??
49
- stripNullish(actualArrayElement);
50
- const expectedStructuralElement = resolveStructuralReferenceType(expectedArrayElement, context) ??
51
- stripNullish(expectedArrayElement);
52
- if ((actualStructuralElement.kind === "objectType" ||
53
- expectedStructuralElement.kind === "objectType") &&
54
- !isSameNominalType(actualArrayElement, expectedArrayElement, context)) {
55
- return true;
56
- }
57
- }
58
- const actualDictionaryValue = getDictionaryValueType(actualType, context);
59
- const expectedDictionaryValue = getDictionaryValueType(expectedType, context);
60
- if (actualDictionaryValue && expectedDictionaryValue) {
61
- const actualStructuralValue = resolveStructuralReferenceType(actualDictionaryValue, context) ??
62
- stripNullish(actualDictionaryValue);
63
- const expectedStructuralValue = resolveStructuralReferenceType(expectedDictionaryValue, context) ??
64
- stripNullish(expectedDictionaryValue);
65
- if ((actualStructuralValue.kind === "objectType" ||
66
- expectedStructuralValue.kind === "objectType") &&
67
- !isSameNominalType(actualDictionaryValue, expectedDictionaryValue, context)) {
68
- return true;
69
- }
70
- }
71
- return false;
72
- };
73
- export const isBroadStorageTarget = (expectedType, context) => {
74
- if (!expectedType) {
75
- return false;
76
- }
77
- const resolved = resolveTypeAlias(stripNullish(expectedType), context);
78
- return (resolved.kind === "unknownType" ||
79
- resolved.kind === "anyType" ||
80
- resolved.kind === "objectType" ||
81
- (resolved.kind === "unionType" &&
82
- resolved.types.some((member) => member.kind === "objectType" || isSystemObjectReferenceType(member)) &&
83
- resolved.types.every((member) => member.kind === "objectType" ||
84
- member.kind === "primitiveType" ||
85
- member.kind === "literalType" ||
86
- isSystemObjectReferenceType(member))) ||
87
- isSystemObjectReferenceType(resolved));
88
- };
89
- const wrapMaterializedTargetAst = (valueAst, targetType, context) => {
90
- const [targetTypeAst, nextContext] = emitTypeAst(targetType, context);
91
- if (isExactExpressionToType(valueAst, stripNullableTypeAst(targetTypeAst))) {
92
- return [valueAst, nextContext];
93
- }
94
- if (valueAst.kind === "castExpression" ||
95
- (valueAst.kind === "memberAccessExpression" &&
96
- valueAst.memberName === "Value")) {
97
- return [valueAst, context];
98
- }
99
- return [
100
- {
101
- kind: "castExpression",
102
- type: targetTypeAst,
103
- expression: valueAst,
104
- },
105
- nextContext,
106
- ];
107
- };
108
- const preservesMaterializedValueTypeNarrowing = (narrowed, context) => {
109
- const sourceType = narrowed.sourceType ?? narrowed.storageType ?? narrowed.carrierType;
110
- return (!!sourceType &&
111
- !!narrowed.type &&
112
- requiresValueTypeMaterialization(sourceType, narrowed.type, context));
113
- };
114
- export const buildRuntimeSubsetExpressionAst = (expr, narrowed, context, targetType = narrowed.type) => {
115
- const sourceType = narrowed.sourceType ?? expr.inferredType;
116
- if (!sourceType || !targetType) {
117
- return undefined;
118
- }
119
- const sourceFrame = (() => {
120
- const sourceValueAst = narrowed.storageExprAst ??
121
- identifierExpression(escapeCSharpIdentifier(expr.name));
122
- if (narrowed.sourceMembers &&
123
- narrowed.sourceCandidateMemberNs &&
124
- narrowed.sourceMembers.length === narrowed.sourceCandidateMemberNs.length) {
125
- const explicitFrame = {
126
- members: narrowed.sourceMembers,
127
- candidateMemberNs: narrowed.sourceCandidateMemberNs,
128
- runtimeUnionArity: narrowed.runtimeUnionArity,
129
- };
130
- const storageType = context.localValueTypes?.get(expr.name);
131
- const storageMembers = sourceValueAst.kind === "identifierExpression" && storageType
132
- ? getCanonicalRuntimeUnionMembers(storageType, context)
133
- : undefined;
134
- return storageMembers &&
135
- storageMembers.length > (explicitFrame.runtimeUnionArity ?? 0)
136
- ? {
137
- members: storageMembers,
138
- candidateMemberNs: storageMembers.map((_, index) => index + 1),
139
- runtimeUnionArity: storageMembers.length,
140
- }
141
- : explicitFrame;
142
- }
143
- const inferredMembers = narrowed.type
144
- ? getCanonicalRuntimeUnionMembers(narrowed.type, context)
145
- : undefined;
146
- return inferredMembers &&
147
- inferredMembers.length === narrowed.runtimeMemberNs.length
148
- ? {
149
- members: inferredMembers,
150
- candidateMemberNs: narrowed.runtimeMemberNs,
151
- runtimeUnionArity: narrowed.runtimeUnionArity,
152
- }
153
- : undefined;
154
- })();
155
- const sourceValueAst = narrowed.storageExprAst ??
156
- identifierExpression(escapeCSharpIdentifier(expr.name));
157
- const materialized = tryBuildRuntimeMaterializationAst(sourceValueAst, sourceType, targetType, context, emitTypeAst, new Set(narrowed.runtimeMemberNs), sourceFrame);
158
- if (!materialized) {
159
- return undefined;
160
- }
161
- return wrapMaterializedTargetAst(materialized[0], targetType, materialized[1]);
162
- };
163
- export const tryEmitRuntimeSubsetMemberProjectionIdentifier = (expr, narrowed, context, expectedType) => {
164
- if (!expectedType ||
165
- isBroadStorageTarget(expectedType, context) ||
166
- willCarryAsRuntimeUnion(expectedType, context) ||
167
- narrowed.runtimeMemberNs.length !== 1) {
168
- return undefined;
169
- }
170
- const [sourceMemberN] = narrowed.runtimeMemberNs;
171
- if (sourceMemberN === undefined || sourceMemberN < 1) {
172
- return undefined;
173
- }
174
- const sourceType = narrowed.sourceType ?? expr.inferredType;
175
- if (!sourceType) {
176
- return undefined;
177
- }
178
- const [sourceLayout, sourceLayoutContext] = buildRuntimeUnionLayout(sourceType, context, emitTypeAst);
179
- const sourceMember = sourceLayout?.members[sourceMemberN - 1];
180
- if (!sourceLayout || !sourceMember) {
181
- return undefined;
182
- }
183
- const [sourceMemberAst, sourceMemberContext] = emitTypeAst(sourceMember, sourceLayoutContext);
184
- const [expectedAst, expectedContext] = emitTypeAst(expectedType, sourceMemberContext);
185
- if (stableTypeKeyFromAst(sourceMemberAst) !== stableTypeKeyFromAst(expectedAst)) {
186
- return undefined;
187
- }
188
- const carrierAst = narrowed.storageExprAst ??
189
- identifierExpression(context.localNameMap?.get(expr.name) ?? escapeCSharpIdentifier(expr.name));
190
- return [
191
- {
192
- kind: "invocationExpression",
193
- expression: {
194
- kind: "memberAccessExpression",
195
- expression: carrierAst,
196
- memberName: `As${sourceMemberN}`,
197
- },
198
- arguments: [],
199
- },
200
- expectedContext,
201
- ];
202
- };
203
- export const tryEmitStorageCompatibleIdentifier = (expr, context, expectedType) => {
204
- if (!expectedType) {
205
- return undefined;
206
- }
207
- const storageType = context.localValueTypes?.get(expr.name);
208
- const storageIdentifierAst = getStorageIdentifierAst(expr, context);
209
- if (!storageIdentifierAst || !storageType) {
210
- return undefined;
211
- }
212
- if (isBroadStorageTarget(expectedType, context)) {
213
- return storageIdentifierAst;
214
- }
215
- const effectiveType = context.localSemanticTypes?.get(expr.name) ??
216
- resolveEffectiveExpressionType(expr, context);
217
- const strippedEffectiveType = effectiveType
218
- ? stripNullish(effectiveType)
219
- : undefined;
220
- const strippedExpectedType = stripNullish(expectedType);
221
- const effectiveNamedStructuralAliasMatchesExpected = strippedEffectiveType?.kind === "referenceType" &&
222
- strippedExpectedType.kind === "referenceType" &&
223
- strippedEffectiveType.structuralOrigin === "namedReference" &&
224
- (strippedEffectiveType.structuralMembers?.length ?? 0) > 0 &&
225
- strippedEffectiveType.name === strippedExpectedType.name;
226
- if (!isBroadStorageTarget(expectedType, context) &&
227
- !willCarryAsRuntimeUnion(expectedType, context) &&
228
- matchesExpectedEmissionType(effectiveType, expectedType, context)) {
229
- return effectiveNamedStructuralAliasMatchesExpected
230
- ? storageIdentifierAst
231
- : undefined;
232
- }
233
- if (!matchesExpectedEmissionType(storageType, expectedType, context)) {
234
- return undefined;
235
- }
236
- if (willCarryAsRuntimeUnion(expectedType, context) &&
237
- !willCarryAsRuntimeUnion(storageType, context)) {
238
- return undefined;
239
- }
240
- if (needsStructuralCollectionMaterialization(storageType, expectedType, context)) {
241
- return undefined;
242
- }
243
- return storageIdentifierAst;
244
- };
245
- export const tryEmitCollapsedStorageIdentifier = (expr, context) => {
246
- const storageType = context.localValueTypes?.get(expr.name);
247
- const storageIdentifierAst = getStorageIdentifierAst(expr, context);
248
- if (!storageIdentifierAst || !storageType) {
249
- return undefined;
250
- }
251
- const effectiveType = resolveEffectiveExpressionType(expr, context);
252
- if (!effectiveType) {
253
- return undefined;
254
- }
255
- let sameSurfaceResult;
256
- try {
257
- sameSurfaceResult = matchesEmittedStorageSurface(storageType, effectiveType, context);
258
- }
259
- catch (err) {
260
- if (err instanceof Error) {
261
- throw new Error(`${err.message} [identifier=${expr.name}]`);
262
- }
263
- throw err;
264
- }
265
- const [sameSurface, nextContext] = sameSurfaceResult;
266
- if (!sameSurface) {
267
- return undefined;
268
- }
269
- return [storageIdentifierAst, nextContext];
270
- };
271
- export const tryEmitImplicitNarrowedStorageIdentifier = (expr, narrowed, context) => {
272
- if (!narrowed.storageExprAst || !narrowed.type) {
273
- return undefined;
274
- }
275
- const storageType = narrowed.storageType ?? context.localValueTypes?.get(expr.name);
276
- if (!storageType) {
277
- return undefined;
278
- }
279
- const narrowedProjectionType = narrowed.type ??
280
- tryResolveRuntimeUnionMemberType(narrowed.sourceType ?? storageType, narrowed.exprAst, context);
281
- const shouldAvoidProjectedRuntimeUnionStorageReuse = narrowed.storageExprAst !== undefined &&
282
- narrowed.storageExprAst !== narrowed.exprAst &&
283
- willCarryAsRuntimeUnion(storageType, context) &&
284
- !!narrowedProjectionType &&
285
- !willCarryAsRuntimeUnion(narrowedProjectionType, context);
286
- if (shouldAvoidProjectedRuntimeUnionStorageReuse) {
287
- return undefined;
288
- }
289
- const [sameSurface, nextContext] = matchesEmittedStorageSurface(storageType, narrowed.type, context);
290
- if (!sameSurface) {
291
- return undefined;
292
- }
293
- return [narrowed.storageExprAst, nextContext];
294
- };
295
- export const tryEmitImplicitRuntimeSubsetStorageIdentifier = (expr, narrowed, context) => {
296
- if (!narrowed.type) {
297
- return undefined;
298
- }
299
- const remappedLocal = context.localNameMap?.get(expr.name);
300
- const storageType = context.localValueTypes?.get(expr.name);
301
- if (!remappedLocal || !storageType) {
302
- return undefined;
303
- }
304
- const [sameSurface, nextContext] = matchesEmittedStorageSurface(storageType, narrowed.type, context);
305
- if (!sameSurface) {
306
- return undefined;
307
- }
308
- return [identifierExpression(remappedLocal), nextContext];
309
- };
310
- export const tryEmitReifiedStorageIdentifier = (expr, context, expectedType) => {
311
- const remappedLocal = context.localNameMap?.get(expr.name);
312
- const storageType = context.localValueTypes?.get(expr.name);
313
- if (!remappedLocal || !storageType) {
314
- return undefined;
315
- }
316
- const effectiveType = resolveEffectiveExpressionType(expr, context);
317
- const expressionType = expr.inferredType;
318
- const expressionMatchesExpected = matchesSemanticExpectedType(expressionType, expectedType, context);
319
- return adaptStorageErasedValueAst({
320
- valueAst: identifierExpression(remappedLocal),
321
- semanticType: expressionMatchesExpected ? expressionType : effectiveType,
322
- storageType,
323
- expectedType,
324
- context,
325
- emitTypeAst,
326
- allowCastFallback: expressionMatchesExpected,
327
- });
328
- };
329
- export const tryEmitStorageCompatibleNarrowedIdentifier = (expr, narrowed, context, expectedType) => {
330
- if (!narrowed.type && !expectedType) {
331
- return undefined;
332
- }
333
- const remappedLocal = context.localNameMap?.get(expr.name);
334
- const storageType = narrowed.storageType ?? context.localValueTypes?.get(expr.name);
335
- if (!storageType) {
336
- return undefined;
337
- }
338
- const targetType = expectedType ?? narrowed.type;
339
- if (!targetType) {
340
- return undefined;
341
- }
342
- const narrowedProjectionType = narrowed.type ??
343
- tryResolveRuntimeUnionMemberType(narrowed.sourceType ?? storageType, narrowed.exprAst, context);
344
- const shouldAvoidProjectedRuntimeUnionStorageReuse = narrowed.storageExprAst !== undefined &&
345
- narrowed.storageExprAst !== narrowed.exprAst &&
346
- willCarryAsRuntimeUnion(storageType, context) &&
347
- !!narrowedProjectionType &&
348
- !willCarryAsRuntimeUnion(narrowedProjectionType, context);
349
- const shouldAvoidBroadStorageReuse = !!expectedType &&
350
- !!narrowed.type &&
351
- isBroadStorageTarget(expectedType, context) &&
352
- willCarryAsRuntimeUnion(storageType, context) &&
353
- !willCarryAsRuntimeUnion(narrowed.type, context);
354
- const shouldAvoidBroadCarrierReuseForProjectedNarrowing = !!expectedType &&
355
- isBroadStorageTarget(expectedType, context) &&
356
- narrowed.carrierExprAst !== undefined &&
357
- narrowed.carrierExprAst !== narrowed.exprAst;
358
- const shouldPreserveMaterializedValueNarrowing = preservesMaterializedValueTypeNarrowing(narrowed, context);
359
- const shouldAvoidStorageReuse = shouldAvoidBroadStorageReuse ||
360
- shouldAvoidProjectedRuntimeUnionStorageReuse ||
361
- shouldAvoidBroadCarrierReuseForProjectedNarrowing ||
362
- shouldPreserveMaterializedValueNarrowing;
363
- const originalRuntimeCarrierAst = narrowed.carrierExprAst ??
364
- narrowed.storageExprAst ??
365
- (remappedLocal ? identifierExpression(remappedLocal) : undefined);
366
- const originalRuntimeCarrierType = narrowed.carrierExprAst
367
- ? (narrowed.carrierType ?? context.localValueTypes?.get(expr.name))
368
- : storageType;
369
- const [sameSourceCarrierSurface, carrierSurfaceContext] = expectedType && originalRuntimeCarrierType
370
- ? matchesEmittedStorageSurface(stripNullish(originalRuntimeCarrierType), expectedType, context)
371
- : [false, context];
372
- const canReuseOriginalRuntimeCarrier = !!expectedType &&
373
- !!originalRuntimeCarrierAst &&
374
- !!originalRuntimeCarrierType &&
375
- willCarryAsRuntimeUnion(expectedType, context) &&
376
- sameSourceCarrierSurface &&
377
- !shouldAvoidStorageReuse &&
378
- (!narrowedProjectionType ||
379
- !willCarryAsRuntimeUnion(narrowedProjectionType, context));
380
- const canReuseOriginalCarrierSurface = !!expectedType &&
381
- !!originalRuntimeCarrierAst &&
382
- !!originalRuntimeCarrierType &&
383
- sameSourceCarrierSurface &&
384
- !shouldAvoidStorageReuse &&
385
- !requiresValueTypeMaterialization(originalRuntimeCarrierType, expectedType, carrierSurfaceContext);
386
- if (expectedType &&
387
- isBroadStorageTarget(expectedType, context) &&
388
- !shouldAvoidStorageReuse) {
389
- const originalSourceCarrierType = narrowed.carrierType ??
390
- narrowed.sourceType ??
391
- context.localValueTypes?.get(expr.name);
392
- if (originalSourceCarrierType &&
393
- !willCarryAsRuntimeUnion(originalSourceCarrierType, context) &&
394
- (matchesExpectedEmissionType(stripNullish(originalSourceCarrierType), expectedType, context) ||
395
- isStorageErasedBroadObjectPassThroughType(originalSourceCarrierType, context))) {
396
- return [
397
- identifierExpression(remappedLocal ?? escapeCSharpIdentifier(expr.name)),
398
- context,
399
- ];
400
- }
401
- if (narrowed.carrierExprAst) {
402
- return [narrowed.carrierExprAst, context];
403
- }
404
- if (remappedLocal) {
405
- return [identifierExpression(remappedLocal), context];
406
- }
407
- if (narrowed.storageExprAst) {
408
- return [narrowed.storageExprAst, context];
409
- }
410
- }
411
- if (canReuseOriginalRuntimeCarrier) {
412
- return [originalRuntimeCarrierAst, carrierSurfaceContext];
413
- }
414
- if (canReuseOriginalCarrierSurface) {
415
- return [originalRuntimeCarrierAst, carrierSurfaceContext];
416
- }
417
- const [sameSurface, nextContext] = matchesEmittedStorageSurface(storageType, targetType, context);
418
- if (!sameSurface) {
419
- return undefined;
420
- }
421
- if (!narrowed.storageExprAst) {
422
- if (!remappedLocal) {
423
- return undefined;
424
- }
425
- return [identifierExpression(remappedLocal), nextContext];
426
- }
427
- if (narrowed.exprAst.kind === "memberAccessExpression" &&
428
- narrowed.exprAst.memberName === "Value" &&
429
- narrowed.exprAst.expression === narrowed.storageExprAst) {
430
- return undefined;
431
- }
432
- if (shouldAvoidStorageReuse) {
433
- return undefined;
434
- }
435
- return [narrowed.storageExprAst, nextContext];
436
- };
437
- export const tryEmitExactStorageCompatibleNarrowedIdentifier = (expr, narrowed, context, expectedType) => {
438
- if (!expectedType) {
439
- return undefined;
440
- }
441
- const remappedLocal = context.localNameMap?.get(expr.name);
442
- const storageType = narrowed.storageType ?? context.localValueTypes?.get(expr.name);
443
- if (!storageType) {
444
- return undefined;
445
- }
446
- const originalRuntimeCarrierAst = narrowed.carrierExprAst ??
447
- narrowed.storageExprAst ??
448
- (remappedLocal ? identifierExpression(remappedLocal) : undefined);
449
- const originalRuntimeCarrierType = narrowed.carrierExprAst
450
- ? (narrowed.carrierType ?? context.localValueTypes?.get(expr.name))
451
- : storageType;
452
- const [sameSourceCarrierSurface, carrierSurfaceContext] = originalRuntimeCarrierAst && originalRuntimeCarrierType
453
- ? matchesEmittedStorageSurface(stripNullish(originalRuntimeCarrierType), expectedType, context)
454
- : [false, context];
455
- if (preservesMaterializedValueTypeNarrowing(narrowed, context)) {
456
- return undefined;
457
- }
458
- if (originalRuntimeCarrierAst &&
459
- willCarryAsRuntimeUnion(expectedType, context) &&
460
- sameSourceCarrierSurface) {
461
- return [originalRuntimeCarrierAst, carrierSurfaceContext];
462
- }
463
- if (originalRuntimeCarrierAst &&
464
- sameSourceCarrierSurface &&
465
- originalRuntimeCarrierType &&
466
- !requiresValueTypeMaterialization(originalRuntimeCarrierType, expectedType, carrierSurfaceContext)) {
467
- return [originalRuntimeCarrierAst, carrierSurfaceContext];
468
- }
469
- const [sameStorageSurface, nextContext] = matchesEmittedStorageSurface(storageType, expectedType, context);
470
- if (!sameStorageSurface) {
471
- return undefined;
472
- }
473
- if (narrowed.exprAst.kind === "memberAccessExpression" &&
474
- narrowed.exprAst.memberName === "Value" &&
475
- narrowed.exprAst.expression === narrowed.storageExprAst) {
476
- return undefined;
477
- }
478
- if (narrowed.storageExprAst) {
479
- return [narrowed.storageExprAst, nextContext];
480
- }
481
- if (!remappedLocal) {
482
- return undefined;
483
- }
484
- return [identifierExpression(remappedLocal), nextContext];
485
- };
486
- export const tryEmitMaterializedNarrowedIdentifier = (narrowed, context, expectedType) => {
487
- if (!expectedType) {
488
- return undefined;
489
- }
490
- const effectiveType = narrowed.type ?? narrowed.sourceType;
491
- if (!effectiveType) {
492
- return undefined;
493
- }
494
- const directMemberType = tryResolveRuntimeUnionMemberType(narrowed.sourceType ?? effectiveType, narrowed.exprAst, context);
495
- if (directMemberType &&
496
- willCarryAsRuntimeUnion(directMemberType, context) &&
497
- willCarryAsRuntimeUnion(expectedType, context) &&
498
- runtimeUnionAliasReferencesMatch(directMemberType, expectedType, context)) {
499
- return [narrowed.exprAst, context];
500
- }
501
- const directSurfaceMemberType = resolveDirectValueSurfaceType(narrowed.exprAst, context) ??
502
- directMemberType;
503
- const directAliasCarrierType = directMemberType ?? directSurfaceMemberType;
504
- if (directAliasCarrierType &&
505
- willCarryAsRuntimeUnion(directAliasCarrierType, context) &&
506
- willCarryAsRuntimeUnion(expectedType, context)) {
507
- const [expectedLayout, expectedLayoutContext] = buildRuntimeUnionLayout(expectedType, context, emitTypeAst);
508
- if (expectedLayout) {
509
- const aliasMemberIndices = expectedLayout.members.flatMap((member, index) => member &&
510
- runtimeUnionAliasReferencesMatch(member, directAliasCarrierType, expectedLayoutContext)
511
- ? [index]
512
- : []);
513
- if (aliasMemberIndices.length === 1) {
514
- const [memberIndex] = aliasMemberIndices;
515
- if (memberIndex !== undefined) {
516
- return [
517
- buildRuntimeUnionFactoryCallAst(buildRuntimeUnionTypeAst(expectedLayout), memberIndex + 1, narrowed.exprAst),
518
- expectedLayoutContext,
519
- ];
520
- }
521
- }
522
- }
523
- }
524
- if (directSurfaceMemberType &&
525
- willCarryAsRuntimeUnion(directSurfaceMemberType, context) &&
526
- willCarryAsRuntimeUnion(expectedType, context) &&
527
- runtimeUnionAliasReferencesMatch(directSurfaceMemberType, expectedType, context)) {
528
- return [narrowed.exprAst, context];
529
- }
530
- if (directSurfaceMemberType &&
531
- willCarryAsRuntimeUnion(expectedType, context) &&
532
- !willCarryAsRuntimeUnion(directSurfaceMemberType, context)) {
533
- const [expectedLayout, expectedLayoutContext] = buildRuntimeUnionLayout(expectedType, context, emitTypeAst);
534
- if (expectedLayout) {
535
- const [directSurfaceTypeAst, directSurfaceContext] = emitTypeAst(directSurfaceMemberType, expectedLayoutContext);
536
- const matchingMemberIndices = expectedLayout.memberTypeAsts.flatMap((memberTypeAst, index) => memberTypeAst &&
537
- sameTypeAstSurface(stripNullableTypeAst(directSurfaceTypeAst), stripNullableTypeAst(memberTypeAst))
538
- ? [index]
539
- : []);
540
- if (matchingMemberIndices.length === 1) {
541
- const [memberIndex] = matchingMemberIndices;
542
- if (memberIndex !== undefined) {
543
- return [
544
- buildRuntimeUnionFactoryCallAst(buildRuntimeUnionTypeAst(expectedLayout), memberIndex + 1, narrowed.exprAst),
545
- directSurfaceContext,
546
- ];
547
- }
548
- }
549
- }
550
- }
551
- if (directMemberType &&
552
- matchesExpectedEmissionType(directMemberType, expectedType, context)) {
553
- return [narrowed.exprAst, context];
554
- }
555
- if (directMemberType &&
556
- willCarryAsRuntimeUnion(expectedType, context) &&
557
- !willCarryAsRuntimeUnion(directMemberType, context)) {
558
- const [expectedLayout, expectedLayoutContext] = buildRuntimeUnionLayout(expectedType, context, emitTypeAst);
559
- if (expectedLayout?.members.some((member) => matchesExpectedEmissionType(directMemberType, member, context))) {
560
- return [narrowed.exprAst, expectedLayoutContext];
561
- }
562
- }
563
- const materialized = materializeDirectNarrowingAst(narrowed.exprAst, effectiveType, expectedType, context);
564
- return wrapMaterializedTargetAst(materialized[0], expectedType, materialized[1]);
565
- };
566
- export const matchesEmittedStorageSurface = (actualType, expectedType, context) => {
567
- const tryEmitSurfaceTypeAst = (type, currentContext) => {
568
- try {
569
- return emitTypeAst(type, currentContext);
570
- }
571
- catch (err) {
572
- if (err instanceof Error &&
573
- (err.message.startsWith("ICE: Unresolved reference type ") ||
574
- err.message.startsWith("ICE: Non-transparent intersection type reached emitter") ||
575
- err.message.startsWith("ICE: 'unknown' type reached emitter") ||
576
- err.message.startsWith("ICE: 'any' type reached emitter"))) {
577
- return undefined;
578
- }
579
- throw err;
580
- }
581
- };
582
- const containsRawObjectType = (type, seen = new Set()) => {
583
- if (seen.has(type)) {
584
- return false;
585
- }
586
- seen.add(type);
587
- switch (type.kind) {
588
- case "objectType":
589
- return true;
590
- case "arrayType":
591
- return containsRawObjectType(type.elementType, seen);
592
- case "tupleType":
593
- return type.elementTypes.some((elementType) => containsRawObjectType(elementType, seen));
594
- case "dictionaryType":
595
- return containsRawObjectType(type.valueType, seen);
596
- case "unionType":
597
- case "intersectionType":
598
- return type.types.some((memberType) => containsRawObjectType(memberType, seen));
599
- case "referenceType":
600
- return (type.typeArguments?.some((typeArgument) => containsRawObjectType(typeArgument, seen)) ?? false);
601
- default:
602
- return false;
603
- }
604
- };
605
- if (!actualType || !expectedType) {
606
- return [false, context];
607
- }
608
- if (requiresValueTypeMaterialization(actualType, expectedType, context)) {
609
- return [false, context];
610
- }
611
- const strippedActual = normalizeStructuralEmissionType(resolveStructuralReferenceType(stripNullish(actualType), context) ??
612
- stripNullish(actualType), context);
613
- const strippedExpected = normalizeStructuralEmissionType(resolveStructuralReferenceType(stripNullish(expectedType), context) ??
614
- stripNullish(expectedType), context);
615
- if (containsRawObjectType(strippedActual) ||
616
- containsRawObjectType(strippedExpected)) {
617
- return [false, context];
618
- }
619
- let actualSurface;
620
- try {
621
- actualSurface = tryEmitSurfaceTypeAst(strippedActual, context);
622
- }
623
- catch (err) {
624
- if (err instanceof Error) {
625
- throw new Error(`${err.message} ${buildStorageSurfaceDiagnosticContext(actualType, expectedType, strippedActual, strippedExpected, context)}`);
626
- }
627
- throw err;
628
- }
629
- if (!actualSurface) {
630
- return [false, context];
631
- }
632
- const [actualTypeAst, actualTypeContext] = actualSurface;
633
- let expectedSurface;
634
- try {
635
- expectedSurface = tryEmitSurfaceTypeAst(strippedExpected, actualTypeContext);
636
- }
637
- catch (err) {
638
- if (err instanceof Error) {
639
- throw new Error(`${err.message} ${buildStorageSurfaceDiagnosticContext(actualType, expectedType, strippedActual, strippedExpected, actualTypeContext)}`);
640
- }
641
- throw err;
642
- }
643
- if (!expectedSurface) {
644
- return [false, context];
645
- }
646
- const [expectedTypeAst, expectedTypeContext] = expectedSurface;
647
- return [
648
- stableTypeKeyFromAst(actualTypeAst) ===
649
- stableTypeKeyFromAst(expectedTypeAst),
650
- expectedTypeContext,
651
- ];
652
- };
1
+ export { buildRuntimeSubsetExpressionAst, isBroadStorageTarget, matchesEmittedStorageSurface, tryEmitCollapsedStorageIdentifier, tryEmitExactStorageCompatibleNarrowedIdentifier, tryEmitImplicitNarrowedStorageIdentifier, tryEmitImplicitRuntimeSubsetStorageIdentifier, tryEmitMaterializedNarrowedIdentifier, tryEmitReifiedStorageIdentifier, tryEmitRuntimeSubsetMemberProjectionIdentifier, tryEmitStorageCompatibleIdentifier, tryEmitStorageCompatibleNarrowedIdentifier, } from "./identifier-storage/storage-surface.js";
653
2
  //# sourceMappingURL=identifier-storage.js.map