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
@@ -8,29 +8,51 @@
8
8
 
9
9
  import { describe, expect, it } from "vitest";
10
10
  import TSymbolInfoAdapter from "../adapters/TSymbolInfoAdapter";
11
- import ESymbolKind from "../../../../../utils/types/ESymbolKind";
12
11
  import ESourceLanguage from "../../../../../utils/types/ESourceLanguage";
13
- import IBitmapSymbol from "../../types/IBitmapSymbol";
14
- import IEnumSymbol from "../../types/IEnumSymbol";
15
- import IStructSymbol from "../../types/IStructSymbol";
16
- import IRegisterSymbol from "../../types/IRegisterSymbol";
17
- import IScopeSymbol from "../../types/IScopeSymbol";
18
- import IVariableSymbol from "../../types/IVariableSymbol";
19
- import IFunctionSymbol from "../../types/IFunctionSymbol";
12
+ import IBitmapSymbol from "../../../../types/symbols/IBitmapSymbol";
13
+ import IEnumSymbol from "../../../../types/symbols/IEnumSymbol";
14
+ import IStructSymbol from "../../../../types/symbols/IStructSymbol";
15
+ import IRegisterSymbol from "../../../../types/symbols/IRegisterSymbol";
16
+ import IVariableSymbol from "../../../../types/symbols/IVariableSymbol";
17
+ import IFunctionSymbol from "../../../../types/symbols/IFunctionSymbol";
18
+ import TypeResolver from "../../../../../utils/TypeResolver";
19
+ import TestScopeUtils from "./testUtils";
20
20
 
