c-next 0.1.69 → 0.1.71

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 (247) 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 +173 -60
  6. package/src/transpiler/logic/analysis/FunctionCallAnalyzer.ts +240 -205
  7. package/src/transpiler/logic/analysis/InitializationAnalyzer.ts +1 -2
  8. package/src/transpiler/logic/analysis/PassByValueAnalyzer.ts +742 -0
  9. package/src/transpiler/logic/analysis/__tests__/FunctionCallAnalyzer.test.ts +102 -15
  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/{output/codegen → logic/analysis}/helpers/AssignmentTargetExtractor.ts +1 -1
  13. package/src/transpiler/{output/codegen → logic/analysis}/helpers/ChildStatementCollector.ts +1 -1
  14. package/src/transpiler/{output/codegen → logic/analysis}/helpers/StatementExpressionCollector.ts +1 -1
  15. package/src/transpiler/{output/codegen → logic/analysis}/helpers/__tests__/AssignmentTargetExtractor.test.ts +2 -2
  16. package/src/transpiler/{output/codegen → logic/analysis}/helpers/__tests__/ChildStatementCollector.test.ts +2 -2
  17. package/src/transpiler/{output/codegen → logic/analysis}/helpers/__tests__/StatementExpressionCollector.test.ts +2 -2
  18. package/src/transpiler/logic/symbols/SymbolTable.ts +676 -258
  19. package/src/transpiler/logic/symbols/SymbolUtils.ts +2 -2
  20. package/src/transpiler/logic/symbols/__tests__/SymbolTable.test.ts +290 -782
  21. package/src/transpiler/logic/symbols/c/__tests__/CResolver.integration.test.ts +573 -0
  22. package/src/transpiler/logic/symbols/c/__tests__/testHelpers.ts +20 -0
  23. package/src/transpiler/logic/symbols/c/collectors/EnumCollector.ts +82 -0
  24. package/src/transpiler/logic/symbols/c/collectors/FunctionCollector.ts +106 -0
  25. package/src/transpiler/logic/symbols/c/collectors/StructCollector.ts +173 -0
  26. package/src/transpiler/logic/symbols/c/collectors/TypedefCollector.ts +35 -0
  27. package/src/transpiler/logic/symbols/c/collectors/VariableCollector.ts +80 -0
  28. package/src/transpiler/logic/symbols/c/index.ts +333 -0
  29. package/src/transpiler/logic/symbols/c/utils/DeclaratorUtils.ts +269 -0
  30. package/src/transpiler/logic/symbols/cnext/__tests__/BitmapCollector.test.ts +50 -11
  31. package/src/transpiler/logic/symbols/cnext/__tests__/CNextResolver.integration.test.ts +45 -34
  32. package/src/transpiler/logic/symbols/cnext/__tests__/EnumCollector.test.ts +30 -13
  33. package/src/transpiler/logic/symbols/cnext/__tests__/FunctionCollector.test.ts +279 -64
  34. package/src/transpiler/logic/symbols/cnext/__tests__/RegisterCollector.test.ts +60 -13
  35. package/src/transpiler/logic/symbols/cnext/__tests__/ScopeCollector.test.ts +40 -37
  36. package/src/transpiler/logic/symbols/cnext/__tests__/StructCollector.test.ts +131 -45
  37. package/src/transpiler/logic/symbols/cnext/__tests__/TSymbolInfoAdapter.test.ts +223 -139
  38. package/src/transpiler/logic/symbols/cnext/__tests__/VariableCollector.test.ts +79 -25
  39. package/src/transpiler/logic/symbols/cnext/__tests__/testUtils.ts +53 -0
  40. package/src/transpiler/logic/symbols/cnext/adapters/TSymbolInfoAdapter.ts +83 -43
  41. package/src/transpiler/logic/symbols/cnext/collectors/BitmapCollector.ts +14 -13
  42. package/src/transpiler/logic/symbols/cnext/collectors/EnumCollector.ts +11 -10
  43. package/src/transpiler/logic/symbols/cnext/collectors/FunctionCollector.ts +83 -34
  44. package/src/transpiler/logic/symbols/cnext/collectors/RegisterCollector.ts +22 -18
  45. package/src/transpiler/logic/symbols/cnext/collectors/ScopeCollector.ts +53 -35
  46. package/src/transpiler/logic/symbols/cnext/collectors/StructCollector.ts +30 -23
  47. package/src/transpiler/logic/symbols/cnext/collectors/VariableCollector.ts +18 -19
  48. package/src/transpiler/logic/symbols/cnext/index.ts +36 -14
  49. package/src/transpiler/logic/symbols/cnext/types/IScopeCollectorResult.ts +2 -2
  50. package/src/transpiler/logic/symbols/cnext/utils/SymbolNameUtils.ts +27 -0
  51. package/src/transpiler/logic/symbols/cpp/__tests__/CppResolver.integration.test.ts +270 -0
  52. package/src/transpiler/logic/symbols/cpp/__tests__/testHelpers.ts +20 -0
  53. package/src/transpiler/logic/symbols/cpp/collectors/ClassCollector.ts +317 -0
  54. package/src/transpiler/logic/symbols/cpp/collectors/EnumCollector.ts +71 -0
  55. package/src/transpiler/logic/symbols/cpp/collectors/FunctionCollector.ts +155 -0
  56. package/src/transpiler/logic/symbols/cpp/collectors/NamespaceCollector.ts +65 -0
  57. package/src/transpiler/logic/symbols/cpp/collectors/TypeAliasCollector.ts +46 -0
  58. package/src/transpiler/logic/symbols/cpp/collectors/VariableCollector.ts +54 -0
  59. package/src/transpiler/logic/symbols/cpp/index.ts +366 -0
  60. package/src/transpiler/logic/symbols/cpp/utils/DeclaratorUtils.ts +248 -0
  61. package/src/transpiler/logic/symbols/shared/IExtractedParameter.ts +18 -0
  62. package/src/transpiler/logic/symbols/shared/ParameterExtractorUtils.ts +73 -0
  63. package/src/transpiler/output/codegen/CodeGenerator.ts +310 -2288
  64. package/src/transpiler/output/codegen/TypeRegistrationUtils.ts +4 -6
  65. package/src/transpiler/output/codegen/TypeResolver.ts +2 -2
  66. package/src/transpiler/output/codegen/TypeValidator.ts +5 -5
  67. package/src/transpiler/output/codegen/__tests__/CodeGenerator.test.ts +7 -1
  68. package/src/transpiler/output/codegen/__tests__/TypeRegistrationUtils.test.ts +36 -51
  69. package/src/transpiler/output/codegen/__tests__/TypeResolver.test.ts +20 -17
  70. package/src/transpiler/output/codegen/__tests__/TypeValidator.resolution.test.ts +3 -3
  71. package/src/transpiler/output/codegen/__tests__/TypeValidator.test.ts +1 -1
  72. package/src/transpiler/output/codegen/analysis/MemberChainAnalyzer.ts +1 -1
  73. package/src/transpiler/output/codegen/analysis/StringLengthCounter.ts +1 -1
  74. package/src/transpiler/output/codegen/analysis/__tests__/MemberChainAnalyzer.test.ts +9 -9
  75. package/src/transpiler/output/codegen/analysis/__tests__/StringLengthCounter.test.ts +12 -12
  76. package/src/transpiler/output/codegen/assignment/AssignmentClassifier.ts +13 -12
  77. package/src/transpiler/output/codegen/assignment/__tests__/AssignmentClassifier.test.ts +23 -17
  78. package/src/transpiler/output/codegen/assignment/handlers/ArrayHandlers.ts +2 -2
  79. package/src/transpiler/output/codegen/assignment/handlers/AssignmentHandlerUtils.ts +7 -1
  80. package/src/transpiler/output/codegen/assignment/handlers/BitAccessHandlers.ts +3 -3
  81. package/src/transpiler/output/codegen/assignment/handlers/BitmapHandlers.ts +9 -5
  82. package/src/transpiler/output/codegen/assignment/handlers/RegisterHandlers.ts +2 -1
  83. package/src/transpiler/output/codegen/assignment/handlers/SpecialHandlers.ts +4 -4
  84. package/src/transpiler/output/codegen/assignment/handlers/StringHandlers.ts +5 -5
  85. package/src/transpiler/output/codegen/assignment/handlers/__tests__/ArrayHandlers.test.ts +23 -25
  86. package/src/transpiler/output/codegen/assignment/handlers/__tests__/BitAccessHandlers.test.ts +20 -36
  87. package/src/transpiler/output/codegen/assignment/handlers/__tests__/BitmapHandlers.test.ts +18 -18
  88. package/src/transpiler/output/codegen/assignment/handlers/__tests__/SpecialHandlers.test.ts +42 -32
  89. package/src/transpiler/output/codegen/assignment/handlers/__tests__/handlerTestUtils.ts +5 -4
  90. package/src/transpiler/output/codegen/generators/declarationGenerators/ScopeGenerator.ts +21 -8
  91. package/src/transpiler/output/codegen/generators/declarationGenerators/ScopedRegisterGenerator.ts +3 -2
  92. package/src/transpiler/output/codegen/generators/expressions/CallExprGenerator.ts +14 -6
  93. package/src/transpiler/output/codegen/generators/expressions/CallExprUtils.ts +9 -3
  94. package/src/transpiler/output/codegen/generators/expressions/PostfixExpressionGenerator.ts +19 -16
  95. package/src/transpiler/output/codegen/generators/expressions/__tests__/CallExprGenerator.test.ts +24 -8
  96. package/src/transpiler/output/codegen/generators/expressions/__tests__/CallExprUtils.test.ts +4 -8
  97. package/src/transpiler/output/codegen/generators/expressions/__tests__/PostfixExpressionGenerator.test.ts +15 -2
  98. package/src/transpiler/output/codegen/helpers/ArgumentGenerator.ts +236 -0
  99. package/src/transpiler/output/codegen/helpers/ArrayInitHelper.ts +2 -1
  100. package/src/transpiler/output/codegen/helpers/AssignmentExpectedTypeResolver.ts +2 -2
  101. package/src/transpiler/output/codegen/helpers/AssignmentValidator.ts +3 -3
  102. package/src/transpiler/output/codegen/helpers/CppConstructorHelper.ts +3 -3
  103. package/src/transpiler/output/codegen/helpers/EnumAssignmentValidator.ts +1 -1
  104. package/src/transpiler/output/codegen/helpers/FunctionContextManager.ts +435 -0
  105. package/src/transpiler/output/codegen/helpers/StringDeclHelper.ts +2 -2
  106. package/src/transpiler/output/codegen/helpers/StringOperationsHelper.ts +203 -0
  107. package/src/transpiler/output/codegen/helpers/SymbolLookupHelper.ts +8 -12
  108. package/src/transpiler/output/codegen/helpers/TypeRegistrationEngine.ts +520 -0
  109. package/src/transpiler/output/codegen/helpers/VariableDeclHelper.ts +735 -0
  110. package/src/transpiler/output/codegen/helpers/VariableDeclarationFormatter.ts +1 -1
  111. package/src/transpiler/output/codegen/helpers/__tests__/ArgumentGenerator.test.ts +521 -0
  112. package/src/transpiler/output/codegen/helpers/__tests__/ArrayInitHelper.test.ts +1 -1
  113. package/src/transpiler/output/codegen/helpers/__tests__/AssignmentExpectedTypeResolver.test.ts +7 -7
  114. package/src/transpiler/output/codegen/helpers/__tests__/AssignmentValidator.test.ts +7 -7
  115. package/src/transpiler/output/codegen/helpers/__tests__/CppConstructorHelper.test.ts +4 -5
  116. package/src/transpiler/output/codegen/helpers/__tests__/EnumAssignmentValidator.test.ts +2 -2
  117. package/src/transpiler/output/codegen/helpers/__tests__/FunctionContextManager.test.ts +983 -0
  118. package/src/transpiler/output/codegen/helpers/__tests__/StringDeclHelper.test.ts +4 -4
  119. package/src/transpiler/output/codegen/helpers/__tests__/StringOperationsHelper.test.ts +269 -0
  120. package/src/transpiler/output/codegen/helpers/__tests__/SymbolLookupHelper.test.ts +31 -32
  121. package/src/transpiler/output/codegen/helpers/__tests__/TypeRegistrationEngine.test.ts +186 -0
  122. package/src/transpiler/output/codegen/helpers/__tests__/VariableDeclHelper.test.ts +460 -0
  123. package/src/transpiler/output/codegen/helpers/types/IArgumentGeneratorCallbacks.ts +32 -0
  124. package/src/transpiler/output/codegen/resolution/EnumTypeResolver.ts +7 -3
  125. package/src/transpiler/output/codegen/resolution/__tests__/EnumTypeResolver.test.ts +5 -5
  126. package/src/transpiler/output/codegen/types/IFunctionContextCallbacks.ts +12 -0
  127. package/src/transpiler/output/codegen/types/IVariableFormatInput.ts +1 -1
  128. package/src/transpiler/output/codegen/utils/QualifiedNameGenerator.ts +114 -0
  129. package/src/transpiler/output/codegen/utils/__tests__/QualifiedNameGenerator.test.ts +183 -0
  130. package/src/transpiler/output/headers/BaseHeaderGenerator.ts +4 -4
  131. package/src/transpiler/output/headers/ExternalTypeHeaderBuilder.ts +7 -7
  132. package/src/transpiler/output/headers/HeaderGenerator.ts +9 -7
  133. package/src/transpiler/output/headers/HeaderGeneratorUtils.ts +19 -20
  134. package/src/transpiler/output/headers/__tests__/BaseHeaderGenerator.test.ts +15 -18
  135. package/src/transpiler/output/headers/__tests__/CHeaderGenerator.test.ts +63 -64
  136. package/src/transpiler/output/headers/__tests__/CppHeaderGenerator.test.ts +36 -32
  137. package/src/transpiler/output/headers/__tests__/ExternalTypeHeaderBuilder.test.ts +26 -26
  138. package/src/transpiler/output/headers/__tests__/HeaderGenerator.test.ts +87 -59
  139. package/src/transpiler/output/headers/__tests__/HeaderGeneratorUtils.test.ts +57 -58
  140. package/src/transpiler/output/headers/adapters/HeaderSymbolAdapter.ts +222 -0
  141. package/src/transpiler/output/headers/adapters/__tests__/HeaderSymbolAdapter.test.ts +538 -0
  142. package/src/transpiler/output/headers/types/IGroupedSymbols.ts +8 -8
  143. package/src/transpiler/output/headers/types/IHeaderSymbol.ts +62 -0
  144. package/src/transpiler/state/CodeGenState.ts +109 -4
  145. package/src/transpiler/state/SymbolRegistry.ts +181 -0
  146. package/src/transpiler/{types → state}/TranspilerState.ts +1 -1
  147. package/src/transpiler/state/__tests__/CodeGenState.test.ts +277 -1
  148. package/src/transpiler/state/__tests__/SymbolRegistry.test.ts +249 -0
  149. package/src/transpiler/{types → state}/__tests__/TranspilerState.test.ts +1 -1
  150. package/src/transpiler/types/ICachedFileEntry.ts +1 -1
  151. package/src/transpiler/types/IConflict.ts +14 -0
  152. package/src/transpiler/types/ISerializedSymbol.ts +11 -0
  153. package/src/transpiler/types/TPrimitiveKind.ts +20 -0
  154. package/src/transpiler/types/TType.ts +103 -0
  155. package/src/transpiler/types/TVisibility.ts +6 -0
  156. package/src/transpiler/types/symbol-kinds/TSymbolKind.ts +10 -0
  157. package/src/transpiler/types/symbol-kinds/TSymbolKindC.ts +12 -0
  158. package/src/transpiler/types/symbol-kinds/TSymbolKindCNext.ts +16 -0
  159. package/src/transpiler/types/symbol-kinds/TSymbolKindCpp.ts +14 -0
  160. package/src/transpiler/types/symbols/IBaseSymbol.ts +31 -0
  161. package/src/transpiler/{logic/symbols/types → types/symbols}/IBitmapFieldInfo.ts +2 -2
  162. package/src/transpiler/types/symbols/IBitmapSymbol.ts +21 -0
  163. package/src/transpiler/{logic/symbols/types → types/symbols}/IEnumSymbol.ts +5 -6
  164. package/src/transpiler/types/symbols/IFieldInfo.ts +26 -0
  165. package/src/transpiler/types/symbols/IFunctionSymbol.ts +30 -0
  166. package/src/transpiler/types/symbols/IParameterInfo.ts +26 -0
  167. package/src/transpiler/{logic/symbols/types → types/symbols}/IRegisterMemberInfo.ts +4 -4
  168. package/src/transpiler/types/symbols/IRegisterSymbol.ts +18 -0
  169. package/src/transpiler/types/symbols/IScopeSymbol.ts +32 -0
  170. package/src/transpiler/{logic/symbols/types → types/symbols}/IStructFieldInfo.ts +2 -1
  171. package/src/transpiler/types/symbols/IStructSymbol.ts +15 -0
  172. package/src/transpiler/types/symbols/IVariableSymbol.ts +30 -0
  173. package/src/transpiler/types/symbols/SymbolGuards.ts +43 -0
  174. package/src/transpiler/types/symbols/TAnySymbol.ts +22 -0
  175. package/src/transpiler/types/symbols/TSymbol.ts +32 -0
  176. package/src/transpiler/types/symbols/__tests__/IBaseSymbol.test.ts +56 -0
  177. package/src/transpiler/types/symbols/__tests__/SymbolGuards.test.ts +57 -0
  178. package/src/transpiler/types/symbols/c/ICBaseSymbol.ts +28 -0
  179. package/src/transpiler/types/symbols/c/ICEnumMemberSymbol.ts +17 -0
  180. package/src/transpiler/types/symbols/c/ICEnumSymbol.ts +17 -0
  181. package/src/transpiler/types/symbols/c/ICFieldInfo.ts +16 -0
  182. package/src/transpiler/types/symbols/c/ICFunctionSymbol.ts +21 -0
  183. package/src/transpiler/types/symbols/c/ICParameterInfo.ts +19 -0
  184. package/src/transpiler/types/symbols/c/ICStructSymbol.ts +21 -0
  185. package/src/transpiler/types/symbols/c/ICTypedefSymbol.ts +14 -0
  186. package/src/transpiler/types/symbols/c/ICVariableSymbol.ts +26 -0
  187. package/src/transpiler/types/symbols/c/TCSymbol.ts +26 -0
  188. package/src/transpiler/types/symbols/cpp/ICppBaseSymbol.ts +31 -0
  189. package/src/transpiler/types/symbols/cpp/ICppClassSymbol.ts +15 -0
  190. package/src/transpiler/types/symbols/cpp/ICppEnumMemberSymbol.ts +14 -0
  191. package/src/transpiler/types/symbols/cpp/ICppEnumSymbol.ts +14 -0
  192. package/src/transpiler/types/symbols/cpp/ICppFieldInfo.ts +16 -0
  193. package/src/transpiler/types/symbols/cpp/ICppFunctionSymbol.ts +21 -0
  194. package/src/transpiler/types/symbols/cpp/ICppNamespaceSymbol.ts +11 -0
  195. package/src/transpiler/types/symbols/cpp/ICppParameterInfo.ts +19 -0
  196. package/src/transpiler/types/symbols/cpp/ICppStructSymbol.ts +16 -0
  197. package/src/transpiler/types/symbols/cpp/ICppTypeAliasSymbol.ts +14 -0
  198. package/src/transpiler/types/symbols/cpp/ICppVariableSymbol.ts +23 -0
  199. package/src/transpiler/types/symbols/cpp/TCppSymbol.ts +30 -0
  200. package/src/utils/CppNamespaceUtils.ts +3 -4
  201. package/src/utils/FunctionUtils.ts +92 -0
  202. package/src/utils/ParameterUtils.ts +55 -0
  203. package/src/utils/PrimitiveKindUtils.ts +33 -0
  204. package/src/utils/ScopeUtils.ts +105 -0
  205. package/src/utils/TTypeUtils.ts +159 -0
  206. package/src/utils/TypeResolver.ts +132 -0
  207. package/src/utils/__tests__/CppNamespaceUtils.test.ts +92 -99
  208. package/src/utils/__tests__/FunctionUtils.test.ts +284 -0
  209. package/src/utils/__tests__/ParameterUtils.test.ts +174 -0
  210. package/src/utils/__tests__/PrimitiveKindUtils.test.ts +59 -0
  211. package/src/utils/__tests__/ScopeUtils.test.ts +53 -0
  212. package/src/utils/__tests__/TTypeUtils.test.ts +245 -0
  213. package/src/utils/__tests__/TypeResolver.test.ts +332 -0
  214. package/src/utils/cache/CacheManager.ts +91 -50
  215. package/src/utils/cache/__tests__/CacheManager.test.ts +180 -114
  216. package/src/transpiler/logic/symbols/AutoConstUpdater.ts +0 -93
  217. package/src/transpiler/logic/symbols/CSymbolCollector.ts +0 -648
  218. package/src/transpiler/logic/symbols/CppSymbolCollector.ts +0 -874
  219. package/src/transpiler/logic/symbols/SymbolCollectorContext.ts +0 -68
  220. package/src/transpiler/logic/symbols/__tests__/AutoConstUpdater.test.ts +0 -418
  221. package/src/transpiler/logic/symbols/__tests__/CSymbolCollector.test.ts +0 -685
  222. package/src/transpiler/logic/symbols/__tests__/CppSymbolCollector.test.ts +0 -1146
  223. package/src/transpiler/logic/symbols/__tests__/SymbolCollectorContext.test.ts +0 -290
  224. package/src/transpiler/logic/symbols/__tests__/cTestHelpers.ts +0 -43
  225. package/src/transpiler/logic/symbols/__tests__/cppTestHelpers.ts +0 -40
  226. package/src/transpiler/logic/symbols/cnext/__tests__/TSymbolAdapter.test.ts +0 -595
  227. package/src/transpiler/logic/symbols/cnext/adapters/TSymbolAdapter.ts +0 -345
  228. package/src/transpiler/logic/symbols/types/IBaseSymbol.ts +0 -27
  229. package/src/transpiler/logic/symbols/types/IBitmapSymbol.ts +0 -23
  230. package/src/transpiler/logic/symbols/types/ICollectorContext.ts +0 -19
  231. package/src/transpiler/logic/symbols/types/IConflict.ts +0 -20
  232. package/src/transpiler/logic/symbols/types/IFieldInfo.ts +0 -18
  233. package/src/transpiler/logic/symbols/types/IFunctionSymbol.ts +0 -25
  234. package/src/transpiler/logic/symbols/types/IParameterInfo.ts +0 -24
  235. package/src/transpiler/logic/symbols/types/IRegisterSymbol.ts +0 -20
  236. package/src/transpiler/logic/symbols/types/IScopeSymbol.ts +0 -19
  237. package/src/transpiler/logic/symbols/types/IStructSymbol.ts +0 -16
  238. package/src/transpiler/logic/symbols/types/IVariableSymbol.ts +0 -30
  239. package/src/transpiler/logic/symbols/types/TSymbol.ts +0 -36
  240. package/src/transpiler/logic/symbols/types/__tests__/SymbolGuards.test.ts +0 -244
  241. package/src/transpiler/logic/symbols/types/typeGuards.ts +0 -44
  242. package/src/utils/types/ESymbolKind.ts +0 -19
  243. package/src/utils/types/ISymbol.ts +0 -64
  244. /package/src/transpiler/{types → constants}/BITMAP_BACKING_TYPE.ts +0 -0
  245. /package/src/transpiler/{types → constants}/BITMAP_SIZE.ts +0 -0
  246. /package/src/transpiler/{output/codegen → logic/analysis}/helpers/TransitiveModificationPropagator.ts +0 -0
  247. /package/src/transpiler/{output/codegen → logic/analysis}/helpers/__tests__/TransitiveModificationPropagator.test.ts +0 -0
