c-next 0.1.70 → 0.1.72

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 (205) 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 +180 -63
  6. package/src/transpiler/logic/analysis/FunctionCallAnalyzer.ts +1 -2
  7. package/src/transpiler/logic/analysis/InitializationAnalyzer.ts +1 -2
  8. package/src/transpiler/logic/analysis/PassByValueAnalyzer.ts +51 -2
  9. package/src/transpiler/logic/analysis/__tests__/FunctionCallAnalyzer.test.ts +18 -12
  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/logic/symbols/SymbolTable.ts +729 -265
  13. package/src/transpiler/logic/symbols/SymbolUtils.ts +2 -2
  14. package/src/transpiler/logic/symbols/__tests__/SymbolTable.test.ts +415 -751
  15. package/src/transpiler/logic/symbols/c/__tests__/CResolver.integration.test.ts +573 -0
  16. package/src/transpiler/logic/symbols/c/__tests__/testHelpers.ts +20 -0
  17. package/src/transpiler/logic/symbols/c/collectors/EnumCollector.ts +82 -0
  18. package/src/transpiler/logic/symbols/c/collectors/FunctionCollector.ts +106 -0
  19. package/src/transpiler/logic/symbols/c/collectors/StructCollector.ts +173 -0
  20. package/src/transpiler/logic/symbols/c/collectors/TypedefCollector.ts +35 -0
  21. package/src/transpiler/logic/symbols/c/collectors/VariableCollector.ts +80 -0
  22. package/src/transpiler/logic/symbols/c/index.ts +333 -0
  23. package/src/transpiler/logic/symbols/c/utils/DeclaratorUtils.ts +269 -0
  24. package/src/transpiler/logic/symbols/cnext/__tests__/BitmapCollector.test.ts +50 -11
  25. package/src/transpiler/logic/symbols/cnext/__tests__/CNextResolver.integration.test.ts +45 -34
  26. package/src/transpiler/logic/symbols/cnext/__tests__/EnumCollector.test.ts +30 -13
  27. package/src/transpiler/logic/symbols/cnext/__tests__/FunctionCollector.test.ts +279 -64
  28. package/src/transpiler/logic/symbols/cnext/__tests__/RegisterCollector.test.ts +60 -13
  29. package/src/transpiler/logic/symbols/cnext/__tests__/ScopeCollector.test.ts +40 -37
  30. package/src/transpiler/logic/symbols/cnext/__tests__/StructCollector.test.ts +131 -45
  31. package/src/transpiler/logic/symbols/cnext/__tests__/TSymbolInfoAdapter.test.ts +223 -139
  32. package/src/transpiler/logic/symbols/cnext/__tests__/VariableCollector.test.ts +79 -25
  33. package/src/transpiler/logic/symbols/cnext/__tests__/testUtils.ts +53 -0
  34. package/src/transpiler/logic/symbols/cnext/adapters/TSymbolInfoAdapter.ts +83 -43
  35. package/src/transpiler/logic/symbols/cnext/collectors/BitmapCollector.ts +14 -13
  36. package/src/transpiler/logic/symbols/cnext/collectors/EnumCollector.ts +11 -10
  37. package/src/transpiler/logic/symbols/cnext/collectors/FunctionCollector.ts +83 -34
  38. package/src/transpiler/logic/symbols/cnext/collectors/RegisterCollector.ts +22 -18
  39. package/src/transpiler/logic/symbols/cnext/collectors/ScopeCollector.ts +53 -35
  40. package/src/transpiler/logic/symbols/cnext/collectors/StructCollector.ts +30 -23
  41. package/src/transpiler/logic/symbols/cnext/collectors/VariableCollector.ts +18 -19
  42. package/src/transpiler/logic/symbols/cnext/index.ts +36 -14
  43. package/src/transpiler/logic/symbols/cnext/types/IScopeCollectorResult.ts +2 -2
  44. package/src/transpiler/logic/symbols/cnext/utils/SymbolNameUtils.ts +27 -0
  45. package/src/transpiler/logic/symbols/cpp/__tests__/CppResolver.integration.test.ts +270 -0
  46. package/src/transpiler/logic/symbols/cpp/__tests__/testHelpers.ts +20 -0
  47. package/src/transpiler/logic/symbols/cpp/collectors/ClassCollector.ts +317 -0
  48. package/src/transpiler/logic/symbols/cpp/collectors/EnumCollector.ts +71 -0
  49. package/src/transpiler/logic/symbols/cpp/collectors/FunctionCollector.ts +155 -0
  50. package/src/transpiler/logic/symbols/cpp/collectors/NamespaceCollector.ts +65 -0
  51. package/src/transpiler/logic/symbols/cpp/collectors/TypeAliasCollector.ts +46 -0
  52. package/src/transpiler/logic/symbols/cpp/collectors/VariableCollector.ts +54 -0
  53. package/src/transpiler/logic/symbols/cpp/index.ts +366 -0
  54. package/src/transpiler/logic/symbols/cpp/utils/DeclaratorUtils.ts +248 -0
  55. package/src/transpiler/logic/symbols/shared/IExtractedParameter.ts +18 -0
  56. package/src/transpiler/logic/symbols/shared/ParameterExtractorUtils.ts +73 -0
  57. package/src/transpiler/output/codegen/CodeGenerator.ts +268 -1674
  58. package/src/transpiler/output/codegen/__tests__/CodeGenerator.test.ts +7 -1
  59. package/src/transpiler/output/codegen/assignment/AssignmentClassifier.ts +2 -1
  60. package/src/transpiler/output/codegen/assignment/handlers/AssignmentHandlerUtils.ts +7 -1
  61. package/src/transpiler/output/codegen/assignment/handlers/BitmapHandlers.ts +6 -2
  62. package/src/transpiler/output/codegen/assignment/handlers/RegisterHandlers.ts +2 -1
  63. package/src/transpiler/output/codegen/generators/declarationGenerators/ScopeGenerator.ts +21 -8
  64. package/src/transpiler/output/codegen/generators/declarationGenerators/ScopedRegisterGenerator.ts +3 -2
  65. package/src/transpiler/output/codegen/generators/expressions/CallExprUtils.ts +9 -3
  66. package/src/transpiler/output/codegen/generators/expressions/__tests__/CallExprGenerator.test.ts +3 -4
  67. package/src/transpiler/output/codegen/generators/expressions/__tests__/CallExprUtils.test.ts +4 -8
  68. package/src/transpiler/output/codegen/helpers/ArgumentGenerator.ts +236 -0
  69. package/src/transpiler/output/codegen/helpers/CppConstructorHelper.ts +3 -3
  70. package/src/transpiler/output/codegen/helpers/FunctionContextManager.ts +435 -0
  71. package/src/transpiler/output/codegen/helpers/StringOperationsHelper.ts +203 -0
  72. package/src/transpiler/output/codegen/helpers/SymbolLookupHelper.ts +8 -12
  73. package/src/transpiler/output/codegen/helpers/TypeRegistrationEngine.ts +520 -0
  74. package/src/transpiler/output/codegen/helpers/VariableDeclHelper.ts +735 -0
  75. package/src/transpiler/output/codegen/helpers/VariableDeclarationFormatter.ts +1 -1
  76. package/src/transpiler/output/codegen/helpers/__tests__/ArgumentGenerator.test.ts +521 -0
  77. package/src/transpiler/output/codegen/helpers/__tests__/CppConstructorHelper.test.ts +4 -5
  78. package/src/transpiler/output/codegen/helpers/__tests__/FunctionContextManager.test.ts +983 -0
  79. package/src/transpiler/output/codegen/helpers/__tests__/StringOperationsHelper.test.ts +269 -0
  80. package/src/transpiler/output/codegen/helpers/__tests__/SymbolLookupHelper.test.ts +31 -32
  81. package/src/transpiler/output/codegen/helpers/__tests__/TypeRegistrationEngine.test.ts +186 -0
  82. package/src/transpiler/output/codegen/helpers/__tests__/VariableDeclHelper.test.ts +460 -0
  83. package/src/transpiler/output/codegen/helpers/types/IArgumentGeneratorCallbacks.ts +32 -0
  84. package/src/transpiler/output/codegen/resolution/EnumTypeResolver.ts +5 -1
  85. package/src/transpiler/output/codegen/types/IFunctionContextCallbacks.ts +12 -0
  86. package/src/transpiler/output/codegen/types/IVariableFormatInput.ts +1 -1
  87. package/src/transpiler/output/codegen/utils/QualifiedNameGenerator.ts +114 -0
  88. package/src/transpiler/output/codegen/utils/__tests__/QualifiedNameGenerator.test.ts +183 -0
  89. package/src/transpiler/output/headers/BaseHeaderGenerator.ts +4 -4
  90. package/src/transpiler/output/headers/ExternalTypeHeaderBuilder.ts +7 -7
  91. package/src/transpiler/output/headers/HeaderGenerator.ts +9 -7
  92. package/src/transpiler/output/headers/HeaderGeneratorUtils.ts +19 -20
  93. package/src/transpiler/output/headers/__tests__/BaseHeaderGenerator.test.ts +15 -18
  94. package/src/transpiler/output/headers/__tests__/CHeaderGenerator.test.ts +63 -64
  95. package/src/transpiler/output/headers/__tests__/CppHeaderGenerator.test.ts +36 -32
  96. package/src/transpiler/output/headers/__tests__/ExternalTypeHeaderBuilder.test.ts +26 -26
  97. package/src/transpiler/output/headers/__tests__/HeaderGenerator.test.ts +87 -59
  98. package/src/transpiler/output/headers/__tests__/HeaderGeneratorUtils.test.ts +57 -58
  99. package/src/transpiler/output/headers/adapters/HeaderSymbolAdapter.ts +222 -0
  100. package/src/transpiler/output/headers/adapters/__tests__/HeaderSymbolAdapter.test.ts +538 -0
  101. package/src/transpiler/output/headers/types/IGroupedSymbols.ts +8 -8
  102. package/src/transpiler/output/headers/types/IHeaderSymbol.ts +62 -0
  103. package/src/transpiler/state/CodeGenState.ts +20 -33
  104. package/src/transpiler/state/SymbolRegistry.ts +181 -0
  105. package/src/transpiler/{types → state}/TranspilerState.ts +1 -1
  106. package/src/transpiler/state/__tests__/CodeGenState.test.ts +67 -59
  107. package/src/transpiler/state/__tests__/SymbolRegistry.test.ts +249 -0
  108. package/src/transpiler/{types → state}/__tests__/TranspilerState.test.ts +1 -1
  109. package/src/transpiler/types/ICachedFileEntry.ts +1 -1
  110. package/src/transpiler/types/IConflict.ts +14 -0
  111. package/src/transpiler/types/IPipelineInput.ts +0 -3
  112. package/src/transpiler/types/ISerializedSymbol.ts +11 -0
  113. package/src/transpiler/types/TPrimitiveKind.ts +20 -0
  114. package/src/transpiler/types/TType.ts +103 -0
  115. package/src/transpiler/types/TVisibility.ts +6 -0
  116. package/src/transpiler/types/symbol-kinds/TSymbolKind.ts +10 -0
  117. package/src/transpiler/types/symbol-kinds/TSymbolKindC.ts +12 -0
  118. package/src/transpiler/types/symbol-kinds/TSymbolKindCNext.ts +16 -0
  119. package/src/transpiler/types/symbol-kinds/TSymbolKindCpp.ts +14 -0
  120. package/src/transpiler/types/symbols/IBaseSymbol.ts +31 -0
  121. package/src/transpiler/{logic/symbols/types → types/symbols}/IBitmapFieldInfo.ts +2 -2
  122. package/src/transpiler/types/symbols/IBitmapSymbol.ts +21 -0
  123. package/src/transpiler/{logic/symbols/types → types/symbols}/IEnumSymbol.ts +5 -6
  124. package/src/transpiler/types/symbols/IFieldInfo.ts +26 -0
  125. package/src/transpiler/types/symbols/IFunctionSymbol.ts +30 -0
  126. package/src/transpiler/types/symbols/IParameterInfo.ts +26 -0
  127. package/src/transpiler/{logic/symbols/types → types/symbols}/IRegisterMemberInfo.ts +4 -4
  128. package/src/transpiler/types/symbols/IRegisterSymbol.ts +18 -0
  129. package/src/transpiler/types/symbols/IScopeSymbol.ts +32 -0
  130. package/src/transpiler/{logic/symbols/types → types/symbols}/IStructFieldInfo.ts +2 -1
  131. package/src/transpiler/types/symbols/IStructSymbol.ts +15 -0
  132. package/src/transpiler/types/symbols/IVariableSymbol.ts +30 -0
  133. package/src/transpiler/types/symbols/SymbolGuards.ts +43 -0
  134. package/src/transpiler/types/symbols/TAnySymbol.ts +22 -0
  135. package/src/transpiler/types/symbols/TSymbol.ts +32 -0
  136. package/src/transpiler/types/symbols/__tests__/IBaseSymbol.test.ts +56 -0
  137. package/src/transpiler/types/symbols/__tests__/SymbolGuards.test.ts +57 -0
  138. package/src/transpiler/types/symbols/c/ICBaseSymbol.ts +28 -0
  139. package/src/transpiler/types/symbols/c/ICEnumMemberSymbol.ts +17 -0
  140. package/src/transpiler/types/symbols/c/ICEnumSymbol.ts +17 -0
  141. package/src/transpiler/types/symbols/c/ICFieldInfo.ts +16 -0
  142. package/src/transpiler/types/symbols/c/ICFunctionSymbol.ts +21 -0
  143. package/src/transpiler/types/symbols/c/ICParameterInfo.ts +19 -0
  144. package/src/transpiler/types/symbols/c/ICStructSymbol.ts +21 -0
  145. package/src/transpiler/types/symbols/c/ICTypedefSymbol.ts +14 -0
  146. package/src/transpiler/types/symbols/c/ICVariableSymbol.ts +26 -0
  147. package/src/transpiler/types/symbols/c/TCSymbol.ts +26 -0
  148. package/src/transpiler/types/symbols/cpp/ICppBaseSymbol.ts +31 -0
  149. package/src/transpiler/types/symbols/cpp/ICppClassSymbol.ts +15 -0
  150. package/src/transpiler/types/symbols/cpp/ICppEnumMemberSymbol.ts +14 -0
  151. package/src/transpiler/types/symbols/cpp/ICppEnumSymbol.ts +14 -0
  152. package/src/transpiler/types/symbols/cpp/ICppFieldInfo.ts +16 -0
  153. package/src/transpiler/types/symbols/cpp/ICppFunctionSymbol.ts +21 -0
  154. package/src/transpiler/types/symbols/cpp/ICppNamespaceSymbol.ts +11 -0
  155. package/src/transpiler/types/symbols/cpp/ICppParameterInfo.ts +19 -0
  156. package/src/transpiler/types/symbols/cpp/ICppStructSymbol.ts +16 -0
  157. package/src/transpiler/types/symbols/cpp/ICppTypeAliasSymbol.ts +14 -0
  158. package/src/transpiler/types/symbols/cpp/ICppVariableSymbol.ts +23 -0
  159. package/src/transpiler/types/symbols/cpp/TCppSymbol.ts +30 -0
  160. package/src/utils/CppNamespaceUtils.ts +3 -4
  161. package/src/utils/FunctionUtils.ts +92 -0
  162. package/src/utils/ParameterUtils.ts +55 -0
  163. package/src/utils/PrimitiveKindUtils.ts +33 -0
  164. package/src/utils/ScopeUtils.ts +105 -0
  165. package/src/utils/TTypeUtils.ts +159 -0
  166. package/src/utils/TypeResolver.ts +132 -0
  167. package/src/utils/__tests__/CppNamespaceUtils.test.ts +92 -99
  168. package/src/utils/__tests__/FunctionUtils.test.ts +284 -0
  169. package/src/utils/__tests__/ParameterUtils.test.ts +174 -0
  170. package/src/utils/__tests__/PrimitiveKindUtils.test.ts +59 -0
  171. package/src/utils/__tests__/ScopeUtils.test.ts +53 -0
  172. package/src/utils/__tests__/TTypeUtils.test.ts +245 -0
  173. package/src/utils/__tests__/TypeResolver.test.ts +332 -0
  174. package/src/utils/cache/CacheManager.ts +91 -50
  175. package/src/utils/cache/__tests__/CacheManager.test.ts +180 -114
  176. package/src/transpiler/logic/symbols/AutoConstUpdater.ts +0 -93
  177. package/src/transpiler/logic/symbols/CSymbolCollector.ts +0 -648
  178. package/src/transpiler/logic/symbols/CppSymbolCollector.ts +0 -874
  179. package/src/transpiler/logic/symbols/SymbolCollectorContext.ts +0 -68
  180. package/src/transpiler/logic/symbols/__tests__/AutoConstUpdater.test.ts +0 -418
  181. package/src/transpiler/logic/symbols/__tests__/CSymbolCollector.test.ts +0 -685
  182. package/src/transpiler/logic/symbols/__tests__/CppSymbolCollector.test.ts +0 -1146
  183. package/src/transpiler/logic/symbols/__tests__/SymbolCollectorContext.test.ts +0 -290
  184. package/src/transpiler/logic/symbols/__tests__/cTestHelpers.ts +0 -43
  185. package/src/transpiler/logic/symbols/__tests__/cppTestHelpers.ts +0 -40
  186. package/src/transpiler/logic/symbols/cnext/__tests__/TSymbolAdapter.test.ts +0 -595
  187. package/src/transpiler/logic/symbols/cnext/adapters/TSymbolAdapter.ts +0 -345
  188. package/src/transpiler/logic/symbols/types/IBaseSymbol.ts +0 -27
  189. package/src/transpiler/logic/symbols/types/IBitmapSymbol.ts +0 -23
  190. package/src/transpiler/logic/symbols/types/ICollectorContext.ts +0 -19
  191. package/src/transpiler/logic/symbols/types/IConflict.ts +0 -20
  192. package/src/transpiler/logic/symbols/types/IFieldInfo.ts +0 -18
  193. package/src/transpiler/logic/symbols/types/IFunctionSymbol.ts +0 -25
  194. package/src/transpiler/logic/symbols/types/IParameterInfo.ts +0 -24
  195. package/src/transpiler/logic/symbols/types/IRegisterSymbol.ts +0 -20
  196. package/src/transpiler/logic/symbols/types/IScopeSymbol.ts +0 -19
  197. package/src/transpiler/logic/symbols/types/IStructSymbol.ts +0 -16
  198. package/src/transpiler/logic/symbols/types/IVariableSymbol.ts +0 -30
  199. package/src/transpiler/logic/symbols/types/TSymbol.ts +0 -36
  200. package/src/transpiler/logic/symbols/types/__tests__/SymbolGuards.test.ts +0 -244
  201. package/src/transpiler/logic/symbols/types/typeGuards.ts +0 -44
  202. package/src/utils/types/ESymbolKind.ts +0 -19
  203. package/src/utils/types/ISymbol.ts +0 -64
  204. /package/src/transpiler/{types → constants}/BITMAP_BACKING_TYPE.ts +0 -0
  205. /package/src/transpiler/{types → constants}/BITMAP_SIZE.ts +0 -0
@@ -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;