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,538 @@
1
+ /**
2
+ * Unit tests for HeaderSymbolAdapter
3
+ * ADR-055 Phase 5/7: Converts TSymbol to IHeaderSymbol (ISymbol methods removed in Phase 7)
4
+ */
5
+ import { describe, it, expect } from "vitest";
6
+ import HeaderSymbolAdapter from "../HeaderSymbolAdapter";
7
+ import IVariableSymbol from "../../../../types/symbols/IVariableSymbol";
8
+ import IFunctionSymbol from "../../../../types/symbols/IFunctionSymbol";
9
+ import IStructSymbol from "../../../../types/symbols/IStructSymbol";
10
+ import IEnumSymbol from "../../../../types/symbols/IEnumSymbol";
11
+ import IBitmapSymbol from "../../../../types/symbols/IBitmapSymbol";
12
+ import IRegisterSymbol from "../../../../types/symbols/IRegisterSymbol";
13
+ import IScopeSymbol from "../../../../types/symbols/IScopeSymbol";
14
+ import ESourceLanguage from "../../../../../utils/types/ESourceLanguage";
15
+ import TTypeUtils from "../../../../../utils/TTypeUtils";
16
+ import ScopeUtils from "../../../../../utils/ScopeUtils";
17
+
18
+ describe("HeaderSymbolAdapter", () => {
19
+ const globalScope = ScopeUtils.createGlobalScope();
20
+ const motorScope = ScopeUtils.createScope("Motor", globalScope);
21
+
22
+ // ========================================================================
23
+ // fromTSymbol - TSymbol to IHeaderSymbol Conversion
24
+ // ========================================================================
25
+
26
+ describe("fromTSymbol - variable", () => {
27
+ it("should convert global variable TSymbol", () => {
28
+ const tSymbol: IVariableSymbol = {
29
+ kind: "variable",
30
+ name: "counter",
31
+ scope: globalScope,
32
+ sourceFile: "test.cnx",
33
+ sourceLine: 1,
34
+ sourceLanguage: ESourceLanguage.CNext,
35
+ isExported: true,
36
+ type: TTypeUtils.createPrimitive("u32"),
37
+ isConst: false,
38
+ isAtomic: false,
39
+ isArray: false,
40
+ };
41
+
42
+ const result = HeaderSymbolAdapter.fromTSymbol(tSymbol);
43
+
44
+ expect(result.name).toBe("counter");
45
+ expect(result.kind).toBe("variable");
46
+ expect(result.type).toBe("u32");
47
+ expect(result.isExported).toBe(true);
48
+ expect(result.parent).toBeUndefined();
49
+ });
50
+
51
+ it("should convert scoped variable with mangled name", () => {
52
+ const tSymbol: IVariableSymbol = {
53
+ kind: "variable",
54
+ name: "speed",
55
+ scope: motorScope,
56
+ sourceFile: "motor.cnx",
57
+ sourceLine: 5,
58
+ sourceLanguage: ESourceLanguage.CNext,
59
+ isExported: true,
60
+ type: TTypeUtils.createPrimitive("f32"),
61
+ isConst: false,
62
+ isAtomic: true,
63
+ isArray: false,
64
+ };
65
+
66
+ const result = HeaderSymbolAdapter.fromTSymbol(tSymbol);
67
+
68
+ expect(result.name).toBe("Motor_speed");
69
+ expect(result.type).toBe("f32");
70
+ expect(result.isAtomic).toBe(true);
71
+ expect(result.parent).toBe("Motor");
72
+ });
73
+
74
+ it("should convert array variable with dimensions", () => {
75
+ const tSymbol: IVariableSymbol = {
76
+ kind: "variable",
77
+ name: "buffer",
78
+ scope: globalScope,
79
+ sourceFile: "data.cnx",
80
+ sourceLine: 1,
81
+ sourceLanguage: ESourceLanguage.CNext,
82
+ isExported: true,
83
+ type: TTypeUtils.createPrimitive("u8"),
84
+ isConst: false,
85
+ isAtomic: false,
86
+ isArray: true,
87
+ arrayDimensions: [256, 4],
88
+ };
89
+
90
+ const result = HeaderSymbolAdapter.fromTSymbol(tSymbol);
91
+
92
+ expect(result.isArray).toBe(true);
93
+ expect(result.arrayDimensions).toEqual(["256", "4"]);
94
+ });
95
+
96
+ it("should convert const variable", () => {
97
+ const tSymbol: IVariableSymbol = {
98
+ kind: "variable",
99
+ name: "MAX_SIZE",
100
+ scope: globalScope,
101
+ sourceFile: "config.cnx",
102
+ sourceLine: 1,
103
+ sourceLanguage: ESourceLanguage.CNext,
104
+ isExported: true,
105
+ type: TTypeUtils.createPrimitive("u32"),
106
+ isConst: true,
107
+ isAtomic: false,
108
+ isArray: false,
109
+ };
110
+
111
+ const result = HeaderSymbolAdapter.fromTSymbol(tSymbol);
112
+
113
+ expect(result.isConst).toBe(true);
114
+ });
115
+ });
116
+
117
+ describe("fromTSymbol - function", () => {
118
+ it("should convert global function TSymbol", () => {
119
+ const tSymbol: IFunctionSymbol = {
120
+ kind: "function",
121
+ name: "init",
122
+ scope: globalScope,
123
+ sourceFile: "main.cnx",
124
+ sourceLine: 1,
125
+ sourceLanguage: ESourceLanguage.CNext,
126
+ isExported: true,
127
+ parameters: [],
128
+ returnType: TTypeUtils.createPrimitive("void"),
129
+ visibility: "public",
130
+ body: null,
131
+ };
132
+
133
+ const result = HeaderSymbolAdapter.fromTSymbol(tSymbol);
134
+
135
+ expect(result.name).toBe("init");
136
+ expect(result.kind).toBe("function");
137
+ expect(result.type).toBe("void");
138
+ expect(result.parameters).toEqual([]);
139
+ expect(result.signature).toBe("void init()");
140
+ });
141
+
142
+ it("should convert scoped function with parameters", () => {
143
+ const tSymbol: IFunctionSymbol = {
144
+ kind: "function",
145
+ name: "setSpeed",
146
+ scope: motorScope,
147
+ sourceFile: "motor.cnx",
148
+ sourceLine: 10,
149
+ sourceLanguage: ESourceLanguage.CNext,
150
+ isExported: true,
151
+ parameters: [
152
+ {
153
+ name: "value",
154
+ type: TTypeUtils.createPrimitive("f32"),
155
+ isConst: false,
156
+ isArray: false,
157
+ },
158
+ ],
159
+ returnType: TTypeUtils.createPrimitive("void"),
160
+ visibility: "public",
161
+ body: null,
162
+ };
163
+
164
+ const result = HeaderSymbolAdapter.fromTSymbol(tSymbol);
165
+
166
+ expect(result.name).toBe("Motor_setSpeed");
167
+ expect(result.type).toBe("void");
168
+ expect(result.parameters).toHaveLength(1);
169
+ expect(result.parameters?.[0].name).toBe("value");
170
+ expect(result.parameters?.[0].type).toBe("f32");
171
+ expect(result.signature).toBe("void Motor_setSpeed(f32)");
172
+ expect(result.parent).toBe("Motor");
173
+ });
174
+
175
+ it("should convert function with array parameter", () => {
176
+ const tSymbol: IFunctionSymbol = {
177
+ kind: "function",
178
+ name: "process",
179
+ scope: globalScope,
180
+ sourceFile: "process.cnx",
181
+ sourceLine: 1,
182
+ sourceLanguage: ESourceLanguage.CNext,
183
+ isExported: true,
184
+ parameters: [
185
+ {
186
+ name: "data",
187
+ type: TTypeUtils.createPrimitive("u8"),
188
+ isConst: true,
189
+ isArray: true,
190
+ arrayDimensions: [256],
191
+ },
192
+ ],
193
+ returnType: TTypeUtils.createPrimitive("i32"),
194
+ visibility: "public",
195
+ body: null,
196
+ };
197
+
198
+ const result = HeaderSymbolAdapter.fromTSymbol(tSymbol);
199
+
200
+ expect(result.parameters?.[0].isArray).toBe(true);
201
+ expect(result.parameters?.[0].isConst).toBe(true);
202
+ expect(result.parameters?.[0].arrayDimensions).toEqual(["256"]);
203
+ });
204
+ });
205
+
206
+ describe("fromTSymbol - struct", () => {
207
+ it("should convert global struct TSymbol", () => {
208
+ const tSymbol: IStructSymbol = {
209
+ kind: "struct",
210
+ name: "Point",
211
+ scope: globalScope,
212
+ sourceFile: "geometry.cnx",
213
+ sourceLine: 1,
214
+ sourceLanguage: ESourceLanguage.CNext,
215
+ isExported: true,
216
+ fields: new Map([
217
+ [
218
+ "x",
219
+ {
220
+ name: "x",
221
+ type: TTypeUtils.createPrimitive("i32"),
222
+ isConst: false,
223
+ isAtomic: false,
224
+ isArray: false,
225
+ },
226
+ ],
227
+ ]),
228
+ };
229
+
230
+ const result = HeaderSymbolAdapter.fromTSymbol(tSymbol);
231
+
232
+ expect(result.name).toBe("Point");
233
+ expect(result.kind).toBe("struct");
234
+ expect(result.isExported).toBe(true);
235
+ expect(result.parent).toBeUndefined();
236
+ });
237
+
238
+ it("should convert scoped struct with mangled name", () => {
239
+ const geometryScope = ScopeUtils.createScope("Geometry", globalScope);
240
+ const tSymbol: IStructSymbol = {
241
+ kind: "struct",
242
+ name: "Vector",
243
+ scope: geometryScope,
244
+ sourceFile: "geometry.cnx",
245
+ sourceLine: 10,
246
+ sourceLanguage: ESourceLanguage.CNext,
247
+ isExported: true,
248
+ fields: new Map(),
249
+ };
250
+
251
+ const result = HeaderSymbolAdapter.fromTSymbol(tSymbol);
252
+
253
+ expect(result.name).toBe("Geometry_Vector");
254
+ expect(result.parent).toBe("Geometry");
255
+ });
256
+ });
257
+
258
+ describe("fromTSymbol - enum", () => {
259
+ it("should convert global enum TSymbol", () => {
260
+ const tSymbol: IEnumSymbol = {
261
+ kind: "enum",
262
+ name: "EColor",
263
+ scope: globalScope,
264
+ sourceFile: "colors.cnx",
265
+ sourceLine: 1,
266
+ sourceLanguage: ESourceLanguage.CNext,
267
+ isExported: true,
268
+ members: new Map([
269
+ ["RED", 0],
270
+ ["GREEN", 1],
271
+ ["BLUE", 2],
272
+ ]),
273
+ };
274
+
275
+ const result = HeaderSymbolAdapter.fromTSymbol(tSymbol);
276
+
277
+ expect(result.name).toBe("EColor");
278
+ expect(result.kind).toBe("enum");
279
+ expect(result.isExported).toBe(true);
280
+ });
281
+
282
+ it("should convert scoped enum with mangled name", () => {
283
+ const tSymbol: IEnumSymbol = {
284
+ kind: "enum",
285
+ name: "EMode",
286
+ scope: motorScope,
287
+ sourceFile: "motor.cnx",
288
+ sourceLine: 1,
289
+ sourceLanguage: ESourceLanguage.CNext,
290
+ isExported: true,
291
+ members: new Map([
292
+ ["OFF", 0],
293
+ ["ON", 1],
294
+ ]),
295
+ };
296
+
297
+ const result = HeaderSymbolAdapter.fromTSymbol(tSymbol);
298
+
299
+ expect(result.name).toBe("Motor_EMode");
300
+ expect(result.parent).toBe("Motor");
301
+ });
302
+ });
303
+
304
+ describe("fromTSymbol - bitmap", () => {
305
+ it("should convert bitmap TSymbol", () => {
306
+ const tSymbol: IBitmapSymbol = {
307
+ kind: "bitmap",
308
+ name: "Flags",
309
+ scope: globalScope,
310
+ sourceFile: "flags.cnx",
311
+ sourceLine: 1,
312
+ sourceLanguage: ESourceLanguage.CNext,
313
+ isExported: true,
314
+ backingType: "u8",
315
+ bitWidth: 8,
316
+ fields: new Map([
317
+ ["enabled", { offset: 0, width: 1 }],
318
+ ["ready", { offset: 1, width: 1 }],
319
+ ]),
320
+ };
321
+
322
+ const result = HeaderSymbolAdapter.fromTSymbol(tSymbol);
323
+
324
+ expect(result.name).toBe("Flags");
325
+ expect(result.kind).toBe("bitmap");
326
+ expect(result.type).toBe("u8");
327
+ expect(result.isExported).toBe(true);
328
+ });
329
+
330
+ it("should convert scoped bitmap with mangled name", () => {
331
+ const tSymbol: IBitmapSymbol = {
332
+ kind: "bitmap",
333
+ name: "Status",
334
+ scope: motorScope,
335
+ sourceFile: "motor.cnx",
336
+ sourceLine: 5,
337
+ sourceLanguage: ESourceLanguage.CNext,
338
+ isExported: true,
339
+ backingType: "u16",
340
+ bitWidth: 16,
341
+ fields: new Map(),
342
+ };
343
+
344
+ const result = HeaderSymbolAdapter.fromTSymbol(tSymbol);
345
+
346
+ expect(result.name).toBe("Motor_Status");
347
+ expect(result.type).toBe("u16");
348
+ expect(result.parent).toBe("Motor");
349
+ });
350
+ });
351
+
352
+ describe("fromTSymbol - register", () => {
353
+ it("should convert register TSymbol", () => {
354
+ const tSymbol: IRegisterSymbol = {
355
+ kind: "register",
356
+ name: "GPIO",
357
+ scope: globalScope,
358
+ sourceFile: "gpio.cnx",
359
+ sourceLine: 1,
360
+ sourceLanguage: ESourceLanguage.CNext,
361
+ isExported: true,
362
+ baseAddress: "0x40000000",
363
+ members: new Map([
364
+ ["DATA", { cType: "u32", offset: "0x00", access: "rw" as const }],
365
+ ["DIR", { cType: "u32", offset: "0x04", access: "rw" as const }],
366
+ ]),
367
+ };
368
+
369
+ const result = HeaderSymbolAdapter.fromTSymbol(tSymbol);
370
+
371
+ expect(result.name).toBe("GPIO");
372
+ expect(result.kind).toBe("register");
373
+ expect(result.isExported).toBe(true);
374
+ });
375
+
376
+ it("should convert scoped register with mangled name", () => {
377
+ const tSymbol: IRegisterSymbol = {
378
+ kind: "register",
379
+ name: "CTRL",
380
+ scope: motorScope,
381
+ sourceFile: "motor.cnx",
382
+ sourceLine: 20,
383
+ sourceLanguage: ESourceLanguage.CNext,
384
+ isExported: true,
385
+ baseAddress: "0x50000000",
386
+ members: new Map(),
387
+ };
388
+
389
+ const result = HeaderSymbolAdapter.fromTSymbol(tSymbol);
390
+
391
+ expect(result.name).toBe("Motor_CTRL");
392
+ expect(result.parent).toBe("Motor");
393
+ });
394
+ });
395
+
396
+ describe("fromTSymbol - scope", () => {
397
+ it("should convert scope TSymbol", () => {
398
+ const tSymbol: IScopeSymbol = {
399
+ kind: "scope",
400
+ name: "Motor",
401
+ scope: globalScope,
402
+ parent: globalScope,
403
+ sourceFile: "motor.cnx",
404
+ sourceLine: 1,
405
+ sourceLanguage: ESourceLanguage.CNext,
406
+ isExported: true,
407
+ members: ["init", "setSpeed"],
408
+ functions: [],
409
+ variables: [],
410
+ memberVisibility: new Map(),
411
+ };
412
+
413
+ const result = HeaderSymbolAdapter.fromTSymbol(tSymbol);
414
+
415
+ expect(result.name).toBe("Motor");
416
+ expect(result.kind).toBe("scope");
417
+ expect(result.isExported).toBe(true);
418
+ });
419
+ });
420
+
421
+ describe("fromTSymbols", () => {
422
+ it("should convert array of TSymbols", () => {
423
+ const tSymbols = [
424
+ {
425
+ kind: "variable" as const,
426
+ name: "var1",
427
+ scope: globalScope,
428
+ sourceFile: "test.cnx",
429
+ sourceLine: 1,
430
+ sourceLanguage: ESourceLanguage.CNext,
431
+ isExported: true,
432
+ type: TTypeUtils.createPrimitive("u32"),
433
+ isConst: false,
434
+ isAtomic: false,
435
+ isArray: false,
436
+ },
437
+ {
438
+ kind: "function" as const,
439
+ name: "func1",
440
+ scope: globalScope,
441
+ sourceFile: "test.cnx",
442
+ sourceLine: 5,
443
+ sourceLanguage: ESourceLanguage.CNext,
444
+ isExported: true,
445
+ parameters: [],
446
+ returnType: TTypeUtils.createPrimitive("void"),
447
+ visibility: "public" as const,
448
+ body: null,
449
+ },
450
+ ];
451
+
452
+ const results = HeaderSymbolAdapter.fromTSymbols(tSymbols);
453
+
454
+ expect(results).toHaveLength(2);
455
+ expect(results[0].name).toBe("var1");
456
+ expect(results[0].kind).toBe("variable");
457
+ expect(results[1].name).toBe("func1");
458
+ expect(results[1].kind).toBe("function");
459
+ });
460
+ });
461
+
462
+ // ========================================================================
463
+ // Edge Cases
464
+ // ========================================================================
465
+
466
+ describe("edge cases", () => {
467
+ it("should handle string dimensions in arrays", () => {
468
+ const tSymbol: IVariableSymbol = {
469
+ kind: "variable",
470
+ name: "macroArray",
471
+ scope: globalScope,
472
+ sourceFile: "test.cnx",
473
+ sourceLine: 1,
474
+ sourceLanguage: ESourceLanguage.CNext,
475
+ isExported: true,
476
+ type: TTypeUtils.createPrimitive("u8"),
477
+ isConst: false,
478
+ isAtomic: false,
479
+ isArray: true,
480
+ arrayDimensions: ["DEVICE_COUNT"],
481
+ };
482
+
483
+ const result = HeaderSymbolAdapter.fromTSymbol(tSymbol);
484
+
485
+ expect(result.arrayDimensions).toEqual(["DEVICE_COUNT"]);
486
+ });
487
+
488
+ it("should resolve qualified enum array dimensions", () => {
489
+ const tSymbol: IVariableSymbol = {
490
+ kind: "variable",
491
+ name: "DATA",
492
+ scope: globalScope,
493
+ sourceFile: "test.cnx",
494
+ sourceLine: 1,
495
+ sourceLanguage: ESourceLanguage.CNext,
496
+ isExported: true,
497
+ type: TTypeUtils.createPrimitive("u8"),
498
+ isConst: true,
499
+ isAtomic: false,
500
+ isArray: true,
501
+ arrayDimensions: ["EColor.COUNT"],
502
+ };
503
+
504
+ const result = HeaderSymbolAdapter.fromTSymbol(tSymbol);
505
+
506
+ // Qualified enum access should be converted to C-style underscore notation
507
+ expect(result.arrayDimensions).toEqual(["EColor_COUNT"]);
508
+ });
509
+
510
+ it("should handle autoConst parameter flag", () => {
511
+ const tSymbol: IFunctionSymbol = {
512
+ kind: "function",
513
+ name: "processData",
514
+ scope: globalScope,
515
+ sourceFile: "test.cnx",
516
+ sourceLine: 1,
517
+ sourceLanguage: ESourceLanguage.CNext,
518
+ isExported: true,
519
+ parameters: [
520
+ {
521
+ name: "data",
522
+ type: TTypeUtils.createPrimitive("u8"),
523
+ isConst: false,
524
+ isArray: true,
525
+ isAutoConst: true,
526
+ },
527
+ ],
528
+ returnType: TTypeUtils.createPrimitive("void"),
529
+ visibility: "public",
530
+ body: null,
531
+ };
532
+
533
+ const result = HeaderSymbolAdapter.fromTSymbol(tSymbol);
534
+
535
+ expect(result.parameters?.[0].isAutoConst).toBe(true);
536
+ });
537
+ });
538
+ });
@@ -2,16 +2,16 @@
2
2
  * Grouped symbols by kind for header generation
