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
@@ -5,14 +5,14 @@
5
5
  * Extracts common lookup patterns for improved testability.
6
6
  */
7
7
 
8
- import ESymbolKind from "../../../../utils/types/ESymbolKind.js";
8
+ import TSymbolKind from "../../../types/symbol-kinds/TSymbolKind.js";
9
9
  import ESourceLanguage from "../../../../utils/types/ESourceLanguage.js";
10
10
 
11
11
  /**
12
12
  * Symbol interface for lookups
13
13
  */
14
14
  interface ISymbol {
15
- kind: ESymbolKind;
15
+ kind: TSymbolKind;
16
16
  sourceLanguage: ESourceLanguage;
17
17
  }
18
18
 
@@ -31,7 +31,7 @@ class SymbolLookupHelper {
31
31
  static hasSymbolWithKindAndLanguage(
32
32
  symbolTable: ISymbolTable | null | undefined,
33
33
  name: string,
34
- kind: ESymbolKind,
34
+ kind: TSymbolKind,
35
35
  languages: ESourceLanguage[],
36
36
  ): boolean {
37
37
  if (!symbolTable) return false;
@@ -53,7 +53,7 @@ class SymbolLookupHelper {
53
53
  return SymbolLookupHelper.hasSymbolWithKindAndLanguage(
54
54
  symbolTable,
55
55
  typeName,
56
- ESymbolKind.Enum,
56
+ "enum",
57
57
  [ESourceLanguage.Cpp],
58
58
  );
59
59
  }
@@ -69,7 +69,7 @@ class SymbolLookupHelper {
69
69
  return SymbolLookupHelper.hasSymbolWithKindAndLanguage(
70
70
  symbolTable,
71
71
  name,
72
- ESymbolKind.Function,
72
+ "function",
73
73
  [ESourceLanguage.C, ESourceLanguage.Cpp],
74
74
  );
75
75
  }
@@ -84,7 +84,7 @@ class SymbolLookupHelper {
84
84
  if (!symbolTable) return false;
85
85
 
86
86
  const symbols = symbolTable.getOverloads(name);
87
- return symbols.some((sym) => sym.kind === ESymbolKind.Namespace);
87
+ return symbols.some((sym) => sym.kind === "namespace");
88
88
  }
89
89
 
90
90
  /**
@@ -99,11 +99,7 @@ class SymbolLookupHelper {
99
99
  if (!symbolTable) return false;
100
100
 
101
101
  const symbols = symbolTable.getOverloads(typeName);
102
- const cppTypeKinds = new Set([
103
- ESymbolKind.Struct,
104
- ESymbolKind.Class,
105
- ESymbolKind.Type,
106
- ]);
102
+ const cppTypeKinds = new Set<TSymbolKind>(["struct", "class", "type"]);
107
103
 
108
104
  return symbols.some(
109
105
  (sym) =>
@@ -123,7 +119,7 @@ class SymbolLookupHelper {
123
119
  return SymbolLookupHelper.hasSymbolWithKindAndLanguage(
124
120
  symbolTable,
125
121
  name,
126
- ESymbolKind.Function,
122
+ "function",
127
123
  [ESourceLanguage.CNext],
128
124
  );
129
125
  }
@@ -0,0 +1,520 @@
1
+ /**
2
+ * Type Registration Engine
3
+ * Issue #791: Extracted from CodeGenerator to reduce file size
4
+ *
5
+ * Registers variable types from AST before code generation.
6
+ * This ensures type information is available for .length and
7
+ * other type-dependent operations regardless of declaration order.
8
+ */
9
+
10
+ import * as Parser from "../../../logic/parser/grammar/CNextParser";
11
+ import TIncludeHeader from "../generators/TIncludeHeader";
12
+ import TOverflowBehavior from "../types/TOverflowBehavior";
13
+ import TYPE_WIDTH from "../types/TYPE_WIDTH";
14
+ import CodeGenState from "../../../state/CodeGenState";
15
+ import TypeRegistrationUtils from "../TypeRegistrationUtils";
16
+ import QualifiedNameGenerator from "../utils/QualifiedNameGenerator";
17
+ import ArrayDimensionParser from "./ArrayDimensionParser";
18
+
19
+ /**
20
+ * Callbacks required for type registration.
21
+ * Minimizes coupling to CodeGenerator.
22
+ */
23
+ interface ITypeRegistrationCallbacks {
24
+ /** Evaluate a compile-time constant expression */
25
+ tryEvaluateConstant: (ctx: Parser.ExpressionContext) => number | undefined;
26
+ /** Request an include header */
27
+ requireInclude: (header: TIncludeHeader) => void;
28
+ /** Resolve qualified type names (optional, for C++ namespace support) */
29
+ resolveQualifiedType?: (identifiers: string[]) => string;
30
+ }
31
+
32
+ /**
33
+ * Static class that registers variable types from the AST.
34
+ * Called during Stage 2 of code generation, before generating any code.
35
+ */
36
+ class TypeRegistrationEngine {
37
+ // ============================================================================
38
+ // Public entry points
39
+ // ============================================================================
40
+
41
+ /**
42
+ * Entry point: Register all variable types from the program tree.
43
+ */
44
+ static register(
45
+ tree: Parser.ProgramContext,
46
+ callbacks: ITypeRegistrationCallbacks,
47
+ ): void {
48
+ for (const decl of tree.declaration()) {
49
+ if (decl.variableDeclaration()) {
50
+ TypeRegistrationEngine.registerGlobalVariable(
51
+ decl.variableDeclaration()!,
52
+ callbacks,
53
+ );
54
+ }
55
+ if (decl.scopeDeclaration()) {
56
+ TypeRegistrationEngine.registerScopeMemberTypes(
57
+ decl.scopeDeclaration()!,
58
+ callbacks,
59
+ );
60
+ }
61
+ }
62
+ }
63
+
64
+ /**
65
+ * Register a global variable's type information.
66
+ */
67
+ static registerGlobalVariable(
68
+ varDecl: Parser.VariableDeclarationContext,
69
+ callbacks: ITypeRegistrationCallbacks,
70
+ ): void {
71
+ TypeRegistrationEngine._trackVariableType(varDecl, callbacks);
72
+ if (varDecl.constModifier() && varDecl.expression()) {
73
+ const constName = varDecl.IDENTIFIER().getText();
74
+ const constValue = callbacks.tryEvaluateConstant(varDecl.expression()!);
75
+ if (constValue !== undefined) {
76
+ CodeGenState.constValues.set(constName, constValue);
77
+ }
78
+ }
79
+ }
80
+
81
+ /**
82
+ * Register type information for all members in a scope.
83
+ */
84
+ static registerScopeMemberTypes(
85
+ scopeDecl: Parser.ScopeDeclarationContext,
86
+ callbacks: ITypeRegistrationCallbacks,
87
+ ): void {
88
+ const scopeName = scopeDecl.IDENTIFIER().getText();
89
+ const savedScope = CodeGenState.currentScope;
90
+ CodeGenState.currentScope = scopeName;
91
+
92
+ for (const member of scopeDecl.scopeMember()) {
93
+ if (member.variableDeclaration()) {
94
+ const varDecl = member.variableDeclaration()!;
95
+ const varName = varDecl.IDENTIFIER().getText();
96
+ const fullName = QualifiedNameGenerator.forMember(scopeName, varName);
97
+ TypeRegistrationEngine._trackVariableTypeWithName(
98
+ varDecl,
99
+ fullName,
100
+ callbacks,
101
+ );
102
+ }
103
+ }
104
+
105
+ CodeGenState.currentScope = savedScope;
106
+ }
107
+
108
+ // ============================================================================
109
+ // Static helper methods (public)
110
+ // ============================================================================
111
+
112
+ /**
113
+ * Parse array dimension from arrayType context.
114
+ * Returns the numeric size, or undefined if not a simple integer literal.
115
+ */
116
+ static parseArrayTypeDimension(
117
+ arrayTypeCtx: Parser.ArrayTypeContext,
118
+ ): number | undefined {
119
+ const dims = arrayTypeCtx.arrayTypeDimension();
120
+ if (dims.length === 0) {
121
+ return undefined;
122
+ }
123
+ const sizeExpr = dims[0].expression();
124
+ if (!sizeExpr) {
125
+ return undefined;
126
+ }
127
+ const size = Number.parseInt(sizeExpr.getText(), 10);
128
+ return Number.isNaN(size) ? undefined : size;
129
+ }
130
+
131
+ /**
132
+ * Resolve base type name from a type context.
133
+ * Handles primitive, scoped (this.Type), global, qualified, and user types.
134
+ * Returns null for special types like string<N> that need separate handling.
135
+ */
136
+ static resolveBaseType(
137
+ typeCtx: Parser.TypeContext,
138
+ currentScope: string | null,
139
+ ): string | null {
140
+ return TypeRegistrationEngine._resolveBaseTypeWithCallbacks(
141
+ typeCtx,
142
+ currentScope,
143
+ );
144
+ }
145
+
146
+ /**
147
+ * Internal: Resolve base type with optional callback for qualified types.
148
+ * When resolveQualifiedType callback is provided, uses it for C++ namespace support.
149
+ */
150
+ private static _resolveBaseTypeWithCallbacks(
151
+ typeCtx: Parser.TypeContext,
152
+ currentScope: string | null,
153
+ callbacks?: ITypeRegistrationCallbacks,
154
+ ): string | null {
155
+ if (typeCtx.primitiveType()) {
156
+ return typeCtx.primitiveType()!.getText();
157
+ }
158
+
159
+ if (typeCtx.scopedType()) {
160
+ // ADR-016: Handle this.Type for scoped types (e.g., this.State -> Motor_State)
161
+ const typeName = typeCtx.scopedType()!.IDENTIFIER().getText();
162
+ return currentScope ? `${currentScope}_${typeName}` : typeName;
163
+ }
164
+
165
+ if (typeCtx.globalType()) {
166
+ // Issue #478: Handle global.Type for global types inside scope
167
+ return typeCtx.globalType()!.IDENTIFIER().getText();
168
+ }
169
+
170
+ if (typeCtx.qualifiedType()) {
171
+ // ADR-016: Handle Scope.Type from outside scope
172
+ // Issue #388: Also handles C++ namespace types when callback is provided
173
+ const identifiers = typeCtx.qualifiedType()!.IDENTIFIER();
174
+ const identifierNames = identifiers.map((id) => id.getText());
175
+
176
+ // Use callback if provided for C++ namespace support
177
+ if (callbacks?.resolveQualifiedType) {
178
+ return callbacks.resolveQualifiedType(identifierNames);
179
+ }
180
+ return identifierNames.join("_");
181
+ }
182
+
183
+ if (typeCtx.userType()) {
184
+ return typeCtx.userType()!.getText();
185
+ }
186
+
187
+ // String types and array types are handled separately
188
+ return null;
189
+ }
190
+
191
+ // ============================================================================
192
+ // Variable tracking methods
193
+ // ============================================================================
194
+
195
+ /**
196
+ * Track a single variable declaration.
197
+ * Used for local variable tracking during code generation.
198
+ */
199
+ static trackVariable(
200
+ varDecl: Parser.VariableDeclarationContext,
201
+ callbacks: ITypeRegistrationCallbacks,
202
+ ): void {
203
+ TypeRegistrationEngine._trackVariableType(varDecl, callbacks);
204
+ }
205
+
206
+ private static _trackVariableType(
207
+ varDecl: Parser.VariableDeclarationContext,
208
+ callbacks: ITypeRegistrationCallbacks,
209
+ ): void {
210
+ const name = varDecl.IDENTIFIER().getText();
211
+ TypeRegistrationEngine._trackVariableTypeWithName(varDecl, name, callbacks);
212
+ }
213
+
214
+ private static _trackVariableTypeWithName(
215
+ varDecl: Parser.VariableDeclarationContext,
216
+ registryName: string,
217
+ callbacks: ITypeRegistrationCallbacks,
218
+ ): void {
219
+ const typeCtx = varDecl.type();
220
+ const arrayDim = varDecl.arrayDimension();
221
+ const isConst = varDecl.constModifier() !== null;
222
+
223
+ const overflowMod = varDecl.overflowModifier();
224
+ const overflowBehavior: TOverflowBehavior =
225
+ overflowMod?.getText() === "wrap" ? "wrap" : "clamp";
226
+
227
+ const isAtomic = varDecl.atomicModifier() !== null;
228
+
229
+ if (
230
+ TypeRegistrationEngine._tryRegisterStringType(
231
+ registryName,
232
+ typeCtx,
233
+ arrayDim,
234
+ isConst,
235
+ overflowBehavior,
236
+ isAtomic,
237
+ callbacks,
238
+ )
239
+ ) {
240
+ return;
241
+ }
242
+
243
+ if (typeCtx.arrayType()) {
244
+ TypeRegistrationEngine._registerArrayTypeVariable(
245
+ registryName,
246
+ typeCtx.arrayType()!,
247
+ arrayDim,
248
+ isConst,
249
+ overflowBehavior,
250
+ isAtomic,
251
+ callbacks,
252
+ );
253
+ return;
254
+ }
255
+
256
+ const baseType = TypeRegistrationEngine._resolveBaseTypeWithCallbacks(
257
+ typeCtx,
258
+ CodeGenState.currentScope,
259
+ callbacks,
260
+ );
261
+ if (!baseType) {
262
+ return;
263
+ }
264
+
265
+ if (
266
+ TypeRegistrationEngine._tryRegisterEnumOrBitmapType(
267
+ registryName,
268
+ baseType,
269
+ isConst,
270
+ arrayDim,
271
+ overflowBehavior,
272
+ isAtomic,
273
+ callbacks,
274
+ )
275
+ ) {
276
+ return;
277
+ }
278
+
279
+ TypeRegistrationEngine._registerStandardType(
280
+ registryName,
281
+ baseType,
282
+ arrayDim,
283
+ isConst,
284
+ overflowBehavior,
285
+ isAtomic,
286
+ callbacks,
287
+ );
288
+ }
289
+
290
+ // ============================================================================
291
+ // String type registration
292
+ // ============================================================================
293
+
294
+ private static _tryRegisterStringType(
295
+ registryName: string,
296
+ typeCtx: Parser.TypeContext,
297
+ arrayDim: Parser.ArrayDimensionContext[] | null,
298
+ isConst: boolean,
299
+ overflowBehavior: TOverflowBehavior,
300
+ isAtomic: boolean,
301
+ callbacks: ITypeRegistrationCallbacks,
302
+ ): boolean {
303
+ const stringCtx = typeCtx.stringType();
304
+ if (!stringCtx) {
305
+ return false;
306
+ }
307
+
308
+ const intLiteral = stringCtx.INTEGER_LITERAL();
309
+ if (!intLiteral) {
310
+ return false;
311
+ }
312
+
313
+ const capacity = Number.parseInt(intLiteral.getText(), 10);
314
+ callbacks.requireInclude("string");
315
+ const stringDim = capacity + 1;
316
+
317
+ const additionalDims = ArrayDimensionParser.parseSimpleDimensions(arrayDim);
318
+ const allDims =
319
+ additionalDims.length > 0 ? [...additionalDims, stringDim] : [stringDim];
320
+
321
+ CodeGenState.setVariableTypeInfo(registryName, {
322
+ baseType: "char",
323
+ bitWidth: 8,
324
+ isArray: true,
325
+ arrayDimensions: allDims,
326
+ isConst,
327
+ isString: true,
328
+ stringCapacity: capacity,
329
+ overflowBehavior,
330
+ isAtomic,
331
+ });
332
+ return true;
333
+ }
334
+
335
+ // ============================================================================
336
+ // Array and standard type registration
337
+ // ============================================================================
338
+
339
+ private static _registerArrayTypeVariable(
340
+ registryName: string,
341
+ arrayTypeCtx: Parser.ArrayTypeContext,
342
+ arrayDim: Parser.ArrayDimensionContext[] | null,
343
+ isConst: boolean,
344
+ overflowBehavior: TOverflowBehavior,
345
+ isAtomic: boolean,
346
+ callbacks: ITypeRegistrationCallbacks,
347
+ ): void {
348
+ let baseType = "";
349
+ let bitWidth = 0;
350
+
351
+ if (arrayTypeCtx.primitiveType()) {
352
+ baseType = arrayTypeCtx.primitiveType()!.getText();
353
+ bitWidth = TYPE_WIDTH[baseType] || 0;
354
+ } else if (arrayTypeCtx.userType()) {
355
+ baseType = arrayTypeCtx.userType()!.getText();
356
+
357
+ const combinedArrayDim = arrayDim ?? [];
358
+ if (
359
+ TypeRegistrationEngine._tryRegisterEnumOrBitmapType(
360
+ registryName,
361
+ baseType,
362
+ isConst,
363
+ combinedArrayDim,
364
+ overflowBehavior,
365
+ isAtomic,
366
+ callbacks,
367
+ )
368
+ ) {
369
+ const existingInfo = CodeGenState.getVariableTypeInfo(registryName);
370
+ if (existingInfo) {
371
+ const arrayTypeDim =
372
+ TypeRegistrationEngine.parseArrayTypeDimension(arrayTypeCtx);
373
+ const allDims = arrayTypeDim
374
+ ? [arrayTypeDim, ...(existingInfo.arrayDimensions ?? [])]
375
+ : existingInfo.arrayDimensions;
376
+ CodeGenState.setVariableTypeInfo(registryName, {
377
+ ...existingInfo,
378
+ isArray: true,
379
+ arrayDimensions: allDims,
380
+ });
381
+ }
382
+ return;
383
+ }
384
+ }
385
+
386
+ if (!baseType) {
387
+ return;
388
+ }
389
+
390
+ const arrayDimensions = TypeRegistrationEngine._collectArrayDimensions(
391
+ arrayTypeCtx,
392
+ arrayDim,
393
+ callbacks,
394
+ );
395
+
396
+ CodeGenState.setVariableTypeInfo(registryName, {
397
+ baseType,
398
+ bitWidth,
399
+ isArray: true,
400
+ arrayDimensions: arrayDimensions.length > 0 ? arrayDimensions : undefined,
401
+ isConst,
402
+ overflowBehavior,
403
+ isAtomic,
404
+ });
405
+ }
406
+
407
+ private static _collectArrayDimensions(
408
+ arrayTypeCtx: Parser.ArrayTypeContext,
409
+ arrayDim: Parser.ArrayDimensionContext[] | null,
410
+ callbacks: ITypeRegistrationCallbacks,
411
+ ): number[] {
412
+ const arrayDimensions: number[] = [];
413
+
414
+ for (const dim of arrayTypeCtx.arrayTypeDimension()) {
415
+ const sizeExpr = dim.expression();
416
+ if (sizeExpr) {
417
+ const size = Number.parseInt(sizeExpr.getText(), 10);
418
+ if (!Number.isNaN(size)) {
419
+ arrayDimensions.push(size);
420
+ }
421
+ }
422
+ }
423
+
424
+ const additionalDims = TypeRegistrationEngine._evaluateArrayDimensions(
425
+ arrayDim,
426
+ callbacks,
427
+ );
428
+ if (additionalDims) {
429
+ arrayDimensions.push(...additionalDims);
430
+ }
431
+
432
+ return arrayDimensions;
433
+ }
434
+
435
+ private static _evaluateArrayDimensions(
436
+ arrayDim: Parser.ArrayDimensionContext[] | null,
437
+ _callbacks: ITypeRegistrationCallbacks,
438
+ ): number[] | undefined {
439
+ return ArrayDimensionParser.parseAllDimensions(arrayDim, {
440
+ constValues: CodeGenState.constValues,
441
+ typeWidths: TYPE_WIDTH,
442
+ isKnownStruct: (name) => CodeGenState.isKnownStruct(name),
443
+ });
444
+ }
445
+
446
+ private static _registerStandardType(
447
+ registryName: string,
448
+ baseType: string,
449
+ arrayDim: Parser.ArrayDimensionContext[] | null,
450
+ isConst: boolean,
451
+ overflowBehavior: TOverflowBehavior,
452
+ isAtomic: boolean,
453
+ callbacks: ITypeRegistrationCallbacks,
454
+ ): void {
455
+ const bitWidth = TYPE_WIDTH[baseType] || 0;
456
+ const isArray = arrayDim !== null && arrayDim.length > 0;
457
+ const arrayDimensions = isArray
458
+ ? TypeRegistrationEngine._evaluateArrayDimensions(arrayDim, callbacks)
459
+ : undefined;
460
+
461
+ CodeGenState.setVariableTypeInfo(registryName, {
462
+ baseType,
463
+ bitWidth,
464
+ isArray,
465
+ arrayDimensions: isArray ? arrayDimensions : undefined,
466
+ isConst,
467
+ overflowBehavior,
468
+ isAtomic,
469
+ });
470
+ }
471
+
472
+ // ============================================================================
473
+ // Enum/bitmap type registration
474
+ // ============================================================================
475
+
476
+ private static _tryRegisterEnumOrBitmapType(
477
+ name: string,
478
+ baseType: string,
479
+ isConst: boolean,
480
+ arrayDim: Parser.ArrayDimensionContext[] | null,
481
+ overflowBehavior: TOverflowBehavior,
482
+ isAtomic: boolean,
483
+ callbacks: ITypeRegistrationCallbacks,
484
+ ): boolean {
485
+ const registrationOptions = {
486
+ name,
487
+ baseType,
488
+ isConst,
489
+ overflowBehavior,
490
+ isAtomic,
491
+ };
492
+
493
+ if (
494
+ TypeRegistrationUtils.tryRegisterEnumType(
495
+ CodeGenState.symbols!,
496
+ registrationOptions,
497
+ )
498
+ ) {
499
+ return true;
500
+ }
501
+
502
+ const bitmapDimensions = TypeRegistrationEngine._evaluateArrayDimensions(
503
+ arrayDim,
504
+ callbacks,
505
+ );
506
+ if (
507
+ TypeRegistrationUtils.tryRegisterBitmapType(
508
+ CodeGenState.symbols!,
509
+ registrationOptions,
510
+ bitmapDimensions,
511
+ )
512
+ ) {
513
+ return true;
514
+ }
515
+
516
+ return false;
517
+ }
518
+ }
519
+
520
+ export default TypeRegistrationEngine;