c-next 0.1.69 → 0.1.71

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 (247) hide show
  1. package/package.json +1 -1
  2. package/src/lib/__tests__/parseCHeader.mocked.test.ts +69 -54
  3. package/src/lib/parseCHeader.ts +56 -23
  4. package/src/lib/parseWithSymbols.ts +195 -53
  5. package/src/transpiler/Transpiler.ts +173 -60
  6. package/src/transpiler/logic/analysis/FunctionCallAnalyzer.ts +240 -205
  7. package/src/transpiler/logic/analysis/InitializationAnalyzer.ts +1 -2
  8. package/src/transpiler/logic/analysis/PassByValueAnalyzer.ts +742 -0
  9. package/src/transpiler/logic/analysis/__tests__/FunctionCallAnalyzer.test.ts +102 -15
  10. package/src/transpiler/logic/analysis/__tests__/InitializationAnalyzer.test.ts +9 -9
  11. package/src/transpiler/logic/analysis/__tests__/runAnalyzers.test.ts +5 -5
  12. package/src/transpiler/{output/codegen → logic/analysis}/helpers/AssignmentTargetExtractor.ts +1 -1
  13. package/src/transpiler/{output/codegen → logic/analysis}/helpers/ChildStatementCollector.ts +1 -1
  14. package/src/transpiler/{output/codegen → logic/analysis}/helpers/StatementExpressionCollector.ts +1 -1
  15. package/src/transpiler/{output/codegen → logic/analysis}/helpers/__tests__/AssignmentTargetExtractor.test.ts +2 -2
  16. package/src/transpiler/{output/codegen → logic/analysis}/helpers/__tests__/ChildStatementCollector.test.ts +2 -2
  17. package/src/transpiler/{output/codegen → logic/analysis}/helpers/__tests__/StatementExpressionCollector.test.ts +2 -2
  18. package/src/transpiler/logic/symbols/SymbolTable.ts +676 -258
  19. package/src/transpiler/logic/symbols/SymbolUtils.ts +2 -2
  20. package/src/transpiler/logic/symbols/__tests__/SymbolTable.test.ts +290 -782
  21. package/src/transpiler/logic/symbols/c/__tests__/CResolver.integration.test.ts +573 -0
  22. package/src/transpiler/logic/symbols/c/__tests__/testHelpers.ts +20 -0
  23. package/src/transpiler/logic/symbols/c/collectors/EnumCollector.ts +82 -0
  24. package/src/transpiler/logic/symbols/c/collectors/FunctionCollector.ts +106 -0
  25. package/src/transpiler/logic/symbols/c/collectors/StructCollector.ts +173 -0
  26. package/src/transpiler/logic/symbols/c/collectors/TypedefCollector.ts +35 -0
  27. package/src/transpiler/logic/symbols/c/collectors/VariableCollector.ts +80 -0
  28. package/src/transpiler/logic/symbols/c/index.ts +333 -0
  29. package/src/transpiler/logic/symbols/c/utils/DeclaratorUtils.ts +269 -0
  30. package/src/transpiler/logic/symbols/cnext/__tests__/BitmapCollector.test.ts +50 -11
  31. package/src/transpiler/logic/symbols/cnext/__tests__/CNextResolver.integration.test.ts +45 -34
  32. package/src/transpiler/logic/symbols/cnext/__tests__/EnumCollector.test.ts +30 -13
  33. package/src/transpiler/logic/symbols/cnext/__tests__/FunctionCollector.test.ts +279 -64
  34. package/src/transpiler/logic/symbols/cnext/__tests__/RegisterCollector.test.ts +60 -13
  35. package/src/transpiler/logic/symbols/cnext/__tests__/ScopeCollector.test.ts +40 -37
  36. package/src/transpiler/logic/symbols/cnext/__tests__/StructCollector.test.ts +131 -45
  37. package/src/transpiler/logic/symbols/cnext/__tests__/TSymbolInfoAdapter.test.ts +223 -139
  38. package/src/transpiler/logic/symbols/cnext/__tests__/VariableCollector.test.ts +79 -25
  39. package/src/transpiler/logic/symbols/cnext/__tests__/testUtils.ts +53 -0
  40. package/src/transpiler/logic/symbols/cnext/adapters/TSymbolInfoAdapter.ts +83 -43
  41. package/src/transpiler/logic/symbols/cnext/collectors/BitmapCollector.ts +14 -13
  42. package/src/transpiler/logic/symbols/cnext/collectors/EnumCollector.ts +11 -10
  43. package/src/transpiler/logic/symbols/cnext/collectors/FunctionCollector.ts +83 -34
  44. package/src/transpiler/logic/symbols/cnext/collectors/RegisterCollector.ts +22 -18
  45. package/src/transpiler/logic/symbols/cnext/collectors/ScopeCollector.ts +53 -35
  46. package/src/transpiler/logic/symbols/cnext/collectors/StructCollector.ts +30 -23
  47. package/src/transpiler/logic/symbols/cnext/collectors/VariableCollector.ts +18 -19
  48. package/src/transpiler/logic/symbols/cnext/index.ts +36 -14
  49. package/src/transpiler/logic/symbols/cnext/types/IScopeCollectorResult.ts +2 -2
  50. package/src/transpiler/logic/symbols/cnext/utils/SymbolNameUtils.ts +27 -0
  51. package/src/transpiler/logic/symbols/cpp/__tests__/CppResolver.integration.test.ts +270 -0
  52. package/src/transpiler/logic/symbols/cpp/__tests__/testHelpers.ts +20 -0
  53. package/src/transpiler/logic/symbols/cpp/collectors/ClassCollector.ts +317 -0
  54. package/src/transpiler/logic/symbols/cpp/collectors/EnumCollector.ts +71 -0
  55. package/src/transpiler/logic/symbols/cpp/collectors/FunctionCollector.ts +155 -0
  56. package/src/transpiler/logic/symbols/cpp/collectors/NamespaceCollector.ts +65 -0
  57. package/src/transpiler/logic/symbols/cpp/collectors/TypeAliasCollector.ts +46 -0
  58. package/src/transpiler/logic/symbols/cpp/collectors/VariableCollector.ts +54 -0
  59. package/src/transpiler/logic/symbols/cpp/index.ts +366 -0
  60. package/src/transpiler/logic/symbols/cpp/utils/DeclaratorUtils.ts +248 -0
  61. package/src/transpiler/logic/symbols/shared/IExtractedParameter.ts +18 -0
  62. package/src/transpiler/logic/symbols/shared/ParameterExtractorUtils.ts +73 -0
  63. package/src/transpiler/output/codegen/CodeGenerator.ts +310 -2288
  64. package/src/transpiler/output/codegen/TypeRegistrationUtils.ts +4 -6
  65. package/src/transpiler/output/codegen/TypeResolver.ts +2 -2
  66. package/src/transpiler/output/codegen/TypeValidator.ts +5 -5
  67. package/src/transpiler/output/codegen/__tests__/CodeGenerator.test.ts +7 -1
  68. package/src/transpiler/output/codegen/__tests__/TypeRegistrationUtils.test.ts +36 -51
  69. package/src/transpiler/output/codegen/__tests__/TypeResolver.test.ts +20 -17
  70. package/src/transpiler/output/codegen/__tests__/TypeValidator.resolution.test.ts +3 -3
  71. package/src/transpiler/output/codegen/__tests__/TypeValidator.test.ts +1 -1
  72. package/src/transpiler/output/codegen/analysis/MemberChainAnalyzer.ts +1 -1
  73. package/src/transpiler/output/codegen/analysis/StringLengthCounter.ts +1 -1
  74. package/src/transpiler/output/codegen/analysis/__tests__/MemberChainAnalyzer.test.ts +9 -9
  75. package/src/transpiler/output/codegen/analysis/__tests__/StringLengthCounter.test.ts +12 -12
  76. package/src/transpiler/output/codegen/assignment/AssignmentClassifier.ts +13 -12
  77. package/src/transpiler/output/codegen/assignment/__tests__/AssignmentClassifier.test.ts +23 -17
  78. package/src/transpiler/output/codegen/assignment/handlers/ArrayHandlers.ts +2 -2
  79. package/src/transpiler/output/codegen/assignment/handlers/AssignmentHandlerUtils.ts +7 -1
  80. package/src/transpiler/output/codegen/assignment/handlers/BitAccessHandlers.ts +3 -3
  81. package/src/transpiler/output/codegen/assignment/handlers/BitmapHandlers.ts +9 -5
  82. package/src/transpiler/output/codegen/assignment/handlers/RegisterHandlers.ts +2 -1
  83. package/src/transpiler/output/codegen/assignment/handlers/SpecialHandlers.ts +4 -4
  84. package/src/transpiler/output/codegen/assignment/handlers/StringHandlers.ts +5 -5
  85. package/src/transpiler/output/codegen/assignment/handlers/__tests__/ArrayHandlers.test.ts +23 -25
  86. package/src/transpiler/output/codegen/assignment/handlers/__tests__/BitAccessHandlers.test.ts +20 -36
  87. package/src/transpiler/output/codegen/assignment/handlers/__tests__/BitmapHandlers.test.ts +18 -18
  88. package/src/transpiler/output/codegen/assignment/handlers/__tests__/SpecialHandlers.test.ts +42 -32
  89. package/src/transpiler/output/codegen/assignment/handlers/__tests__/handlerTestUtils.ts +5 -4
  90. package/src/transpiler/output/codegen/generators/declarationGenerators/ScopeGenerator.ts +21 -8
  91. package/src/transpiler/output/codegen/generators/declarationGenerators/ScopedRegisterGenerator.ts +3 -2
  92. package/src/transpiler/output/codegen/generators/expressions/CallExprGenerator.ts +14 -6
  93. package/src/transpiler/output/codegen/generators/expressions/CallExprUtils.ts +9 -3
  94. package/src/transpiler/output/codegen/generators/expressions/PostfixExpressionGenerator.ts +19 -16
  95. package/src/transpiler/output/codegen/generators/expressions/__tests__/CallExprGenerator.test.ts +24 -8
  96. package/src/transpiler/output/codegen/generators/expressions/__tests__/CallExprUtils.test.ts +4 -8
  97. package/src/transpiler/output/codegen/generators/expressions/__tests__/PostfixExpressionGenerator.test.ts +15 -2
  98. package/src/transpiler/output/codegen/helpers/ArgumentGenerator.ts +236 -0
  99. package/src/transpiler/output/codegen/helpers/ArrayInitHelper.ts +2 -1
  100. package/src/transpiler/output/codegen/helpers/AssignmentExpectedTypeResolver.ts +2 -2
  101. package/src/transpiler/output/codegen/helpers/AssignmentValidator.ts +3 -3
  102. package/src/transpiler/output/codegen/helpers/CppConstructorHelper.ts +3 -3
  103. package/src/transpiler/output/codegen/helpers/EnumAssignmentValidator.ts +1 -1
  104. package/src/transpiler/output/codegen/helpers/FunctionContextManager.ts +435 -0
  105. package/src/transpiler/output/codegen/helpers/StringDeclHelper.ts +2 -2
  106. package/src/transpiler/output/codegen/helpers/StringOperationsHelper.ts +203 -0
  107. package/src/transpiler/output/codegen/helpers/SymbolLookupHelper.ts +8 -12
  108. package/src/transpiler/output/codegen/helpers/TypeRegistrationEngine.ts +520 -0
  109. package/src/transpiler/output/codegen/helpers/VariableDeclHelper.ts +735 -0
  110. package/src/transpiler/output/codegen/helpers/VariableDeclarationFormatter.ts +1 -1
  111. package/src/transpiler/output/codegen/helpers/__tests__/ArgumentGenerator.test.ts +521 -0
  112. package/src/transpiler/output/codegen/helpers/__tests__/ArrayInitHelper.test.ts +1 -1
  113. package/src/transpiler/output/codegen/helpers/__tests__/AssignmentExpectedTypeResolver.test.ts +7 -7
  114. package/src/transpiler/output/codegen/helpers/__tests__/AssignmentValidator.test.ts +7 -7
  115. package/src/transpiler/output/codegen/helpers/__tests__/CppConstructorHelper.test.ts +4 -5
  116. package/src/transpiler/output/codegen/helpers/__tests__/EnumAssignmentValidator.test.ts +2 -2
  117. package/src/transpiler/output/codegen/helpers/__tests__/FunctionContextManager.test.ts +983 -0
  118. package/src/transpiler/output/codegen/helpers/__tests__/StringDeclHelper.test.ts +4 -4
  119. package/src/transpiler/output/codegen/helpers/__tests__/StringOperationsHelper.test.ts +269 -0
  120. package/src/transpiler/output/codegen/helpers/__tests__/SymbolLookupHelper.test.ts +31 -32
  121. package/src/transpiler/output/codegen/helpers/__tests__/TypeRegistrationEngine.test.ts +186 -0
  122. package/src/transpiler/output/codegen/helpers/__tests__/VariableDeclHelper.test.ts +460 -0
  123. package/src/transpiler/output/codegen/helpers/types/IArgumentGeneratorCallbacks.ts +32 -0
  124. package/src/transpiler/output/codegen/resolution/EnumTypeResolver.ts +7 -3
  125. package/src/transpiler/output/codegen/resolution/__tests__/EnumTypeResolver.test.ts +5 -5
  126. package/src/transpiler/output/codegen/types/IFunctionContextCallbacks.ts +12 -0
  127. package/src/transpiler/output/codegen/types/IVariableFormatInput.ts +1 -1
  128. package/src/transpiler/output/codegen/utils/QualifiedNameGenerator.ts +114 -0
  129. package/src/transpiler/output/codegen/utils/__tests__/QualifiedNameGenerator.test.ts +183 -0
  130. package/src/transpiler/output/headers/BaseHeaderGenerator.ts +4 -4
  131. package/src/transpiler/output/headers/ExternalTypeHeaderBuilder.ts +7 -7
  132. package/src/transpiler/output/headers/HeaderGenerator.ts +9 -7
  133. package/src/transpiler/output/headers/HeaderGeneratorUtils.ts +19 -20
  134. package/src/transpiler/output/headers/__tests__/BaseHeaderGenerator.test.ts +15 -18
  135. package/src/transpiler/output/headers/__tests__/CHeaderGenerator.test.ts +63 -64
  136. package/src/transpiler/output/headers/__tests__/CppHeaderGenerator.test.ts +36 -32
  137. package/src/transpiler/output/headers/__tests__/ExternalTypeHeaderBuilder.test.ts +26 -26
  138. package/src/transpiler/output/headers/__tests__/HeaderGenerator.test.ts +87 -59
  139. package/src/transpiler/output/headers/__tests__/HeaderGeneratorUtils.test.ts +57 -58
  140. package/src/transpiler/output/headers/adapters/HeaderSymbolAdapter.ts +222 -0
  141. package/src/transpiler/output/headers/adapters/__tests__/HeaderSymbolAdapter.test.ts +538 -0
  142. package/src/transpiler/output/headers/types/IGroupedSymbols.ts +8 -8
  143. package/src/transpiler/output/headers/types/IHeaderSymbol.ts +62 -0
  144. package/src/transpiler/state/CodeGenState.ts +109 -4
  145. package/src/transpiler/state/SymbolRegistry.ts +181 -0
  146. package/src/transpiler/{types → state}/TranspilerState.ts +1 -1
  147. package/src/transpiler/state/__tests__/CodeGenState.test.ts +277 -1
  148. package/src/transpiler/state/__tests__/SymbolRegistry.test.ts +249 -0
  149. package/src/transpiler/{types → state}/__tests__/TranspilerState.test.ts +1 -1
  150. package/src/transpiler/types/ICachedFileEntry.ts +1 -1
  151. package/src/transpiler/types/IConflict.ts +14 -0
  152. package/src/transpiler/types/ISerializedSymbol.ts +11 -0
  153. package/src/transpiler/types/TPrimitiveKind.ts +20 -0
  154. package/src/transpiler/types/TType.ts +103 -0
  155. package/src/transpiler/types/TVisibility.ts +6 -0
  156. package/src/transpiler/types/symbol-kinds/TSymbolKind.ts +10 -0
  157. package/src/transpiler/types/symbol-kinds/TSymbolKindC.ts +12 -0
  158. package/src/transpiler/types/symbol-kinds/TSymbolKindCNext.ts +16 -0
  159. package/src/transpiler/types/symbol-kinds/TSymbolKindCpp.ts +14 -0
  160. package/src/transpiler/types/symbols/IBaseSymbol.ts +31 -0
  161. package/src/transpiler/{logic/symbols/types → types/symbols}/IBitmapFieldInfo.ts +2 -2
  162. package/src/transpiler/types/symbols/IBitmapSymbol.ts +21 -0
  163. package/src/transpiler/{logic/symbols/types → types/symbols}/IEnumSymbol.ts +5 -6
  164. package/src/transpiler/types/symbols/IFieldInfo.ts +26 -0
  165. package/src/transpiler/types/symbols/IFunctionSymbol.ts +30 -0
  166. package/src/transpiler/types/symbols/IParameterInfo.ts +26 -0
  167. package/src/transpiler/{logic/symbols/types → types/symbols}/IRegisterMemberInfo.ts +4 -4
  168. package/src/transpiler/types/symbols/IRegisterSymbol.ts +18 -0
  169. package/src/transpiler/types/symbols/IScopeSymbol.ts +32 -0
  170. package/src/transpiler/{logic/symbols/types → types/symbols}/IStructFieldInfo.ts +2 -1
  171. package/src/transpiler/types/symbols/IStructSymbol.ts +15 -0
  172. package/src/transpiler/types/symbols/IVariableSymbol.ts +30 -0
  173. package/src/transpiler/types/symbols/SymbolGuards.ts +43 -0
  174. package/src/transpiler/types/symbols/TAnySymbol.ts +22 -0
  175. package/src/transpiler/types/symbols/TSymbol.ts +32 -0
  176. package/src/transpiler/types/symbols/__tests__/IBaseSymbol.test.ts +56 -0
  177. package/src/transpiler/types/symbols/__tests__/SymbolGuards.test.ts +57 -0
  178. package/src/transpiler/types/symbols/c/ICBaseSymbol.ts +28 -0
  179. package/src/transpiler/types/symbols/c/ICEnumMemberSymbol.ts +17 -0
  180. package/src/transpiler/types/symbols/c/ICEnumSymbol.ts +17 -0
  181. package/src/transpiler/types/symbols/c/ICFieldInfo.ts +16 -0
  182. package/src/transpiler/types/symbols/c/ICFunctionSymbol.ts +21 -0
  183. package/src/transpiler/types/symbols/c/ICParameterInfo.ts +19 -0
  184. package/src/transpiler/types/symbols/c/ICStructSymbol.ts +21 -0
  185. package/src/transpiler/types/symbols/c/ICTypedefSymbol.ts +14 -0
  186. package/src/transpiler/types/symbols/c/ICVariableSymbol.ts +26 -0
  187. package/src/transpiler/types/symbols/c/TCSymbol.ts +26 -0
  188. package/src/transpiler/types/symbols/cpp/ICppBaseSymbol.ts +31 -0
  189. package/src/transpiler/types/symbols/cpp/ICppClassSymbol.ts +15 -0
  190. package/src/transpiler/types/symbols/cpp/ICppEnumMemberSymbol.ts +14 -0
  191. package/src/transpiler/types/symbols/cpp/ICppEnumSymbol.ts +14 -0
  192. package/src/transpiler/types/symbols/cpp/ICppFieldInfo.ts +16 -0
  193. package/src/transpiler/types/symbols/cpp/ICppFunctionSymbol.ts +21 -0
  194. package/src/transpiler/types/symbols/cpp/ICppNamespaceSymbol.ts +11 -0
  195. package/src/transpiler/types/symbols/cpp/ICppParameterInfo.ts +19 -0
  196. package/src/transpiler/types/symbols/cpp/ICppStructSymbol.ts +16 -0
  197. package/src/transpiler/types/symbols/cpp/ICppTypeAliasSymbol.ts +14 -0
  198. package/src/transpiler/types/symbols/cpp/ICppVariableSymbol.ts +23 -0
  199. package/src/transpiler/types/symbols/cpp/TCppSymbol.ts +30 -0
  200. package/src/utils/CppNamespaceUtils.ts +3 -4
  201. package/src/utils/FunctionUtils.ts +92 -0
  202. package/src/utils/ParameterUtils.ts +55 -0
  203. package/src/utils/PrimitiveKindUtils.ts +33 -0
  204. package/src/utils/ScopeUtils.ts +105 -0
  205. package/src/utils/TTypeUtils.ts +159 -0
  206. package/src/utils/TypeResolver.ts +132 -0
  207. package/src/utils/__tests__/CppNamespaceUtils.test.ts +92 -99
  208. package/src/utils/__tests__/FunctionUtils.test.ts +284 -0
  209. package/src/utils/__tests__/ParameterUtils.test.ts +174 -0
  210. package/src/utils/__tests__/PrimitiveKindUtils.test.ts +59 -0
  211. package/src/utils/__tests__/ScopeUtils.test.ts +53 -0
  212. package/src/utils/__tests__/TTypeUtils.test.ts +245 -0
  213. package/src/utils/__tests__/TypeResolver.test.ts +332 -0
  214. package/src/utils/cache/CacheManager.ts +91 -50
  215. package/src/utils/cache/__tests__/CacheManager.test.ts +180 -114
  216. package/src/transpiler/logic/symbols/AutoConstUpdater.ts +0 -93
  217. package/src/transpiler/logic/symbols/CSymbolCollector.ts +0 -648
  218. package/src/transpiler/logic/symbols/CppSymbolCollector.ts +0 -874
  219. package/src/transpiler/logic/symbols/SymbolCollectorContext.ts +0 -68
  220. package/src/transpiler/logic/symbols/__tests__/AutoConstUpdater.test.ts +0 -418
  221. package/src/transpiler/logic/symbols/__tests__/CSymbolCollector.test.ts +0 -685
  222. package/src/transpiler/logic/symbols/__tests__/CppSymbolCollector.test.ts +0 -1146
  223. package/src/transpiler/logic/symbols/__tests__/SymbolCollectorContext.test.ts +0 -290
  224. package/src/transpiler/logic/symbols/__tests__/cTestHelpers.ts +0 -43
  225. package/src/transpiler/logic/symbols/__tests__/cppTestHelpers.ts +0 -40
  226. package/src/transpiler/logic/symbols/cnext/__tests__/TSymbolAdapter.test.ts +0 -595
  227. package/src/transpiler/logic/symbols/cnext/adapters/TSymbolAdapter.ts +0 -345
  228. package/src/transpiler/logic/symbols/types/IBaseSymbol.ts +0 -27
  229. package/src/transpiler/logic/symbols/types/IBitmapSymbol.ts +0 -23
  230. package/src/transpiler/logic/symbols/types/ICollectorContext.ts +0 -19
  231. package/src/transpiler/logic/symbols/types/IConflict.ts +0 -20
  232. package/src/transpiler/logic/symbols/types/IFieldInfo.ts +0 -18
  233. package/src/transpiler/logic/symbols/types/IFunctionSymbol.ts +0 -25
  234. package/src/transpiler/logic/symbols/types/IParameterInfo.ts +0 -24
  235. package/src/transpiler/logic/symbols/types/IRegisterSymbol.ts +0 -20
  236. package/src/transpiler/logic/symbols/types/IScopeSymbol.ts +0 -19
  237. package/src/transpiler/logic/symbols/types/IStructSymbol.ts +0 -16
  238. package/src/transpiler/logic/symbols/types/IVariableSymbol.ts +0 -30
  239. package/src/transpiler/logic/symbols/types/TSymbol.ts +0 -36
  240. package/src/transpiler/logic/symbols/types/__tests__/SymbolGuards.test.ts +0 -244
  241. package/src/transpiler/logic/symbols/types/typeGuards.ts +0 -44
  242. package/src/utils/types/ESymbolKind.ts +0 -19
  243. package/src/utils/types/ISymbol.ts +0 -64
  244. /package/src/transpiler/{types → constants}/BITMAP_BACKING_TYPE.ts +0 -0
  245. /package/src/transpiler/{types → constants}/BITMAP_SIZE.ts +0 -0
  246. /package/src/transpiler/{output/codegen → logic/analysis}/helpers/TransitiveModificationPropagator.ts +0 -0
  247. /package/src/transpiler/{output/codegen → logic/analysis}/helpers/__tests__/TransitiveModificationPropagator.test.ts +0 -0