3
3
  */
4
4
 
5
- import ISymbol from "../../../../utils/types/ISymbol";
5
+ import IHeaderSymbol from "./IHeaderSymbol";
6
6
 
7
7
  interface IGroupedSymbols {
8
- structs: ISymbol[];
9
- classes: ISymbol[];
10
- functions: ISymbol[];
11
- variables: ISymbol[];
12
- enums: ISymbol[];
13
- types: ISymbol[];
14
- bitmaps: ISymbol[];
8
+ structs: IHeaderSymbol[];
9
+ classes: IHeaderSymbol[];
10
+ functions: IHeaderSymbol[];
11
+ variables: IHeaderSymbol[];
12
+ enums: IHeaderSymbol[];
13
+ types: IHeaderSymbol[];
14
+ bitmaps: IHeaderSymbol[];
15
15
  }
16
16
 
17
17
  export default IGroupedSymbols;
@@ -0,0 +1,62 @@
1
+ /**
2
+ * IHeaderSymbol - Normalized symbol interface for header generation.
3
+ *
4
+ * ADR-055 Phase 5: This interface works with both TSymbol and ISymbol,
5
+ * providing a consistent view for header generation regardless of source.
6
+ *
7
+ * Header generation needs a subset of symbol information:
8
+ * - Name and kind for categorization
9
+ * - Type information for declarations
10
+ * - Export status for filtering
11
+ * - Array/const/atomic modifiers for variable declarations
12
+ * - Parameters for function signatures
13
+ */
14
+
15
+ import TSymbolKind from "../../../types/symbol-kinds/TSymbolKind";
16
+ import IParameterSymbol from "../../../../utils/types/IParameterSymbol";
17
+
18
+ interface IHeaderSymbol {
19
+ /** Symbol name */
20
+ readonly name: string;
21
+
22
+ /** Symbol kind */
23
+ readonly kind: TSymbolKind;
24
+
25
+ /** Type of the symbol (e.g., "void", "u32", "Point") */
26
+ readonly type?: string;
27
+
28
+ /** Whether this symbol is exported/public */
29
+ readonly isExported: boolean;
30
+
31
+ /** Whether this variable is const */
32
+ readonly isConst?: boolean;
33
+
34
+ /** Whether this variable is atomic (volatile in C) */
35
+ readonly isAtomic?: boolean;
36
+
37
+ /** Whether this is an array */
38
+ readonly isArray?: boolean;
39
+
40
+ /** Array dimensions (e.g., ["10"] or ["10", "20"]) */
41
+ readonly arrayDimensions?: readonly string[];
42
+
43
+ /** Function parameters for signature generation */
44
+ readonly parameters?: readonly IParameterSymbol[];
45
+
46
+ /** Function signature for display */
47
+ readonly signature?: string;
48
+
49
+ /** Parent namespace or class name */
50
+ readonly parent?: string;
51
+
52
+ /** Access modifier for register members */
53
+ readonly accessModifier?: string;
54
+
55
+ /** Source file (for debugging/logging) */
56
+ readonly sourceFile?: string;
57
+
58
+ /** Source line (for debugging/logging) */
59
+ readonly sourceLine?: number;
60
+ }
61
+
62
+ export default IHeaderSymbol;