@@ -1,11 +1,16 @@
1
- import { describe, expect, it } from "vitest";
1
+ import { describe, expect, it, beforeEach } from "vitest";
2
2
  import parse from "./testHelpers";
3
3
  import ScopeCollector from "../collectors/ScopeCollector";
4
- import ESymbolKind from "../../../../../utils/types/ESymbolKind";
5
4
  import ESourceLanguage from "../../../../../utils/types/ESourceLanguage";
6
- import SymbolGuards from "../../types/typeGuards";
5
+ import SymbolGuards from "../../../../types/symbols/SymbolGuards";
6
+ import SymbolRegistry from "../../../../state/SymbolRegistry";
7
+ import TypeResolver from "../../../../../utils/TypeResolver";
7
8
 
8
9
  describe("ScopeCollector", () => {
10
+ beforeEach(() => {
11
+ SymbolRegistry.reset();
12
+ });
13
+
9
14
  describe("basic scope extraction", () => {
10
15
  it("collects an empty scope", () => {
11
16
  const code = `
@@ -16,7 +21,7 @@ describe("ScopeCollector", () => {
16
21
  const scopeCtx = tree.declaration(0)!.scopeDeclaration()!;
17
22
  const result = ScopeCollector.collect(scopeCtx, "test.cnx", new Set());
18
23
 
19
- expect(result.scopeSymbol.kind).toBe(ESymbolKind.Namespace);
24
+ expect(result.scopeSymbol.kind).toBe("scope");
20
25
  expect(result.scopeSymbol.name).toBe("Motor");
21
26
  expect(result.scopeSymbol.members).toEqual([]);
22
27
  expect(result.scopeSymbol.sourceFile).toBe("test.cnx");
@@ -45,24 +50,23 @@ describe("ScopeCollector", () => {
45
50
 
46
51
  expect(result.memberSymbols.length).toBe(2);
47
52
 
48
- const initFunc = result.memberSymbols.find(
49
- (s) => s.name === "Motor_init",
50
- );
53
+ // Functions now have bare names with scope references
54
+ const initFunc = result.memberSymbols.find((s) => s.name === "init");
51
55
  expect(initFunc).toBeDefined();
52
56
  expect(SymbolGuards.isFunction(initFunc!)).toBe(true);
53
57
  if (SymbolGuards.isFunction(initFunc!)) {
54
58
  expect(initFunc.visibility).toBe("public");
55
59
  expect(initFunc.isExported).toBe(true);
60
+ expect(initFunc.scope.name).toBe("Motor");
56
61
  }
57
62
 
58
- const updateFunc = result.memberSymbols.find(
59
- (s) => s.name === "Motor_update",
60
- );
63
+ const updateFunc = result.memberSymbols.find((s) => s.name === "update");
61
64
  expect(updateFunc).toBeDefined();
62
65
  expect(SymbolGuards.isFunction(updateFunc!)).toBe(true);
63
66
  if (SymbolGuards.isFunction(updateFunc!)) {
64
67
  expect(updateFunc.visibility).toBe("private");
65
68
  expect(updateFunc.isExported).toBe(false);
69
+ expect(updateFunc.scope.name).toBe("Motor");
66
70
  }
67
71
  });
68
72
 
@@ -85,14 +89,14 @@ describe("ScopeCollector", () => {
85
89
 
86
90
  expect(result.memberSymbols.length).toBe(2);
87
91
 
88
- const posVar = result.memberSymbols.find(
89
- (s) => s.name === "Motor_position",
90
- );
92
+ // Variables now have bare names with scope references
93
+ const posVar = result.memberSymbols.find((s) => s.name === "position");
91
94
  expect(posVar).toBeDefined();
92
95
  expect(SymbolGuards.isVariable(posVar!)).toBe(true);
93
96
  if (SymbolGuards.isVariable(posVar!)) {
94
- expect(posVar.type).toBe("u32");
97
+ expect(TypeResolver.getTypeName(posVar.type)).toBe("u32");
95
98
  expect(posVar.isExported).toBe(false);
99
+ expect(posVar.scope.name).toBe("Motor");
96
100
  }
97
101
  });
98
102
  });
@@ -114,15 +118,15 @@ describe("ScopeCollector", () => {
114
118
 
115
119
  expect(result.scopeSymbol.members).toEqual(["State"]);
116
120
 
117
- const enumSymbol = result.memberSymbols.find(
118
- (s) => s.name === "Motor_State",
119
- );
121
+ // Enum has bare name with scope reference
122
+ const enumSymbol = result.memberSymbols.find((s) => s.name === "State");
120
123
  expect(enumSymbol).toBeDefined();
121
124
  expect(SymbolGuards.isEnum(enumSymbol!)).toBe(true);
122
125
  if (SymbolGuards.isEnum(enumSymbol!)) {
123
126
  expect(enumSymbol.members.get("Off")).toBe(0);
124
127
  expect(enumSymbol.members.get("Running")).toBe(1);
125
128
  expect(enumSymbol.members.get("Error")).toBe(2);
129
+ expect(enumSymbol.scope.name).toBe("Motor");
126
130
  }
127
131
  });
128
132
 
@@ -139,14 +143,16 @@ describe("ScopeCollector", () => {
139
143
  const scopeCtx = tree.declaration(0)!.scopeDeclaration()!;
140
144
  const result = ScopeCollector.collect(scopeCtx, "test.cnx", new Set());
141
145
 
146
+ // Struct has bare name with scope reference
142
147
  const structSymbol = result.memberSymbols.find(
143
- (s) => s.name === "Motor_Config",
148
+ (s) => s.name === "Config",
144
149
  );
145
150
  expect(structSymbol).toBeDefined();
146
151
  expect(SymbolGuards.isStruct(structSymbol!)).toBe(true);
147
152
  if (SymbolGuards.isStruct(structSymbol!)) {
148
- expect(structSymbol.fields.get("maxSpeed")?.type).toBe("u32");
149
- expect(structSymbol.fields.get("acceleration")?.type).toBe("u32");
153
+ expect(structSymbol.fields.get("maxSpeed")).toBeDefined();
154
+ expect(structSymbol.fields.get("acceleration")).toBeDefined();
155
+ expect(structSymbol.scope.name).toBe("Motor");
150
156
  }
151
157
  });
152
158
 
@@ -166,8 +172,9 @@ describe("ScopeCollector", () => {
166
172
  const scopeCtx = tree.declaration(0)!.scopeDeclaration()!;
167
173
  const result = ScopeCollector.collect(scopeCtx, "test.cnx", new Set());
168
174
 
175
+ // Bitmap has bare name with scope reference
169
176
  const bitmapSymbol = result.memberSymbols.find(
170
- (s) => s.name === "Motor_Status",
177
+ (s) => s.name === "Status",
171
178
  );
172
179
  expect(bitmapSymbol).toBeDefined();
173
180
  expect(SymbolGuards.isBitmap(bitmapSymbol!)).toBe(true);
@@ -177,6 +184,7 @@ describe("ScopeCollector", () => {
177
184
  offset: 0,
178
185
  width: 1,
179
186
  });
187
+ expect(bitmapSymbol.scope.name).toBe("Motor");
180
188
  }
181
189
  });
182
190
 
@@ -193,15 +201,15 @@ describe("ScopeCollector", () => {
193
201
  const scopeCtx = tree.declaration(0)!.scopeDeclaration()!;
194
202
  const result = ScopeCollector.collect(scopeCtx, "test.cnx", new Set());
195
203
 
196
- const regSymbol = result.memberSymbols.find(
197
- (s) => s.name === "Motor_CTRL",
198
- );
204
+ // Register has bare name with scope reference
205
+ const regSymbol = result.memberSymbols.find((s) => s.name === "CTRL");
199
206
  expect(regSymbol).toBeDefined();
200
207
  expect(SymbolGuards.isRegister(regSymbol!)).toBe(true);
201
208
  if (SymbolGuards.isRegister(regSymbol!)) {
202
209
  expect(regSymbol.baseAddress).toBe("0x40001000");
203
210
  expect(regSymbol.members.get("STATUS")?.access).toBe("rw");
204
211
  expect(regSymbol.members.get("COMMAND")?.access).toBe("wo");
212
+ expect(regSymbol.scope.name).toBe("Motor");
205
213
  }
206
214
  });
207
215
  });
@@ -228,21 +236,18 @@ describe("ScopeCollector", () => {
228
236
  expect(result.scopeSymbol.members).toEqual(["position", "init", "State"]);
229
237
  expect(result.memberSymbols.length).toBe(3);
230
238
 
231
- // Verify each type was collected correctly
232
- const varSymbol = result.memberSymbols.find(
233
- (s) => s.name === "Motor_position",
234
- );
239
+ // Verify each type was collected correctly with bare names
240
+ const varSymbol = result.memberSymbols.find((s) => s.name === "position");
235
241
  expect(SymbolGuards.isVariable(varSymbol!)).toBe(true);
242
+ expect(varSymbol!.scope.name).toBe("Motor");
236
243
 
237
- const funcSymbol = result.memberSymbols.find(
238
- (s) => s.name === "Motor_init",
239
- );
244
+ const funcSymbol = result.memberSymbols.find((s) => s.name === "init");
240
245
  expect(SymbolGuards.isFunction(funcSymbol!)).toBe(true);
246
+ expect(funcSymbol!.scope.name).toBe("Motor");
241
247
 
242
- const enumSymbol = result.memberSymbols.find(
243
- (s) => s.name === "Motor_State",
244
- );
248
+ const enumSymbol = result.memberSymbols.find((s) => s.name === "State");
245
249
  expect(SymbolGuards.isEnum(enumSymbol!)).toBe(true);
250
+ expect(enumSymbol!.scope.name).toBe("Motor");
246
251
  });
247
252
  });
248
253
 
@@ -261,9 +266,7 @@ describe("ScopeCollector", () => {
261
266
  const knownBitmaps = new Set(["Motor_MotorFlags"]);
262
267
  const result = ScopeCollector.collect(scopeCtx, "test.cnx", knownBitmaps);
263
268
 
264
- const regSymbol = result.memberSymbols.find(
265
- (s) => s.name === "Motor_CTRL",
266
- );
269
+ const regSymbol = result.memberSymbols.find((s) => s.name === "CTRL");
267
270
  expect(SymbolGuards.isRegister(regSymbol!)).toBe(true);
268
271
  if (SymbolGuards.isRegister(regSymbol!)) {
269
272
  expect(regSymbol.members.get("FLAGS")?.bitmapType).toBe(
@@ -1,10 +1,15 @@
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 StructCollector from "../collectors/StructCollector";
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("StructCollector", () => {
9
+ beforeEach(() => {
10
+ TestScopeUtils.resetGlobalScope();
11
+ });
12
+
8
13
  describe("basic struct extraction", () => {
9
14
  it("collects a simple struct with primitive fields", () => {
10
15
  const code = `
@@ -15,25 +20,33 @@ describe("StructCollector", () => {
15
20
  `;
16
21
  const tree = parse(code);
17
22
  const structCtx = tree.declaration(0)!.structDeclaration()!;
18
- const symbol = StructCollector.collect(structCtx, "test.cnx");
23
+ const globalScope = TestScopeUtils.getGlobalScope();
24
+ const symbol = StructCollector.collect(
25
+ structCtx,
26
+ "test.cnx",
27
+ globalScope,
28
+ );
19
29
 
20
- expect(symbol.kind).toBe(ESymbolKind.Struct);
30
+ expect(symbol.kind).toBe("struct");
21
31
  expect(symbol.name).toBe("Point");
22
32
  expect(symbol.sourceFile).toBe("test.cnx");
23
33
  expect(symbol.sourceLanguage).toBe(ESourceLanguage.CNext);
24
34
  expect(symbol.isExported).toBe(true);
35
+ expect(symbol.scope).toBe(globalScope);
25
36
 
26
37
  expect(symbol.fields.size).toBe(2);
27
- expect(symbol.fields.get("x")).toEqual({
28
- type: "i32",
29
- isArray: false,
30
- isConst: false,
31
- });
32
- expect(symbol.fields.get("y")).toEqual({
33
- type: "i32",
34
- isArray: false,
35
- isConst: false,
36
- });
38
+
39
+ const xField = symbol.fields.get("x");
40
+ expect(xField).toBeDefined();
41
+ expect(TypeResolver.getTypeName(xField!.type)).toBe("i32");
42
+ expect(xField!.isArray).toBe(false);
43
+ expect(xField!.isConst).toBe(false);
44
+
45
+ const yField = symbol.fields.get("y");
46
+ expect(yField).toBeDefined();
47
+ expect(TypeResolver.getTypeName(yField!.type)).toBe("i32");
48
+ expect(yField!.isArray).toBe(false);
49
+ expect(yField!.isConst).toBe(false);
37
50
  });
38
51
 
39
52
  it("collects a struct with various primitive types", () => {
@@ -49,14 +62,31 @@ describe("StructCollector", () => {
49
62
  `;
50
63
  const tree = parse(code);
51
64
  const structCtx = tree.declaration(0)!.structDeclaration()!;
52
- const symbol = StructCollector.collect(structCtx, "test.cnx");
53
-
54
- expect(symbol.fields.get("version")?.type).toBe("u8");
55
- expect(symbol.fields.get("flags")?.type).toBe("u16");
56
- expect(symbol.fields.get("size")?.type).toBe("u32");
57
- expect(symbol.fields.get("timestamp")?.type).toBe("i64");
58
- expect(symbol.fields.get("scale")?.type).toBe("f32");
59
- expect(symbol.fields.get("enabled")?.type).toBe("bool");
65
+ const globalScope = TestScopeUtils.getGlobalScope();
66
+ const symbol = StructCollector.collect(
67
+ structCtx,
68
+ "test.cnx",
69
+ globalScope,
70
+ );
71
+
72
+ expect(TypeResolver.getTypeName(symbol.fields.get("version")!.type)).toBe(
73
+ "u8",
74
+ );
75
+ expect(TypeResolver.getTypeName(symbol.fields.get("flags")!.type)).toBe(
76
+ "u16",
77
+ );
78
+ expect(TypeResolver.getTypeName(symbol.fields.get("size")!.type)).toBe(
79
+ "u32",
80
+ );
81
+ expect(
82
+ TypeResolver.getTypeName(symbol.fields.get("timestamp")!.type),
83
+ ).toBe("i64");
84
+ expect(TypeResolver.getTypeName(symbol.fields.get("scale")!.type)).toBe(
85
+ "f32",
86
+ );
87
+ expect(TypeResolver.getTypeName(symbol.fields.get("enabled")!.type)).toBe(
88
+ "bool",
89
+ );
60
90
  });
61
91
  });
62
92
 
@@ -69,10 +99,15 @@ describe("StructCollector", () => {
69
99
  `;
70
100
  const tree = parse(code);
71
101
  const structCtx = tree.declaration(0)!.structDeclaration()!;
72
- const symbol = StructCollector.collect(structCtx, "test.cnx");
102
+ const globalScope = TestScopeUtils.getGlobalScope();
103
+ const symbol = StructCollector.collect(
104
+ structCtx,
105
+ "test.cnx",
106
+ globalScope,
107
+ );
73
108
 
74
109
  const field = symbol.fields.get("data");
75
- expect(field?.type).toBe("u8");
110
+ expect(TypeResolver.getTypeName(field!.type)).toBe("u8");
76
111
  expect(field?.isArray).toBe(true);
77
112
  expect(field?.dimensions).toEqual([256]);
78
113
  });
@@ -85,10 +120,15 @@ describe("StructCollector", () => {
85
120
  `;
86
121
  const tree = parse(code);
87
122
  const structCtx = tree.declaration(0)!.structDeclaration()!;
88
- const symbol = StructCollector.collect(structCtx, "test.cnx");
123
+ const globalScope = TestScopeUtils.getGlobalScope();
124
+ const symbol = StructCollector.collect(
125
+ structCtx,
126
+ "test.cnx",
127
+ globalScope,
128
+ );
89
129
 
90
130
  const field = symbol.fields.get("values");
91
- expect(field?.type).toBe("f32");
131
+ expect(TypeResolver.getTypeName(field!.type)).toBe("f32");
92
132
  expect(field?.isArray).toBe(true);
93
133
  expect(field?.dimensions).toEqual([4, 4]);
94
134
  });
@@ -102,10 +142,11 @@ describe("StructCollector", () => {
102
142
  const tree = parse(code);
103
143
  const structCtx = tree.declaration(0)!.structDeclaration()!;
104
144
  const constValues = new Map<string, number>([["BUFFER_SIZE", 256]]);
145
+ const globalScope = TestScopeUtils.getGlobalScope();
105
146
  const symbol = StructCollector.collect(
106
147
  structCtx,
107
148
  "test.cnx",
108
- undefined,
149
+ globalScope,
109
150
  constValues,
110
151
  );
111
152
 
@@ -126,10 +167,11 @@ describe("StructCollector", () => {
126
167
  ["ROWS", 4],
127
168
  ["COLS", 3],
128
169
  ]);
170
+ const globalScope = TestScopeUtils.getGlobalScope();
129
171
  const symbol = StructCollector.collect(
130
172
  structCtx,
131
173
  "test.cnx",
132
- undefined,
174
+ globalScope,
133
175
  constValues,
134
176
  );
135
177
 
@@ -147,10 +189,11 @@ describe("StructCollector", () => {
147
189
  const tree = parse(code);
148
190
  const structCtx = tree.declaration(0)!.structDeclaration()!;
149
191
  const constValues = new Map<string, number>([["HEX_SIZE", 16]]);
192
+ const globalScope = TestScopeUtils.getGlobalScope();
150
193
  const symbol = StructCollector.collect(
151
194
  structCtx,
152
195
  "test.cnx",
153
- undefined,
196
+ globalScope,
154
197
  constValues,
155
198
  );
156
199
 
@@ -169,11 +212,16 @@ describe("StructCollector", () => {
169
212
  `;
170
213
  const tree = parse(code);
171
214
  const structCtx = tree.declaration(0)!.structDeclaration()!;
172
- const symbol = StructCollector.collect(structCtx, "test.cnx");
215
+ const globalScope = TestScopeUtils.getGlobalScope();
216
+ const symbol = StructCollector.collect(
217
+ structCtx,
218
+ "test.cnx",
219
+ globalScope,
220
+ );
173
221
 
174
222
  const field = symbol.fields.get("name");
175
223
  // Issue #139: Type includes capacity for string validation in CodeGenerator
176
- expect(field?.type).toBe("string<32>");
224
+ expect(TypeResolver.getTypeName(field!.type)).toBe("string<32>");
177
225
  expect(field?.isArray).toBe(true);
178
226
  expect(field?.dimensions).toEqual([33]); // 32 + 1 for null terminator
179
227
  });
@@ -186,11 +234,16 @@ describe("StructCollector", () => {
186
234
  `;
187
235
  const tree = parse(code);
188
236
  const structCtx = tree.declaration(0)!.structDeclaration()!;
189
- const symbol = StructCollector.collect(structCtx, "test.cnx");
237
+ const globalScope = TestScopeUtils.getGlobalScope();
238
+ const symbol = StructCollector.collect(
239
+ structCtx,
240
+ "test.cnx",
241
+ globalScope,
242
+ );
190
243
 
191
244
  const field = symbol.fields.get("items");
192
245
  // Issue #139: Type includes capacity for string validation in CodeGenerator
193
- expect(field?.type).toBe("string<16>");
246
+ expect(TypeResolver.getTypeName(field!.type)).toBe("string<16>");
194
247
  expect(field?.isArray).toBe(true);
195
248
  expect(field?.dimensions).toEqual([5, 17]); // [5] array, then 16+1 for string
196
249
  });
@@ -204,15 +257,16 @@ describe("StructCollector", () => {
204
257
  const tree = parse(code);
205
258
  const structCtx = tree.declaration(0)!.structDeclaration()!;
206
259
  const constValues = new Map<string, number>([["MAX_NAMES", 3]]);
260
+ const globalScope = TestScopeUtils.getGlobalScope();
207
261
  const symbol = StructCollector.collect(
208
262
  structCtx,
209
263
  "test.cnx",
210
- undefined,
264
+ globalScope,
211
265
  constValues,
212
266
  );
213
267
 
214
268
  const field = symbol.fields.get("items");
215
- expect(field?.type).toBe("string<16>");
269
+ expect(TypeResolver.getTypeName(field!.type)).toBe("string<16>");
216
270
  expect(field?.isArray).toBe(true);
217
271
  expect(field?.dimensions).toEqual([3, 17]); // [3] from const, then 16+1 for string
218
272
  });
@@ -230,7 +284,12 @@ describe("StructCollector", () => {
230
284
  `;
231
285
  const tree = parse(code);
232
286
  const structCtx = tree.declaration(0)!.structDeclaration()!;
233
- const symbol = StructCollector.collect(structCtx, "test.cnx");
287
+ const globalScope = TestScopeUtils.getGlobalScope();
288
+ const symbol = StructCollector.collect(
289
+ structCtx,
290
+ "test.cnx",
291
+ globalScope,
292
+ );
234
293
 
235
294
  expect(symbol.fields.get("maxSize")?.isConst).toBe(false);
236
295
  expect(symbol.fields.get("currentSize")?.isConst).toBe(false);
@@ -247,15 +306,24 @@ describe("StructCollector", () => {
247
306
  `;
248
307
  const tree = parse(code);
249
308
  const structCtx = tree.declaration(0)!.structDeclaration()!;
250
- const symbol = StructCollector.collect(structCtx, "test.cnx");
309
+ const globalScope = TestScopeUtils.getGlobalScope();
310
+ const symbol = StructCollector.collect(
311
+ structCtx,
312
+ "test.cnx",
313
+ globalScope,
314
+ );
251
315
 
252
- expect(symbol.fields.get("start")?.type).toBe("Point");
253
- expect(symbol.fields.get("end")?.type).toBe("Point");
316
+ expect(TypeResolver.getTypeName(symbol.fields.get("start")!.type)).toBe(
317
+ "Point",
318
+ );
319
+ expect(TypeResolver.getTypeName(symbol.fields.get("end")!.type)).toBe(
320
+ "Point",
321
+ );
254
322
  });
255
323
  });
256
324
 
257
325
  describe("scoped structs", () => {
258
- it("prefixes name with scope when scopeName is provided", () => {
326
+ it("uses scope reference properly", () => {
259
327
  const code = `
260
328
  struct Config {
261
329
  u32 value;
@@ -263,9 +331,16 @@ describe("StructCollector", () => {
263
331
  `;
264
332
  const tree = parse(code);
265
333
  const structCtx = tree.declaration(0)!.structDeclaration()!;
266
- const symbol = StructCollector.collect(structCtx, "motor.cnx", "Motor");
334
+ const motorScope = TestScopeUtils.createMockScope("Motor");
335
+ const symbol = StructCollector.collect(
336
+ structCtx,
337
+ "motor.cnx",
338
+ motorScope,
339
+ );
267
340
 
268
- expect(symbol.name).toBe("Motor_Config");
341
+ expect(symbol.name).toBe("Config");
342
+ expect(symbol.scope).toBe(motorScope);
343
+ expect(symbol.scope.name).toBe("Motor");
269
344
  });
270
345
 
271
346
  it("resolves this.Type references within scope", () => {
@@ -278,9 +353,15 @@ describe("StructCollector", () => {
278
353
  `;
279
354
  const tree = parse(code);
280
355
  const structCtx = tree.declaration(0)!.structDeclaration()!;
281
- const symbol = StructCollector.collect(structCtx, "motor.cnx", "Motor");
356
+ const motorScope = TestScopeUtils.createMockScope("Motor");
357
+ const symbol = StructCollector.collect(
358
+ structCtx,
359
+ "motor.cnx",
360
+ motorScope,
361
+ );
282
362
 
283
- expect(symbol.name).toBe("Motor_Container");
363
+ expect(symbol.name).toBe("Container");
364
+ expect(symbol.scope.name).toBe("Motor");
284
365
  });
285
366
  });
286
367
 
@@ -294,7 +375,12 @@ describe("StructCollector", () => {
294
375
  `;
295
376
  const tree = parse(code);
296
377
  const structCtx = tree.declaration(0)!.structDeclaration()!;
297
- const symbol = StructCollector.collect(structCtx, "test.cnx");
378
+ const globalScope = TestScopeUtils.getGlobalScope();
379
+ const symbol = StructCollector.collect(
380
+ structCtx,
381
+ "test.cnx",
382
+ globalScope,
383
+ );
298
384
 
299
385
  expect(symbol.sourceLine).toBe(3);
300
386
  });