@@ -23,6 +23,7 @@ import TGeneratorFn from "../TGeneratorFn";
23
23
  import generateScopedRegister from "./ScopedRegisterGenerator";
24
24
  import BitmapCommentUtils from "./BitmapCommentUtils";
25
25
  import ArrayDimensionUtils from "./ArrayDimensionUtils";
26
+ import QualifiedNameGenerator from "../../utils/QualifiedNameGenerator";
26
27
 
27
28
  /**
28
29
  * Generate initializer expression for a variable declaration.
@@ -48,7 +49,7 @@ function getScopedName(
48
49
  scopeName: string,
49
50
  ): { name: string; fullName: string } {
50
51
  const name = node.IDENTIFIER().getText();
51
- return { name, fullName: `${scopeName}_${name}` };
52
+ return { name, fullName: QualifiedNameGenerator.forMember(scopeName, name) };
52
53
  }
53
54
 
54
55
  /**
@@ -66,7 +67,7 @@ function resolveConstructorArgs(
66
67
  for (const argNode of argIdentifiers) {
67
68
  const argName = argNode.getText();
68
69
  // Arguments must be resolved with scope prefix
69
- const scopedArgName = `${scopeName}_${argName}`;
70
+ const scopedArgName = QualifiedNameGenerator.forMember(scopeName, argName);
70
71
 
71
72
  // Check if it's const using orchestrator
72
73
  if (!orchestrator.isConstValue(scopedArgName)) {
@@ -146,7 +147,7 @@ function generateConstructorVariable(
146
147
  ): string {
147
148
  // ADR-016: All scope variables are emitted at file scope
148
149
  const type = orchestrator.generateType(varDecl.type());
149
- const fullName = `${scopeName}_${varName}`;
150
+ const fullName = QualifiedNameGenerator.forMember(scopeName, varName);
150
151
  const prefix = isPrivate ? "static " : "";
151
152
 
152
153
  // Validate and resolve constructor arguments
@@ -180,7 +181,7 @@ function generateRegularVariable(
180
181
 
181
182
  // ADR-016: All scope variables are emitted at file scope (static-like persistence)
182
183
  const type = orchestrator.generateType(varDecl.type());
183
- const fullName = `${scopeName}_${varName}`;
184
+ const fullName = QualifiedNameGenerator.forMember(scopeName, varName);
184
185
  // Issue #282: Add 'const' modifier for const variables
185
186
  const constPrefix = isConst ? "const " : "";
186
187
  const prefix = isPrivate ? "static " : "";
@@ -216,7 +217,11 @@ function generateScopeFunction(
216
217
  ): string[] {
217
218
  const returnType = orchestrator.generateType(funcDecl.type());
218
219
  const funcName = funcDecl.IDENTIFIER().getText();
219
- const fullName = `${scopeName}_${funcName}`;
220
+ // Use QualifiedNameGenerator for consistent C-style name generation
221
+ const fullName = QualifiedNameGenerator.forFunctionStrings(
222
+ scopeName,
223
+ funcName,
224
+ );
220
225
  const prefix = isPrivate ? "static " : "";
221
226
 
222
227
  // Issue #269: Set current function name for pass-by-value lookup
@@ -274,7 +279,11 @@ function generateEnumMembersFromAST(
274
279
  for (let i = 0; i < members.length; i++) {
275
280
  const member = members[i];
276
281
  const memberName = member.IDENTIFIER().getText();
277
- const fullMemberName = `${fullName}_${memberName}`;
282
+ // Enum members use the full enum name as their "scope"
283
+ const fullMemberName = QualifiedNameGenerator.forMember(
284
+ fullName,
285
+ memberName,
286
+ );
278
287
 
279
288
  if (member.expression()) {
280
289
  const constValue = orchestrator.tryEvaluateConstant(member.expression()!);
@@ -421,7 +430,11 @@ function generateScopedEnumInline(
421
430
  const memberEntries = Array.from(symbolMembers.entries());
422
431
  for (let i = 0; i < memberEntries.length; i++) {
423
432
  const [memberName, value] = memberEntries[i];
424
- const fullMemberName = `${fullName}_${memberName}`;
433
+ // Enum members use the full enum name as their "scope"
434
+ const fullMemberName = QualifiedNameGenerator.forMember(
435
+ fullName,
436
+ memberName,
437
+ );
425
438
  const comma = i < memberEntries.length - 1 ? "," : "";
426
439
  lines.push(` ${fullMemberName} = ${value}${comma}`);
427
440
  }
@@ -500,7 +513,7 @@ function generateScopedBitmapInline(
500
513
  input: IGeneratorInput,
501
514
  ): string {
502
515
  const name = node.IDENTIFIER().getText();
503
- const fullName = `${scopeName}_${name}`;
516
+ const fullName = QualifiedNameGenerator.forMember(scopeName, name);
504
517
  const backingType = _getBitmapBackingType(fullName, node, input);
505
518
 
506
519
  const lines: string[] = [];
@@ -14,6 +14,7 @@ import IGeneratorState from "../IGeneratorState";
14
14
  import IGeneratorOutput from "../IGeneratorOutput";
15
15
  import IOrchestrator from "../IOrchestrator";
16
16
  import generateRegisterMacros from "./RegisterMacroGenerator";
17
+ import QualifiedNameGenerator from "../../utils/QualifiedNameGenerator";
17
18
 
18
19
  /**
19
20
  * Generate register macros with scope prefix.
@@ -26,12 +27,12 @@ const generateScopedRegister = (
26
27
  orchestrator: IOrchestrator,
27
28
  ): IGeneratorOutput => {
28
29
  const name = node.IDENTIFIER().getText();
29
- const fullName = `${scopeName}_${name}`; // Teensy4_GPIO7
30
+ const fullName = QualifiedNameGenerator.forMember(scopeName, name); // Teensy4_GPIO7
30
31
  const baseAddress = orchestrator.generateExpression(node.expression());
31
32
 
32
33
  // Type resolver for scoped bitmaps (e.g., GPIO7Pins -> Teensy4_GPIO7Pins)
33
34
  const resolveType = (regType: string): string | undefined => {
34
- const scopedTypeName = `${scopeName}_${regType}`;
35
+ const scopedTypeName = QualifiedNameGenerator.forMember(scopeName, regType);
35
36
  return input.symbols?.knownBitmaps.has(scopedTypeName)
36
37
  ? scopedTypeName
37
38
  : undefined;
@@ -17,6 +17,7 @@ import IGeneratorInput from "../IGeneratorInput";
17
17
  import IGeneratorState from "../IGeneratorState";
18
18
  import IOrchestrator from "../IOrchestrator";
19
19
  import CallExprUtils from "./CallExprUtils";
20
+ import CodeGenState from "../../../../state/CodeGenState";
20
21
 
21
22
  /**
22
23
  * Issue #304: Wrap argument with static_cast if it's a C++ enum class
@@ -80,7 +81,7 @@ const _generateCFunctionArg = (
80
81
  // Issue #322: If getExpressionType returns null (e.g., for this.member),
81
82
  // fall back to looking up the generated code in the type registry
82
83
  if (!argType && !argCode.startsWith("&")) {
83
- const typeInfo = input.typeRegistry.get(argCode);
84
+ const typeInfo = CodeGenState.getVariableTypeInfo(argCode);
84
85
  if (typeInfo) {
85
86
  argType = typeInfo.baseType;
86
87
  }
@@ -119,8 +120,15 @@ const _shouldPassByValue = (
119
120
  funcExpr,
120
121
  idx,
121
122
  );
122
- const isSmallPrimitive =
123
- isCrossFile && CallExprUtils.isSmallPrimitiveType(targetParam.baseType);
123
+
124
+ // Issue #786: For cross-file calls, check if parameter is a known primitive type.
125
+ // Known primitives (u8-u64, i8-i64, bool) should always be pass-by-value.
126
+ // This handles the case where local passByValueParams isn't populated for cross-file functions.
127
+ const isCrossFilePrimitive =
128
+ isCrossFile &&
129
+ CallExprUtils.isKnownPrimitiveType(targetParam.baseType) &&
130
+ !orchestrator.isStructType(targetParam.baseType) &&
131
+ !CallExprUtils.isStringType(targetParam.baseType);
124
132
 
125
133
  // Issue #551: Unknown types (external enums, typedefs) use pass-by-value
126
134
  const isUnknownType =
@@ -129,13 +137,13 @@ const _shouldPassByValue = (
129
137
  !CallExprUtils.isStringType(targetParam.baseType) &&
130
138
  !isFloatParam &&
131
139
  !isEnumParam &&
132
- !isSmallPrimitive;
140
+ !isCrossFilePrimitive;
133
141
 
134
142
  return (
135
143
  isFloatParam ||
136
144
  isEnumParam ||
137
145
  isPrimitivePassByValue ||
138
- isSmallPrimitive ||
146
+ isCrossFilePrimitive ||
139
147
  isUnknownType
140
148
  );
141
149
  };
@@ -259,7 +267,7 @@ const generateSafeDivMod = (
259
267
  }
260
268
 
261
269
  // Look up the type of the output parameter
262
- const typeInfo = input.typeRegistry.get(outputArgId);
270
+ const typeInfo = CodeGenState.getVariableTypeInfo(outputArgId);
263
271
  if (!typeInfo) {
264
272
  throw new Error(
265
273
  `Cannot determine type of output parameter '${outputArgId}' for ${funcName}`,
@@ -5,7 +5,7 @@
5
5
  import TYPE_MAP from "../../types/TYPE_MAP";
6
6
  import IFunctionSignature from "../../types/IFunctionSignature";
7
7
  import SymbolTable from "../../../../logic/symbols/SymbolTable";
8
- import ESymbolKind from "../../../../../utils/types/ESymbolKind";
8
+ import TypeResolver from "../../../../../utils/TypeResolver";
9
9
 
10
10
  /**
11
11
  * Issue #315: Small primitive types that are always passed by value.
@@ -88,12 +88,18 @@ class CallExprUtils {
88
88
  if (symbolTable) {
89
89
  const symbols = symbolTable.getOverloads(funcName);
90
90
  for (const sym of symbols) {
91
- if (sym.kind === ESymbolKind.Function && sym.parameters?.[paramIndex]) {
91
+ if (sym.kind === "function" && sym.parameters?.[paramIndex]) {
92
92
  const p = sym.parameters[paramIndex];
93
+ // Convert TType to string for C-Next symbols, use string directly for C/C++
94
+ const paramType = p.type;
95
+ const baseType =
96
+ typeof paramType === "string"
97
+ ? paramType
98
+ : TypeResolver.getTypeName(paramType);
93
99
  return {
94
100
  param: {
95
101
  name: p.name,
96
- baseType: p.type,
102
+ baseType,
97
103
  isConst: p.isConst,
98
104
  isArray: p.isArray,
99
105
  },
@@ -27,6 +27,7 @@ import SubscriptClassifier from "../../subscript/SubscriptClassifier";
27
27
  import TYPE_WIDTH from "../../types/TYPE_WIDTH";
28
28
  import C_TYPE_WIDTH from "../../types/C_TYPE_WIDTH";
29
29
  import TTypeInfo from "../../types/TTypeInfo";
30
+ import CodeGenState from "../../../../state/CodeGenState";
30
31
 
31
32
  // ========================================================================
32
33
  // Tracking State
@@ -67,7 +68,7 @@ const initializeTrackingState = (
67
68
  : false;
68
69
 
69
70
  const primaryBaseType = rootIdentifier
70
- ? input.typeRegistry.get(rootIdentifier)?.baseType
71
+ ? CodeGenState.getVariableTypeInfo(rootIdentifier)?.baseType
71
72
  : undefined;
72
73
  const currentStructType =
73
74
  primaryBaseType && orchestrator.isKnownStruct(primaryBaseType)
@@ -162,7 +163,7 @@ const generatePostfixExpression = (
162
163
  }
163
164
 
164
165
  const primaryTypeInfo = rootIdentifier
165
- ? input.typeRegistry.get(rootIdentifier)
166
+ ? CodeGenState.getVariableTypeInfo(rootIdentifier)
166
167
  : undefined;
167
168
 
168
169
  const tracking = initializeTrackingState(
@@ -364,7 +365,7 @@ const handleGlobalPrefix = (
364
365
  }
365
366
 
366
367
  // Issue #612: Set currentStructType for global struct variables
367
- const globalTypeInfo = input.typeRegistry.get(memberName);
368
+ const globalTypeInfo = CodeGenState.getVariableTypeInfo(memberName);
368
369
  if (globalTypeInfo && orchestrator.isKnownStruct(globalTypeInfo.baseType)) {
369
370
  tracking.currentStructType = globalTypeInfo.baseType;
370
371
  }
@@ -396,7 +397,7 @@ const handleThisScopeLength = (
396
397
 
397
398
  tracking.result = `${state.currentScope}_${memberName}`;
398
399
  tracking.resolvedIdentifier = tracking.result;
399
- const resolvedTypeInfo = input.typeRegistry.get(tracking.result);
400
+ const resolvedTypeInfo = CodeGenState.getVariableTypeInfo(tracking.result);
400
401
  if (
401
402
  resolvedTypeInfo &&
402
403
  orchestrator.isKnownStruct(resolvedTypeInfo.baseType)
@@ -422,7 +423,9 @@ const resolveStringTypeInfo = (
422
423
  orchestrator: IOrchestrator,
423
424
  ): TTypeInfo | undefined => {
424
425
  const identifier = tracking.resolvedIdentifier ?? rootIdentifier;
425
- const typeInfo = identifier ? input.typeRegistry.get(identifier) : undefined;
426
+ const typeInfo = identifier
427
+ ? CodeGenState.getVariableTypeInfo(identifier)
428
+ : undefined;
426
429
  if (typeInfo?.isString) {
427
430
  return typeInfo;
428
431
  }
@@ -650,7 +653,7 @@ const generateLengthProperty = (
650
653
 
651
654
  // Fall back to checking the current resolved identifier's type
652
655
  const typeInfo = ctx.resolvedIdentifier
653
- ? input.typeRegistry.get(ctx.resolvedIdentifier)
656
+ ? CodeGenState.getVariableTypeInfo(ctx.resolvedIdentifier)
654
657
  : undefined;
655
658
 
656
659
  if (!typeInfo) {
@@ -931,7 +934,7 @@ const generateBitLengthProperty = (
931
934
 
932
935
  // Get type info for the resolved identifier
933
936
  const typeInfo = ctx.resolvedIdentifier
934
- ? input.typeRegistry.get(ctx.resolvedIdentifier)
937
+ ? CodeGenState.getVariableTypeInfo(ctx.resolvedIdentifier)
935
938
  : undefined;
936
939
 
937
940
  if (!typeInfo) {
@@ -1185,7 +1188,7 @@ const generateByteLengthProperty = (
1185
1188
 
1186
1189
  // Get type info for the resolved identifier
1187
1190
  const typeInfo = ctx.resolvedIdentifier
1188
- ? input.typeRegistry.get(ctx.resolvedIdentifier)
1191
+ ? CodeGenState.getVariableTypeInfo(ctx.resolvedIdentifier)
1189
1192
  : undefined;
1190
1193
 
1191
1194
  if (!typeInfo) {
@@ -1251,10 +1254,10 @@ const generateStructFieldElementCount = (
1251
1254
  */
