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.
Files changed (73) hide show
  1. package/package.json +5 -1
  2. package/src/transpiler/Transpiler.ts +49 -42
  3. package/src/transpiler/logic/symbols/cnext/__tests__/TSymbolAdapter.test.ts +129 -0
  4. package/src/transpiler/logic/symbols/cnext/adapters/TSymbolAdapter.ts +27 -3
  5. package/src/transpiler/output/codegen/CodeGenerator.ts +131 -186
  6. package/src/transpiler/output/codegen/TypeResolver.ts +2 -2
  7. package/src/transpiler/output/codegen/TypeValidator.ts +1 -1
  8. package/src/transpiler/output/codegen/__tests__/CodeGenerator.coverage.test.ts +1087 -0
  9. package/src/transpiler/output/codegen/__tests__/CodeGenerator.test.ts +665 -1315
  10. package/src/transpiler/output/codegen/__tests__/TypeResolver.test.ts +1 -1
  11. package/src/transpiler/output/codegen/__tests__/TypeValidator.resolution.test.ts +1 -1
  12. package/src/transpiler/output/codegen/__tests__/TypeValidator.test.ts +1 -1
  13. package/src/transpiler/output/codegen/analysis/MemberChainAnalyzer.ts +1 -1
  14. package/src/transpiler/output/codegen/analysis/StringLengthCounter.ts +1 -1
  15. package/src/transpiler/output/codegen/analysis/__tests__/MemberChainAnalyzer.test.ts +1 -1
  16. package/src/transpiler/output/codegen/analysis/__tests__/StringLengthCounter.test.ts +1 -1
  17. package/src/transpiler/output/codegen/assignment/AssignmentClassifier.ts +1 -1
  18. package/src/transpiler/output/codegen/assignment/__tests__/AssignmentClassifier.test.ts +1 -1
  19. package/src/transpiler/output/codegen/assignment/handlers/AccessPatternHandlers.ts +24 -27
  20. package/src/transpiler/output/codegen/assignment/handlers/ArrayHandlers.ts +25 -18
  21. package/src/transpiler/output/codegen/assignment/handlers/BitAccessHandlers.ts +27 -33
  22. package/src/transpiler/output/codegen/assignment/handlers/BitmapHandlers.ts +39 -42
  23. package/src/transpiler/output/codegen/assignment/handlers/RegisterHandlers.ts +39 -97
  24. package/src/transpiler/output/codegen/assignment/handlers/RegisterUtils.ts +75 -0
  25. package/src/transpiler/output/codegen/assignment/handlers/SimpleHandler.ts +9 -6
  26. package/src/transpiler/output/codegen/assignment/handlers/SpecialHandlers.ts +30 -22
  27. package/src/transpiler/output/codegen/assignment/handlers/StringHandlers.ts +42 -50
  28. package/src/transpiler/output/codegen/assignment/handlers/TAssignmentHandler.ts +6 -5
  29. package/src/transpiler/output/codegen/assignment/handlers/__tests__/AccessPatternHandlers.test.ts +81 -134
  30. package/src/transpiler/output/codegen/assignment/handlers/__tests__/ArrayHandlers.test.ts +85 -124
  31. package/src/transpiler/output/codegen/assignment/handlers/__tests__/BitAccessHandlers.test.ts +82 -124
  32. package/src/transpiler/output/codegen/assignment/handlers/__tests__/BitmapHandlers.test.ts +135 -297
  33. package/src/transpiler/output/codegen/assignment/handlers/__tests__/RegisterHandlers.test.ts +105 -227
  34. package/src/transpiler/output/codegen/assignment/handlers/__tests__/RegisterUtils.test.ts +214 -1
  35. package/src/transpiler/output/codegen/assignment/handlers/__tests__/SpecialHandlers.test.ts +66 -127
  36. package/src/transpiler/output/codegen/assignment/handlers/__tests__/StringHandlers.test.ts +37 -83
  37. package/src/transpiler/output/codegen/assignment/handlers/__tests__/handlerTestUtils.ts +162 -0
  38. package/src/transpiler/output/codegen/generators/expressions/PostfixExpressionGenerator.ts +618 -12
  39. package/src/transpiler/output/codegen/generators/expressions/__tests__/PostfixExpressionGenerator.test.ts +819 -0
  40. package/src/transpiler/output/codegen/helpers/ArrayInitHelper.ts +1 -1
  41. package/src/transpiler/output/codegen/helpers/AssignmentExpectedTypeResolver.ts +1 -1
  42. package/src/transpiler/output/codegen/helpers/AssignmentValidator.ts +1 -1
  43. package/src/transpiler/output/codegen/helpers/CppModeHelper.ts +1 -1
  44. package/src/transpiler/output/codegen/helpers/EnumAssignmentValidator.ts +1 -1
  45. package/src/transpiler/output/codegen/helpers/FloatBitHelper.ts +1 -1
  46. package/src/transpiler/output/codegen/helpers/ParameterInputAdapter.ts +337 -0
  47. package/src/transpiler/output/codegen/helpers/ParameterSignatureBuilder.ts +135 -0
  48. package/src/transpiler/output/codegen/helpers/StringDeclHelper.ts +1 -1
  49. package/src/transpiler/output/codegen/helpers/VariableDeclarationFormatter.ts +118 -0
  50. package/src/transpiler/output/codegen/helpers/__tests__/ArrayInitHelper.test.ts +1 -1
  51. package/src/transpiler/output/codegen/helpers/__tests__/AssignmentExpectedTypeResolver.test.ts +1 -1
  52. package/src/transpiler/output/codegen/helpers/__tests__/AssignmentValidator.test.ts +1 -1
  53. package/src/transpiler/output/codegen/helpers/__tests__/CppModeHelper.test.ts +1 -1
  54. package/src/transpiler/output/codegen/helpers/__tests__/EnumAssignmentValidator.test.ts +1 -1
  55. package/src/transpiler/output/codegen/helpers/__tests__/FloatBitHelper.test.ts +1 -1
  56. package/src/transpiler/output/codegen/helpers/__tests__/ParameterInputAdapter.test.ts +426 -0
  57. package/src/transpiler/output/codegen/helpers/__tests__/ParameterSignatureBuilder.test.ts +315 -0
  58. package/src/transpiler/output/codegen/helpers/__tests__/StringDeclHelper.test.ts +1 -1
  59. package/src/transpiler/output/codegen/helpers/__tests__/VariableDeclarationFormatter.test.ts +333 -0
  60. package/src/transpiler/output/codegen/resolution/EnumTypeResolver.ts +1 -1
  61. package/src/transpiler/output/codegen/resolution/ScopeResolver.ts +1 -1
  62. package/src/transpiler/output/codegen/resolution/SizeofResolver.ts +1 -1
  63. package/src/transpiler/output/codegen/resolution/__tests__/EnumTypeResolver.test.ts +1 -1
  64. package/src/transpiler/output/codegen/resolution/__tests__/SizeofResolver.test.ts +1 -1
  65. package/src/transpiler/output/codegen/types/ICodeGenApi.ts +57 -0
  66. package/src/transpiler/output/codegen/types/IParameterInput.ts +58 -0
  67. package/src/transpiler/output/codegen/types/IVariableFormatInput.ts +51 -0
  68. package/src/transpiler/output/headers/BaseHeaderGenerator.ts +20 -35
  69. package/src/transpiler/output/headers/HeaderGeneratorUtils.ts +21 -48
  70. package/src/transpiler/output/headers/__tests__/HeaderGeneratorUtils.test.ts +0 -64
  71. package/src/transpiler/{output/codegen → state}/CodeGenState.ts +46 -26
  72. package/src/transpiler/{output/codegen → state}/__tests__/CodeGenState.test.ts +12 -2
  73. package/src/transpiler/output/codegen/assignment/handlers/IHandlerDeps.ts +0 -161
