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,9 @@
1
1
  import { describe, expect, it } from "vitest";
2
2
  import parse from "./testHelpers";
3
+ import TestScopeUtils from "./testUtils";
3
4
  import VariableCollector from "../collectors/VariableCollector";
4
- import ESymbolKind from "../../../../../utils/types/ESymbolKind";
5
5
  import ESourceLanguage from "../../../../../utils/types/ESourceLanguage";
6
+ import TypeResolver from "../../../../../utils/TypeResolver";
6
7
 
7
8
  describe("VariableCollector", () => {
8
9
  describe("basic variable extraction", () => {
@@ -12,11 +13,15 @@ describe("VariableCollector", () => {
12
13
  `;
13
14
  const tree = parse(code);
14
15
  const varCtx = tree.declaration(0)!.variableDeclaration()!;
15
- const symbol = VariableCollector.collect(varCtx, "test.cnx");
16
+ const symbol = VariableCollector.collect(
17
+ varCtx,
18
+ "test.cnx",
19
+ TestScopeUtils.getGlobalScope(),
20
+ );
16
21
 
17
- expect(symbol.kind).toBe(ESymbolKind.Variable);
22
+ expect(symbol.kind).toBe("variable");
18
23
  expect(symbol.name).toBe("counter");
19
- expect(symbol.type).toBe("u32");
24
+ expect(TypeResolver.getTypeName(symbol.type)).toBe("u32");
20
25
  expect(symbol.isConst).toBe(false);
21
26
  expect(symbol.isArray).toBe(false);
22
27
  expect(symbol.sourceFile).toBe("test.cnx");
@@ -30,9 +35,13 @@ describe("VariableCollector", () => {
30
35
  `;
31
36
  const tree = parse(code);
32
37
  const varCtx = tree.declaration(0)!.variableDeclaration()!;
33
- const symbol = VariableCollector.collect(varCtx, "test.cnx");
38
+ const symbol = VariableCollector.collect(
39
+ varCtx,
40
+ "test.cnx",
41
+ TestScopeUtils.getGlobalScope(),
42
+ );
34
43
 
35
- expect(symbol.type).toBe("i64");
44
+ expect(TypeResolver.getTypeName(symbol.type)).toBe("i64");
36
45
  });
37
46
 
38
47
  it("collects variable with initial value", () => {
@@ -41,7 +50,11 @@ describe("VariableCollector", () => {
41
50
  `;
42
51
  const tree = parse(code);
43
52
  const varCtx = tree.declaration(0)!.variableDeclaration()!;
44
- const symbol = VariableCollector.collect(varCtx, "test.cnx");
53
+ const symbol = VariableCollector.collect(
54
+ varCtx,
55
+ "test.cnx",
56
+ TestScopeUtils.getGlobalScope(),
57
+ );
45
58
 
46
59
  expect(symbol.initialValue).toBe("0");
47
60
  });
@@ -54,7 +67,11 @@ describe("VariableCollector", () => {
54
67
  `;
55
68
  const tree = parse(code);
56
69
  const varCtx = tree.declaration(0)!.variableDeclaration()!;
57
- const symbol = VariableCollector.collect(varCtx, "test.cnx");
70
+ const symbol = VariableCollector.collect(
71
+ varCtx,
72
+ "test.cnx",
73
+ TestScopeUtils.getGlobalScope(),
74
+ );
58
75
 
59
76
  expect(symbol.isConst).toBe(true);
60
77
  expect(symbol.initialValue).toBe("1024");
@@ -66,7 +83,11 @@ describe("VariableCollector", () => {
66
83
  `;
67
84
  const tree = parse(code);
68
85
  const varCtx = tree.declaration(0)!.variableDeclaration()!;
69
- const symbol = VariableCollector.collect(varCtx, "test.cnx");
86
+ const symbol = VariableCollector.collect(
87
+ varCtx,
88
+ "test.cnx",
89
+ TestScopeUtils.getGlobalScope(),
90
+ );
70
91
 
71
92
  expect(symbol.initialValue).toBe("0xDEADBEEF");
72
93
  });
@@ -79,7 +100,11 @@ describe("VariableCollector", () => {
79
100
  `;
80
101
  const tree = parse(code);
81
102
  const varCtx = tree.declaration(0)!.variableDeclaration()!;
82
- const symbol = VariableCollector.collect(varCtx, "test.cnx");
103
+ const symbol = VariableCollector.collect(
104
+ varCtx,
105
+ "test.cnx",
106
+ TestScopeUtils.getGlobalScope(),
107
+ );
83
108
 
84
109
  expect(symbol.isArray).toBe(true);
85
110
  expect(symbol.arrayDimensions).toEqual([256]);
@@ -91,7 +116,11 @@ describe("VariableCollector", () => {
91
116
  `;
92
117
  const tree = parse(code);
93
118
  const varCtx = tree.declaration(0)!.variableDeclaration()!;
94
- const symbol = VariableCollector.collect(varCtx, "test.cnx");
119
+ const symbol = VariableCollector.collect(
120
+ varCtx,
121
+ "test.cnx",
122
+ TestScopeUtils.getGlobalScope(),
123
+ );
95
124
 
96
125
  expect(symbol.isArray).toBe(true);
97
126
  expect(symbol.arrayDimensions).toEqual([4, 4]);
@@ -107,7 +136,7 @@ describe("VariableCollector", () => {
107
136
  const symbol = VariableCollector.collect(
108
137
  varCtx,
109
138
  "test.cnx",
110
- undefined,
139
+ TestScopeUtils.getGlobalScope(),
111
140
  true,
112
141
  constValues,
113
142
  );
@@ -126,7 +155,7 @@ describe("VariableCollector", () => {
126
155
  const symbol = VariableCollector.collect(
127
156
  varCtx,
128
157
  "test.cnx",
129
- undefined,
158
+ TestScopeUtils.getGlobalScope(),
130
159
  true,
131
160
  constValues,
132
161
  );
@@ -148,7 +177,7 @@ describe("VariableCollector", () => {
148
177
  const symbol = VariableCollector.collect(
149
178
  varCtx,
150
179
  "test.cnx",
151
- undefined,
180
+ TestScopeUtils.getGlobalScope(),
152
181
  true,
153
182
  constValues,
154
183
  );
@@ -163,7 +192,11 @@ describe("VariableCollector", () => {
163
192
  `;
164
193
  const tree = parse(code);
165
194
  const varCtx = tree.declaration(0)!.variableDeclaration()!;
166
- const symbol = VariableCollector.collect(varCtx, "test.cnx");
195
+ const symbol = VariableCollector.collect(
196
+ varCtx,
197
+ "test.cnx",
198
+ TestScopeUtils.getGlobalScope(),
199
+ );
167
200
 
168
201
  expect(symbol.isArray).toBe(true);
169
202
  expect(symbol.arrayDimensions).toEqual([8]);
@@ -175,7 +208,11 @@ describe("VariableCollector", () => {
175
208
  `;
176
209
  const tree = parse(code);
177
210
  const varCtx = tree.declaration(0)!.variableDeclaration()!;
178
- const symbol = VariableCollector.collect(varCtx, "test.cnx");
211
+ const symbol = VariableCollector.collect(
212
+ varCtx,
213
+ "test.cnx",
214
+ TestScopeUtils.getGlobalScope(),
215
+ );
179
216
 
180
217
  expect(symbol.isArray).toBe(true);
181
218
  expect(symbol.arrayDimensions).toEqual([4, 4]);
@@ -191,7 +228,7 @@ describe("VariableCollector", () => {
191
228
  const symbol = VariableCollector.collect(
192
229
  varCtx,
193
230
  "test.cnx",
194
- undefined,
231
+ TestScopeUtils.getGlobalScope(),
195
232
  true,
196
233
  constValues,
197
234
  );
@@ -206,7 +243,11 @@ describe("VariableCollector", () => {
206
243
  `;
207
244
  const tree = parse(code);
208
245
  const varCtx = tree.declaration(0)!.variableDeclaration()!;
209
- const symbol = VariableCollector.collect(varCtx, "test.cnx");
246
+ const symbol = VariableCollector.collect(
247
+ varCtx,
248
+ "test.cnx",
249
+ TestScopeUtils.getGlobalScope(),
250
+ );
210
251
 
211
252
  expect(symbol.isArray).toBe(true);
212
253
  expect(symbol.arrayDimensions).toEqual(["BUFFER_SIZE"]);
@@ -214,15 +255,19 @@ describe("VariableCollector", () => {
214
255
  });
215
256
 
216
257
  describe("scoped variables", () => {
217
- it("prefixes name with scope when scopeName is provided", () => {
258
+ it("stores scope reference when scope is provided", () => {
218
259
  const code = `
219
260
  u32 position;
220
261
  `;
221
262
  const tree = parse(code);
222
263
  const varCtx = tree.declaration(0)!.variableDeclaration()!;
223
- const symbol = VariableCollector.collect(varCtx, "motor.cnx", "Motor");
264
+ const motorScope = TestScopeUtils.createMockScope("Motor");
265
+ const symbol = VariableCollector.collect(varCtx, "motor.cnx", motorScope);
224
266
 
225
- expect(symbol.name).toBe("Motor_position");
267
+ // With new IScopeSymbol-based design, name is just "position" (not prefixed)
268
+ // The prefixing happens in TSymbolAdapter for backwards compatibility
269
+ expect(symbol.name).toBe("position");
270
+ expect(symbol.scope.name).toBe("Motor");
226
271
  });
227
272
 
228
273
  it("respects isPublic parameter", () => {
@@ -231,10 +276,11 @@ describe("VariableCollector", () => {
231
276
  `;
232
277
  const tree = parse(code);
233
278
  const varCtx = tree.declaration(0)!.variableDeclaration()!;
279
+ const motorScope = TestScopeUtils.createMockScope("Motor");
234
280
  const symbol = VariableCollector.collect(
235
281
  varCtx,
236
282
  "motor.cnx",
237
- "Motor",
283
+ motorScope,
238
284
  false,
239
285
  );
240
286
 
@@ -249,9 +295,13 @@ describe("VariableCollector", () => {
249
295
  `;
250
296
  const tree = parse(code);
251
297
  const varCtx = tree.declaration(0)!.variableDeclaration()!;
252
- const symbol = VariableCollector.collect(varCtx, "test.cnx");
298
+ const symbol = VariableCollector.collect(
299
+ varCtx,
300
+ "test.cnx",
301
+ TestScopeUtils.getGlobalScope(),
302
+ );
253
303
 
254
- expect(symbol.type).toBe("Point");
304
+ expect(TypeResolver.getTypeName(symbol.type)).toBe("Point");
255
305
  });
256
306
  });
257
307
 
@@ -263,7 +313,11 @@ describe("VariableCollector", () => {
263
313
  `;
264
314
  const tree = parse(code);
265
315
  const varCtx = tree.declaration(0)!.variableDeclaration()!;
266
- const symbol = VariableCollector.collect(varCtx, "test.cnx");
316
+ const symbol = VariableCollector.collect(
317
+ varCtx,
318
+ "test.cnx",
319
+ TestScopeUtils.getGlobalScope(),
320
+ );
267
321
 
268
322
  expect(symbol.sourceLine).toBe(3);
269
323
  });
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Test utilities for symbol collector tests.
3
+ *
4
+ * Provides mock IScopeSymbol instances for testing collectors
5
+ * that now require proper scope references.
6
+ *
7
+ * Note: Delegates to ScopeUtils to avoid code duplication.
8
+ */
9
+
10
+ import ScopeUtils from "../../../../../utils/ScopeUtils";
11
+ import IScopeSymbol from "../../../../types/symbols/IScopeSymbol";
12
+
13
+ /**
14
+ * Static utility class for creating mock scopes in tests.
15
+ *
16
+ * Note: Each call creates a fresh scope instance to avoid test pollution.
17
+ * Tests should use SymbolRegistry.reset() in beforeEach for state isolation.
18
+ */
19
+ class TestScopeUtils {
20
+ /**
21
+ * Create the global scope singleton for tests.
22
+ * The global scope has a self-reference for parent.
23
+ */
24
+ static createMockGlobalScope(): IScopeSymbol {
25
+ return ScopeUtils.createGlobalScope();
26
+ }
27
+
28
+ /**
29
+ * Create a named scope for tests.
30
+ */
31
+ static createMockScope(name: string, parent?: IScopeSymbol): IScopeSymbol {
32
+ const actualParent = parent ?? ScopeUtils.createGlobalScope();
33
+ return ScopeUtils.createScope(name, actualParent);
34
+ }
35
+
36
+ /**
37
+ * Get a fresh global scope instance.
38
+ * Returns a new instance each time to avoid test pollution.
39
+ */
40
+ static getGlobalScope(): IScopeSymbol {
41
+ return ScopeUtils.createGlobalScope();
42
+ }
43
+
44
+ /**
45
+ * Reset global scope (no-op, kept for backwards compatibility).
46
+ * @deprecated Use SymbolRegistry.reset() instead for test isolation.
47
+ */
48
+ static resetGlobalScope(): void {
49
+ // No-op - each call to getGlobalScope() now returns a fresh instance
50
+ }
51
+ }
52
+
53
+ export default TestScopeUtils;
@@ -10,15 +10,16 @@
10
10
 
11
11
  import ICodeGenSymbols from "../../../../types/ICodeGenSymbols";
12
12
  import CNEXT_TO_C_TYPE_MAP from "../../../../../utils/constants/TypeMappings";
13
- import ESymbolKind from "../../../../../utils/types/ESymbolKind";
14
- import TSymbol from "../../types/TSymbol";
15
- import IBitmapSymbol from "../../types/IBitmapSymbol";
16
- import IEnumSymbol from "../../types/IEnumSymbol";
17
- import IFunctionSymbol from "../../types/IFunctionSymbol";
18
- import IStructSymbol from "../../types/IStructSymbol";
19
- import IRegisterSymbol from "../../types/IRegisterSymbol";
20
- import IScopeSymbol from "../../types/IScopeSymbol";
21
- import IVariableSymbol from "../../types/IVariableSymbol";
13
+ import TSymbol from "../../../../types/symbols/TSymbol";
14
+ import IBitmapSymbol from "../../../../types/symbols/IBitmapSymbol";
15
+ import IEnumSymbol from "../../../../types/symbols/IEnumSymbol";
16
+ import IFunctionSymbol from "../../../../types/symbols/IFunctionSymbol";
17
+ import IStructSymbol from "../../../../types/symbols/IStructSymbol";
18
+ import IRegisterSymbol from "../../../../types/symbols/IRegisterSymbol";
19
+ import IScopeSymbol from "../../../../types/symbols/IScopeSymbol";
20
+ import IVariableSymbol from "../../../../types/symbols/IVariableSymbol";
21
+ import TypeResolver from "../../../../../utils/TypeResolver";
22
+ import SymbolNameUtils from "../utils/SymbolNameUtils";
22
23
 
23
24
  /**
24
25
  * Groups register-related maps for processRegister method.
@@ -94,7 +95,7 @@ class TSymbolInfoAdapter {
94
95
  // Process each symbol
95
96
  for (const symbol of symbols) {
96
97
  switch (symbol.kind) {
97
- case ESymbolKind.Struct:
98
+ case "struct":
98
99
  TSymbolInfoAdapter.processStruct(
99
100
  symbol,
100
101
  knownStructs,
@@ -104,11 +105,11 @@ class TSymbolInfoAdapter {
104
105
  );
105
106
  break;
106
107
 
107
- case ESymbolKind.Enum:
108
+ case "enum":
108
109
  TSymbolInfoAdapter.processEnum(symbol, knownEnums, enumMembers);
109
110
  break;
110
111
 
111
- case ESymbolKind.Bitmap:
112
+ case "bitmap":
112
113
  TSymbolInfoAdapter.processBitmap(
113
114
  symbol,
114
115
  knownBitmaps,
@@ -118,7 +119,7 @@ class TSymbolInfoAdapter {
118
119
  );
119
120
  break;
120
121
 
121
- case ESymbolKind.Namespace:
122
+ case "scope":
122
123
  TSymbolInfoAdapter.processScope(
123
124
  symbol,
124
125
  knownScopes,
@@ -127,7 +128,7 @@ class TSymbolInfoAdapter {
127
128
  );
128
129
  break;
129
130
 
130
- case ESymbolKind.Register:
131
+ case "register":
131
132
  TSymbolInfoAdapter.processRegister(symbol, knownBitmaps, {
132
133
  knownRegisters,
133
134
  scopedRegisters,
@@ -139,13 +140,17 @@ class TSymbolInfoAdapter {
139
140
  });
140
141
  break;
141
142
 
142
- case ESymbolKind.Variable:
143
- // Issue #282: Track private const values for inlining
144
- TSymbolInfoAdapter.processVariable(symbol, scopePrivateConstValues);
143
+ case "variable":
144
+ // Track scope membership and private const values
145
+ TSymbolInfoAdapter.processVariable(
146
+ symbol,
147
+ scopeMembers,
148
+ scopePrivateConstValues,
149
+ );
145
150
  break;
146
151
 
147
152
  // Track function return types for enum validation
148
- case ESymbolKind.Function:
153
+ case "function":
149
154
  TSymbolInfoAdapter.processFunction(symbol, functionReturnTypes);
150
155
  break;
151
156
  }
@@ -226,6 +231,9 @@ class TSymbolInfoAdapter {
226
231
 
227
232
  // === Private Processing Methods ===
228
233
 
234
+ // Use shared utility for name mangling
235
+ private static readonly getMangledName = SymbolNameUtils.getMangledName;
236
+
229
237
  private static processStruct(
230
238
  struct: IStructSymbol,
231
239
  knownStructs: Set<string>,
@@ -233,28 +241,38 @@ class TSymbolInfoAdapter {
233
241
  structFieldArrays: Map<string, Set<string>>,
234
242
  structFieldDimensions: Map<string, Map<string, number[]>>,
235
243
  ): void {
236
- knownStructs.add(struct.name);
244
+ // Use mangled name for lookups (e.g., "Geometry_Point")
245
+ const mangledName = TSymbolInfoAdapter.getMangledName(struct);
246
+ knownStructs.add(mangledName);
237
247
 
238
248
  const fields = new Map<string, string>();
239
249
  const arrayFields = new Set<string>();
240
250
  const dimensions = new Map<string, number[]>();
241
251
 
242
252
  for (const [fieldName, fieldInfo] of struct.fields) {
243
- fields.set(fieldName, fieldInfo.type);
253
+ // Convert TType to string for legacy ISymbolInfo format
254
+ const typeStr = TypeResolver.getTypeName(fieldInfo.type);
255
+ fields.set(fieldName, typeStr);
244
256
 
245
257
  if (fieldInfo.isArray) {
246
258
  arrayFields.add(fieldName);
247
259
 
248
260
  if (fieldInfo.dimensions && fieldInfo.dimensions.length > 0) {
249
- dimensions.set(fieldName, fieldInfo.dimensions);
261
+ // Filter to only include numeric dimensions
262
+ const numericDims = fieldInfo.dimensions.filter(
263
+ (d): d is number => typeof d === "number",
264
+ );
265
+ if (numericDims.length > 0) {
266
+ dimensions.set(fieldName, numericDims);
267
+ }
250
268
  }
251
269
  }
252
270
  }
253
271
 
254
- structFields.set(struct.name, fields);
255
- structFieldArrays.set(struct.name, arrayFields);
272
+ structFields.set(mangledName, fields);
273
+ structFieldArrays.set(mangledName, arrayFields);
256
274
  if (dimensions.size > 0) {
257
- structFieldDimensions.set(struct.name, dimensions);
275
+ structFieldDimensions.set(mangledName, dimensions);
258
276
  }
259
277
  }
260
278
 
@@ -263,8 +281,9 @@ class TSymbolInfoAdapter {
263
281
  knownEnums: Set<string>,
264
282
  enumMembers: Map<string, Map<string, number>>,
265
283
  ): void {
266
- knownEnums.add(enumSym.name);
267
- enumMembers.set(enumSym.name, new Map(enumSym.members));
284
+ const mangledName = TSymbolInfoAdapter.getMangledName(enumSym);
285
+ knownEnums.add(mangledName);
286
+ enumMembers.set(mangledName, new Map(enumSym.members));
268
287
  }
269
288
 
270
289
  private static processBitmap(
@@ -274,9 +293,10 @@ class TSymbolInfoAdapter {
274
293
  bitmapBackingType: Map<string, string>,
275
294
  bitmapBitWidth: Map<string, number>,
276
295
  ): void {
277
- knownBitmaps.add(bitmap.name);
278
- bitmapBackingType.set(bitmap.name, bitmap.backingType);
279
- bitmapBitWidth.set(bitmap.name, bitmap.bitWidth);
296
+ const mangledName = TSymbolInfoAdapter.getMangledName(bitmap);
297
+ knownBitmaps.add(mangledName);
298
+ bitmapBackingType.set(mangledName, bitmap.backingType);
299
+ bitmapBitWidth.set(mangledName, bitmap.bitWidth);
280
300
 
281
301
  const fields = new Map<string, { offset: number; width: number }>();
282
302
  for (const [fieldName, fieldInfo] of bitmap.fields) {
@@ -285,7 +305,7 @@ class TSymbolInfoAdapter {
285
305
  width: fieldInfo.width,
286
306
  });
287
307
  }
288
- bitmapFields.set(bitmap.name, fields);
308
+ bitmapFields.set(mangledName, fields);
289
309
  }
290
310
 
291
311
  private static processScope(
@@ -296,8 +316,10 @@ class TSymbolInfoAdapter {
296
316
  ): void {
297
317
  knownScopes.add(scope.name);
298
318
 
299
- // Convert members array to Set
300
- scopeMembers.set(scope.name, new Set(scope.members));
319
+ // Use scope.members as the authoritative list of member names
320
+ // This includes functions, variables, enums, structs, etc.
321
+ const members = new Set<string>(scope.members);
322
+ scopeMembers.set(scope.name, members);
301
323
 
302
324
  // Copy visibility map
303
325
  scopeMemberVisibility.set(scope.name, new Map(scope.memberVisibility));
@@ -308,16 +330,18 @@ class TSymbolInfoAdapter {
308
330
  knownBitmaps: Set<string>,
309
331
  maps: IRegisterMaps,
310
332
  ): void {
311
- maps.knownRegisters.add(register.name);
312
- maps.registerBaseAddresses.set(register.name, register.baseAddress);
313
-
314
- // Check if this is a scoped register (name contains underscore)
315
- if (register.name.includes("_")) {
316
- maps.scopedRegisters.set(register.name, register.baseAddress);
333
+ const mangledName = TSymbolInfoAdapter.getMangledName(register);
334
+ maps.knownRegisters.add(mangledName);
335
+ maps.registerBaseAddresses.set(mangledName, register.baseAddress);
336
+
337
+ // Check if this is a scoped register (has non-global scope)
338
+ const isScoped = register.scope.name !== "";
339
+ if (isScoped) {
340
+ maps.scopedRegisters.set(mangledName, register.baseAddress);
317
341
  }
318
342
 
319
343
  for (const [memberName, memberInfo] of register.members) {
320
- const fullName = `${register.name}_${memberName}`;
344
+ const fullName = `${mangledName}_${memberName}`;
321
345
 
322
346
  maps.registerMemberAccess.set(fullName, memberInfo.access);
323
347
  maps.registerMemberOffsets.set(fullName, memberInfo.offset);
@@ -335,11 +359,24 @@ class TSymbolInfoAdapter {
335
359
 
336
360
  private static processVariable(
337
361
  variable: IVariableSymbol,
362
+ scopeMembers: Map<string, Set<string>>,
338
363
  scopePrivateConstValues: Map<string, string>,
339
364
  ): void {
365
+ const mangledName = TSymbolInfoAdapter.getMangledName(variable);
366
+ const scopeName = variable.scope.name;
367
+ const isScoped = scopeName !== "";
368
+
369
+ // Track scoped variables as scope members (needed for name resolution)
370
+ if (isScoped) {
371
+ let members = scopeMembers.get(scopeName);
372
+ if (!members) {
373
+ members = new Set<string>();
374
+ scopeMembers.set(scopeName, members);
375
+ }
376
+ members.add(variable.name); // Add local name (e.g., "value"), not mangled
377
+ }
378
+
340
379
  // Issue #282: Track private const values for inlining
341
- // A scoped variable has an underscore in its name (e.g., "Motor_MAX_SPEED")
342
- const isScoped = variable.name.includes("_");
343
380
  const isPrivate = !variable.isExported;
344
381
 
345
382
  // Issue #500: Only inline SCALAR consts, not arrays - arrays must be emitted
@@ -350,7 +387,7 @@ class TSymbolInfoAdapter {
350
387
  variable.initialValue &&
351
388
  !variable.isArray
352
389
  ) {
353
- scopePrivateConstValues.set(variable.name, variable.initialValue);
390
+ scopePrivateConstValues.set(mangledName, variable.initialValue);
354
391
  }
355
392
  }
356
393
 
@@ -360,7 +397,10 @@ class TSymbolInfoAdapter {
360
397
  ): void {
361
398
  // Track function return types for enum validation in assignments
362
399
  // This enables recognizing that Motor.getMode() returns Motor_EMode
363
- functionReturnTypes.set(func.name, func.returnType);
400
+ // Use mangled name (e.g., "Motor_getMode") for lookup consistency
401
+ const mangledName = TSymbolInfoAdapter.getMangledName(func);
402
+ const returnTypeStr = TypeResolver.getTypeName(func.returnType);
403
+ functionReturnTypes.set(mangledName, returnTypeStr);
364
404
  }
365
405
 
366
406
  private static cnextTypeToCType(typeName: string): string {
@@ -1,15 +1,17 @@
1
1
  /**
2
2
  * BitmapCollector - Extracts bitmap type declarations from parse trees.
3
3
  * ADR-034: Bitmaps provide named access to bit regions within an integer backing type.
4
+ *
5
+ * Produces TType-based IBitmapSymbol with proper IScopeSymbol references.
4
6
  */
5
7
 
6
8
  import * as Parser from "../../../parser/grammar/CNextParser";
7
9
  import ESourceLanguage from "../../../../../utils/types/ESourceLanguage";
8
- import ESymbolKind from "../../../../../utils/types/ESymbolKind";
9
- import IBitmapSymbol from "../../types/IBitmapSymbol";
10
- import IBitmapFieldInfo from "../../types/IBitmapFieldInfo";
11
- import BITMAP_SIZE from "../../../../types/BITMAP_SIZE";
12
- import BITMAP_BACKING_TYPE from "../../../../types/BITMAP_BACKING_TYPE";
10
+ import IBitmapSymbol from "../../../../types/symbols/IBitmapSymbol";
11
+ import IBitmapFieldInfo from "../../../../types/symbols/IBitmapFieldInfo";
12
+ import IScopeSymbol from "../../../../types/symbols/IScopeSymbol";
13
+ import BITMAP_SIZE from "../../../../constants/BITMAP_SIZE";
14
+ import BITMAP_BACKING_TYPE from "../../../../constants/BITMAP_BACKING_TYPE";
13
15
 
14
16
  class BitmapCollector {
15
17
  /**
@@ -17,17 +19,16 @@ class BitmapCollector {
17
19
  *
18
20
  * @param ctx The bitmap declaration context
19
21
  * @param sourceFile Source file path
20
- * @param scopeName Optional scope name for nested bitmaps
21
- * @returns The bitmap symbol
22
+ * @param scope The scope this bitmap belongs to (IScopeSymbol)
23
+ * @returns The bitmap symbol with proper scope reference
22
24
  * @throws Error if total bits don't match bitmap size
23
25
  */
24
26
  static collect(
25
27
  ctx: Parser.BitmapDeclarationContext,
26
28
  sourceFile: string,
27
- scopeName?: string,
29
+ scope: IScopeSymbol,
28
30
  ): IBitmapSymbol {
29
31
  const name = ctx.IDENTIFIER().getText();
30
- const fullName = scopeName ? `${scopeName}_${name}` : name;
31
32
  const bitmapType = ctx.bitmapType().getText();
32
33
  const expectedBits = BITMAP_SIZE[bitmapType];
33
34
  const backingType = BITMAP_BACKING_TYPE[bitmapType];
@@ -51,18 +52,18 @@ class BitmapCollector {
51
52
  // Validate total bits equals bitmap size
52
53
  if (totalBits !== expectedBits) {
53
54
  throw new Error(
54
- `Error: Bitmap '${fullName}' has ${totalBits} bits but ${bitmapType} requires exactly ${expectedBits} bits`,
55
+ `Error: Bitmap '${name}' has ${totalBits} bits but ${bitmapType} requires exactly ${expectedBits} bits`,
55
56
  );
56
57
  }
57
58
 
58
59
  return {
59
- name: fullName,
60
- parent: scopeName,
60
+ kind: "bitmap",
61
+ name,
62
+ scope,
61
63
  sourceFile,
62
64
  sourceLine: line,
63
65
  sourceLanguage: ESourceLanguage.CNext,
64
66
  isExported: true,
65
- kind: ESymbolKind.Bitmap,
66
67
  backingType,
67
68
  bitWidth: expectedBits,
68
69
  fields,