1252
1255
  const generateTypeInfoElementCount = (
1253
1256
  ctx: IExplicitLengthContext,
1254
- input: IGeneratorInput,
1257
+ _input: IGeneratorInput,
1255
1258
  ): string => {
1256
1259
  const typeInfo = ctx.resolvedIdentifier
1257
- ? input.typeRegistry.get(ctx.resolvedIdentifier)
1260
+ ? CodeGenState.getVariableTypeInfo(ctx.resolvedIdentifier)
1258
1261
  : undefined;
1259
1262
 
1260
1263
  if (!typeInfo) {
@@ -1350,7 +1353,7 @@ const generateCharCountProperty = (
1350
1353
 
1351
1354
  // Get type info
1352
1355
  const typeInfo = ctx.resolvedIdentifier
1353
- ? input.typeRegistry.get(ctx.resolvedIdentifier)
1356
+ ? CodeGenState.getVariableTypeInfo(ctx.resolvedIdentifier)
1354
1357
  : undefined;
1355
1358
 
1356
1359
  if (!typeInfo) {
@@ -1484,7 +1487,7 @@ const tryBitmapFieldAccess = (
1484
1487
  if (!ctx.rootIdentifier) {
1485
1488
  return null;
1486
1489
  }
1487
- const typeInfo = input.typeRegistry.get(ctx.rootIdentifier);
1490
+ const typeInfo = CodeGenState.getVariableTypeInfo(ctx.rootIdentifier);
1488
1491
  if (!typeInfo?.isBitmap || !typeInfo.bitmapTypeName) {
1489
1492
  return null;
1490
1493
  }
@@ -1525,7 +1528,7 @@ const tryScopeMemberAccess = (
1525
1528
  output.result = fullName;
1526
1529
  output.resolvedIdentifier = fullName;
1527
1530
  if (!input.symbols!.knownEnums.has(fullName)) {
1528
- const resolvedTypeInfo = input.typeRegistry.get(fullName);
1531
+ const resolvedTypeInfo = CodeGenState.getVariableTypeInfo(fullName);
1529
1532
  if (
1530
1533
  resolvedTypeInfo &&
1531
1534
  orchestrator.isKnownStruct(resolvedTypeInfo.baseType)
@@ -1569,7 +1572,7 @@ const tryKnownScopeAccess = (
1569
1572
  const output = initializeMemberOutput(ctx);
1570
1573
  output.result = `${ctx.result}${orchestrator.getScopeSeparator(ctx.isCppAccessChain)}${ctx.memberName}`;
1571
1574
  output.resolvedIdentifier = output.result;
1572
- const resolvedTypeInfo = input.typeRegistry.get(output.result);
1575
+ const resolvedTypeInfo = CodeGenState.getVariableTypeInfo(output.result);
1573
1576
  if (
1574
1577
  resolvedTypeInfo &&
1575
1578
  orchestrator.isKnownStruct(resolvedTypeInfo.baseType)
@@ -1920,11 +1923,11 @@ const checkRegisterAccess = (
1920
1923
  */
1921
1924
  const getIdentifierTypeInfo = (
1922
1925
  ctx: ISubscriptAccessContext,
1923
- input: IGeneratorInput,
1926
+ _input: IGeneratorInput,
1924
1927
  ): TTypeInfo | undefined => {
1925
1928
  const identifierToCheck = ctx.resolvedIdentifier || ctx.rootIdentifier;
1926
1929
  return identifierToCheck
1927
- ? input.typeRegistry.get(identifierToCheck)
1930
+ ? CodeGenState.getVariableTypeInfo(identifierToCheck)
1928
1931
  : undefined;
1929
1932
  };
1930
1933
 
@@ -1,10 +1,11 @@
1
- import { describe, it, expect, vi } from "vitest";
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
2
  import generateFunctionCall from "../CallExprGenerator";
3
3
  import IGeneratorInput from "../../IGeneratorInput";
4
4
  import IGeneratorState from "../../IGeneratorState";
5
5
  import IOrchestrator from "../../IOrchestrator";
6
6
  import * as Parser from "../../../../../logic/parser/grammar/CNextParser";
7
- import ESymbolKind from "../../../../../../utils/types/ESymbolKind";
7
+ import CodeGenState from "../../../../../state/CodeGenState";
8
+ import TTypeInfo from "../../../types/TTypeInfo";
8
9
 
9
10
  // ========================================================================
10
11
  // Test Helpers
@@ -27,10 +28,18 @@ function createMockArgListContext(
27
28
  function createMockInput(
28
29
  overrides: Partial<IGeneratorInput> = {},
29
30
  ): IGeneratorInput {
31
+ // Also populate CodeGenState with the type registry entries
32
+ // This is needed because CallExprGenerator now uses CodeGenState directly
33
+ const typeRegistry =
34
+ (overrides.typeRegistry as Map<string, TTypeInfo>) ?? new Map();
35
+ for (const [name, info] of typeRegistry) {
36
+ CodeGenState.setVariableTypeInfo(name, info);
37
+ }
38
+
30
39
  return {
31
40
  symbols: null,
32
41
  symbolTable: null,
33
- typeRegistry: new Map(),
42
+ typeRegistry,
34
43
  functionSignatures: new Map(),
35
44
  knownFunctions: new Set(),
36
45
  knownStructs: new Set(),
@@ -94,6 +103,11 @@ function createMockOrchestrator(
94
103
  // ========================================================================
95
104
 
96
105
  describe("CallExprGenerator", () => {
106
+ // Reset CodeGenState before each test to avoid state pollution
107
+ beforeEach(() => {
108
+ CodeGenState.reset();
109
+ });
110
+
97
111
  describe("empty function call", () => {
98
112
  it("generates call with no arguments when argCtx is null", () => {
99
113
  const input = createMockInput();
@@ -756,13 +770,13 @@ describe("CallExprGenerator", () => {
756
770
  });
757
771
 
758
772
  describe("cross-file function calls (Issue #315)", () => {
759
- it("looks up parameter info from SymbolTable when no local signature", () => {
773
+ it("looks up parameter info from SymbolTable and passes primitives by value (Issue #786)", () => {
760
774
  const argExprs = [createMockExpressionContext("myVal")];
761
775
  const argCtx = createMockArgListContext(argExprs);
762
776
  const symbolTable = {
763
777
  getOverloads: vi.fn(() => [
764
778
  {
765
- kind: ESymbolKind.Function,
779
+ kind: "function",
766
780
  parameters: [
767
781
  { name: "val", type: "u32", isConst: false, isArray: false },
768
782
  ],
@@ -777,6 +791,7 @@ describe("CallExprGenerator", () => {
777
791
  isCNextFunction: vi.fn(() => true),
778
792
  isFloatType: vi.fn(() => false),
779
793
  isParameterPassByValue: vi.fn(() => false),
794
+ isStructType: vi.fn(() => false),
780
795
  });
781
796
 
782
797
  const result = generateFunctionCall(
@@ -788,7 +803,8 @@ describe("CallExprGenerator", () => {
788
803
  );
789
804
 
790
805
  expect(symbolTable.getOverloads).toHaveBeenCalledWith("crossFileFunc");
791
- expect(result.code).toBe("crossFileFunc(&myVal)");
806
+ // Issue #786: Primitive types like u32 are now passed by value for cross-file calls
807
+ expect(result.code).toBe("crossFileFunc(myVal)");
792
808
  });
793
809
 
794
810
  it("passes small primitive by value for cross-file functions", () => {
@@ -797,7 +813,7 @@ describe("CallExprGenerator", () => {
797
813
  const symbolTable = {
798
814
  getOverloads: vi.fn(() => [
799
815
  {
800
- kind: ESymbolKind.Function,
816
+ kind: "function",
801
817
  parameters: [
802
818
  { name: "f", type: "u8", isConst: false, isArray: false },
803
819
  ],
@@ -831,7 +847,7 @@ describe("CallExprGenerator", () => {
831
847
  const argCtx = createMockArgListContext(argExprs);
832
848
  const symbolTable = {
833
849
  getOverloads: vi.fn(() => [
834
- { kind: ESymbolKind.Variable, parameters: undefined },
850
+ { kind: "variable", parameters: undefined },
835
851
  ]),
836
852
  };
837
853
  const input = createMockInput({
@@ -1,6 +1,5 @@
1
1
  import { describe, it, expect, vi } from "vitest";
2
2
  import CallExprUtils from "../CallExprUtils";
3
- import ESymbolKind from "../../../../../../utils/types/ESymbolKind";
4
3
 
5
4
  describe("CallExprUtils", () => {
6
5
  describe("mapTypeToCType", () => {
@@ -166,7 +165,7 @@ describe("CallExprUtils", () => {
166
165
  const symbolTable = {
167
166
  getOverloads: vi.fn(() => [
168
167
  {
169
- kind: ESymbolKind.Function,
168
+ kind: "function",
170
169
  parameters: [
171
170
  { name: "val", type: "i32", isConst: true, isArray: false },
172
171
  ],
@@ -193,10 +192,7 @@ describe("CallExprUtils", () => {
193
192
 
194
193
  it("skips non-function symbols in SymbolTable", () => {
195
194
  const symbolTable = {
196
- getOverloads: vi.fn(() => [
197
- { kind: ESymbolKind.Variable },
198
- { kind: ESymbolKind.Struct },
199
- ]),
195
+ getOverloads: vi.fn(() => [{ kind: "variable" }, { kind: "struct" }]),
200
196
  };
201
197
 
202
198
  const result = CallExprUtils.resolveTargetParam(
@@ -214,7 +210,7 @@ describe("CallExprUtils", () => {
214
210
  const symbolTable = {
215
211
  getOverloads: vi.fn(() => [
216
212
  {
217
- kind: ESymbolKind.Function,
213
+ kind: "function",
218
214
  parameters: [
219
215
  { name: "a", type: "u8", isConst: false, isArray: false },
220
216
  ],
@@ -243,7 +239,7 @@ describe("CallExprUtils", () => {
243
239
  const symbolTable = {
244
240
  getOverloads: vi.fn(() => [
245
241
  {
246
- kind: ESymbolKind.Function,
242
+ kind: "function",
247
243
  parameters: [
248
244
  { name: "remote", type: "i64", isConst: true, isArray: false },
249
245
  ],
@@ -9,7 +9,7 @@
9
9
  * - Property access (.length, .capacity, .size)
10
10
  */
11
11
 
12
- import { describe, it, expect, vi } from "vitest";
12
+ import { describe, it, expect, vi, beforeEach } from "vitest";
13
13
  import generatePostfixExpression from "../PostfixExpressionGenerator";
14
14
  import type IGeneratorInput from "../../IGeneratorInput";
15
15
  import type IGeneratorState from "../../IGeneratorState";
@@ -18,6 +18,7 @@ import type ICodeGenSymbols from "../../../../../types/ICodeGenSymbols";
18
18
  import type TTypeInfo from "../../../types/TTypeInfo";
19
19
  import type TParameterInfo from "../../../types/TParameterInfo";
20
20
  import * as Parser from "../../../../../logic/parser/grammar/CNextParser";
21
+ import CodeGenState from "../../../../../state/CodeGenState";
21
22
 
22
23
  // ========================================================================
23
24
  // Test Helpers - Mock Symbols
@@ -64,10 +65,17 @@ function createMockInput(overrides?: {
64
65
  symbols?: ICodeGenSymbols;
65
66
  typeRegistry?: Map<string, TTypeInfo>;
66
67
  }): IGeneratorInput {
68
+ // Also populate CodeGenState with the type registry entries
69
+ // This is needed because PostfixExpressionGenerator now uses CodeGenState directly
70
+ const typeRegistry = overrides?.typeRegistry ?? new Map<string, TTypeInfo>();
71
+ for (const [name, info] of typeRegistry) {
72
+ CodeGenState.setVariableTypeInfo(name, info);
73
+ }
74
+
67
75
  return {
68
76
  symbolTable: null,
69
77
  symbols: overrides?.symbols ?? createMockSymbols(),
70
- typeRegistry: overrides?.typeRegistry ?? new Map(),
78
+ typeRegistry,
71
79
  functionSignatures: new Map(),
72
80
  knownFunctions: new Set(),
73
81
  knownStructs: new Set(),
@@ -290,6 +298,11 @@ function createMockPostfixExpressionContext(
290
298
  // ========================================================================
291
299
 
292
300
  describe("PostfixExpressionGenerator", () => {
301
+ // Reset CodeGenState before each test to avoid state pollution
302
+ beforeEach(() => {
303
+ CodeGenState.reset();
304
+ });
305
+
293
306
  describe("basic expression generation", () => {
294
307
  it("generates simple identifier", () => {
295
308
  const ctx = createMockPostfixExpressionContext("x", []);