c-next 0.1.66 → 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 (60) hide show
  1. package/package.json +1 -1
  2. package/src/transpiler/Transpiler.ts +49 -42
  3. package/src/transpiler/logic/symbols/cnext/__tests__/TSymbolAdapter.test.ts +32 -82
  4. package/src/transpiler/logic/symbols/cnext/adapters/TSymbolAdapter.ts +17 -61
  5. package/src/transpiler/output/codegen/CodeGenerator.ts +22 -59
  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 +5 -4
  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/helpers/ArrayInitHelper.ts +1 -1
  39. package/src/transpiler/output/codegen/helpers/AssignmentExpectedTypeResolver.ts +1 -1
  40. package/src/transpiler/output/codegen/helpers/AssignmentValidator.ts +1 -1
  41. package/src/transpiler/output/codegen/helpers/CppModeHelper.ts +1 -1
  42. package/src/transpiler/output/codegen/helpers/EnumAssignmentValidator.ts +1 -1
  43. package/src/transpiler/output/codegen/helpers/FloatBitHelper.ts +1 -1
  44. package/src/transpiler/output/codegen/helpers/StringDeclHelper.ts +1 -1
  45. package/src/transpiler/output/codegen/helpers/__tests__/ArrayInitHelper.test.ts +1 -1
  46. package/src/transpiler/output/codegen/helpers/__tests__/AssignmentExpectedTypeResolver.test.ts +1 -1
  47. package/src/transpiler/output/codegen/helpers/__tests__/AssignmentValidator.test.ts +1 -1
  48. package/src/transpiler/output/codegen/helpers/__tests__/CppModeHelper.test.ts +1 -1
  49. package/src/transpiler/output/codegen/helpers/__tests__/EnumAssignmentValidator.test.ts +1 -1
  50. package/src/transpiler/output/codegen/helpers/__tests__/FloatBitHelper.test.ts +1 -1
  51. package/src/transpiler/output/codegen/helpers/__tests__/StringDeclHelper.test.ts +1 -1
  52. package/src/transpiler/output/codegen/resolution/EnumTypeResolver.ts +1 -1
  53. package/src/transpiler/output/codegen/resolution/ScopeResolver.ts +1 -1
  54. package/src/transpiler/output/codegen/resolution/SizeofResolver.ts +1 -1
  55. package/src/transpiler/output/codegen/resolution/__tests__/EnumTypeResolver.test.ts +1 -1
  56. package/src/transpiler/output/codegen/resolution/__tests__/SizeofResolver.test.ts +1 -1
  57. package/src/transpiler/output/codegen/types/ICodeGenApi.ts +57 -0
  58. package/src/transpiler/{output/codegen → state}/CodeGenState.ts +46 -26
  59. package/src/transpiler/{output/codegen → state}/__tests__/CodeGenState.test.ts +12 -2
  60. package/src/transpiler/output/codegen/assignment/handlers/IHandlerDeps.ts +0 -161
@@ -5,7 +5,7 @@
5
5
 
6
6
  import { CommonTokenStream, ParserRuleContext } from "antlr4ng";
7
7
  import * as Parser from "../../logic/parser/grammar/CNextParser";
8
- import SymbolTable from "../../logic/symbols/SymbolTable";
8
+
9
9
  import ESymbolKind from "../../../utils/types/ESymbolKind";
10
10
  import CommentExtractor from "../../logic/analysis/CommentExtractor";
11
11
  import CommentFormatter from "./CommentFormatter";
@@ -67,7 +67,7 @@ import memberAccessChain from "./memberAccessChain";
67
67
  import AssignmentHandlerRegistry from "./assignment/index";
68
68
  import AssignmentClassifier from "./assignment/AssignmentClassifier";
69
69
  import buildAssignmentContext from "./assignment/AssignmentContextBuilder";
70
- import IHandlerDeps from "./assignment/handlers/IHandlerDeps";
70
+ // IHandlerDeps removed - handlers now use CodeGenState.generator directly
71
71
  // Issue #461: LiteralUtils for parsing const values from symbol table
72
72
  import LiteralUtils from "../../../utils/LiteralUtils";
73
73
  // Issue #644: Extracted string length counter for strlen caching optimization
@@ -133,7 +133,7 @@ import TypeGenerationHelper from "./helpers/TypeGenerationHelper";
133
133
  // Phase 5: Cast validation helper for improved testability
