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
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Unit tests for TypeRegistrationEngine
3
+ * Issue #791: Tests for extracted type registration logic
4
+ */
5
+
6
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
7
+ import TypeRegistrationEngine from "../TypeRegistrationEngine";
8
+ import CNextSourceParser from "../../../../logic/parser/CNextSourceParser";
9
+ import CodeGenState from "../../../../state/CodeGenState";
10
+ import ICodeGenSymbols from "../../../../types/ICodeGenSymbols";
11
+ import * as Parser from "../../../../logic/parser/grammar/CNextParser";
12
+
13
+ /**
14
+ * Create a minimal mock ICodeGenSymbols with default empty collections.
15
+ */
16
+ function createMockSymbols(): ICodeGenSymbols {
17
+ return {
18
+ knownScopes: new Set(),
19
+ knownEnums: new Set(),
20
+ knownBitmaps: new Set(),
21
+ knownStructs: new Set(),
22
+ knownRegisters: new Set(),
23
+ scopeMembers: new Map(),
24
+ scopeMemberVisibility: new Map(),
25
+ structFields: new Map(),
26
+ structFieldArrays: new Map(),
27
+ structFieldDimensions: new Map(),
28
+ enumMembers: new Map(),
29
+ bitmapFields: new Map(),
30
+ bitmapBackingType: new Map(),
31
+ bitmapBitWidth: new Map(),
32
+ scopedRegisters: new Map(),
33
+ registerMemberAccess: new Map(),
34
+ registerMemberTypes: new Map(),
35
+ registerBaseAddresses: new Map(),
36
+ registerMemberOffsets: new Map(),
37
+ registerMemberCTypes: new Map(),
38
+ scopeVariableUsage: new Map(),
39
+ scopePrivateConstValues: new Map(),
40
+ functionReturnTypes: new Map(),
41
+ getSingleFunctionForVariable: () => null,
42
+ hasPublicSymbols: () => false,
43
+ };
44
+ }
45
+
46
+ /**
47
+ * Helper to parse a variable declaration and get its arrayType context
48
+ */
49
+ function parseArrayType(source: string): Parser.ArrayTypeContext | null {
50
+ const tree = CNextSourceParser.parse(source).tree;
51
+ const decl = tree.declaration(0)?.variableDeclaration();
52
+ return decl?.type()?.arrayType() ?? null;
53
+ }
54
+
55
+ /**
56
+ * Helper to parse a variable declaration and get its type context
57
+ */
58
+ function parseTypeContext(source: string): Parser.TypeContext | null {
59
+ const tree = CNextSourceParser.parse(source).tree;
60
+ const decl = tree.declaration(0)?.variableDeclaration();
61
+ return decl?.type() ?? null;
62
+ }
63
+
64
+ describe("TypeRegistrationEngine", () => {
65
+ describe("parseArrayTypeDimension", () => {
66
+ it("returns number for integer literal dimension", () => {
67
+ const ctx = parseArrayType("u8[10] buffer;");
68
+ expect(ctx).not.toBeNull();
69
+ const result = TypeRegistrationEngine.parseArrayTypeDimension(ctx!);
70
+ expect(result).toBe(10);
71
+ });
72
+
73
+ it("returns undefined for empty dimension", () => {
74
+ const ctx = parseArrayType("u8[] buffer;");
75
+ expect(ctx).not.toBeNull();
76
+ const result = TypeRegistrationEngine.parseArrayTypeDimension(ctx!);
77
+ expect(result).toBeUndefined();
78
+ });
79
+
80
+ it("returns undefined for non-numeric dimension", () => {
81
+ const ctx = parseArrayType("u8[SIZE] buffer;");
82
+ expect(ctx).not.toBeNull();
83
+ const result = TypeRegistrationEngine.parseArrayTypeDimension(ctx!);
84
+ expect(result).toBeUndefined();
85
+ });
86
+ });
87
+
88
+ describe("resolveBaseType", () => {
89
+ it("resolves primitive types", () => {
90
+ const ctx = parseTypeContext("u32 counter;");
91
+ expect(ctx).not.toBeNull();
92
+ const result = TypeRegistrationEngine.resolveBaseType(ctx!, null);
93
+ expect(result).toBe("u32");
94
+ });
95
+
96
+ it("resolves scoped types with currentScope", () => {
97
+ const ctx = parseTypeContext("this.State value;");
98
+ expect(ctx).not.toBeNull();
99
+ const result = TypeRegistrationEngine.resolveBaseType(ctx!, "Motor");
100
+ expect(result).toBe("Motor_State");
101
+ });
102
+
103
+ it("resolves scoped types without currentScope", () => {
104
+ const ctx = parseTypeContext("this.State value;");
105
+ expect(ctx).not.toBeNull();
106
+ const result = TypeRegistrationEngine.resolveBaseType(ctx!, null);
107
+ expect(result).toBe("State");
108
+ });
109
+
110
+ it("resolves user types", () => {
111
+ const ctx = parseTypeContext("Point origin;");
112
+ expect(ctx).not.toBeNull();
113
+ const result = TypeRegistrationEngine.resolveBaseType(ctx!, null);
114
+ expect(result).toBe("Point");
115
+ });
116
+
117
+ it("resolves global types", () => {
118
+ const ctx = parseTypeContext("global.Config cfg;");
119
+ expect(ctx).not.toBeNull();
120
+ const result = TypeRegistrationEngine.resolveBaseType(ctx!, "Motor");
121
+ expect(result).toBe("Config");
122
+ });
123
+
124
+ it("resolves qualified types", () => {
125
+ const ctx = parseTypeContext("Motor.State state;");
126
+ expect(ctx).not.toBeNull();
127
+ const result = TypeRegistrationEngine.resolveBaseType(ctx!, null);
128
+ expect(result).toBe("Motor_State");
129
+ });
130
+
131
+ it("returns null for string types", () => {
132
+ const ctx = parseTypeContext("string<64> buffer;");
133
+ expect(ctx).not.toBeNull();
134
+ const result = TypeRegistrationEngine.resolveBaseType(ctx!, null);
135
+ expect(result).toBeNull();
136
+ });
137
+ });
138
+
139
+ describe("register orchestration", () => {
140
+ const mockCallbacks = {
141
+ tryEvaluateConstant: vi.fn(),
142
+ requireInclude: vi.fn(),
143
+ };
144
+
145
+ beforeEach(() => {
146
+ vi.clearAllMocks();
147
+ CodeGenState.reset();
148
+ CodeGenState.symbols = createMockSymbols();
149
+ });
150
+
151
+ afterEach(() => {
152
+ CodeGenState.reset();
153
+ });
154
+
155
+ it("registers global variable types", () => {
156
+ const source = `u32 counter;`;
157
+ const tree = CNextSourceParser.parse(source).tree;
158
+
159
+ TypeRegistrationEngine.register(tree, mockCallbacks);
160
+
161
+ const info = CodeGenState.getVariableTypeInfo("counter");
162
+ expect(info).not.toBeNull();
163
+ expect(info?.baseType).toBe("u32");
164
+ expect(info?.bitWidth).toBe(32);
165
+ });
166
+
167
+ it("tracks const values", () => {
168
+ mockCallbacks.tryEvaluateConstant.mockReturnValue(10);
169
+ const source = `const u32 SIZE <- 10;`;
170
+ const tree = CNextSourceParser.parse(source).tree;
171
+
172
+ TypeRegistrationEngine.register(tree, mockCallbacks);
173
+
174
+ expect(CodeGenState.constValues.get("SIZE")).toBe(10);
175
+ });
176
+
177
+ it("requires string include for string types", () => {
178
+ const source = `string<64> message;`;
179
+ const tree = CNextSourceParser.parse(source).tree;
180
+
181
+ TypeRegistrationEngine.register(tree, mockCallbacks);
182
+
183
+ expect(mockCallbacks.requireInclude).toHaveBeenCalledWith("string");
184
+ });
185
+ });
186
+ });
@@ -0,0 +1,460 @@
1
+ /**
2
+ * Unit tests for VariableDeclHelper
3
+ *
4
+ * Issue #792: Tests for extracted variable declaration logic
5
+ */
6
+
7
+ import { describe, it, expect, beforeEach } from "vitest";
8
+ import VariableDeclHelper from "../VariableDeclHelper.js";
9
+ import CodeGenState from "../../../../state/CodeGenState.js";
10
+ import CNextSourceParser from "../../../../logic/parser/CNextSourceParser.js";
11
+ import * as Parser from "../../../../logic/parser/grammar/CNextParser.js";
12
+
13
+ /**
14
+ * Helper to parse a variable declaration from source code.
15
+ */
16
+ function parseVarDecl(source: string): Parser.VariableDeclarationContext {
17
+ const result = CNextSourceParser.parse(source);
18
+ const decl = result.tree.declaration(0);
19
+ const varDecl = decl?.variableDeclaration();
20
+ if (!varDecl) {
21
+ throw new Error(`Failed to parse variable declaration from: ${source}`);
22
+ }
23
+ return varDecl;
24
+ }
25
+
26
+ /**
27
+ * Helper to parse a type context from source code.
28
+ */
29
+ function parseType(source: string): Parser.TypeContext {
30
+ const varDecl = parseVarDecl(source);
31
+ return varDecl.type();
32
+ }
33
+
34
+ describe("VariableDeclHelper", () => {
35
+ beforeEach(() => {
36
+ CodeGenState.reset();
37
+ });
38
+
39
+ // ========================================================================
40
+ // Tier 1: Pure Utilities
41
+ // ========================================================================
42
+
43
+ describe("parseArrayTypeDimension", () => {
44
+ it("returns null for non-array types", () => {
45
+ const typeCtx = parseType("u8 x;");
46
+ expect(VariableDeclHelper.parseArrayTypeDimension(typeCtx)).toBeNull();
47
+ });
48
+
49
+ it("returns numeric dimension for literal array type", () => {
50
+ const typeCtx = parseType("u8[10] x;");
51
+ expect(VariableDeclHelper.parseArrayTypeDimension(typeCtx)).toBe(10);
52
+ });
53
+
54
+ it("returns null for empty array dimension", () => {
55
+ const typeCtx = parseType("u8[] x;");
56
+ expect(VariableDeclHelper.parseArrayTypeDimension(typeCtx)).toBeNull();
57
+ });
58
+
59
+ it("returns null for expression dimension", () => {
60
+ const typeCtx = parseType("u8[SIZE] x;");
61
+ expect(VariableDeclHelper.parseArrayTypeDimension(typeCtx)).toBeNull();
62
+ });
63
+ });
64
+
65
+ describe("parseFirstArrayDimension", () => {
66
+ it("returns null for empty array", () => {
67
+ expect(VariableDeclHelper.parseFirstArrayDimension([])).toBeNull();
68
+ });
69
+
70
+ it("returns null for empty dimension expression", () => {
71
+ const varDecl = parseVarDecl("u8 x[];");
72
+ const dims = varDecl.arrayDimension();
73
+ expect(VariableDeclHelper.parseFirstArrayDimension(dims)).toBeNull();
74
+ });
75
+
76
+ it("returns numeric value for literal dimension", () => {
77
+ // Note: arrayTypeDimension != arrayDimension, so we test with arrayDimension
78
+ const varDecl = parseVarDecl("u8 x[5];");
79
+ const arrayDims = varDecl.arrayDimension();
80
+ expect(VariableDeclHelper.parseFirstArrayDimension(arrayDims)).toBe(5);
81
+ });
82
+
83
+ it("returns null for expression dimension", () => {
84
+ const varDecl = parseVarDecl("u8 x[SIZE];");
85
+ const dims = varDecl.arrayDimension();
86
+ expect(VariableDeclHelper.parseFirstArrayDimension(dims)).toBeNull();
87
+ });
88
+ });
89
+
90
+ describe("extractBaseTypeName", () => {
91
+ it("extracts primitive type name", () => {
92
+ const typeCtx = parseType("u8 x;");
93
+ expect(VariableDeclHelper.extractBaseTypeName(typeCtx)).toBe("u8");
94
+ });
95
+
96
+ it("extracts user type name", () => {
97
+ const typeCtx = parseType("MyStruct x;");
98
+ expect(VariableDeclHelper.extractBaseTypeName(typeCtx)).toBe("MyStruct");
99
+ });
100
+
101
+ it("extracts primitive from array type", () => {
102
+ const typeCtx = parseType("u16[8] x;");
103
+ expect(VariableDeclHelper.extractBaseTypeName(typeCtx)).toBe("u16");
104
+ });
105
+
106
+ it("extracts user type from array type", () => {
107
+ const typeCtx = parseType("Point[4] x;");
108
+ expect(VariableDeclHelper.extractBaseTypeName(typeCtx)).toBe("Point");
109
+ });
110
+ });
111
+
112
+ // ========================================================================
113
+ // Tier 2: Simple Operations
114
+ // ========================================================================
115
+
116
+ describe("validateArrayDeclarationSyntax", () => {
117
+ it("allows C-Next style array syntax", () => {
118
+ const varDecl = parseVarDecl("u8[10] arr;");
119
+ const typeCtx = varDecl.type();
120
+ // Should not throw
121
+ expect(() => {
122
+ VariableDeclHelper.validateArrayDeclarationSyntax(
123
+ varDecl,
124
+ typeCtx,
125
+ "arr",
126
+ );
127
+ }).not.toThrow();
128
+ });
129
+
130
+ it("allows empty dimension for size inference", () => {
131
+ const varDecl = parseVarDecl("u8 arr[] <- [1, 2, 3];");
132
+ const typeCtx = varDecl.type();
133
+ expect(() => {
134
+ VariableDeclHelper.validateArrayDeclarationSyntax(
135
+ varDecl,
136
+ typeCtx,
137
+ "arr",
138
+ );
139
+ }).not.toThrow();
140
+ });
141
+
142
+ it("allows multi-dimensional C-style", () => {
143
+ const varDecl = parseVarDecl("u8 matrix[4][4];");
144
+ const typeCtx = varDecl.type();
145
+ expect(() => {
146
+ VariableDeclHelper.validateArrayDeclarationSyntax(
147
+ varDecl,
148
+ typeCtx,
149
+ "matrix",
150
+ );
151
+ }).not.toThrow();
152
+ });
153
+
154
+ it("allows string type with C-style", () => {
155
+ const varDecl = parseVarDecl("string<32> names[4];");
156
+ const typeCtx = varDecl.type();
157
+ expect(() => {
158
+ VariableDeclHelper.validateArrayDeclarationSyntax(
159
+ varDecl,
160
+ typeCtx,
161
+ "names",
162
+ );
163
+ }).not.toThrow();
164
+ });
165
+
166
+ it("rejects C-style single dimension for primitives", () => {
167
+ const varDecl = parseVarDecl("u8 arr[10];");
168
+ const typeCtx = varDecl.type();
169
+ expect(() => {
170
+ VariableDeclHelper.validateArrayDeclarationSyntax(
171
+ varDecl,
172
+ typeCtx,
173
+ "arr",
174
+ );
175
+ }).toThrow(/C-style array declaration is not allowed/);
176
+ });
177
+ });
178
+
179
+ describe("validateIntegerInitializer", () => {
180
+ it("does nothing for non-integer types", () => {
181
+ const varDecl = parseVarDecl("f32 x <- 1.5;");
182
+ // Should not throw
183
+ expect(() => {
184
+ VariableDeclHelper.validateIntegerInitializer(varDecl, "f32", {
185
+ getExpressionType: () => "f32",
186
+ });
187
+ }).not.toThrow();
188
+ });
189
+
190
+ it("accepts valid integer literal", () => {
191
+ const varDecl = parseVarDecl("u8 x <- 255;");
192
+ expect(() => {
193
+ VariableDeclHelper.validateIntegerInitializer(varDecl, "u8", {
194
+ getExpressionType: () => "u8",
195
+ });
196
+ }).not.toThrow();
197
+ });
198
+
199
+ it("throws for overflow in literal", () => {
200
+ const varDecl = parseVarDecl("u8 x <- 256;");
201
+ expect(() => {
202
+ VariableDeclHelper.validateIntegerInitializer(varDecl, "u8", {
203
+ getExpressionType: () => "u8",
204
+ });
205
+ }).toThrow();
206
+ });
207
+ });
208
+
209
+ describe("finalizeCppClassAssignments", () => {
210
+ beforeEach(() => {
211
+ CodeGenState.reset();
212
+ });
213
+
214
+ it("returns simple declaration with semicolon when no pending assignments", () => {
215
+ const typeCtx = parseType("MyClass x;");
216
+ const result = VariableDeclHelper.finalizeCppClassAssignments(
217
+ typeCtx,
218
+ "x",
219
+ "MyClass x",
220
+ { getTypeName: () => "MyClass" },
221
+ );
222
+ expect(result).toBe("MyClass x;");
223
+ });
224
+
225
+ it("appends assignments in function body", () => {
226
+ CodeGenState.inFunctionBody = true;
227
+ CodeGenState.pendingCppClassAssignments = ["field1 = value1"];
228
+
229
+ const typeCtx = parseType("MyClass x;");
230
+ const result = VariableDeclHelper.finalizeCppClassAssignments(
231
+ typeCtx,
232
+ "x",
233
+ "MyClass x",
234
+ { getTypeName: () => "MyClass" },
235
+ );
236
+
237
+ expect(result).toBe("MyClass x;\nx.field1 = value1");
238
+ expect(CodeGenState.pendingCppClassAssignments).toHaveLength(0);
239
+ });
240
+
241
+ it("throws error at global scope with pending assignments", () => {
242
+ CodeGenState.inFunctionBody = false;
243
+ CodeGenState.pendingCppClassAssignments = ["field1 = value1"];
244
+
245
+ const typeCtx = parseType("MyClass x;");
246
+ expect(() => {
247
+ VariableDeclHelper.finalizeCppClassAssignments(
248
+ typeCtx,
249
+ "x",
250
+ "MyClass x",
251
+ { getTypeName: () => "MyClass" },
252
+ );
253
+ }).toThrow(/global scope/);
254
+ });
255
+ });
256
+
257
+ // ========================================================================
258
+ // Tier 3: Complex Operations
259
+ // ========================================================================
260
+
261
+ describe("getArrayTypeDimension", () => {
262
+ it("returns empty string for non-array type", () => {
263
+ const typeCtx = parseType("u8 x;");
264
+ const result = VariableDeclHelper.getArrayTypeDimension(typeCtx, {
265
+ tryEvaluateConstant: () => undefined,
266
+ generateExpression: (ctx) => ctx.getText(),
267
+ });
268
+ expect(result).toBe("");
269
+ });
270
+
271
+ it("returns dimension string for literal", () => {
272
+ const typeCtx = parseType("u8[10] x;");
273
+ const result = VariableDeclHelper.getArrayTypeDimension(typeCtx, {
274
+ tryEvaluateConstant: () => 10,
275
+ generateExpression: (ctx) => ctx.getText(),
276
+ });
277
+ expect(result).toBe("[10]");
278
+ });
279
+
280
+ it("returns empty bracket for unsized dimension", () => {
281
+ const typeCtx = parseType("u8[] x;");
282
+ const result = VariableDeclHelper.getArrayTypeDimension(typeCtx, {
283
+ tryEvaluateConstant: () => undefined,
284
+ generateExpression: (ctx) => ctx.getText(),
285
+ });
286
+ expect(result).toBe("[]");
287
+ });
288
+
289
+ it("falls back to expression for non-const", () => {
290
+ const typeCtx = parseType("u8[SIZE] x;");
291
+ const result = VariableDeclHelper.getArrayTypeDimension(typeCtx, {
292
+ tryEvaluateConstant: () => undefined,
293
+ generateExpression: () => "SIZE",
294
+ });
295
+ expect(result).toBe("[SIZE]");
296
+ });
297
+ });
298
+
299
+ describe("handleArrayDeclaration", () => {
300
+ beforeEach(() => {
301
+ CodeGenState.reset();
302
+ });
303
+
304
+ it("returns not handled for non-array", () => {
305
+ const varDecl = parseVarDecl("u8 x;");
306
+ const typeCtx = varDecl.type();
307
+ const result = VariableDeclHelper.handleArrayDeclaration(
308
+ varDecl,
309
+ typeCtx,
310
+ "x",
311
+ "uint8_t x",
312
+ {
313
+ generateExpression: (ctx) => ctx.getText(),
314
+ getTypeName: () => "u8",
315
+ generateArrayDimensions: () => "",
316
+ tryEvaluateConstant: () => undefined,
317
+ },
318
+ );
319
+ expect(result.handled).toBe(false);
320
+ expect(result.isArray).toBe(false);
321
+ });
322
+
323
+ it("returns array with dimension for C-Next style", () => {
324
+ const varDecl = parseVarDecl("u8[10] arr;");
325
+ const typeCtx = varDecl.type();
326
+ const result = VariableDeclHelper.handleArrayDeclaration(
327
+ varDecl,
328
+ typeCtx,
329
+ "arr",
330
+ "uint8_t arr",
331
+ {
332
+ generateExpression: (ctx) => ctx.getText(),
333
+ getTypeName: () => "u8",
334
+ generateArrayDimensions: () => "",
335
+ tryEvaluateConstant: () => 10,
336
+ },
337
+ );
338
+ expect(result.handled).toBe(false);
339
+ expect(result.isArray).toBe(true);
340
+ expect(result.decl).toBe("uint8_t arr[10]");
341
+ });
342
+ });
343
+
344
+ describe("generateVariableInitializer", () => {
345
+ beforeEach(() => {
346
+ CodeGenState.reset();
347
+ });
348
+
349
+ it("returns zero initializer for uninitialized variable", () => {
350
+ const varDecl = parseVarDecl("u8 x;");
351
+ const typeCtx = varDecl.type();
352
+ const result = VariableDeclHelper.generateVariableInitializer(
353
+ varDecl,
354
+ typeCtx,
355
+ "uint8_t x",
356
+ false,
357
+ {
358
+ generateExpression: (ctx) => ctx.getText(),
359
+ getTypeName: () => "u8",
360
+ getZeroInitializer: () => "0",
361
+ getExpressionType: () => "u8",
362
+ },
363
+ );
364
+ expect(result).toBe("uint8_t x = 0");
365
+ });
366
+
367
+ it("generates expression for initialized variable", () => {
368
+ const varDecl = parseVarDecl("u8 x <- 42;");
369
+ const typeCtx = varDecl.type();
370
+ const result = VariableDeclHelper.generateVariableInitializer(
371
+ varDecl,
372
+ typeCtx,
373
+ "uint8_t x",
374
+ false,
375
+ {
376
+ generateExpression: () => "42",
377
+ getTypeName: () => "u8",
378
+ getZeroInitializer: () => "0",
379
+ getExpressionType: () => "u8",
380
+ },
381
+ );
382
+ expect(result).toBe("uint8_t x = 42");
383
+ });
384
+ });
385
+
386
+ // ========================================================================
387
+ // Tier 4: Orchestrators
388
+ // ========================================================================
389
+
390
+ describe("generateConstructorDecl", () => {
391
+ beforeEach(() => {
392
+ CodeGenState.reset();
393
+ // Set up a const variable in the type registry for constructor argument
394
+ CodeGenState.setVariableTypeInfo("pinConst", {
395
+ baseType: "u8",
396
+ bitWidth: 8,
397
+ isArray: false,
398
+ arrayDimensions: [],
399
+ isConst: true,
400
+ });
401
+ });
402
+
403
+ it("generates constructor declaration with const args", () => {
404
+ const varDecl = parseVarDecl("MAX31856 thermo(pinConst);");
405
+ const argListCtx = varDecl.constructorArgumentList()!;
406
+
407
+ const result = VariableDeclHelper.generateConstructorDecl(
408
+ varDecl,
409
+ argListCtx,
410
+ { generateType: () => "MAX31856" },
411
+ );
412
+
413
+ expect(result).toBe("MAX31856 thermo(pinConst);");
414
+ });
415
+
416
+ it("throws for undeclared constructor argument", () => {
417
+ const varDecl = parseVarDecl("MAX31856 thermo(unknownVar);");
418
+ const argListCtx = varDecl.constructorArgumentList()!;
419
+
420
+ expect(() => {
421
+ VariableDeclHelper.generateConstructorDecl(varDecl, argListCtx, {
422
+ generateType: () => "MAX31856",
423
+ });
424
+ }).toThrow(/not declared/);
425
+ });
426
+
427
+ it("throws for non-const constructor argument", () => {
428
+ CodeGenState.setVariableTypeInfo("nonConstVar", {
429
+ baseType: "u8",
430
+ bitWidth: 8,
431
+ isArray: false,
432
+ arrayDimensions: [],
433
+ isConst: false,
434
+ });
435
+
436
+ const varDecl = parseVarDecl("MAX31856 thermo(nonConstVar);");
437
+ const argListCtx = varDecl.constructorArgumentList()!;
438
+
439
+ expect(() => {
440
+ VariableDeclHelper.generateConstructorDecl(varDecl, argListCtx, {
441
+ generateType: () => "MAX31856",
442
+ });
443
+ }).toThrow(/must be const/);
444
+ });
445
+
446
+ it("tracks the variable in type registry", () => {
447
+ const varDecl = parseVarDecl("MAX31856 thermo(pinConst);");
448
+ const argListCtx = varDecl.constructorArgumentList()!;
449
+
450
+ VariableDeclHelper.generateConstructorDecl(varDecl, argListCtx, {
451
+ generateType: () => "MAX31856",
452
+ });
453
+
454
+ const typeInfo = CodeGenState.getVariableTypeInfo("thermo");
455
+ expect(typeInfo).toBeDefined();
456
+ expect(typeInfo!.baseType).toBe("MAX31856");
457
+ expect(typeInfo!.isExternalCppType).toBe(true);
458
+ });
459
+ });
460
+ });
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Callbacks required for argument generation.
3
+ * These need CodeGenerator context and cannot be replaced with static state.
4
+ *
5
+ * Issue #794: Extracted from CodeGenerator to reduce file size.
6
+ */
7
+
8
+ import * as Parser from "../../../../logic/parser/grammar/CNextParser.js";
9
+
10
+ interface IArgumentGeneratorCallbacks {
11
+ /** Determine if expression is an lvalue (member access or array access) */
12
+ getLvalueType: (ctx: Parser.ExpressionContext) => "member" | "array" | null;
13
+
14
+ /** Check if member access is to an array field */
15
+ getMemberAccessArrayStatus: (
16
+ ctx: Parser.ExpressionContext,
17
+ ) => "array" | "not-array" | "unknown";
18
+
19
+ /** Check if C++ mode needs temp variable for type conversion */
20
+ needsCppMemberConversion: (
21
+ ctx: Parser.ExpressionContext,
22
+ targetType?: string,
23
+ ) => boolean;
24
+
25
+ /** Check if expression is subscript access on a string variable */
26
+ isStringSubscriptAccess: (ctx: Parser.ExpressionContext) => boolean;
27
+
28
+ /** Generate expression code */
29
+ generateExpression: (ctx: Parser.ExpressionContext) => string;
30
+ }
31
+
32
+ export default IArgumentGeneratorCallbacks;