@@ -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 IHandlerDeps from "../IHandlerDeps";
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
- const typeRegistry = new Map([["flags", { baseType: "u32" }]]);
107
- const deps = createMockDeps({
108
- typeRegistry,
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, deps);
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
- const typeRegistry = new Map([["flags", { baseType: "u64" }]]);
122
- const deps = createMockDeps({
123
- typeRegistry,
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, deps);
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
- const typeRegistry = new Map([["flags", { baseType: "i64" }]]);
137
- const deps = createMockDeps({
138
- typeRegistry,
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, deps);
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
- const typeRegistry = new Map([["flags", { baseType: "u8" }]]);
151
- const deps = createMockDeps({
152
- typeRegistry,
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, deps);
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
- const typeRegistry = new Map([["flags", { baseType: "u8" }]]);
166
- const deps = createMockDeps({
167
- typeRegistry,
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, deps);
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
- const typeRegistry = new Map([["f", { baseType: "f32" }]]);
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
- const deps = createMockDeps({
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, deps);
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, deps)).toThrow(
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
- const typeRegistry = new Map([["flags", { baseType: "u32" }]]);
220
- const deps = createMockDeps({
221
- typeRegistry,
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, deps);
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
- const typeRegistry = new Map([["data", { baseType: "u16" }]]);
241
- const deps = createMockDeps({
242
- typeRegistry,
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, deps);
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
- const typeRegistry = new Map([["flags", { baseType: "u64" }]]);
263
- const deps = createMockDeps({
264
- typeRegistry,
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, deps);
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
- const typeRegistry = new Map([["f", { baseType: "f32" }]]);
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
- const deps = createMockDeps({
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, deps);
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, deps)).toThrow(
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
- const deps = createMockDeps({
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, deps);
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, deps)).toThrow(
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
- const typeRegistry = new Map([
339
+ CodeGenState.typeRegistry = new Map([
372
340
  ["arr", { baseType: "u32", arrayDimensions: [10] }],
373
- ]);
374
- const deps = createMockDeps({
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, deps);
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
- const typeRegistry = new Map([
363
+ CodeGenState.typeRegistry = new Map([
397
364
  ["matrix", { baseType: "u16", arrayDimensions: [10, 10] }],
398
- ]);
399
- const deps = createMockDeps({
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, deps);
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
- const typeRegistry = new Map([
389
+ CodeGenState.typeRegistry = new Map([
424
390
  ["arr", { baseType: "u64", arrayDimensions: [5] }],
425
- ]);
426
- const deps = createMockDeps({
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, deps);
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
- const typeRegistry = new Map([["notArray", { baseType: "u32" }]]);
445
- const deps = createMockDeps({
446
- typeRegistry,
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, deps)).toThrow(
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
- const typeRegistry = new Map([
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, deps)).toThrow(
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
- const deps = createMockDeps({
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, deps);
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, deps)).toThrow(
500
+ expect(() => getHandler()!(ctx)).toThrow(
543
501
  "Compound assignment operators not supported for bit field access",
544
502
  );
545
503
  });