134
134
  import CastValidator from "./helpers/CastValidator";
135
135
  // Global state for code generation (simplifies debugging, eliminates DI complexity)
136
- import CodeGenState from "./CodeGenState";
136
+ import CodeGenState from "../../state/CodeGenState";
137
137
  // Unified parameter generation (Phase 1)
138
138
  import ParameterInputAdapter from "./helpers/ParameterInputAdapter";
139
139
  import ParameterSignatureBuilder from "./helpers/ParameterSignatureBuilder";
@@ -679,7 +679,7 @@ export default class CodeGenerator implements IOrchestrator {
679
679
  currentScope: CodeGenState.currentScope,
680
680
  isCppScopeSymbol: (name) => this.isCppScopeSymbol(name),
681
681
  checkNeedsStructKeyword: (name) =>
682
- CodeGenState.symbolTable?.checkNeedsStructKeyword(name) ?? false,
682
+ CodeGenState.symbolTable.checkNeedsStructKeyword(name),
683
683
  validateCrossScopeVisibility: (scope, member) =>
684
684
  ScopeResolver.validateCrossScopeVisibility(scope, member),
685
685
  });
@@ -2117,13 +2117,11 @@ export default class CodeGenerator implements IOrchestrator {
2117
2117
  /**
2118
2118
  * Generate C code from a C-Next program
2119
2119
  * @param tree The parsed C-Next program
2120
- * @param symbolTable Optional symbol table for cross-language interop
2121
2120
  * @param tokenStream Optional token stream for comment preservation (ADR-043)
2122
2121
  * @param options Optional code generator options (e.g., debugMode)
2123
2122
  */
2124
2123
  generate(
2125
2124
  tree: Parser.ProgramContext,
2126
- symbolTable?: SymbolTable,
2127
2125
  tokenStream?: CommonTokenStream,
2128
2126
  options?: ICodeGeneratorOptions,
2129
2127
  ): string {
@@ -2145,9 +2143,6 @@ export default class CodeGenerator implements IOrchestrator {
2145
2143
  // Initialize options and configuration (after reset)
2146
2144
  this.initializeGenerateOptions(options, tokenStream);
2147
2145
 
2148
- // Store symbol table for function lookup (after reset)
2149
- CodeGenState.symbolTable = symbolTable ?? null;
2150
-
2151
2146
  // ADR-055: Use pre-collected symbolInfo from Pipeline (TSymbolInfoAdapter)
2152
2147
  if (!options?.symbolInfo) {
2153
2148
  throw new Error(
@@ -2198,6 +2193,9 @@ export default class CodeGenerator implements IOrchestrator {
2198
2193
  // Reset global state first
2199
2194
  CodeGenState.reset(targetCapabilities);
2200
2195
 
2196
+ // Set generator reference for handlers to use
2197
+ CodeGenState.generator = this;
2198
+
2201
2199
  // Reset local context (will gradually migrate to CodeGenState)
2202
2200
  this.context = CodeGenerator.createDefaultContext(targetCapabilities);
2203
2201
 
@@ -6026,54 +6024,14 @@ export default class CodeGenerator implements IOrchestrator {
6026
6024
  // Issue #644: _generateBitMask removed, now delegating to BitUtils.generateMask
6027
6025
  // ========================================================================
6028
6026
 
6029
- // ADR-109: Build handler dependencies for assignment dispatch
6030
- private buildHandlerDeps(): IHandlerDeps {
6031
- return {
6032
- symbols: CodeGenState.symbols!,
6033
- typeRegistry: CodeGenState.typeRegistry,
6034
- currentScope: CodeGenState.currentScope,
6035
- currentParameters: CodeGenState.currentParameters,
6036
- targetCapabilities: CodeGenState.targetCapabilities,
6037
- generateExpression: (ctx) => this.generateExpression(ctx),
6038
- tryEvaluateConstant: (ctx) => this.tryEvaluateConstant(ctx),
6039
- generateAssignmentTarget: (ctx) => this.generateAssignmentTarget(ctx),
6040
- isKnownStruct: (name) => this.isKnownStruct(name),
6041
- isKnownScope: (name) => this.isKnownScope(name),
6042
- getMemberTypeInfo: (structType, memberName) =>
6043
- this.getMemberTypeInfo(structType, memberName),
6044
- validateBitmapFieldLiteral: (expr, width, fieldName) =>
6045
- TypeValidator.validateBitmapFieldLiteral(expr, width, fieldName),
6046
- validateCrossScopeVisibility: (scopeName, memberName) =>
6047
- this.validateCrossScopeVisibility(scopeName, memberName),
6048
- checkArrayBounds: (arrayName, dimensions, indexExprs, line) =>
6049
- TypeValidator.checkArrayBounds(
6050
- arrayName,
6051
- [...dimensions],
6052
- [...indexExprs],
6053
- line,
6054
- (expr) => this.tryEvaluateConstant(expr),
6055
- ),
6056
- analyzeMemberChainForBitAccess: (targetCtx) =>
6057
- this.analyzeMemberChainForBitAccess(targetCtx),
6058
- generateFloatBitWrite: (name, typeInfo, bitIndex, width, value) =>
6059
- this.generateFloatBitWrite(name, typeInfo, bitIndex, width, value),
6060
- foldBooleanToInt: (expr) => this.foldBooleanToInt(expr),
6061
- markNeedsString: () => {
6062
- this.requireInclude("string");
6063
- },
6064
- markClampOpUsed: (op, typeName) => this.markClampOpUsed(op, typeName),
6065
- generateAtomicRMW: (target, cOp, value, typeInfo) =>
6066
- this.generateAtomicRMW(target, cOp, value, typeInfo),
6067
- };
6068
- }
6027
+ // ADR-109: buildHandlerDeps removed - handlers now use CodeGenState.generator directly
6069
6028
 
6070
6029
  /**
6071
6030
  * Analyze a member chain target to detect bit access at the end.
6072
6031
  * Issue #644: Delegates to MemberChainAnalyzer.
6073
6032
  */
6074
- private analyzeMemberChainForBitAccess(
6075
- targetCtx: Parser.AssignmentTargetContext,
6076
- ): {
6033
+ /** Public for handler access via CodeGenState.generator */
6034
+ analyzeMemberChainForBitAccess(targetCtx: Parser.AssignmentTargetContext): {
6077
6035
  isBitAccess: boolean;
6078
6036
  baseTarget?: string;
6079
6037
  bitIndex?: string;
@@ -6089,7 +6047,8 @@ export default class CodeGenerator implements IOrchestrator {
6089
6047
  * Generate float bit write using shadow variable + memcpy.
6090
6048
  * Issue #644: Delegates to FloatBitHelper.
6091
6049
  */
6092
- private generateFloatBitWrite(
6050
+ /** Public for handler access via CodeGenState.generator */
6051
+ generateFloatBitWrite(
6093
6052
  name: string,
6094
6053
  typeInfo: TTypeInfo,
6095
6054
  bitIndex: string,
@@ -6162,17 +6121,18 @@ export default class CodeGenerator implements IOrchestrator {
6162
6121
  typeRegistry: CodeGenState.typeRegistry,
6163
6122
  generateExpression: () => value,
6164
6123
  });
6165
- const handlerDeps = this.buildHandlerDeps();
6124
+ // ADR-109: Handlers access CodeGenState directly, no deps needed
6166
6125
  const assignmentKind = AssignmentClassifier.classify(assignCtx);
6167
6126
  const handler = AssignmentHandlerRegistry.getHandler(assignmentKind);
6168
- return handler(assignCtx, handlerDeps);
6127
+ return handler(assignCtx);
6169
6128
  }
6170
6129
 
6171
6130
  /**
6172
6131
  * ADR-049: Generate atomic Read-Modify-Write operation
6173
6132
  * Uses LDREX/STREX on platforms that support it, otherwise PRIMASK
6174
6133
  */
6175
- private generateAtomicRMW(
6134
+ /** Public for handler access via CodeGenState.generator */
6135
+ generateAtomicRMW(
6176
6136
  target: string,
6177
6137
  cOp: string,
6178
6138
  value: string,
@@ -6422,7 +6382,7 @@ export default class CodeGenerator implements IOrchestrator {
6422
6382
  return null;
6423
6383
  }
6424
6384
 
6425
- // No expected enum type - search all enums but error on ambiguity
6385
+ // No expected enum type - bare enum members are not allowed without context
6426
6386
  const matchingEnums: string[] = [];
6427
6387
  for (const [enumName, members] of CodeGenState.symbols!.enumMembers) {
6428
6388
  if (members.has(id)) {
@@ -6431,11 +6391,14 @@ export default class CodeGenerator implements IOrchestrator {
6431
6391
  }
6432
6392
 
6433
6393
  if (matchingEnums.length === 1) {
6434
- return `${matchingEnums[0]}${this.getScopeSeparator(false)}${id}`;
6394
+ throw new Error(
6395
+ `error[E0424]: '${id}' is not defined; did you mean '${matchingEnums[0]}.${id}'?`,
6396
+ );
6435
6397
  }
6436
6398
  if (matchingEnums.length > 1) {
6399
+ const suggestions = matchingEnums.map((e) => `'${e}.${id}'`).join(" or ");
6437
6400
  throw new Error(
6438
- `Error: Ambiguous enum member '${id}' exists in multiple enums: ${matchingEnums.join(", ")}. Use qualified access (e.g., ${matchingEnums[0]}.${id})`,
6401
+ `error[E0424]: '${id}' is not defined; did you mean ${suggestions}?`,
6439
6402
  );
6440
6403
  }
6441
6404
 
@@ -3,7 +3,7 @@
3
3
  * Static class that reads from CodeGenState directly.
4
4
  */
5
5
  import * as Parser from "../../logic/parser/grammar/CNextParser";
6
- import CodeGenState from "./CodeGenState";
6
+ import CodeGenState from "../../state/CodeGenState";
7
7
  import INTEGER_TYPES from "./types/INTEGER_TYPES";
8
8
  import FLOAT_TYPES from "./types/FLOAT_TYPES";
9
9
  import SIGNED_TYPES from "./types/SIGNED_TYPES";
@@ -73,7 +73,7 @@ class TypeResolver {
73
73
  if (CodeGenState.symbols?.knownBitmaps.has(typeName)) {
74
74
  return true;
75
75
  }
76
- if (CodeGenState.symbolTable?.getStructFields(typeName)) {
76
+ if (CodeGenState.symbolTable.getStructFields(typeName)) {
77
77
  return true;
78
78
  }
79
79
  return false;
@@ -6,7 +6,7 @@
6
6
  import { existsSync } from "node:fs";
7
7
  import { dirname, resolve, join } from "node:path";
8
8
  import * as Parser from "../../logic/parser/grammar/CNextParser";
9
- import CodeGenState from "./CodeGenState";
9
+ import CodeGenState from "../../state/CodeGenState";
10
10
  import TypeResolver from "./TypeResolver";
11
11
  import ExpressionUtils from "../../../utils/ExpressionUtils";
12
12
  // SonarCloud S3776: Extracted literal parsing to reduce complexity
@@ -16,7 +16,7 @@ import * as Parser from "../../../logic/parser/grammar/CNextParser";
16
16
  import SymbolTable from "../../../logic/symbols/SymbolTable";
17
17
  import CNextResolver from "../../../logic/symbols/cnext/index";
18
18
  import TSymbolInfoAdapter from "../../../logic/symbols/cnext/adapters/TSymbolInfoAdapter";
19
- import CodeGenState from "../CodeGenState";
19
+ import CodeGenState from "../../../state/CodeGenState";
20
20
 
21
21
  /**
22
22
  * Helper to parse C-Next source and return tree + generator ready for testing.
@@ -39,7 +39,8 @@ function setupGenerator(
39
39
  const symbols = TSymbolInfoAdapter.convert(tSymbols);
40
40
 
41
41
  const generator = new CodeGenerator();
42
- const code = generator.generate(tree, symbolTable, tokenStream, {
42
+ CodeGenState.symbolTable = symbolTable;
43
+ const code = generator.generate(tree, tokenStream, {
43
44
  symbolInfo: symbols,
44
45
  sourcePath: "test.cnx",
45
46
  cppMode: options.cppMode ?? false,
@@ -512,7 +513,7 @@ describe("CodeGenerator Coverage Tests", () => {
512
513
  scope Config {
513
514
  public enum State { IDLE, RUNNING, STOPPED }
514
515
  public void init() {
515
- State s <- IDLE;
516
+ State s <- State.IDLE;
516
517
  }
517
518
  }
518
519
  `;
@@ -1035,7 +1036,7 @@ describe("CodeGenerator Coverage Tests", () => {
1035
1036
  public void increment() { counter +<- 1; }
1036
1037
  public enum State { INIT, RUN }
1037
1038
  public void setState() {
1038
- State s <- INIT;
1039
+ State s <- State.INIT;
1039
1040
  }
1040
1041
  }
1041
1042
  `;