@tsonic/emitter 0.0.6 → 0.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/array.test.js +5 -5
- package/dist/array.test.js.map +1 -1
- package/dist/core/attributes.d.ts +43 -0
- package/dist/core/attributes.d.ts.map +1 -0
- package/dist/core/attributes.js +128 -0
- package/dist/core/attributes.js.map +1 -0
- package/dist/core/attributes.test.d.ts +5 -0
- package/dist/core/attributes.test.d.ts.map +1 -0
- package/dist/core/attributes.test.js +296 -0
- package/dist/core/attributes.test.js.map +1 -0
- package/dist/core/imports.test.js +6 -3
- package/dist/core/imports.test.js.map +1 -1
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/module-emitter/static-container.d.ts.map +1 -1
- package/dist/core/module-emitter/static-container.js +50 -1
- package/dist/core/module-emitter/static-container.js.map +1 -1
- package/dist/core/module-emitter.test.js +2 -1
- package/dist/core/module-emitter.test.js.map +1 -1
- package/dist/core/module-map.d.ts.map +1 -1
- package/dist/core/module-map.js +5 -1
- package/dist/core/module-map.js.map +1 -1
- package/dist/core/module-map.test.d.ts +8 -0
- package/dist/core/module-map.test.d.ts.map +1 -0
- package/dist/core/module-map.test.js +94 -0
- package/dist/core/module-map.test.js.map +1 -0
- package/dist/core/type-compatibility.d.ts +31 -0
- package/dist/core/type-compatibility.d.ts.map +1 -0
- package/dist/core/type-compatibility.js +99 -0
- package/dist/core/type-compatibility.js.map +1 -0
- package/dist/core/type-resolution.d.ts +83 -3
- package/dist/core/type-resolution.d.ts.map +1 -1
- package/dist/core/type-resolution.js +262 -4
- package/dist/core/type-resolution.js.map +1 -1
- package/dist/core/type-resolution.test.js +110 -1
- package/dist/core/type-resolution.test.js.map +1 -1
- package/dist/emitter-types/context.d.ts.map +1 -1
- package/dist/emitter-types/context.js +21 -1
- package/dist/emitter-types/context.js.map +1 -1
- package/dist/emitter-types/core.d.ts +26 -0
- package/dist/emitter-types/core.d.ts.map +1 -1
- package/dist/emitter-types/identifiers.d.ts.map +1 -1
- package/dist/emitter-types/identifiers.js +4 -43
- package/dist/emitter-types/identifiers.js.map +1 -1
- package/dist/emitter-types/index.d.ts +1 -1
- package/dist/emitter-types/index.d.ts.map +1 -1
- package/dist/emitter-types/index.js.map +1 -1
- package/dist/emitter.d.ts.map +1 -1
- package/dist/emitter.js +47 -1
- package/dist/emitter.js.map +1 -1
- package/dist/expression-emitter.d.ts.map +1 -1
- package/dist/expression-emitter.js +51 -3
- package/dist/expression-emitter.js.map +1 -1
- package/dist/expressions/access.d.ts.map +1 -1
- package/dist/expressions/access.js +138 -23
- package/dist/expressions/access.js.map +1 -1
- package/dist/expressions/calls.d.ts.map +1 -1
- package/dist/expressions/calls.js +90 -13
- package/dist/expressions/calls.js.map +1 -1
- package/dist/expressions/collections.d.ts +3 -2
- package/dist/expressions/collections.d.ts.map +1 -1
- package/dist/expressions/collections.js +251 -52
- package/dist/expressions/collections.js.map +1 -1
- package/dist/expressions/functions.d.ts +2 -2
- package/dist/expressions/functions.d.ts.map +1 -1
- package/dist/expressions/functions.js +81 -38
- package/dist/expressions/functions.js.map +1 -1
- package/dist/expressions/identifiers.d.ts.map +1 -1
- package/dist/expressions/identifiers.js +28 -7
- package/dist/expressions/identifiers.js.map +1 -1
- package/dist/expressions/index.test.js +191 -4
- package/dist/expressions/index.test.js.map +1 -1
- package/dist/expressions/literals.d.ts +7 -17
- package/dist/expressions/literals.d.ts.map +1 -1
- package/dist/expressions/literals.js +27 -87
- package/dist/expressions/literals.js.map +1 -1
- package/dist/expressions/literals.test.js +52 -2
- package/dist/expressions/literals.test.js.map +1 -1
- package/dist/expressions/operators.d.ts +29 -11
- package/dist/expressions/operators.d.ts.map +1 -1
- package/dist/expressions/operators.js +244 -67
- package/dist/expressions/operators.js.map +1 -1
- package/dist/expressions/other.d.ts +3 -0
- package/dist/expressions/other.d.ts.map +1 -1
- package/dist/expressions/other.js +27 -3
- package/dist/expressions/other.js.map +1 -1
- package/dist/generator-exchange.d.ts +1 -1
- package/dist/generator-exchange.d.ts.map +1 -1
- package/dist/generator-exchange.js +15 -4
- package/dist/generator-exchange.js.map +1 -1
- package/dist/generator-wrapper.d.ts +84 -0
- package/dist/generator-wrapper.d.ts.map +1 -0
- package/dist/generator-wrapper.js +312 -0
- package/dist/generator-wrapper.js.map +1 -0
- package/dist/generator-wrapper.test.d.ts +12 -0
- package/dist/generator-wrapper.test.d.ts.map +1 -0
- package/dist/generator-wrapper.test.js +179 -0
- package/dist/generator-wrapper.test.js.map +1 -0
- package/dist/generator.test.js +596 -6
- package/dist/generator.test.js.map +1 -1
- package/dist/golden-tests/config-parser.d.ts.map +1 -1
- package/dist/golden-tests/config-parser.js +81 -11
- package/dist/golden-tests/config-parser.js.map +1 -1
- package/dist/golden-tests/discovery.d.ts +14 -3
- package/dist/golden-tests/discovery.d.ts.map +1 -1
- package/dist/golden-tests/discovery.js +105 -12
- package/dist/golden-tests/discovery.js.map +1 -1
- package/dist/golden-tests/index.d.ts +1 -1
- package/dist/golden-tests/index.d.ts.map +1 -1
- package/dist/golden-tests/index.js.map +1 -1
- package/dist/golden-tests/runner.d.ts +1 -0
- package/dist/golden-tests/runner.d.ts.map +1 -1
- package/dist/golden-tests/runner.js +83 -25
- package/dist/golden-tests/runner.js.map +1 -1
- package/dist/golden-tests/types.d.ts +18 -1
- package/dist/golden-tests/types.d.ts.map +1 -1
- package/dist/golden.test.d.ts +12 -5
- package/dist/golden.test.d.ts.map +1 -1
- package/dist/golden.test.js +40 -21
- package/dist/golden.test.js.map +1 -1
- package/dist/hierarchical-bindings.test.js +2 -2
- package/dist/hierarchical-bindings.test.js.map +1 -1
- package/dist/integration.test.js +57 -10
- package/dist/integration.test.js.map +1 -1
- package/dist/invariants/emitter-globals-subset.test.d.ts +15 -0
- package/dist/invariants/emitter-globals-subset.test.d.ts.map +1 -0
- package/dist/invariants/emitter-globals-subset.test.js +137 -0
- package/dist/invariants/emitter-globals-subset.test.js.map +1 -0
- package/dist/invariants/numeric-proof-contract.test.d.ts +19 -0
- package/dist/invariants/numeric-proof-contract.test.d.ts.map +1 -0
- package/dist/invariants/numeric-proof-contract.test.js +565 -0
- package/dist/invariants/numeric-proof-contract.test.js.map +1 -0
- package/dist/specialization/generic-functions.test.js +376 -0
- package/dist/specialization/generic-functions.test.js.map +1 -1
- package/dist/specialization/interfaces.test.js +6 -6
- package/dist/specialization/interfaces.test.js.map +1 -1
- package/dist/specialization/substitution.d.ts.map +1 -1
- package/dist/specialization/substitution.js +7 -0
- package/dist/specialization/substitution.js.map +1 -1
- package/dist/specialization/type-aliases.test.js +88 -5
- package/dist/specialization/type-aliases.test.js.map +1 -1
- package/dist/statement-emitter.d.ts.map +1 -1
- package/dist/statement-emitter.js +5 -1
- package/dist/statement-emitter.js.map +1 -1
- package/dist/statements/blocks.d.ts +39 -1
- package/dist/statements/blocks.d.ts.map +1 -1
- package/dist/statements/blocks.js +129 -3
- package/dist/statements/blocks.js.map +1 -1
- package/dist/statements/classes/members/methods.d.ts.map +1 -1
- package/dist/statements/classes/members/methods.js +16 -5
- package/dist/statements/classes/members/methods.js.map +1 -1
- package/dist/statements/classes/members/properties.d.ts.map +1 -1
- package/dist/statements/classes/members/properties.js +10 -1
- package/dist/statements/classes/members/properties.js.map +1 -1
- package/dist/statements/classes/properties.d.ts.map +1 -1
- package/dist/statements/classes/properties.js +4 -0
- package/dist/statements/classes/properties.js.map +1 -1
- package/dist/statements/control/conditionals.d.ts.map +1 -1
- package/dist/statements/control/conditionals.js +352 -1
- package/dist/statements/control/conditionals.js.map +1 -1
- package/dist/statements/control/loops.d.ts +6 -0
- package/dist/statements/control/loops.d.ts.map +1 -1
- package/dist/statements/control/loops.js +9 -2
- package/dist/statements/control/loops.js.map +1 -1
- package/dist/statements/declarations/classes.d.ts.map +1 -1
- package/dist/statements/declarations/classes.js +20 -6
- 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 +98 -26
- package/dist/statements/declarations/functions.js.map +1 -1
- package/dist/statements/declarations/interfaces.d.ts.map +1 -1
- package/dist/statements/declarations/interfaces.js +11 -1
- package/dist/statements/declarations/interfaces.js.map +1 -1
- package/dist/statements/declarations/structs.test.js +7 -5
- package/dist/statements/declarations/structs.test.js.map +1 -1
- package/dist/statements/declarations/type-aliases.d.ts.map +1 -1
- package/dist/statements/declarations/type-aliases.js +18 -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 +54 -2
- package/dist/statements/declarations/variables.js.map +1 -1
- package/dist/statements/index.test.js +164 -3
- package/dist/statements/index.test.js.map +1 -1
- package/dist/types/arrays.d.ts +10 -1
- package/dist/types/arrays.d.ts.map +1 -1
- package/dist/types/arrays.js +16 -1
- package/dist/types/arrays.js.map +1 -1
- package/dist/types/dictionaries.d.ts +3 -2
- package/dist/types/dictionaries.d.ts.map +1 -1
- package/dist/types/dictionaries.js +14 -8
- package/dist/types/dictionaries.js.map +1 -1
- package/dist/types/emitter.d.ts.map +1 -1
- package/dist/types/emitter.js +3 -0
- package/dist/types/emitter.js.map +1 -1
- package/dist/types/index.test.js +5 -2
- package/dist/types/index.test.js.map +1 -1
- package/dist/types/parameters.d.ts.map +1 -1
- package/dist/types/parameters.js +29 -0
- package/dist/types/parameters.js.map +1 -1
- package/dist/types/primitives.d.ts +12 -1
- package/dist/types/primitives.d.ts.map +1 -1
- package/dist/types/primitives.js +14 -1
- package/dist/types/primitives.js.map +1 -1
- package/dist/types/references.d.ts.map +1 -1
- package/dist/types/references.js +136 -30
- package/dist/types/references.js.map +1 -1
- package/dist/types/references.test.d.ts +11 -0
- package/dist/types/references.test.d.ts.map +1 -0
- package/dist/types/references.test.js +382 -0
- package/dist/types/references.test.js.map +1 -0
- package/dist/types/tuples.d.ts +23 -0
- package/dist/types/tuples.d.ts.map +1 -0
- package/dist/types/tuples.js +54 -0
- package/dist/types/tuples.js.map +1 -0
- package/dist/types/unions.test.js +62 -15
- package/dist/types/unions.test.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +7 -3
|
@@ -0,0 +1,565 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contract Test: Numeric Proof System (Behavioral)
|
|
3
|
+
*
|
|
4
|
+
* These tests enforce the contract between the numeric proof pass (frontend)
|
|
5
|
+
* and the emitter (backend) using BEHAVIOR, not source code pattern matching.
|
|
6
|
+
*
|
|
7
|
+
* Key contract:
|
|
8
|
+
* 1. Only the proof pass determines whether an expression is proven Int32
|
|
9
|
+
* 2. The emitter checks IR markers (numericIntent) and ICEs if missing
|
|
10
|
+
* 3. TSN5107 is triggered based on accessKind, not heuristic name matching
|
|
11
|
+
* 4. TSN5109 is triggered when accessKind is unknown/missing (compiler bug)
|
|
12
|
+
*
|
|
13
|
+
* Test approach:
|
|
14
|
+
* - Create IR fixtures with specific accessKind values
|
|
15
|
+
* - Run proof pass and assert diagnostics or success
|
|
16
|
+
* - Run emitter and verify ICE behavior for unproven indices
|
|
17
|
+
*/
|
|
18
|
+
import { describe, it } from "mocha";
|
|
19
|
+
import { expect } from "chai";
|
|
20
|
+
import { runNumericProofPass, } from "@tsonic/frontend";
|
|
21
|
+
import { emitModule } from "../emitter.js";
|
|
22
|
+
/**
|
|
23
|
+
* Create a minimal module with an array access expression.
|
|
24
|
+
* This allows testing different accessKind values and proof states.
|
|
25
|
+
*/
|
|
26
|
+
const createModuleWithAccess = (options) => {
|
|
27
|
+
const indexExpr = {
|
|
28
|
+
kind: "literal",
|
|
29
|
+
value: options.indexValue ?? 0,
|
|
30
|
+
raw: options.indexRaw ?? "0",
|
|
31
|
+
// If indexHasProof is true, pre-annotate with int type
|
|
32
|
+
// (simulating what the proof pass would do)
|
|
33
|
+
// INVARIANT: primitiveType(name="int") is the proven integer type
|
|
34
|
+
...(options.indexHasProof
|
|
35
|
+
? {
|
|
36
|
+
inferredType: {
|
|
37
|
+
kind: "primitiveType",
|
|
38
|
+
name: "int",
|
|
39
|
+
},
|
|
40
|
+
}
|
|
41
|
+
: {}),
|
|
42
|
+
};
|
|
43
|
+
const memberAccess = {
|
|
44
|
+
kind: "memberAccess",
|
|
45
|
+
object: {
|
|
46
|
+
kind: "identifier",
|
|
47
|
+
name: "arr",
|
|
48
|
+
inferredType: {
|
|
49
|
+
kind: "arrayType",
|
|
50
|
+
elementType: { kind: "primitiveType", name: "number" },
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
property: indexExpr,
|
|
54
|
+
isComputed: true,
|
|
55
|
+
isOptional: false,
|
|
56
|
+
// accessKind may be undefined to test missing tag
|
|
57
|
+
...(options.accessKind !== undefined
|
|
58
|
+
? { accessKind: options.accessKind }
|
|
59
|
+
: {}),
|
|
60
|
+
inferredType: { kind: "primitiveType", name: "number" },
|
|
61
|
+
};
|
|
62
|
+
return {
|
|
63
|
+
kind: "module",
|
|
64
|
+
filePath: "/test/contract.ts",
|
|
65
|
+
namespace: "Test",
|
|
66
|
+
className: "contract",
|
|
67
|
+
isStaticContainer: true,
|
|
68
|
+
imports: [],
|
|
69
|
+
body: [
|
|
70
|
+
{
|
|
71
|
+
kind: "variableDeclaration",
|
|
72
|
+
declarationKind: "const",
|
|
73
|
+
isExported: false,
|
|
74
|
+
declarations: [
|
|
75
|
+
{
|
|
76
|
+
kind: "variableDeclarator",
|
|
77
|
+
name: { kind: "identifierPattern", name: "arr" },
|
|
78
|
+
type: {
|
|
79
|
+
kind: "arrayType",
|
|
80
|
+
elementType: { kind: "primitiveType", name: "number" },
|
|
81
|
+
},
|
|
82
|
+
initializer: {
|
|
83
|
+
kind: "array",
|
|
84
|
+
elements: [
|
|
85
|
+
{ kind: "literal", value: 1 },
|
|
86
|
+
{ kind: "literal", value: 2 },
|
|
87
|
+
{ kind: "literal", value: 3 },
|
|
88
|
+
],
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
kind: "variableDeclaration",
|
|
95
|
+
declarationKind: "const",
|
|
96
|
+
isExported: false,
|
|
97
|
+
declarations: [
|
|
98
|
+
{
|
|
99
|
+
kind: "variableDeclarator",
|
|
100
|
+
name: { kind: "identifierPattern", name: "x" },
|
|
101
|
+
initializer: memberAccess,
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
},
|
|
105
|
+
],
|
|
106
|
+
exports: [],
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* Create module with identifier index (not literal)
|
|
111
|
+
*/
|
|
112
|
+
const createModuleWithIdentifierIndex = (options) => {
|
|
113
|
+
const indexExpr = {
|
|
114
|
+
kind: "identifier",
|
|
115
|
+
name: options.indexName,
|
|
116
|
+
// If indexHasInt32Type, give it int type
|
|
117
|
+
// INVARIANT: primitiveType(name="int") is the proven integer type
|
|
118
|
+
...(options.indexHasInt32Type
|
|
119
|
+
? {
|
|
120
|
+
inferredType: {
|
|
121
|
+
kind: "primitiveType",
|
|
122
|
+
name: "int",
|
|
123
|
+
},
|
|
124
|
+
}
|
|
125
|
+
: {
|
|
126
|
+
inferredType: { kind: "primitiveType", name: "number" },
|
|
127
|
+
}),
|
|
128
|
+
};
|
|
129
|
+
const memberAccess = {
|
|
130
|
+
kind: "memberAccess",
|
|
131
|
+
object: {
|
|
132
|
+
kind: "identifier",
|
|
133
|
+
name: "arr",
|
|
134
|
+
inferredType: {
|
|
135
|
+
kind: "arrayType",
|
|
136
|
+
elementType: { kind: "primitiveType", name: "number" },
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
property: indexExpr,
|
|
140
|
+
isComputed: true,
|
|
141
|
+
isOptional: false,
|
|
142
|
+
accessKind: options.accessKind,
|
|
143
|
+
inferredType: { kind: "primitiveType", name: "number" },
|
|
144
|
+
};
|
|
145
|
+
return {
|
|
146
|
+
kind: "module",
|
|
147
|
+
filePath: "/test/contract.ts",
|
|
148
|
+
namespace: "Test",
|
|
149
|
+
className: "contract",
|
|
150
|
+
isStaticContainer: true,
|
|
151
|
+
imports: [],
|
|
152
|
+
body: [
|
|
153
|
+
{
|
|
154
|
+
kind: "variableDeclaration",
|
|
155
|
+
declarationKind: "const",
|
|
156
|
+
isExported: false,
|
|
157
|
+
declarations: [
|
|
158
|
+
{
|
|
159
|
+
kind: "variableDeclarator",
|
|
160
|
+
name: { kind: "identifierPattern", name: "arr" },
|
|
161
|
+
type: {
|
|
162
|
+
kind: "arrayType",
|
|
163
|
+
elementType: { kind: "primitiveType", name: "number" },
|
|
164
|
+
},
|
|
165
|
+
initializer: {
|
|
166
|
+
kind: "array",
|
|
167
|
+
elements: [
|
|
168
|
+
{ kind: "literal", value: 1 },
|
|
169
|
+
{ kind: "literal", value: 2 },
|
|
170
|
+
{ kind: "literal", value: 3 },
|
|
171
|
+
],
|
|
172
|
+
},
|
|
173
|
+
},
|
|
174
|
+
],
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
kind: "variableDeclaration",
|
|
178
|
+
declarationKind: "const",
|
|
179
|
+
isExported: false,
|
|
180
|
+
declarations: [
|
|
181
|
+
{
|
|
182
|
+
kind: "variableDeclarator",
|
|
183
|
+
name: { kind: "identifierPattern", name: "x" },
|
|
184
|
+
initializer: memberAccess,
|
|
185
|
+
},
|
|
186
|
+
],
|
|
187
|
+
},
|
|
188
|
+
],
|
|
189
|
+
exports: [],
|
|
190
|
+
};
|
|
191
|
+
};
|
|
192
|
+
describe("Numeric Proof Contract (Behavioral)", () => {
|
|
193
|
+
// ============================================================================
|
|
194
|
+
// ACCESS KINDS THAT REQUIRE Int32 PROOF: clrIndexer, jsRuntimeArray, stringChar
|
|
195
|
+
// ============================================================================
|
|
196
|
+
describe("clrIndexer access (requires Int32 proof)", () => {
|
|
197
|
+
it("double literal (1.5) triggers TSN5107", () => {
|
|
198
|
+
const module = createModuleWithAccess({
|
|
199
|
+
accessKind: "clrIndexer",
|
|
200
|
+
indexHasProof: false,
|
|
201
|
+
indexValue: 1.5,
|
|
202
|
+
indexRaw: "1.5",
|
|
203
|
+
});
|
|
204
|
+
const result = runNumericProofPass([module]);
|
|
205
|
+
expect(result.ok).to.be.false;
|
|
206
|
+
expect(result.diagnostics[0]?.code).to.equal("TSN5107");
|
|
207
|
+
});
|
|
208
|
+
it("unproven identifier triggers TSN5107", () => {
|
|
209
|
+
const module = createModuleWithIdentifierIndex({
|
|
210
|
+
accessKind: "clrIndexer",
|
|
211
|
+
indexName: "i",
|
|
212
|
+
indexHasInt32Type: false,
|
|
213
|
+
});
|
|
214
|
+
const result = runNumericProofPass([module]);
|
|
215
|
+
expect(result.ok).to.be.false;
|
|
216
|
+
expect(result.diagnostics[0]?.code).to.equal("TSN5107");
|
|
217
|
+
});
|
|
218
|
+
it("integer literal (0) passes and gets marker", () => {
|
|
219
|
+
const module = createModuleWithAccess({
|
|
220
|
+
accessKind: "clrIndexer",
|
|
221
|
+
indexHasProof: false,
|
|
222
|
+
indexValue: 0,
|
|
223
|
+
indexRaw: "0",
|
|
224
|
+
});
|
|
225
|
+
const result = runNumericProofPass([module]);
|
|
226
|
+
expect(result.ok).to.be.true;
|
|
227
|
+
expect(result.diagnostics).to.have.length(0);
|
|
228
|
+
// Verify marker was set
|
|
229
|
+
const varDecl = result.modules[0]?.body[1];
|
|
230
|
+
if (varDecl?.kind !== "variableDeclaration") {
|
|
231
|
+
throw new Error("Expected variable declaration");
|
|
232
|
+
}
|
|
233
|
+
const access = varDecl.declarations[0]?.initializer;
|
|
234
|
+
const indexExpr = access.property;
|
|
235
|
+
// Index should have primitiveType(name="int") after proof pass
|
|
236
|
+
expect(indexExpr.inferredType?.kind).to.equal("primitiveType");
|
|
237
|
+
if (indexExpr.inferredType?.kind === "primitiveType") {
|
|
238
|
+
expect(indexExpr.inferredType.name).to.equal("int");
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
it("proven identifier passes", () => {
|
|
242
|
+
const module = createModuleWithIdentifierIndex({
|
|
243
|
+
accessKind: "clrIndexer",
|
|
244
|
+
indexName: "i",
|
|
245
|
+
indexHasInt32Type: true,
|
|
246
|
+
});
|
|
247
|
+
const result = runNumericProofPass([module]);
|
|
248
|
+
expect(result.ok).to.be.true;
|
|
249
|
+
});
|
|
250
|
+
});
|
|
251
|
+
describe("jsRuntimeArray access (requires Int32 proof)", () => {
|
|
252
|
+
it("double literal (1.5) triggers TSN5107", () => {
|
|
253
|
+
const module = createModuleWithAccess({
|
|
254
|
+
accessKind: "jsRuntimeArray",
|
|
255
|
+
indexHasProof: false,
|
|
256
|
+
indexValue: 1.5,
|
|
257
|
+
indexRaw: "1.5",
|
|
258
|
+
});
|
|
259
|
+
const result = runNumericProofPass([module]);
|
|
260
|
+
expect(result.ok).to.be.false;
|
|
261
|
+
expect(result.diagnostics[0]?.code).to.equal("TSN5107");
|
|
262
|
+
});
|
|
263
|
+
it("unproven identifier triggers TSN5107", () => {
|
|
264
|
+
const module = createModuleWithIdentifierIndex({
|
|
265
|
+
accessKind: "jsRuntimeArray",
|
|
266
|
+
indexName: "idx",
|
|
267
|
+
indexHasInt32Type: false,
|
|
268
|
+
});
|
|
269
|
+
const result = runNumericProofPass([module]);
|
|
270
|
+
expect(result.ok).to.be.false;
|
|
271
|
+
expect(result.diagnostics[0]?.code).to.equal("TSN5107");
|
|
272
|
+
});
|
|
273
|
+
it("integer literal (1) passes and gets marker", () => {
|
|
274
|
+
const module = createModuleWithAccess({
|
|
275
|
+
accessKind: "jsRuntimeArray",
|
|
276
|
+
indexHasProof: false,
|
|
277
|
+
indexValue: 1,
|
|
278
|
+
indexRaw: "1",
|
|
279
|
+
});
|
|
280
|
+
const result = runNumericProofPass([module]);
|
|
281
|
+
expect(result.ok).to.be.true;
|
|
282
|
+
});
|
|
283
|
+
});
|
|
284
|
+
describe("stringChar access (requires Int32 proof)", () => {
|
|
285
|
+
it("double literal (1.5) triggers TSN5107", () => {
|
|
286
|
+
const module = createModuleWithAccess({
|
|
287
|
+
accessKind: "stringChar",
|
|
288
|
+
indexHasProof: false,
|
|
289
|
+
indexValue: 1.5,
|
|
290
|
+
indexRaw: "1.5",
|
|
291
|
+
});
|
|
292
|
+
const result = runNumericProofPass([module]);
|
|
293
|
+
expect(result.ok).to.be.false;
|
|
294
|
+
expect(result.diagnostics[0]?.code).to.equal("TSN5107");
|
|
295
|
+
});
|
|
296
|
+
it("unproven identifier triggers TSN5107", () => {
|
|
297
|
+
const module = createModuleWithIdentifierIndex({
|
|
298
|
+
accessKind: "stringChar",
|
|
299
|
+
indexName: "charIdx",
|
|
300
|
+
indexHasInt32Type: false,
|
|
301
|
+
});
|
|
302
|
+
const result = runNumericProofPass([module]);
|
|
303
|
+
expect(result.ok).to.be.false;
|
|
304
|
+
expect(result.diagnostics[0]?.code).to.equal("TSN5107");
|
|
305
|
+
});
|
|
306
|
+
it("integer literal (0) passes and gets marker", () => {
|
|
307
|
+
const module = createModuleWithAccess({
|
|
308
|
+
accessKind: "stringChar",
|
|
309
|
+
indexHasProof: false,
|
|
310
|
+
indexValue: 0,
|
|
311
|
+
indexRaw: "0",
|
|
312
|
+
});
|
|
313
|
+
const result = runNumericProofPass([module]);
|
|
314
|
+
expect(result.ok).to.be.true;
|
|
315
|
+
});
|
|
316
|
+
});
|
|
317
|
+
// ============================================================================
|
|
318
|
+
// ACCESS KIND THAT DOES NOT REQUIRE Int32 PROOF: dictionary
|
|
319
|
+
// ============================================================================
|
|
320
|
+
describe("dictionary access (does NOT require Int32 proof)", () => {
|
|
321
|
+
it("double literal passes (no TSN5107)", () => {
|
|
322
|
+
const module = createModuleWithAccess({
|
|
323
|
+
accessKind: "dictionary",
|
|
324
|
+
indexHasProof: false,
|
|
325
|
+
indexValue: 1.5,
|
|
326
|
+
indexRaw: "1.5",
|
|
327
|
+
});
|
|
328
|
+
const result = runNumericProofPass([module]);
|
|
329
|
+
expect(result.ok).to.be.true;
|
|
330
|
+
expect(result.diagnostics.filter((d) => d.code === "TSN5107")).to.have.length(0);
|
|
331
|
+
});
|
|
332
|
+
it("unproven identifier passes (no TSN5107)", () => {
|
|
333
|
+
const module = createModuleWithIdentifierIndex({
|
|
334
|
+
accessKind: "dictionary",
|
|
335
|
+
indexName: "key",
|
|
336
|
+
indexHasInt32Type: false,
|
|
337
|
+
});
|
|
338
|
+
const result = runNumericProofPass([module]);
|
|
339
|
+
expect(result.ok).to.be.true;
|
|
340
|
+
});
|
|
341
|
+
it("integer literal passes (no TSN5107)", () => {
|
|
342
|
+
const module = createModuleWithAccess({
|
|
343
|
+
accessKind: "dictionary",
|
|
344
|
+
indexHasProof: false,
|
|
345
|
+
indexValue: 0,
|
|
346
|
+
indexRaw: "0",
|
|
347
|
+
});
|
|
348
|
+
const result = runNumericProofPass([module]);
|
|
349
|
+
expect(result.ok).to.be.true;
|
|
350
|
+
});
|
|
351
|
+
});
|
|
352
|
+
// ============================================================================
|
|
353
|
+
// UNKNOWN / MISSING ACCESS KIND: TSN5109 (compiler bug)
|
|
354
|
+
// ============================================================================
|
|
355
|
+
describe("unknown/missing accessKind (TSN5109)", () => {
|
|
356
|
+
it("accessKind='unknown' triggers TSN5109 with debug info", () => {
|
|
357
|
+
const module = createModuleWithAccess({
|
|
358
|
+
accessKind: "unknown",
|
|
359
|
+
indexHasProof: false,
|
|
360
|
+
indexValue: 0,
|
|
361
|
+
indexRaw: "0",
|
|
362
|
+
});
|
|
363
|
+
const result = runNumericProofPass([module]);
|
|
364
|
+
expect(result.ok).to.be.false;
|
|
365
|
+
expect(result.diagnostics[0]?.code).to.equal("TSN5109");
|
|
366
|
+
// Verify message includes debug info for diagnosis
|
|
367
|
+
expect(result.diagnostics[0]?.message).to.include("Computed access kind was not classified");
|
|
368
|
+
expect(result.diagnostics[0]?.message).to.include("accessKind=unknown");
|
|
369
|
+
expect(result.diagnostics[0]?.message).to.include("objectType.kind=");
|
|
370
|
+
});
|
|
371
|
+
it("missing accessKind (undefined) triggers TSN5109 with debug info", () => {
|
|
372
|
+
// accessKind is not set at all
|
|
373
|
+
const module = createModuleWithAccess({
|
|
374
|
+
accessKind: undefined,
|
|
375
|
+
indexHasProof: false,
|
|
376
|
+
indexValue: 0,
|
|
377
|
+
indexRaw: "0",
|
|
378
|
+
});
|
|
379
|
+
const result = runNumericProofPass([module]);
|
|
380
|
+
expect(result.ok).to.be.false;
|
|
381
|
+
expect(result.diagnostics[0]?.code).to.equal("TSN5109");
|
|
382
|
+
// Verify message includes "undefined" for missing accessKind
|
|
383
|
+
expect(result.diagnostics[0]?.message).to.include("accessKind=undefined");
|
|
384
|
+
});
|
|
385
|
+
it("REGRESSION: referenceType without resolvedClrType defaults to clrIndexer (safe)", () => {
|
|
386
|
+
// This test guards against unsafe dictionary misclassification.
|
|
387
|
+
// If a referenceType lacks resolvedClrType, classification defaults to clrIndexer
|
|
388
|
+
// (not "unknown") which is SAFE: it requires Int32 proof for the index.
|
|
389
|
+
// This is the conservative safe behavior - Dictionary would fail at compile time
|
|
390
|
+
// if accessed with a non-Int32 key, which is better than runtime unsoundness.
|
|
391
|
+
const indexExpr = {
|
|
392
|
+
kind: "literal",
|
|
393
|
+
value: 0,
|
|
394
|
+
raw: "0", // Valid integer literal - should pass Int32 check
|
|
395
|
+
};
|
|
396
|
+
const memberAccess = {
|
|
397
|
+
kind: "memberAccess",
|
|
398
|
+
object: {
|
|
399
|
+
kind: "identifier",
|
|
400
|
+
name: "list",
|
|
401
|
+
// referenceType WITHOUT resolvedClrType (e.g., tsbindgen type)
|
|
402
|
+
inferredType: {
|
|
403
|
+
kind: "referenceType",
|
|
404
|
+
name: "List",
|
|
405
|
+
// resolvedClrType is MISSING - defaults to clrIndexer (safe)
|
|
406
|
+
},
|
|
407
|
+
},
|
|
408
|
+
property: indexExpr,
|
|
409
|
+
isComputed: true,
|
|
410
|
+
isOptional: false,
|
|
411
|
+
// accessKind is clrIndexer because classifyComputedAccess defaults to it
|
|
412
|
+
// when resolvedClrType is missing on a referenceType
|
|
413
|
+
accessKind: "clrIndexer",
|
|
414
|
+
inferredType: { kind: "primitiveType", name: "number" },
|
|
415
|
+
};
|
|
416
|
+
const module = {
|
|
417
|
+
kind: "module",
|
|
418
|
+
filePath: "/test/list-regression.ts",
|
|
419
|
+
namespace: "Test",
|
|
420
|
+
className: "listRegression",
|
|
421
|
+
isStaticContainer: true,
|
|
422
|
+
imports: [],
|
|
423
|
+
body: [
|
|
424
|
+
{
|
|
425
|
+
kind: "variableDeclaration",
|
|
426
|
+
declarationKind: "const",
|
|
427
|
+
isExported: false,
|
|
428
|
+
declarations: [
|
|
429
|
+
{
|
|
430
|
+
kind: "variableDeclarator",
|
|
431
|
+
name: { kind: "identifierPattern", name: "x" },
|
|
432
|
+
initializer: memberAccess,
|
|
433
|
+
},
|
|
434
|
+
],
|
|
435
|
+
},
|
|
436
|
+
],
|
|
437
|
+
exports: [],
|
|
438
|
+
};
|
|
439
|
+
const result = runNumericProofPass([module]);
|
|
440
|
+
// Should PASS because:
|
|
441
|
+
// 1. accessKind is clrIndexer (default for referenceType without resolvedClrType)
|
|
442
|
+
// 2. index is literal 0, which is valid Int32
|
|
443
|
+
expect(result.ok).to.be.true;
|
|
444
|
+
// Verify the index got annotated with int type
|
|
445
|
+
const varDecl = result.modules[0]?.body[0];
|
|
446
|
+
if (varDecl?.kind !== "variableDeclaration") {
|
|
447
|
+
throw new Error("Expected variable declaration");
|
|
448
|
+
}
|
|
449
|
+
const access = varDecl.declarations[0]?.initializer;
|
|
450
|
+
const processedIndex = access.property;
|
|
451
|
+
// Index should have primitiveType(name="int") after proof pass
|
|
452
|
+
expect(processedIndex.inferredType?.kind).to.equal("primitiveType");
|
|
453
|
+
if (processedIndex.inferredType?.kind === "primitiveType") {
|
|
454
|
+
expect(processedIndex.inferredType.name).to.equal("int");
|
|
455
|
+
}
|
|
456
|
+
});
|
|
457
|
+
});
|
|
458
|
+
// ============================================================================
|
|
459
|
+
// EMITTER CONTRACT: ICE when proof marker missing
|
|
460
|
+
// ============================================================================
|
|
461
|
+
describe("Emitter contract enforcement", () => {
|
|
462
|
+
it("emits without ICE when proof marker present", () => {
|
|
463
|
+
const module = createModuleWithAccess({
|
|
464
|
+
accessKind: "clrIndexer",
|
|
465
|
+
indexHasProof: true, // Pre-annotated with Int32 proof
|
|
466
|
+
indexValue: 0,
|
|
467
|
+
indexRaw: "0",
|
|
468
|
+
});
|
|
469
|
+
// Should not throw - proof marker is present
|
|
470
|
+
expect(() => emitModule(module, { runtime: "dotnet" })).to.not.throw();
|
|
471
|
+
});
|
|
472
|
+
it("ICE when proof marker missing - even for literal 0", () => {
|
|
473
|
+
// REGRESSION GUARD: This test ensures nobody "helpfully" re-adds
|
|
474
|
+
// literal parsing to the emitter. Even literal 0 must have the proof
|
|
475
|
+
// marker set by the proof pass, or the emitter ICEs.
|
|
476
|
+
const module = createModuleWithAccess({
|
|
477
|
+
accessKind: "clrIndexer",
|
|
478
|
+
indexHasProof: false, // NO proof marker
|
|
479
|
+
indexValue: 0, // Even though it's 0
|
|
480
|
+
indexRaw: "0",
|
|
481
|
+
});
|
|
482
|
+
// Emitter should ICE because proof marker is missing
|
|
483
|
+
expect(() => emitModule(module, { runtime: "dotnet" })).to.throw(/Internal Compiler Error.*Int32 proof/);
|
|
484
|
+
});
|
|
485
|
+
it("ICE when proof marker missing - even for literal 1", () => {
|
|
486
|
+
// REGRESSION GUARD: Same as above for literal 1
|
|
487
|
+
const module = createModuleWithAccess({
|
|
488
|
+
accessKind: "clrIndexer",
|
|
489
|
+
indexHasProof: false,
|
|
490
|
+
indexValue: 1,
|
|
491
|
+
indexRaw: "1",
|
|
492
|
+
});
|
|
493
|
+
expect(() => emitModule(module, { runtime: "dotnet" })).to.throw(/Internal Compiler Error.*Int32 proof/);
|
|
494
|
+
});
|
|
495
|
+
});
|
|
496
|
+
// ============================================================================
|
|
497
|
+
// PROOF PASS ANNOTATION: Markers set correctly for all access kinds
|
|
498
|
+
// ============================================================================
|
|
499
|
+
describe("Proof pass annotation", () => {
|
|
500
|
+
it("clrIndexer: valid index gets primitiveType(name='int')", () => {
|
|
501
|
+
const module = createModuleWithAccess({
|
|
502
|
+
accessKind: "clrIndexer",
|
|
503
|
+
indexHasProof: false,
|
|
504
|
+
indexValue: 0,
|
|
505
|
+
indexRaw: "0",
|
|
506
|
+
});
|
|
507
|
+
const result = runNumericProofPass([module]);
|
|
508
|
+
expect(result.ok).to.be.true;
|
|
509
|
+
const varDecl = result.modules[0]?.body[1];
|
|
510
|
+
if (varDecl?.kind !== "variableDeclaration") {
|
|
511
|
+
throw new Error("Expected variable declaration");
|
|
512
|
+
}
|
|
513
|
+
const access = varDecl.declarations[0]?.initializer;
|
|
514
|
+
const indexExpr = access.property;
|
|
515
|
+
// Index should have primitiveType(name="int") after proof pass
|
|
516
|
+
expect(indexExpr.inferredType?.kind).to.equal("primitiveType");
|
|
517
|
+
if (indexExpr.inferredType?.kind === "primitiveType") {
|
|
518
|
+
expect(indexExpr.inferredType.name).to.equal("int");
|
|
519
|
+
}
|
|
520
|
+
});
|
|
521
|
+
it("jsRuntimeArray: valid index gets primitiveType(name='int')", () => {
|
|
522
|
+
const module = createModuleWithAccess({
|
|
523
|
+
accessKind: "jsRuntimeArray",
|
|
524
|
+
indexHasProof: false,
|
|
525
|
+
indexValue: 5,
|
|
526
|
+
indexRaw: "5",
|
|
527
|
+
});
|
|
528
|
+
const result = runNumericProofPass([module]);
|
|
529
|
+
expect(result.ok).to.be.true;
|
|
530
|
+
const varDecl = result.modules[0]?.body[1];
|
|
531
|
+
if (varDecl?.kind !== "variableDeclaration") {
|
|
532
|
+
throw new Error("Expected variable declaration");
|
|
533
|
+
}
|
|
534
|
+
const access = varDecl.declarations[0]?.initializer;
|
|
535
|
+
const indexExpr = access.property;
|
|
536
|
+
// Index should have primitiveType(name="int") after proof pass
|
|
537
|
+
expect(indexExpr.inferredType?.kind).to.equal("primitiveType");
|
|
538
|
+
if (indexExpr.inferredType?.kind === "primitiveType") {
|
|
539
|
+
expect(indexExpr.inferredType.name).to.equal("int");
|
|
540
|
+
}
|
|
541
|
+
});
|
|
542
|
+
it("stringChar: valid index gets primitiveType(name='int')", () => {
|
|
543
|
+
const module = createModuleWithAccess({
|
|
544
|
+
accessKind: "stringChar",
|
|
545
|
+
indexHasProof: false,
|
|
546
|
+
indexValue: 2,
|
|
547
|
+
indexRaw: "2",
|
|
548
|
+
});
|
|
549
|
+
const result = runNumericProofPass([module]);
|
|
550
|
+
expect(result.ok).to.be.true;
|
|
551
|
+
const varDecl = result.modules[0]?.body[1];
|
|
552
|
+
if (varDecl?.kind !== "variableDeclaration") {
|
|
553
|
+
throw new Error("Expected variable declaration");
|
|
554
|
+
}
|
|
555
|
+
const access = varDecl.declarations[0]?.initializer;
|
|
556
|
+
const indexExpr = access.property;
|
|
557
|
+
// Index should have primitiveType(name="int") after proof pass
|
|
558
|
+
expect(indexExpr.inferredType?.kind).to.equal("primitiveType");
|
|
559
|
+
if (indexExpr.inferredType?.kind === "primitiveType") {
|
|
560
|
+
expect(indexExpr.inferredType.name).to.equal("int");
|
|
561
|
+
}
|
|
562
|
+
});
|
|
563
|
+
});
|
|
564
|
+
});
|
|
565
|
+
//# sourceMappingURL=numeric-proof-contract.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"numeric-proof-contract.test.js","sourceRoot":"","sources":["../../src/invariants/numeric-proof-contract.test.ts"],"names":[],"mappings":"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"}
|