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
@@ -1,8 +1,8 @@
1
1
  import { describe, expect, it } from "vitest";
2
2
  import parse from "./testHelpers";
3
3
  import BitmapCollector from "../collectors/BitmapCollector";
4
- import ESymbolKind from "../../../../../utils/types/ESymbolKind";
5
4
  import ESourceLanguage from "../../../../../utils/types/ESourceLanguage";
5
+ import TestScopeUtils from "./testUtils";
6
6
 
7
7
  describe("BitmapCollector", () => {
8
8
  describe("basic bitmap extraction", () => {
@@ -18,9 +18,13 @@ describe("BitmapCollector", () => {
18
18
  `;
19
19
  const tree = parse(code);
20
20
  const bitmapCtx = tree.declaration(0)!.bitmapDeclaration()!;
21
- const symbol = BitmapCollector.collect(bitmapCtx, "test.cnx");
21
+ const symbol = BitmapCollector.collect(
22
+ bitmapCtx,
23
+ "test.cnx",
24
+ TestScopeUtils.getGlobalScope(),
25
+ );
22
26
 
23
- expect(symbol.kind).toBe(ESymbolKind.Bitmap);
27
+ expect(symbol.kind).toBe("bitmap");
24
28
  expect(symbol.name).toBe("Status");
25
29
  expect(symbol.backingType).toBe("uint8_t");
26
30
  expect(symbol.bitWidth).toBe(8);
@@ -47,7 +51,11 @@ describe("BitmapCollector", () => {
47
51
  `;
48
52
  const tree = parse(code);
49
53
  const bitmapCtx = tree.declaration(0)!.bitmapDeclaration()!;
50
- const symbol = BitmapCollector.collect(bitmapCtx, "control.cnx");
54
+ const symbol = BitmapCollector.collect(
55
+ bitmapCtx,
56
+ "control.cnx",
57
+ TestScopeUtils.getGlobalScope(),
58
+ );
51
59
 
52
60
  expect(symbol.name).toBe("Control");
53
61
  expect(symbol.backingType).toBe("uint16_t");
@@ -68,7 +76,11 @@ describe("BitmapCollector", () => {
68
76
  `;
69
77
  const tree = parse(code);
70
78
  const bitmapCtx = tree.declaration(0)!.bitmapDeclaration()!;
71
- const symbol = BitmapCollector.collect(bitmapCtx, "config.cnx");
79
+ const symbol = BitmapCollector.collect(
80
+ bitmapCtx,
81
+ "config.cnx",
82
+ TestScopeUtils.getGlobalScope(),
83
+ );
72
84
 
73
85
  expect(symbol.name).toBe("Config");
74
86
  expect(symbol.backingType).toBe("uint32_t");
@@ -85,7 +97,11 @@ describe("BitmapCollector", () => {
85
97
  `;
86
98
  const tree = parse(code);
87
99
  const bitmapCtx = tree.declaration(0)!.bitmapDeclaration()!;
88
- const symbol = BitmapCollector.collect(bitmapCtx, "rgb.cnx");
100
+ const symbol = BitmapCollector.collect(
101
+ bitmapCtx,
102
+ "rgb.cnx",
103
+ TestScopeUtils.getGlobalScope(),
104
+ );
89
105
 
90
106
  expect(symbol.name).toBe("RGB");
91
107
  expect(symbol.backingType).toBe("uint32_t"); // 24-bit uses 32-bit backing
@@ -106,9 +122,16 @@ describe("BitmapCollector", () => {
106
122
  `;
107
123
  const tree = parse(code);
108
124
  const bitmapCtx = tree.declaration(0)!.bitmapDeclaration()!;
109
- const symbol = BitmapCollector.collect(bitmapCtx, "motor.cnx", "Motor");
125
+ const motorScope = TestScopeUtils.createMockScope("Motor");
126
+ const symbol = BitmapCollector.collect(
127
+ bitmapCtx,
128
+ "motor.cnx",
129
+ motorScope,
130
+ );
110
131
 
111
- expect(symbol.name).toBe("Motor_Flags");
132
+ // With the new IScopeSymbol-based design, name is just "Flags" (not prefixed)
133
+ // The prefixing happens in TSymbolAdapter for backwards compatibility
134
+ expect(symbol.name).toBe("Flags");
112
135
  });
113
136
  });
114
137
 
@@ -123,7 +146,13 @@ describe("BitmapCollector", () => {
123
146
  const tree = parse(code);
124
147
  const bitmapCtx = tree.declaration(0)!.bitmapDeclaration()!;
125
148
 
126
- expect(() => BitmapCollector.collect(bitmapCtx, "test.cnx")).toThrow(
149
+ expect(() =>
150
+ BitmapCollector.collect(
151
+ bitmapCtx,
152
+ "test.cnx",
153
+ TestScopeUtils.getGlobalScope(),
154
+ ),
155
+ ).toThrow(
127
156
  "Error: Bitmap 'TooMany' has 10 bits but bitmap8 requires exactly 8 bits",
128
157
  );
129
158
  });
@@ -138,7 +167,13 @@ describe("BitmapCollector", () => {
138
167
  const tree = parse(code);
139
168
  const bitmapCtx = tree.declaration(0)!.bitmapDeclaration()!;
140
169
 
141
- expect(() => BitmapCollector.collect(bitmapCtx, "test.cnx")).toThrow(
170
+ expect(() =>
171
+ BitmapCollector.collect(
172
+ bitmapCtx,
173
+ "test.cnx",
174
+ TestScopeUtils.getGlobalScope(),
175
+ ),
176
+ ).toThrow(
142
177
  "Error: Bitmap 'TooFew' has 4 bits but bitmap8 requires exactly 8 bits",
143
178
  );
144
179
  });
@@ -154,7 +189,11 @@ describe("BitmapCollector", () => {
154
189
  `;
155
190
  const tree = parse(code);
156
191
  const bitmapCtx = tree.declaration(0)!.bitmapDeclaration()!;
157
- const symbol = BitmapCollector.collect(bitmapCtx, "test.cnx");
192
+ const symbol = BitmapCollector.collect(
193
+ bitmapCtx,
194
+ "test.cnx",
195
+ TestScopeUtils.getGlobalScope(),
196
+ );
158
197
 
159
198
  expect(symbol.sourceLine).toBe(3);
160
199
  });
@@ -1,8 +1,7 @@
1
1
  import { describe, expect, it } from "vitest";
2
2
  import parse from "./testHelpers";
3
3
  import CNextResolver from "../index";
4
- import ESymbolKind from "../../../../../utils/types/ESymbolKind";
5
- import SymbolGuards from "../../types/typeGuards";
4
+ import SymbolGuards from "../../../../types/symbols/SymbolGuards";
6
5
 
7
6
  describe("CNextResolver Integration", () => {
8
7
  describe("single declaration types", () => {
@@ -117,20 +116,24 @@ describe("CNextResolver Integration", () => {
117
116
  expect(scope).toBeDefined();
118
117
  expect(SymbolGuards.isScope(scope!)).toBe(true);
119
118
 
120
- const positionVar = symbols.find((s) => s.name === "Motor_position");
119
+ // Members now have bare names with scope references
120
+ const positionVar = symbols.find((s) => s.name === "position");
121
121
  expect(positionVar).toBeDefined();
122
122
  expect(SymbolGuards.isVariable(positionVar!)).toBe(true);
123
+ expect(positionVar!.scope.name).toBe("Motor");
123
124
 
124
- const initFunc = symbols.find((s) => s.name === "Motor_init");
125
+ const initFunc = symbols.find((s) => s.name === "init");
125
126
  expect(initFunc).toBeDefined();
126
127
  if (SymbolGuards.isFunction(initFunc!)) {
127
128
  expect(initFunc.visibility).toBe("public");
129
+ expect(initFunc.scope.name).toBe("Motor");
128
130
  }
129
131
 
130
- const updateFunc = symbols.find((s) => s.name === "Motor_update");
132
+ const updateFunc = symbols.find((s) => s.name === "update");
131
133
  expect(updateFunc).toBeDefined();
132
134
  if (SymbolGuards.isFunction(updateFunc!)) {
133
135
  expect(updateFunc.visibility).toBe("private");
136
+ expect(updateFunc.scope.name).toBe("Motor");
134
137
  }
135
138
  });
136
139
 
@@ -153,13 +156,16 @@ describe("CNextResolver Integration", () => {
153
156
  // Scope + enum + struct
154
157
  expect(symbols.length).toBe(3);
155
158
 
156
- const enumSym = symbols.find((s) => s.name === "Motor_State");
159
+ // Nested types have bare names with scope references
160
+ const enumSym = symbols.find((s) => s.name === "State");
157
161
  expect(enumSym).toBeDefined();
158
162
  expect(SymbolGuards.isEnum(enumSym!)).toBe(true);
163
+ expect(enumSym!.scope.name).toBe("Motor");
159
164
 
160
- const structSym = symbols.find((s) => s.name === "Motor_Config");
165
+ const structSym = symbols.find((s) => s.name === "Config");
161
166
  expect(structSym).toBeDefined();
162
167
  expect(SymbolGuards.isStruct(structSym!)).toBe(true);
168
+ expect(structSym!.scope.name).toBe("Motor");
163
169
  });
164
170
  });
165
171
 
@@ -210,8 +216,10 @@ describe("CNextResolver Integration", () => {
210
216
  // Scope + bitmap + register
211
217
  expect(symbols.length).toBe(3);
212
218
 
213
- const regSymbol = symbols.find((s) => s.name === "Motor_CTRL");
219
+ // Both bitmap and register have bare names with scope references
220
+ const regSymbol = symbols.find((s) => s.name === "CTRL");
214
221
  expect(regSymbol).toBeDefined();
222
+ expect(regSymbol!.scope.name).toBe("Motor");
215
223
  if (SymbolGuards.isRegister(regSymbol!)) {
216
224
  expect(regSymbol.members.get("FLAGS")?.bitmapType).toBe(
217
225
  "Motor_CtrlFlags",
@@ -270,44 +278,32 @@ describe("CNextResolver Integration", () => {
270
278
  // 1 bitmap (Status)
271
279
  // 1 register (GPIO)
272
280
  // 1 scope (Motor)
273
- // 2 scope variables (Motor_position, Motor_direction)
274
- // 2 scope functions (Motor_init, Motor_move)
281
+ // 2 scope variables (position, direction)
282
+ // 2 scope functions (init, move)
275
283
  // 1 top-level function (main)
276
284
  // Total: 10
277
285
  expect(symbols.length).toBe(10);
278
286
 
279
287
  // Verify each type is present
280
- const structSymbols = symbols.filter(
281
- (s) => s.kind === ESymbolKind.Struct,
282
- );
288
+ const structSymbols = symbols.filter((s) => s.kind === "struct");
283
289
  expect(structSymbols.length).toBe(1);
284
290
 
285
- const enumSymbols = symbols.filter((s) => s.kind === ESymbolKind.Enum);
291
+ const enumSymbols = symbols.filter((s) => s.kind === "enum");
286
292
  expect(enumSymbols.length).toBe(1);
287
293
 
288
- const bitmapSymbols = symbols.filter(
289
- (s) => s.kind === ESymbolKind.Bitmap,
290
- );
294
+ const bitmapSymbols = symbols.filter((s) => s.kind === "bitmap");
291
295
  expect(bitmapSymbols.length).toBe(1);
292
296
 
293
- const registerSymbols = symbols.filter(
294
- (s) => s.kind === ESymbolKind.Register,
295
- );
297
+ const registerSymbols = symbols.filter((s) => s.kind === "register");
296
298
  expect(registerSymbols.length).toBe(1);
297
299
 
298
- const scopeSymbols = symbols.filter(
299
- (s) => s.kind === ESymbolKind.Namespace,
300
- );
300
+ const scopeSymbols = symbols.filter((s) => s.kind === "scope");
301
301
  expect(scopeSymbols.length).toBe(1);
302
302
 
303
- const functionSymbols = symbols.filter(
304
- (s) => s.kind === ESymbolKind.Function,
305
- );
303
+ const functionSymbols = symbols.filter((s) => s.kind === "function");
306
304
  expect(functionSymbols.length).toBe(3);
307
305
 
308
- const variableSymbols = symbols.filter(
309
- (s) => s.kind === ESymbolKind.Variable,
310
- );
306
+ const variableSymbols = symbols.filter((s) => s.kind === "variable");
311
307
  expect(variableSymbols.length).toBe(2);
312
308
  });
313
309
 
@@ -340,10 +336,22 @@ describe("CNextResolver Integration", () => {
340
336
  expect(ledScope).toBeDefined();
341
337
  expect(motorScope).toBeDefined();
342
338
 
343
- expect(symbols.find((s) => s.name === "LED_on")).toBeDefined();
344
- expect(symbols.find((s) => s.name === "LED_off")).toBeDefined();
345
- expect(symbols.find((s) => s.name === "Motor_start")).toBeDefined();
346
- expect(symbols.find((s) => s.name === "Motor_stop")).toBeDefined();
339
+ // Functions have bare names with scope references
340
+ const onFunc = symbols.find((s) => s.name === "on");
341
+ expect(onFunc).toBeDefined();
342
+ expect(onFunc!.scope.name).toBe("LED");
343
+
344
+ const offFunc = symbols.find((s) => s.name === "off");
345
+ expect(offFunc).toBeDefined();
346
+ expect(offFunc!.scope.name).toBe("LED");
347
+
348
+ const startFunc = symbols.find((s) => s.name === "start");
349
+ expect(startFunc).toBeDefined();
350
+ expect(startFunc!.scope.name).toBe("Motor");
351
+
352
+ const stopFunc = symbols.find((s) => s.name === "stop");
353
+ expect(stopFunc).toBeDefined();
354
+ expect(stopFunc!.scope.name).toBe("Motor");
347
355
  });
348
356
  });
349
357
 
@@ -386,7 +394,10 @@ describe("CNextResolver Integration", () => {
386
394
  const tree = parse(code);
387
395
  const symbols = CNextResolver.resolve(tree, "test.cnx");
388
396
 
389
- const bufferSymbol = symbols.find((s) => s.name === "Device_buffer");
397
+ // Find buffer by bare name with scope reference
398
+ const bufferSymbol = symbols.find(
399
+ (s) => s.name === "buffer" && s.scope?.name === "Device",
400
+ );
390
401
  expect(bufferSymbol).toBeDefined();
391
402
  if (SymbolGuards.isVariable(bufferSymbol!)) {
392
403
  expect(bufferSymbol.isArray).toBe(true);
@@ -1,10 +1,14 @@
1
- import { describe, expect, it } from "vitest";
1
+ import { describe, expect, it, beforeEach } from "vitest";
2
2
  import parse from "./testHelpers";
3
+ import TestScopeUtils from "./testUtils";
3
4
  import EnumCollector from "../collectors/EnumCollector";
4
- import ESymbolKind from "../../../../../utils/types/ESymbolKind";
5
5
  import ESourceLanguage from "../../../../../utils/types/ESourceLanguage";
6
6
 
7
7
  describe("EnumCollector", () => {
8
+ beforeEach(() => {
9
+ TestScopeUtils.resetGlobalScope();
10
+ });
11
+
8
12
  describe("basic enum extraction", () => {
9
13
  it("collects a simple enum with auto-increment values", () => {
10
14
  const code = `
@@ -16,13 +20,15 @@ describe("EnumCollector", () => {
16
20
  `;
17
21
  const tree = parse(code);
18
22
  const enumCtx = tree.declaration(0)!.enumDeclaration()!;
19
- const symbol = EnumCollector.collect(enumCtx, "test.cnx");
23
+ const globalScope = TestScopeUtils.getGlobalScope();
24
+ const symbol = EnumCollector.collect(enumCtx, "test.cnx", globalScope);
20
25
 
21
- expect(symbol.kind).toBe(ESymbolKind.Enum);
26
+ expect(symbol.kind).toBe("enum");
22
27
  expect(symbol.name).toBe("Color");
23
28
  expect(symbol.sourceFile).toBe("test.cnx");
24
29
  expect(symbol.sourceLanguage).toBe(ESourceLanguage.CNext);
25
30
  expect(symbol.isExported).toBe(true);
31
+ expect(symbol.scope).toBe(globalScope);
26
32
 
27
33
  // Check members
28
34
  expect(symbol.members.size).toBe(3);
@@ -41,7 +47,8 @@ describe("EnumCollector", () => {
41
47
  `;
42
48
  const tree = parse(code);
43
49
  const enumCtx = tree.declaration(0)!.enumDeclaration()!;
44
- const symbol = EnumCollector.collect(enumCtx, "test.cnx");
50
+ const globalScope = TestScopeUtils.getGlobalScope();
51
+ const symbol = EnumCollector.collect(enumCtx, "test.cnx", globalScope);
45
52
 
46
53
  expect(symbol.members.get("Low")).toBe(10);
47
54
  expect(symbol.members.get("Medium")).toBe(20);
@@ -60,7 +67,8 @@ describe("EnumCollector", () => {
60
67
  `;
61
68
  const tree = parse(code);
62
69
  const enumCtx = tree.declaration(0)!.enumDeclaration()!;
63
- const symbol = EnumCollector.collect(enumCtx, "test.cnx");
70
+ const globalScope = TestScopeUtils.getGlobalScope();
71
+ const symbol = EnumCollector.collect(enumCtx, "test.cnx", globalScope);
64
72
 
65
73
  expect(symbol.members.get("Idle")).toBe(0);
66
74
  expect(symbol.members.get("Running")).toBe(5);
@@ -81,7 +89,8 @@ describe("EnumCollector", () => {
81
89
  `;
82
90
  const tree = parse(code);
83
91
  const enumCtx = tree.declaration(0)!.enumDeclaration()!;
84
- const symbol = EnumCollector.collect(enumCtx, "test.cnx");
92
+ const globalScope = TestScopeUtils.getGlobalScope();
93
+ const symbol = EnumCollector.collect(enumCtx, "test.cnx", globalScope);
85
94
 
86
95
  expect(symbol.members.get("A")).toBe(1);
87
96
  expect(symbol.members.get("B")).toBe(2);
@@ -99,7 +108,8 @@ describe("EnumCollector", () => {
99
108
  `;
100
109
  const tree = parse(code);
101
110
  const enumCtx = tree.declaration(0)!.enumDeclaration()!;
102
- const symbol = EnumCollector.collect(enumCtx, "test.cnx");
111
+ const globalScope = TestScopeUtils.getGlobalScope();
112
+ const symbol = EnumCollector.collect(enumCtx, "test.cnx", globalScope);
103
113
 
104
114
  expect(symbol.members.get("Bit0")).toBe(1);
105
115
  expect(symbol.members.get("Bit1")).toBe(2);
@@ -109,7 +119,7 @@ describe("EnumCollector", () => {
109
119
  });
110
120
 
111
121
  describe("scoped enums", () => {
112
- it("prefixes name with scope when scopeName is provided", () => {
122
+ it("uses scope reference properly", () => {
113
123
  const code = `
114
124
  enum State {
115
125
  Off,
@@ -118,9 +128,12 @@ describe("EnumCollector", () => {
118
128
  `;
119
129
  const tree = parse(code);
120
130
  const enumCtx = tree.declaration(0)!.enumDeclaration()!;
121
- const symbol = EnumCollector.collect(enumCtx, "motor.cnx", "Motor");
131
+ const motorScope = TestScopeUtils.createMockScope("Motor");
132
+ const symbol = EnumCollector.collect(enumCtx, "motor.cnx", motorScope);
122
133
 
123
- expect(symbol.name).toBe("Motor_State");
134
+ expect(symbol.name).toBe("State");
135
+ expect(symbol.scope).toBe(motorScope);
136
+ expect(symbol.scope.name).toBe("Motor");
124
137
  });
125
138
  });
126
139
 
@@ -133,8 +146,11 @@ describe("EnumCollector", () => {
133
146
  `;
134
147
  const tree = parse(code);
135
148
  const enumCtx = tree.declaration(0)!.enumDeclaration()!;
149
+ const globalScope = TestScopeUtils.getGlobalScope();
136
150
 
137
- expect(() => EnumCollector.collect(enumCtx, "test.cnx")).toThrow(
151
+ expect(() =>
152
+ EnumCollector.collect(enumCtx, "test.cnx", globalScope),
153
+ ).toThrow(
138
154
  "Error: Negative values not allowed in enum (found -1 in Invalid.Bad)",
139
155
  );
140
156
  });
@@ -150,7 +166,8 @@ describe("EnumCollector", () => {
150
166
  `;
151
167
  const tree = parse(code);
152
168
  const enumCtx = tree.declaration(0)!.enumDeclaration()!;
153
- const symbol = EnumCollector.collect(enumCtx, "test.cnx");
169
+ const globalScope = TestScopeUtils.getGlobalScope();
170
+ const symbol = EnumCollector.collect(enumCtx, "test.cnx", globalScope);
154
171
 
155
172
  expect(symbol.sourceLine).toBe(3);
156
173
  });