c-next 0.1.65 → 0.1.67
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/package.json +5 -1
- package/src/transpiler/Transpiler.ts +49 -42
- package/src/transpiler/logic/symbols/cnext/__tests__/TSymbolAdapter.test.ts +129 -0
- package/src/transpiler/logic/symbols/cnext/adapters/TSymbolAdapter.ts +27 -3
- package/src/transpiler/output/codegen/CodeGenerator.ts +131 -186
- package/src/transpiler/output/codegen/TypeResolver.ts +2 -2
- package/src/transpiler/output/codegen/TypeValidator.ts +1 -1
- package/src/transpiler/output/codegen/__tests__/CodeGenerator.coverage.test.ts +1087 -0
- package/src/transpiler/output/codegen/__tests__/CodeGenerator.test.ts +665 -1315
- package/src/transpiler/output/codegen/__tests__/TypeResolver.test.ts +1 -1
- package/src/transpiler/output/codegen/__tests__/TypeValidator.resolution.test.ts +1 -1
- package/src/transpiler/output/codegen/__tests__/TypeValidator.test.ts +1 -1
- package/src/transpiler/output/codegen/analysis/MemberChainAnalyzer.ts +1 -1
- package/src/transpiler/output/codegen/analysis/StringLengthCounter.ts +1 -1
- package/src/transpiler/output/codegen/analysis/__tests__/MemberChainAnalyzer.test.ts +1 -1
- package/src/transpiler/output/codegen/analysis/__tests__/StringLengthCounter.test.ts +1 -1
- package/src/transpiler/output/codegen/assignment/AssignmentClassifier.ts +1 -1
- package/src/transpiler/output/codegen/assignment/__tests__/AssignmentClassifier.test.ts +1 -1
- package/src/transpiler/output/codegen/assignment/handlers/AccessPatternHandlers.ts +24 -27
- package/src/transpiler/output/codegen/assignment/handlers/ArrayHandlers.ts +25 -18
- package/src/transpiler/output/codegen/assignment/handlers/BitAccessHandlers.ts +27 -33
- package/src/transpiler/output/codegen/assignment/handlers/BitmapHandlers.ts +39 -42
- package/src/transpiler/output/codegen/assignment/handlers/RegisterHandlers.ts +39 -97
- package/src/transpiler/output/codegen/assignment/handlers/RegisterUtils.ts +75 -0
- package/src/transpiler/output/codegen/assignment/handlers/SimpleHandler.ts +9 -6
- package/src/transpiler/output/codegen/assignment/handlers/SpecialHandlers.ts +30 -22
- package/src/transpiler/output/codegen/assignment/handlers/StringHandlers.ts +42 -50
- package/src/transpiler/output/codegen/assignment/handlers/TAssignmentHandler.ts +6 -5
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/AccessPatternHandlers.test.ts +81 -134
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/ArrayHandlers.test.ts +85 -124
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/BitAccessHandlers.test.ts +82 -124
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/BitmapHandlers.test.ts +135 -297
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/RegisterHandlers.test.ts +105 -227
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/RegisterUtils.test.ts +214 -1
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/SpecialHandlers.test.ts +66 -127
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/StringHandlers.test.ts +37 -83
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/handlerTestUtils.ts +162 -0
- package/src/transpiler/output/codegen/generators/expressions/PostfixExpressionGenerator.ts +618 -12
- package/src/transpiler/output/codegen/generators/expressions/__tests__/PostfixExpressionGenerator.test.ts +819 -0
- package/src/transpiler/output/codegen/helpers/ArrayInitHelper.ts +1 -1
- package/src/transpiler/output/codegen/helpers/AssignmentExpectedTypeResolver.ts +1 -1
- package/src/transpiler/output/codegen/helpers/AssignmentValidator.ts +1 -1
- package/src/transpiler/output/codegen/helpers/CppModeHelper.ts +1 -1
- package/src/transpiler/output/codegen/helpers/EnumAssignmentValidator.ts +1 -1
- package/src/transpiler/output/codegen/helpers/FloatBitHelper.ts +1 -1
- package/src/transpiler/output/codegen/helpers/ParameterInputAdapter.ts +337 -0
- package/src/transpiler/output/codegen/helpers/ParameterSignatureBuilder.ts +135 -0
- package/src/transpiler/output/codegen/helpers/StringDeclHelper.ts +1 -1
- package/src/transpiler/output/codegen/helpers/VariableDeclarationFormatter.ts +118 -0
- package/src/transpiler/output/codegen/helpers/__tests__/ArrayInitHelper.test.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/AssignmentExpectedTypeResolver.test.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/AssignmentValidator.test.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/CppModeHelper.test.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/EnumAssignmentValidator.test.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/FloatBitHelper.test.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/ParameterInputAdapter.test.ts +426 -0
- package/src/transpiler/output/codegen/helpers/__tests__/ParameterSignatureBuilder.test.ts +315 -0
- package/src/transpiler/output/codegen/helpers/__tests__/StringDeclHelper.test.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/VariableDeclarationFormatter.test.ts +333 -0
- package/src/transpiler/output/codegen/resolution/EnumTypeResolver.ts +1 -1
- package/src/transpiler/output/codegen/resolution/ScopeResolver.ts +1 -1
- package/src/transpiler/output/codegen/resolution/SizeofResolver.ts +1 -1
- package/src/transpiler/output/codegen/resolution/__tests__/EnumTypeResolver.test.ts +1 -1
- package/src/transpiler/output/codegen/resolution/__tests__/SizeofResolver.test.ts +1 -1
- package/src/transpiler/output/codegen/types/ICodeGenApi.ts +57 -0
- package/src/transpiler/output/codegen/types/IParameterInput.ts +58 -0
- package/src/transpiler/output/codegen/types/IVariableFormatInput.ts +51 -0
- package/src/transpiler/output/headers/BaseHeaderGenerator.ts +20 -35
- package/src/transpiler/output/headers/HeaderGeneratorUtils.ts +21 -48
- package/src/transpiler/output/headers/__tests__/HeaderGeneratorUtils.test.ts +0 -64
- package/src/transpiler/{output/codegen → state}/CodeGenState.ts +46 -26
- package/src/transpiler/{output/codegen → state}/__tests__/CodeGenState.test.ts +12 -2
- package/src/transpiler/output/codegen/assignment/handlers/IHandlerDeps.ts +0 -161
package/src/transpiler/output/codegen/assignment/handlers/__tests__/BitAccessHandlers.test.ts
CHANGED
|
@@ -3,53 +3,12 @@
|
|
|
3
3
|
* Tests integer bit access assignment handler functions.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { describe, expect, it, vi } from "vitest";
|
|
6
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
7
7
|
import bitAccessHandlers from "../BitAccessHandlers";
|
|
8
8
|
import AssignmentKind from "../../AssignmentKind";
|
|
9
9
|
import IAssignmentContext from "../../IAssignmentContext";
|
|
10
|
-
import
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Create mock dependencies for testing.
|
|
14
|
-
*/
|
|
15
|
-
function createMockDeps(overrides: Record<string, unknown> = {}): IHandlerDeps {
|
|
16
|
-
const base = {
|
|
17
|
-
typeRegistry: new Map(),
|
|
18
|
-
symbols: {
|
|
19
|
-
structFields: new Map(),
|
|
20
|
-
structFieldDimensions: new Map(),
|
|
21
|
-
bitmapFields: new Map(),
|
|
22
|
-
registerMemberAccess: new Map(),
|
|
23
|
-
registerBaseAddresses: new Map(),
|
|
24
|
-
registerMemberOffsets: new Map(),
|
|
25
|
-
registerMemberTypes: new Map(),
|
|
26
|
-
},
|
|
27
|
-
currentScope: null,
|
|
28
|
-
currentParameters: new Map(),
|
|
29
|
-
targetCapabilities: { hasLDREX: false },
|
|
30
|
-
generateAssignmentTarget: vi.fn().mockReturnValue("target"),
|
|
31
|
-
generateExpression: vi
|
|
32
|
-
.fn()
|
|
33
|
-
.mockImplementation((ctx) => ctx?.mockValue ?? "0"),
|
|
34
|
-
markNeedsString: vi.fn(),
|
|
35
|
-
markClampOpUsed: vi.fn(),
|
|
36
|
-
isKnownScope: vi.fn().mockReturnValue(false),
|
|
37
|
-
isKnownStruct: vi.fn().mockReturnValue(false),
|
|
38
|
-
validateCrossScopeVisibility: vi.fn(),
|
|
39
|
-
validateBitmapFieldLiteral: vi.fn(),
|
|
40
|
-
checkArrayBounds: vi.fn(),
|
|
41
|
-
analyzeMemberChainForBitAccess: vi
|
|
42
|
-
.fn()
|
|
43
|
-
.mockReturnValue({ isBitAccess: false }),
|
|
44
|
-
tryEvaluateConstant: vi.fn().mockReturnValue(undefined),
|
|
45
|
-
getMemberTypeInfo: vi.fn().mockReturnValue(null),
|
|
46
|
-
generateFloatBitWrite: vi.fn().mockReturnValue(null),
|
|
47
|
-
foldBooleanToInt: vi.fn().mockImplementation((expr) => expr),
|
|
48
|
-
generateAtomicRMW: vi.fn().mockReturnValue("atomic_rmw"),
|
|
49
|
-
...overrides,
|
|
50
|
-
};
|
|
51
|
-
return base as unknown as IHandlerDeps;
|
|
52
|
-
}
|
|
10
|
+
import CodeGenState from "../../../../../state/CodeGenState";
|
|
11
|
+
import HandlerTestUtils from "./handlerTestUtils";
|
|
53
12
|
|
|
54
13
|
/**
|
|
55
14
|
* Create mock context for testing.
|
|
@@ -80,6 +39,12 @@ function createMockContext(
|
|
|
80
39
|
}
|
|
81
40
|
|
|
82
41
|
describe("BitAccessHandlers", () => {
|
|
42
|
+
beforeEach(() => {
|
|
43
|
+
CodeGenState.reset();
|
|
44
|
+
HandlerTestUtils.setupMockGenerator();
|
|
45
|
+
HandlerTestUtils.setupMockSymbols();
|
|
46
|
+
});
|
|
47
|
+
|
|
83
48
|
describe("handler registration", () => {
|
|
84
49
|
it("registers all expected bit access kinds", () => {
|
|
85
50
|
const kinds = bitAccessHandlers.map(([kind]) => kind);
|
|
@@ -103,14 +68,15 @@ describe("BitAccessHandlers", () => {
|
|
|
103
68
|
)?.[1];
|
|
104
69
|
|
|
105
70
|
it("generates single bit read-modify-write", () => {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
71
|
+
CodeGenState.typeRegistry = new Map([
|
|
72
|
+
["flags", { baseType: "u32" }],
|
|
73
|
+
]) as any;
|
|
74
|
+
HandlerTestUtils.setupMockGenerator({
|
|
109
75
|
generateExpression: vi.fn().mockReturnValue("3"),
|
|
110
76
|
});
|
|
111
77
|
const ctx = createMockContext();
|
|
112
78
|
|
|
113
|
-
const result = getHandler()!(ctx
|
|
79
|
+
const result = getHandler()!(ctx);
|
|
114
80
|
|
|
115
81
|
expect(result).toContain("flags =");
|
|
116
82
|
expect(result).toContain("& ~(1 << 3)");
|
|
@@ -118,71 +84,74 @@ describe("BitAccessHandlers", () => {
|
|
|
118
84
|
});
|
|
119
85
|
|
|
120
86
|
it("uses 1ULL for 64-bit types", () => {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
87
|
+
CodeGenState.typeRegistry = new Map([
|
|
88
|
+
["flags", { baseType: "u64" }],
|
|
89
|
+
]) as any;
|
|
90
|
+
HandlerTestUtils.setupMockGenerator({
|
|
124
91
|
generateExpression: vi.fn().mockReturnValue("32"),
|
|
125
92
|
});
|
|
126
93
|
const ctx = createMockContext({
|
|
127
94
|
subscripts: [{ mockValue: "32" } as never],
|
|
128
95
|
});
|
|
129
96
|
|
|
130
|
-
const result = getHandler()!(ctx
|
|
97
|
+
const result = getHandler()!(ctx);
|
|
131
98
|
|
|
132
99
|
expect(result).toContain("1ULL << 32");
|
|
133
100
|
});
|
|
134
101
|
|
|
135
102
|
it("uses 1ULL for signed 64-bit types", () => {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
103
|
+
CodeGenState.typeRegistry = new Map([
|
|
104
|
+
["flags", { baseType: "i64" }],
|
|
105
|
+
]) as any;
|
|
106
|
+
HandlerTestUtils.setupMockGenerator({
|
|
139
107
|
generateExpression: vi.fn().mockReturnValue("bit"),
|
|
140
108
|
});
|
|
141
109
|
const ctx = createMockContext();
|
|
142
110
|
|
|
143
|
-
const result = getHandler()!(ctx
|
|
111
|
+
const result = getHandler()!(ctx);
|
|
144
112
|
|
|
145
113
|
// i64 uses 1ULL for the mask and cast for the value
|
|
146
114
|
expect(result).toContain("1ULL << bit");
|
|
147
115
|
});
|
|
148
116
|
|
|
149
117
|
it("converts true to 1", () => {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
118
|
+
CodeGenState.typeRegistry = new Map([
|
|
119
|
+
["flags", { baseType: "u8" }],
|
|
120
|
+
]) as any;
|
|
121
|
+
HandlerTestUtils.setupMockGenerator({
|
|
153
122
|
generateExpression: vi.fn().mockReturnValue("0"),
|
|
154
123
|
});
|
|
155
124
|
const ctx = createMockContext({
|
|
156
125
|
generatedValue: "true",
|
|
157
126
|
});
|
|
158
127
|
|
|
159
|
-
const result = getHandler()!(ctx
|
|
128
|
+
const result = getHandler()!(ctx);
|
|
160
129
|
|
|
161
130
|
expect(result).toContain("| (1 << 0)");
|
|
162
131
|
});
|
|
163
132
|
|
|
164
133
|
it("converts false to 0", () => {
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
134
|
+
CodeGenState.typeRegistry = new Map([
|
|
135
|
+
["flags", { baseType: "u8" }],
|
|
136
|
+
]) as any;
|
|
137
|
+
HandlerTestUtils.setupMockGenerator({
|
|
168
138
|
generateExpression: vi.fn().mockReturnValue("0"),
|
|
169
139
|
});
|
|
170
140
|
const ctx = createMockContext({
|
|
171
141
|
generatedValue: "false",
|
|
172
142
|
});
|
|
173
143
|
|
|
174
|
-
const result = getHandler()!(ctx
|
|
144
|
+
const result = getHandler()!(ctx);
|
|
175
145
|
|
|
176
146
|
expect(result).toContain("| (0 << 0)");
|
|
177
147
|
});
|
|
178
148
|
|
|
179
149
|
it("delegates to float bit write for float types", () => {
|
|
180
|
-
|
|
150
|
+
CodeGenState.typeRegistry = new Map([["f", { baseType: "f32" }]]) as any;
|
|
181
151
|
const generateFloatBitWrite = vi
|
|
182
152
|
.fn()
|
|
183
153
|
.mockReturnValue("float_bit_write_result");
|
|
184
|
-
|
|
185
|
-
typeRegistry,
|
|
154
|
+
HandlerTestUtils.setupMockGenerator({
|
|
186
155
|
generateFloatBitWrite,
|
|
187
156
|
generateExpression: vi.fn().mockReturnValue("3"),
|
|
188
157
|
});
|
|
@@ -190,20 +159,19 @@ describe("BitAccessHandlers", () => {
|
|
|
190
159
|
identifiers: ["f"],
|
|
191
160
|
});
|
|
192
161
|
|
|
193
|
-
const result = getHandler()!(ctx
|
|
162
|
+
const result = getHandler()!(ctx);
|
|
194
163
|
|
|
195
164
|
expect(generateFloatBitWrite).toHaveBeenCalled();
|
|
196
165
|
expect(result).toBe("float_bit_write_result");
|
|
197
166
|
});
|
|
198
167
|
|
|
199
168
|
it("throws on compound assignment", () => {
|
|
200
|
-
const deps = createMockDeps();
|
|
201
169
|
const ctx = createMockContext({
|
|
202
170
|
isCompound: true,
|
|
203
171
|
cnextOp: "+<-",
|
|
204
172
|
});
|
|
205
173
|
|
|
206
|
-
expect(() => getHandler()!(ctx
|
|
174
|
+
expect(() => getHandler()!(ctx)).toThrow(
|
|
207
175
|
"Compound assignment operators not supported for bit field access",
|
|
208
176
|
);
|
|
209
177
|
});
|
|
@@ -216,9 +184,10 @@ describe("BitAccessHandlers", () => {
|
|
|
216
184
|
)?.[1];
|
|
217
185
|
|
|
218
186
|
it("generates bit range read-modify-write", () => {
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
187
|
+
CodeGenState.typeRegistry = new Map([
|
|
188
|
+
["flags", { baseType: "u32" }],
|
|
189
|
+
]) as any;
|
|
190
|
+
HandlerTestUtils.setupMockGenerator({
|
|
222
191
|
generateExpression: vi
|
|
223
192
|
.fn()
|
|
224
193
|
.mockReturnValueOnce("0")
|
|
@@ -229,7 +198,7 @@ describe("BitAccessHandlers", () => {
|
|
|
229
198
|
generatedValue: "5",
|
|
230
199
|
});
|
|
231
200
|
|
|
232
|
-
const result = getHandler()!(ctx
|
|
201
|
+
const result = getHandler()!(ctx);
|
|
233
202
|
|
|
234
203
|
expect(result).toContain("flags =");
|
|
235
204
|
expect(result).toContain("& ~(");
|
|
@@ -237,9 +206,10 @@ describe("BitAccessHandlers", () => {
|
|
|
237
206
|
});
|
|
238
207
|
|
|
239
208
|
it("uses correct mask for bit range", () => {
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
209
|
+
CodeGenState.typeRegistry = new Map([
|
|
210
|
+
["data", { baseType: "u16" }],
|
|
211
|
+
]) as any;
|
|
212
|
+
HandlerTestUtils.setupMockGenerator({
|
|
243
213
|
generateExpression: vi
|
|
244
214
|
.fn()
|
|
245
215
|
.mockReturnValueOnce("4")
|
|
@@ -251,7 +221,7 @@ describe("BitAccessHandlers", () => {
|
|
|
251
221
|
generatedValue: "value",
|
|
252
222
|
});
|
|
253
223
|
|
|
254
|
-
const result = getHandler()!(ctx
|
|
224
|
+
const result = getHandler()!(ctx);
|
|
255
225
|
|
|
256
226
|
// For constant width, BitUtils generates hex mask
|
|
257
227
|
expect(result).toContain("0xFFU");
|
|
@@ -259,9 +229,10 @@ describe("BitAccessHandlers", () => {
|
|
|
259
229
|
});
|
|
260
230
|
|
|
261
231
|
it("uses ULL suffix for 64-bit bit range mask", () => {
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
232
|
+
CodeGenState.typeRegistry = new Map([
|
|
233
|
+
["flags", { baseType: "u64" }],
|
|
234
|
+
]) as any;
|
|
235
|
+
HandlerTestUtils.setupMockGenerator({
|
|
265
236
|
generateExpression: vi
|
|
266
237
|
.fn()
|
|
267
238
|
.mockReturnValueOnce("32")
|
|
@@ -275,19 +246,18 @@ describe("BitAccessHandlers", () => {
|
|
|
275
246
|
generatedValue: "value",
|
|
276
247
|
});
|
|
277
248
|
|
|
278
|
-
const result = getHandler()!(ctx
|
|
249
|
+
const result = getHandler()!(ctx);
|
|
279
250
|
|
|
280
251
|
// 64-bit type uses ULL suffix on the hex mask
|
|
281
252
|
expect(result).toContain("0xFFFFULL");
|
|
282
253
|
});
|
|
283
254
|
|
|
284
255
|
it("delegates to float bit write for float types", () => {
|
|
285
|
-
|
|
256
|
+
CodeGenState.typeRegistry = new Map([["f", { baseType: "f32" }]]) as any;
|
|
286
257
|
const generateFloatBitWrite = vi
|
|
287
258
|
.fn()
|
|
288
259
|
.mockReturnValue("float_range_write_result");
|
|
289
|
-
|
|
290
|
-
typeRegistry,
|
|
260
|
+
HandlerTestUtils.setupMockGenerator({
|
|
291
261
|
generateFloatBitWrite,
|
|
292
262
|
generateExpression: vi
|
|
293
263
|
.fn()
|
|
@@ -299,7 +269,7 @@ describe("BitAccessHandlers", () => {
|
|
|
299
269
|
subscripts: [{ mockValue: "0" } as never, { mockValue: "8" } as never],
|
|
300
270
|
});
|
|
301
271
|
|
|
302
|
-
const result = getHandler()!(ctx
|
|
272
|
+
const result = getHandler()!(ctx);
|
|
303
273
|
|
|
304
274
|
expect(generateFloatBitWrite).toHaveBeenCalledWith(
|
|
305
275
|
"f",
|
|
@@ -312,14 +282,13 @@ describe("BitAccessHandlers", () => {
|
|
|
312
282
|
});
|
|
313
283
|
|
|
314
284
|
it("throws on compound assignment", () => {
|
|
315
|
-
const deps = createMockDeps();
|
|
316
285
|
const ctx = createMockContext({
|
|
317
286
|
isCompound: true,
|
|
318
287
|
cnextOp: "+<-",
|
|
319
288
|
subscripts: [{ mockValue: "0" } as never, { mockValue: "8" } as never],
|
|
320
289
|
});
|
|
321
290
|
|
|
322
|
-
expect(() => getHandler()!(ctx
|
|
291
|
+
expect(() => getHandler()!(ctx)).toThrow(
|
|
323
292
|
"Compound assignment operators not supported for bit field access",
|
|
324
293
|
);
|
|
325
294
|
});
|
|
@@ -332,7 +301,7 @@ describe("BitAccessHandlers", () => {
|
|
|
332
301
|
)?.[1];
|
|
333
302
|
|
|
334
303
|
it("generates struct member bit assignment", () => {
|
|
335
|
-
|
|
304
|
+
HandlerTestUtils.setupMockGenerator({
|
|
336
305
|
generateAssignmentTarget: vi.fn().mockReturnValue("item.byte"),
|
|
337
306
|
generateExpression: vi.fn().mockReturnValue("7"),
|
|
338
307
|
});
|
|
@@ -341,7 +310,7 @@ describe("BitAccessHandlers", () => {
|
|
|
341
310
|
subscripts: [{ mockValue: "7" } as never],
|
|
342
311
|
});
|
|
343
312
|
|
|
344
|
-
const result = getHandler()!(ctx
|
|
313
|
+
const result = getHandler()!(ctx);
|
|
345
314
|
|
|
346
315
|
expect(result).toContain("item.byte =");
|
|
347
316
|
expect(result).toContain("& ~(1 << 7)");
|
|
@@ -349,13 +318,12 @@ describe("BitAccessHandlers", () => {
|
|
|
349
318
|
});
|
|
350
319
|
|
|
351
320
|
it("throws on compound assignment", () => {
|
|
352
|
-
const deps = createMockDeps();
|
|
353
321
|
const ctx = createMockContext({
|
|
354
322
|
isCompound: true,
|
|
355
323
|
cnextOp: "+<-",
|
|
356
324
|
});
|
|
357
325
|
|
|
358
|
-
expect(() => getHandler()!(ctx
|
|
326
|
+
expect(() => getHandler()!(ctx)).toThrow(
|
|
359
327
|
"Compound assignment operators not supported for bit field access",
|
|
360
328
|
);
|
|
361
329
|
});
|
|
@@ -368,11 +336,10 @@ describe("BitAccessHandlers", () => {
|
|
|
368
336
|
)?.[1];
|
|
369
337
|
|
|
370
338
|
it("generates array element bit assignment for 1D array", () => {
|
|
371
|
-
|
|
339
|
+
CodeGenState.typeRegistry = new Map([
|
|
372
340
|
["arr", { baseType: "u32", arrayDimensions: [10] }],
|
|
373
|
-
]);
|
|
374
|
-
|
|
375
|
-
typeRegistry,
|
|
341
|
+
]) as any;
|
|
342
|
+
HandlerTestUtils.setupMockGenerator({
|
|
376
343
|
generateExpression: vi
|
|
377
344
|
.fn()
|
|
378
345
|
.mockReturnValueOnce("i")
|
|
@@ -386,18 +353,17 @@ describe("BitAccessHandlers", () => {
|
|
|
386
353
|
],
|
|
387
354
|
});
|
|
388
355
|
|
|
389
|
-
const result = getHandler()!(ctx
|
|
356
|
+
const result = getHandler()!(ctx);
|
|
390
357
|
|
|
391
358
|
expect(result).toContain("arr[i] =");
|
|
392
359
|
expect(result).toContain("& ~(1 << BIT)");
|
|
393
360
|
});
|
|
394
361
|
|
|
395
362
|
it("generates array element bit assignment for 2D array", () => {
|
|
396
|
-
|
|
363
|
+
CodeGenState.typeRegistry = new Map([
|
|
397
364
|
["matrix", { baseType: "u16", arrayDimensions: [10, 10] }],
|
|
398
|
-
]);
|
|
399
|
-
|
|
400
|
-
typeRegistry,
|
|
365
|
+
]) as any;
|
|
366
|
+
HandlerTestUtils.setupMockGenerator({
|
|
401
367
|
generateExpression: vi
|
|
402
368
|
.fn()
|
|
403
369
|
.mockReturnValueOnce("i")
|
|
@@ -413,18 +379,17 @@ describe("BitAccessHandlers", () => {
|
|
|
413
379
|
],
|
|
414
380
|
});
|
|
415
381
|
|
|
416
|
-
const result = getHandler()!(ctx
|
|
382
|
+
const result = getHandler()!(ctx);
|
|
417
383
|
|
|
418
384
|
expect(result).toContain("matrix[i][j] =");
|
|
419
385
|
expect(result).toContain("& ~(1 << FIELD_BIT)");
|
|
420
386
|
});
|
|
421
387
|
|
|
422
388
|
it("uses 1ULL for 64-bit array element", () => {
|
|
423
|
-
|
|
389
|
+
CodeGenState.typeRegistry = new Map([
|
|
424
390
|
["arr", { baseType: "u64", arrayDimensions: [5] }],
|
|
425
|
-
]);
|
|
426
|
-
|
|
427
|
-
typeRegistry,
|
|
391
|
+
]) as any;
|
|
392
|
+
HandlerTestUtils.setupMockGenerator({
|
|
428
393
|
generateExpression: vi
|
|
429
394
|
.fn()
|
|
430
395
|
.mockReturnValueOnce("0")
|
|
@@ -435,38 +400,32 @@ describe("BitAccessHandlers", () => {
|
|
|
435
400
|
subscripts: [{ mockValue: "0" } as never, { mockValue: "40" } as never],
|
|
436
401
|
});
|
|
437
402
|
|
|
438
|
-
const result = getHandler()!(ctx
|
|
403
|
+
const result = getHandler()!(ctx);
|
|
439
404
|
|
|
440
405
|
expect(result).toContain("1ULL << 40");
|
|
441
406
|
});
|
|
442
407
|
|
|
443
408
|
it("throws when variable is not an array", () => {
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
});
|
|
409
|
+
CodeGenState.typeRegistry = new Map([
|
|
410
|
+
["notArray", { baseType: "u32" }],
|
|
411
|
+
]) as any;
|
|
448
412
|
const ctx = createMockContext({
|
|
449
413
|
identifiers: ["notArray"],
|
|
450
414
|
});
|
|
451
415
|
|
|
452
|
-
expect(() => getHandler()!(ctx
|
|
453
|
-
"notArray is not an array",
|
|
454
|
-
);
|
|
416
|
+
expect(() => getHandler()!(ctx)).toThrow("notArray is not an array");
|
|
455
417
|
});
|
|
456
418
|
|
|
457
419
|
it("throws on compound assignment", () => {
|
|
458
|
-
|
|
420
|
+
CodeGenState.typeRegistry = new Map([
|
|
459
421
|
["arr", { baseType: "u32", arrayDimensions: [10] }],
|
|
460
|
-
]);
|
|
461
|
-
const deps = createMockDeps({
|
|
462
|
-
typeRegistry,
|
|
463
|
-
});
|
|
422
|
+
]) as any;
|
|
464
423
|
const ctx = createMockContext({
|
|
465
424
|
isCompound: true,
|
|
466
425
|
cnextOp: "+<-",
|
|
467
426
|
});
|
|
468
427
|
|
|
469
|
-
expect(() => getHandler()!(ctx
|
|
428
|
+
expect(() => getHandler()!(ctx)).toThrow(
|
|
470
429
|
"Compound assignment operators not supported for bit field access",
|
|
471
430
|
);
|
|
472
431
|
});
|
|
@@ -479,7 +438,7 @@ describe("BitAccessHandlers", () => {
|
|
|
479
438
|
)?.[1];
|
|
480
439
|
|
|
481
440
|
it("generates bit range write through struct chain", () => {
|
|
482
|
-
|
|
441
|
+
HandlerTestUtils.setupMockGenerator({
|
|
483
442
|
generateExpression: vi
|
|
484
443
|
.fn()
|
|
485
444
|
.mockReturnValueOnce("0") // array index
|
|
@@ -517,7 +476,7 @@ describe("BitAccessHandlers", () => {
|
|
|
517
476
|
lastSubscriptExprCount: 2,
|
|
518
477
|
});
|
|
519
478
|
|
|
520
|
-
const result = getHandler()!(ctx
|
|
479
|
+
const result = getHandler()!(ctx);
|
|
521
480
|
|
|
522
481
|
expect(result).toContain("devices[0].control =");
|
|
523
482
|
expect(result).toContain("& ~(");
|
|
@@ -526,7 +485,6 @@ describe("BitAccessHandlers", () => {
|
|
|
526
485
|
});
|
|
527
486
|
|
|
528
487
|
it("throws on compound assignment", () => {
|
|
529
|
-
const deps = createMockDeps();
|
|
530
488
|
const mockPostfixOps = [
|
|
531
489
|
{
|
|
532
490
|
IDENTIFIER: () => null,
|
|
@@ -539,7 +497,7 @@ describe("BitAccessHandlers", () => {
|
|
|
539
497
|
postfixOps: mockPostfixOps as never,
|
|
540
498
|
});
|
|
541
499
|
|
|
542
|
-
expect(() => getHandler()!(ctx
|
|
500
|
+
expect(() => getHandler()!(ctx)).toThrow(
|
|
543
501
|
"Compound assignment operators not supported for bit field access",
|
|
544
502
|
);
|
|
545
503
|
});
|