21
21
  describe("TSymbolInfoAdapter", () => {
22
+ // Reset global scope between tests to avoid state pollution
23
+ const globalScope = TestScopeUtils.getGlobalScope();
24
+
22
25
  describe("convert structs", () => {
23
26
  it("should populate knownStructs set", () => {
24
27
  const struct: IStructSymbol = {
25
- kind: ESymbolKind.Struct,
28
+ kind: "struct",
26
29
  name: "Point",
30
+ scope: globalScope,
27
31
  sourceFile: "test.cnx",
28
32
  sourceLine: 1,
29
33
  sourceLanguage: ESourceLanguage.CNext,
30
34
  isExported: true,
31
35
  fields: new Map([
32
- ["x", { type: "i32", isArray: false, isConst: false }],
33
- ["y", { type: "i32", isArray: false, isConst: false }],
36
+ [
37
+ "x",
38
+ {
39
+ name: "x",
40
+ type: TypeResolver.resolve("i32"),
41
+ isArray: false,
42
+ isConst: false,
43
+ isAtomic: false,
44
+ },
45
+ ],
46
+ [
47
+ "y",
48
+ {
49
+ name: "y",
50
+ type: TypeResolver.resolve("i32"),
51
+ isArray: false,
52
+ isConst: false,
53
+ isAtomic: false,
54
+ },
55
+ ],
34
56
  ]),
35
57
  };
36
58
 
@@ -41,15 +63,34 @@ describe("TSymbolInfoAdapter", () => {
41
63
 
42
64
  it("should populate structFields map", () => {
43
65
  const struct: IStructSymbol = {
44
- kind: ESymbolKind.Struct,
66
+ kind: "struct",
45
67
  name: "Point",
68
+ scope: globalScope,
46
69
  sourceFile: "test.cnx",
47
70
  sourceLine: 1,
48
71
  sourceLanguage: ESourceLanguage.CNext,
49
72
  isExported: true,
50
73
  fields: new Map([
51
- ["x", { type: "i32", isArray: false, isConst: false }],
52
- ["y", { type: "f32", isArray: false, isConst: false }],
74
+ [
75
+ "x",
76
+ {
77
+ name: "x",
78
+ type: TypeResolver.resolve("i32"),
79
+ isArray: false,
80
+ isConst: false,
81
+ isAtomic: false,
82
+ },
83
+ ],
84
+ [
85
+ "y",
86
+ {
87
+ name: "y",
88
+ type: TypeResolver.resolve("f32"),
89
+ isArray: false,
90
+ isConst: false,
91
+ isAtomic: false,
92
+ },
93
+ ],
53
94
  ]),
54
95
  };
55
96
 
@@ -61,8 +102,9 @@ describe("TSymbolInfoAdapter", () => {
61
102
 
62
103
  it("should populate structFieldArrays for array fields", () => {
63
104
  const struct: IStructSymbol = {
64
- kind: ESymbolKind.Struct,
105
+ kind: "struct",
65
106
  name: "Buffer",
107
+ scope: globalScope,
66
108
  sourceFile: "test.cnx",
67
109
  sourceLine: 1,
68
110
  sourceLanguage: ESourceLanguage.CNext,
@@ -70,9 +112,25 @@ describe("TSymbolInfoAdapter", () => {
70
112
  fields: new Map([
71
113
  [
72
114
  "data",
73
- { type: "u8", isArray: true, isConst: false, dimensions: [256] },
115
+ {
116
+ name: "data",
117
+ type: TypeResolver.resolve("u8"),
118
+ isArray: true,
119
+ isConst: false,
120
+ isAtomic: false,
121
+ dimensions: [256],
122
+ },
123
+ ],
124
+ [
125
+ "size",
126
+ {
127
+ name: "size",
128
+ type: TypeResolver.resolve("u32"),
129
+ isArray: false,
130
+ isConst: false,
131
+ isAtomic: false,
132
+ },
74
133
  ],
75
- ["size", { type: "u32", isArray: false, isConst: false }],
76
134
  ]),
77
135
  };
78
136
 
@@ -84,8 +142,9 @@ describe("TSymbolInfoAdapter", () => {
84
142
 
85
143
  it("should populate structFieldDimensions for array fields", () => {
86
144
  const struct: IStructSymbol = {
87
- kind: ESymbolKind.Struct,
145
+ kind: "struct",
88
146
  name: "Matrix",
147
+ scope: globalScope,
89
148
  sourceFile: "test.cnx",
90
149
  sourceLine: 1,
91
150
  sourceLanguage: ESourceLanguage.CNext,
@@ -93,7 +152,14 @@ describe("TSymbolInfoAdapter", () => {
93
152
  fields: new Map([
94
153
  [
95
154
  "values",
96
- { type: "f32", isArray: true, isConst: false, dimensions: [4, 4] },
155
+ {
156
+ name: "values",
157
+ type: TypeResolver.resolve("f32"),
158
+ isArray: true,
159
+ isConst: false,
160
+ isAtomic: false,
161
+ dimensions: [4, 4],
162
+ },
97
163
  ],
98
164
  ]),
99
165
  };
@@ -109,8 +175,9 @@ describe("TSymbolInfoAdapter", () => {
109
175
  describe("convert enums", () => {
110
176
  it("should populate knownEnums set", () => {
111
177
  const enumSym: IEnumSymbol = {
112
- kind: ESymbolKind.Enum,
178
+ kind: "enum",
113
179
  name: "Color",
180
+ scope: globalScope,
114
181
  sourceFile: "test.cnx",
115
182
  sourceLine: 1,
116
183
  sourceLanguage: ESourceLanguage.CNext,
@@ -129,8 +196,9 @@ describe("TSymbolInfoAdapter", () => {
129
196
 
130
197
  it("should populate enumMembers map", () => {
131
198
  const enumSym: IEnumSymbol = {
132
- kind: ESymbolKind.Enum,
199
+ kind: "enum",
133
200
  name: "Priority",
201
+ scope: globalScope,
134
202
  sourceFile: "test.cnx",
135
203
  sourceLine: 1,
136
204
  sourceLanguage: ESourceLanguage.CNext,
@@ -153,8 +221,9 @@ describe("TSymbolInfoAdapter", () => {
153
221
  describe("convert bitmaps", () => {
154
222
  it("should populate knownBitmaps set", () => {
155
223
  const bitmap: IBitmapSymbol = {
156
- kind: ESymbolKind.Bitmap,
224
+ kind: "bitmap",
157
225
  name: "Status",
226
+ scope: globalScope,
158
227
  sourceFile: "test.cnx",
159
228
  sourceLine: 1,
160
229
  sourceLanguage: ESourceLanguage.CNext,
@@ -171,8 +240,9 @@ describe("TSymbolInfoAdapter", () => {
171
240
 
172
241
  it("should populate bitmapBackingType and bitmapBitWidth", () => {
173
242
  const bitmap: IBitmapSymbol = {
174
- kind: ESymbolKind.Bitmap,
243
+ kind: "bitmap",
175
244
  name: "Control",
245
+ scope: globalScope,
176
246
  sourceFile: "test.cnx",
177
247
  sourceLine: 1,
178
248
  sourceLanguage: ESourceLanguage.CNext,
@@ -194,8 +264,9 @@ describe("TSymbolInfoAdapter", () => {
194
264
 
195
265
  it("should populate bitmapFields with offset and width", () => {
196
266
  const bitmap: IBitmapSymbol = {
197
- kind: ESymbolKind.Bitmap,
267
+ kind: "bitmap",
198
268
  name: "Flags",
269
+ scope: globalScope,
199
270
  sourceFile: "test.cnx",
200
271
  sourceLine: 1,
201
272
  sourceLanguage: ESourceLanguage.CNext,
@@ -220,42 +291,33 @@ describe("TSymbolInfoAdapter", () => {
220
291
 
221
292
  describe("convert scopes", () => {
222
293
  it("should populate knownScopes set", () => {
223
- const scope: IScopeSymbol = {
224
- kind: ESymbolKind.Namespace,
225
- name: "Motor",
226
- sourceFile: "test.cnx",
227
- sourceLine: 1,
228
- sourceLanguage: ESourceLanguage.CNext,
229
- isExported: true,
230
- members: ["init", "run"],
231
- memberVisibility: new Map([
232
- ["init", "public"],
233
- ["run", "private"],
234
- ]),
235
- };
294
+ const motorScope = TestScopeUtils.createMockScope("Motor");
295
+ (motorScope.members as string[]).push("init", "run");
296
+ (motorScope.memberVisibility as Map<string, string>).set(
297
+ "init",
298
+ "public",
299
+ );
300
+ (motorScope.memberVisibility as Map<string, string>).set(
301
+ "run",
302
+ "private",
303
+ );
236
304
 
237
- const info = TSymbolInfoAdapter.convert([scope]);
305
+ const info = TSymbolInfoAdapter.convert([motorScope]);
238
306
 
239
307
  expect(info.knownScopes.has("Motor")).toBe(true);
240
308
  });
241
309
 
242
310
  it("should populate scopeMembers with member names", () => {
243
- const scope: IScopeSymbol = {
244
- kind: ESymbolKind.Namespace,
245
- name: "LED",
246
- sourceFile: "test.cnx",
247
- sourceLine: 1,
248
- sourceLanguage: ESourceLanguage.CNext,
249
- isExported: true,
250
- members: ["on", "off", "toggle"],
251
- memberVisibility: new Map([
252
- ["on", "public"],
253
- ["off", "public"],
254
- ["toggle", "private"],
255
- ]),
256
- };
311
+ const ledScope = TestScopeUtils.createMockScope("LED");
312
+ (ledScope.members as string[]).push("on", "off", "toggle");
313
+ (ledScope.memberVisibility as Map<string, string>).set("on", "public");
314
+ (ledScope.memberVisibility as Map<string, string>).set("off", "public");
315
+ (ledScope.memberVisibility as Map<string, string>).set(
316
+ "toggle",
317
+ "private",
318
+ );
257
319
 
258
- const info = TSymbolInfoAdapter.convert([scope]);
320
+ const info = TSymbolInfoAdapter.convert([ledScope]);
259
321
 
260
322
  const members = info.scopeMembers.get("LED");
261
323
  expect(members?.has("on")).toBe(true);
@@ -264,22 +326,22 @@ describe("TSymbolInfoAdapter", () => {
264
326
  });
265
327
 
266
328
  it("should populate scopeMemberVisibility", () => {
267
- const scope: IScopeSymbol = {
268
- kind: ESymbolKind.Namespace,
269
- name: "Timer",
270
- sourceFile: "test.cnx",
271
- sourceLine: 1,
272
- sourceLanguage: ESourceLanguage.CNext,
273
- isExported: true,
274
- members: ["start", "stop", "reset"],
275
- memberVisibility: new Map([
276
- ["start", "public"],
277
- ["stop", "public"],
278
- ["reset", "private"],
279
- ]),
280
- };
329
+ const timerScope = TestScopeUtils.createMockScope("Timer");
330
+ (timerScope.members as string[]).push("start", "stop", "reset");
331
+ (timerScope.memberVisibility as Map<string, string>).set(
332
+ "start",
333
+ "public",
334
+ );
335
+ (timerScope.memberVisibility as Map<string, string>).set(
336
+ "stop",
337
+ "public",
338
+ );
339
+ (timerScope.memberVisibility as Map<string, string>).set(
340
+ "reset",
341
+ "private",
342
+ );
281
343
 
282
- const info = TSymbolInfoAdapter.convert([scope]);
344
+ const info = TSymbolInfoAdapter.convert([timerScope]);
283
345
 
284
346
  const visibility = info.scopeMemberVisibility.get("Timer");
285
347
  expect(visibility?.get("start")).toBe("public");
@@ -291,8 +353,9 @@ describe("TSymbolInfoAdapter", () => {
291
353
  describe("convert registers", () => {
292
354
  it("should populate knownRegisters set", () => {
293
355
  const register: IRegisterSymbol = {
294
- kind: ESymbolKind.Register,
356
+ kind: "register",
295
357
  name: "GPIO",
358
+ scope: globalScope,
296
359
  sourceFile: "test.cnx",
297
360
  sourceLine: 1,
298
361
  sourceLanguage: ESourceLanguage.CNext,
@@ -310,8 +373,9 @@ describe("TSymbolInfoAdapter", () => {
310
373
 
311
374
  it("should populate registerBaseAddresses", () => {
312
375
  const register: IRegisterSymbol = {
313
- kind: ESymbolKind.Register,
376
+ kind: "register",
314
377
  name: "UART",
378
+ scope: globalScope,
315
379
  sourceFile: "test.cnx",
316
380
  sourceLine: 1,
317
381
  sourceLanguage: ESourceLanguage.CNext,
@@ -329,8 +393,9 @@ describe("TSymbolInfoAdapter", () => {
329
393
 
330
394
  it("should populate register member info maps", () => {
331
395
  const register: IRegisterSymbol = {
332
- kind: ESymbolKind.Register,
396
+ kind: "register",
333
397
  name: "SPI",
398
+ scope: globalScope,
334
399
  sourceFile: "test.cnx",
335
400
  sourceLine: 1,
336
401
  sourceLanguage: ESourceLanguage.CNext,
@@ -354,8 +419,9 @@ describe("TSymbolInfoAdapter", () => {
354
419
 
355
420
  it("should track bitmap types for register members", () => {
356
421
  const bitmap: IBitmapSymbol = {
357
- kind: ESymbolKind.Bitmap,
422
+ kind: "bitmap",
358
423
  name: "StatusFlags",
424
+ scope: globalScope,
359
425
  sourceFile: "test.cnx",
360
426
  sourceLine: 1,
361
427
  sourceLanguage: ESourceLanguage.CNext,
@@ -366,8 +432,9 @@ describe("TSymbolInfoAdapter", () => {
366
432
  };
367
433
 
368
434
  const register: IRegisterSymbol = {
369
- kind: ESymbolKind.Register,
435
+ kind: "register",
370
436
  name: "CTRL",
437
+ scope: globalScope,
371
438
  sourceFile: "test.cnx",
372
439
  sourceLine: 1,
373
440
  sourceLanguage: ESourceLanguage.CNext,
@@ -395,15 +462,17 @@ describe("TSymbolInfoAdapter", () => {
395
462
 
396
463
  describe("convert variables", () => {
397
464
  it("should track private scope const values for inlining", () => {
398
- // Variable with scope prefix (scoped variable)
465
+ // Create a scoped variable with bare name and scope reference
466
+ const motorScope = TestScopeUtils.createMockScope("Motor");
399
467
  const variable: IVariableSymbol = {
400
- kind: ESymbolKind.Variable,
401
- name: "Motor_MAX_SPEED",
468
+ kind: "variable",
469
+ name: "MAX_SPEED", // Bare name - adapter computes mangled name
470
+ scope: motorScope,
402
471
  sourceFile: "test.cnx",
403
472
  sourceLine: 1,
404
473
  sourceLanguage: ESourceLanguage.CNext,
405
474
  isExported: false, // private
406
- type: "u32",
475
+ type: TypeResolver.resolve("u32"),
407
476
  isConst: true,
408
477
  isAtomic: false,
409
478
  isArray: false,
@@ -412,18 +481,21 @@ describe("TSymbolInfoAdapter", () => {
412
481
 
413
482
  const info = TSymbolInfoAdapter.convert([variable]);
414
483
 
484
+ // Adapter stores using mangled name (scope + bare name)
415
485
  expect(info.scopePrivateConstValues.get("Motor_MAX_SPEED")).toBe("255");
416
486
  });
417
487
 
418
488
  it("should not track public const values", () => {
489
+ const motorScope = TestScopeUtils.createMockScope("Motor");
419
490
  const variable: IVariableSymbol = {
420
- kind: ESymbolKind.Variable,
421
- name: "Motor_PUBLIC_CONST",
491
+ kind: "variable",
492
+ name: "PUBLIC_CONST", // Bare name - adapter computes mangled name
493
+ scope: motorScope,
422
494
  sourceFile: "test.cnx",
423
495
  sourceLine: 1,
424
496
  sourceLanguage: ESourceLanguage.CNext,
425
497
  isExported: true, // public
426
- type: "u32",
498
+ type: TypeResolver.resolve("u32"),
427
499
  isConst: true,
428
500
  isAtomic: false,
429
501
  isArray: false,
@@ -438,14 +510,16 @@ describe("TSymbolInfoAdapter", () => {
438
510
  });
439
511
 
440
512
  it("should not track non-const private values", () => {
513
+ const motorScope = TestScopeUtils.createMockScope("Motor");
441
514
  const variable: IVariableSymbol = {
442
- kind: ESymbolKind.Variable,
443
- name: "Motor_counter",
515
+ kind: "variable",
516
+ name: "counter", // Bare name - adapter computes mangled name
517
+ scope: motorScope,
444
518
  sourceFile: "test.cnx",
445
519
  sourceLine: 1,
446
520
  sourceLanguage: ESourceLanguage.CNext,
447
521
  isExported: false,
448
- type: "u32",
522
+ type: TypeResolver.resolve("u32"),
449
523
  isConst: false, // not const
450
524
  isAtomic: false,
451
525
  isArray: false,
@@ -458,14 +532,16 @@ describe("TSymbolInfoAdapter", () => {
458
532
 
459
533
  it("should NOT track private const array values for inlining", () => {
460
534
  // Issue #500: Array consts must be emitted, not inlined
535
+ const motorScope = TestScopeUtils.createMockScope("Motor");
461
536
  const variable: IVariableSymbol = {
462
- kind: ESymbolKind.Variable,
463
- name: "Motor_LOOKUP_TABLE",
537
+ kind: "variable",
538
+ name: "LOOKUP_TABLE", // Bare name - adapter computes mangled name
539
+ scope: motorScope,
464
540
  sourceFile: "test.cnx",
465
541
  sourceLine: 1,
466
542
  sourceLanguage: ESourceLanguage.CNext,
467
543
  isExported: false,
468
- type: "u16",
544
+ type: TypeResolver.resolve("u16"),
469
545
  isConst: true,
470
546
  isAtomic: false,
471
547
  isArray: true,
@@ -483,14 +559,16 @@ describe("TSymbolInfoAdapter", () => {
483
559
 
484
560
  it("should NOT track private const multi-dimensional array values", () => {
485
561
  // Issue #500: Multi-dimensional arrays must also be emitted
562
+ const motorScope = TestScopeUtils.createMockScope("Motor");
486
563
  const variable: IVariableSymbol = {
487
- kind: ESymbolKind.Variable,
488
- name: "Motor_MATRIX",
564
+ kind: "variable",
565
+ name: "MATRIX", // Bare name - adapter computes mangled name
566
+ scope: motorScope,
489
567
  sourceFile: "test.cnx",
490
568
  sourceLine: 1,
491
569
  sourceLanguage: ESourceLanguage.CNext,
492
570
  isExported: false,
493
- type: "u8",
571
+ type: TypeResolver.resolve("u8"),
494
572
  isConst: true,
495
573
  isAtomic: false,
496
574
  isArray: true,
@@ -506,49 +584,48 @@ describe("TSymbolInfoAdapter", () => {
506
584
 
507
585
  describe("hasPublicSymbols", () => {
508
586
  it("should return true when scope has public members", () => {
509
- const scope: IScopeSymbol = {
510
- kind: ESymbolKind.Namespace,
511
- name: "LED",
512
- sourceFile: "test.cnx",
513
- sourceLine: 1,
514
- sourceLanguage: ESourceLanguage.CNext,
515
- isExported: true,
516
- members: ["on"],
517
- memberVisibility: new Map([["on", "public"]]),
518
- };
587
+ const ledScope = TestScopeUtils.createMockScope("LED");
588
+ (ledScope.members as string[]).push("on");
589
+ (ledScope.memberVisibility as Map<string, string>).set("on", "public");
519
590
 
520
- const info = TSymbolInfoAdapter.convert([scope]);
591
+ const info = TSymbolInfoAdapter.convert([ledScope]);
521
592
 
522
593
  expect(info.hasPublicSymbols()).toBe(true);
523
594
  });
524
595
 
525
596
  it("should return false when all scope members are private", () => {
526
- const scope: IScopeSymbol = {
527
- kind: ESymbolKind.Namespace,
528
- name: "Internal",
529
- sourceFile: "test.cnx",
530
- sourceLine: 1,
531
- sourceLanguage: ESourceLanguage.CNext,
532
- isExported: true,
533
- members: ["helper"],
534
- memberVisibility: new Map([["helper", "private"]]),
535
- };
597
+ const internalScope = TestScopeUtils.createMockScope("Internal");
598
+ (internalScope.members as string[]).push("helper");
599
+ (internalScope.memberVisibility as Map<string, string>).set(
600
+ "helper",
601
+ "private",
602
+ );
536
603
 
537
- const info = TSymbolInfoAdapter.convert([scope]);
604
+ const info = TSymbolInfoAdapter.convert([internalScope]);
538
605
 
539
606
  expect(info.hasPublicSymbols()).toBe(false);
540
607
  });
541
608
 
542
609
  it("should return false when there are no scopes", () => {
543
610
  const struct: IStructSymbol = {
544
- kind: ESymbolKind.Struct,
611
+ kind: "struct",
545
612
  name: "Point",
613
+ scope: globalScope,
546
614
  sourceFile: "test.cnx",
547
615
  sourceLine: 1,
548
616
  sourceLanguage: ESourceLanguage.CNext,
549
617
  isExported: true,
550
618
  fields: new Map([
551
- ["x", { type: "i32", isArray: false, isConst: false }],
619
+ [
620
+ "x",
621
+ {
622
+ name: "x",
623
+ type: TypeResolver.resolve("i32"),
624
+ isArray: false,
625
+ isConst: false,
626
+ isAtomic: false,
627
+ },
628
+ ],
552
629
  ]),
553
630
  };
554
631
 
@@ -568,18 +645,14 @@ describe("TSymbolInfoAdapter", () => {
568
645
  // Note: scopeVariableUsage requires function body analysis
569
646
  // which isn't done by the current collectors
570
647
  it("should return null for unknown variables", () => {
571
- const scope: IScopeSymbol = {
572
- kind: ESymbolKind.Namespace,
573
- name: "Motor",
574
- sourceFile: "test.cnx",
575
- sourceLine: 1,
576
- sourceLanguage: ESourceLanguage.CNext,
577
- isExported: true,
578
- members: ["counter"],
579
- memberVisibility: new Map([["counter", "private"]]),
580
- };
648
+ const motorScope = TestScopeUtils.createMockScope("Motor");
649
+ (motorScope.members as string[]).push("counter");
650
+ (motorScope.memberVisibility as Map<string, string>).set(
651
+ "counter",
652
+ "private",
653
+ );
581
654
 
582
- const info = TSymbolInfoAdapter.convert([scope]);
655
+ const info = TSymbolInfoAdapter.convert([motorScope]);
583
656
 
584
657
  expect(info.getSingleFunctionForVariable("Motor", "counter")).toBeNull();
585
658
  });
@@ -587,21 +660,39 @@ describe("TSymbolInfoAdapter", () => {
587
660
 
588
661
  describe("mixed symbols", () => {
589
662
  it("should handle array of different symbol types", () => {
663
+ const motorScope = TestScopeUtils.createMockScope("Motor");
664
+ (motorScope.members as string[]).push("init");
665
+ (motorScope.memberVisibility as Map<string, string>).set(
666
+ "init",
667
+ "public",
668
+ );
669
+
590
670
  const symbols = [
591
671
  {
592
- kind: ESymbolKind.Struct,
672
+ kind: "struct",
593
673
  name: "Point",
674
+ scope: globalScope,
594
675
  sourceFile: "test.cnx",
595
676
  sourceLine: 1,
596
677
  sourceLanguage: ESourceLanguage.CNext,
597
678
  isExported: true,
598
679
  fields: new Map([
599
- ["x", { type: "i32", isArray: false, isConst: false }],
680
+ [
681
+ "x",
682
+ {
683
+ name: "x",
684
+ type: TypeResolver.resolve("i32"),
685
+ isArray: false,
686
+ isConst: false,
687
+ isAtomic: false,
688
+ },
689
+ ],
600
690
  ]),
601
691
  } as IStructSymbol,
602
692
  {
603
- kind: ESymbolKind.Enum,
693
+ kind: "enum",
604
694
  name: "Color",
695
+ scope: globalScope,
605
696
  sourceFile: "test.cnx",
606
697
  sourceLine: 5,
607
698
  sourceLanguage: ESourceLanguage.CNext,
@@ -611,24 +702,17 @@ describe("TSymbolInfoAdapter", () => {
611
702
  ["Green", 1],
612
703
  ]),
613
704
  } as IEnumSymbol,
705
+ motorScope,
614
706
  {
615
- kind: ESymbolKind.Namespace,
616
- name: "Motor",
617
- sourceFile: "test.cnx",
618
- sourceLine: 10,
619
- sourceLanguage: ESourceLanguage.CNext,
620
- isExported: true,
621
- members: ["init"],
622
- memberVisibility: new Map([["init", "public"]]),
623
- } as IScopeSymbol,
624
- {
625
- kind: ESymbolKind.Function,
707
+ kind: "function",
626
708
  name: "main",
709
+ scope: globalScope,
710
+ body: null,
627
711
  sourceFile: "test.cnx",
628
712
  sourceLine: 15,
629
713
  sourceLanguage: ESourceLanguage.CNext,
630
714
  isExported: true,
631
- returnType: "void",
715
+ returnType: TypeResolver.resolve("void"),
632
716
  visibility: "public",
633
717
  parameters: [],
634
718
  } as IFunctionSymbol,