c-next 0.1.70 → 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 (204) 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 +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 +676 -258
  13. package/src/transpiler/logic/symbols/SymbolUtils.ts +2 -2
  14. package/src/transpiler/logic/symbols/__tests__/SymbolTable.test.ts +290 -782
  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/ISerializedSymbol.ts +11 -0
  112. package/src/transpiler/types/TPrimitiveKind.ts +20 -0
  113. package/src/transpiler/types/TType.ts +103 -0
  114. package/src/transpiler/types/TVisibility.ts +6 -0
  115. package/src/transpiler/types/symbol-kinds/TSymbolKind.ts +10 -0
  116. package/src/transpiler/types/symbol-kinds/TSymbolKindC.ts +12 -0
  117. package/src/transpiler/types/symbol-kinds/TSymbolKindCNext.ts +16 -0
  118. package/src/transpiler/types/symbol-kinds/TSymbolKindCpp.ts +14 -0
  119. package/src/transpiler/types/symbols/IBaseSymbol.ts +31 -0
  120. package/src/transpiler/{logic/symbols/types → types/symbols}/IBitmapFieldInfo.ts +2 -2
  121. package/src/transpiler/types/symbols/IBitmapSymbol.ts +21 -0
  122. package/src/transpiler/{logic/symbols/types → types/symbols}/IEnumSymbol.ts +5 -6
  123. package/src/transpiler/types/symbols/IFieldInfo.ts +26 -0
  124. package/src/transpiler/types/symbols/IFunctionSymbol.ts +30 -0
  125. package/src/transpiler/types/symbols/IParameterInfo.ts +26 -0
  126. package/src/transpiler/{logic/symbols/types → types/symbols}/IRegisterMemberInfo.ts +4 -4
  127. package/src/transpiler/types/symbols/IRegisterSymbol.ts +18 -0
  128. package/src/transpiler/types/symbols/IScopeSymbol.ts +32 -0
  129. package/src/transpiler/{logic/symbols/types → types/symbols}/IStructFieldInfo.ts +2 -1
  130. package/src/transpiler/types/symbols/IStructSymbol.ts +15 -0
  131. package/src/transpiler/types/symbols/IVariableSymbol.ts +30 -0
  132. package/src/transpiler/types/symbols/SymbolGuards.ts +43 -0
  133. package/src/transpiler/types/symbols/TAnySymbol.ts +22 -0
  134. package/src/transpiler/types/symbols/TSymbol.ts +32 -0
  135. package/src/transpiler/types/symbols/__tests__/IBaseSymbol.test.ts +56 -0
  136. package/src/transpiler/types/symbols/__tests__/SymbolGuards.test.ts +57 -0
  137. package/src/transpiler/types/symbols/c/ICBaseSymbol.ts +28 -0
  138. package/src/transpiler/types/symbols/c/ICEnumMemberSymbol.ts +17 -0
  139. package/src/transpiler/types/symbols/c/ICEnumSymbol.ts +17 -0
  140. package/src/transpiler/types/symbols/c/ICFieldInfo.ts +16 -0
  141. package/src/transpiler/types/symbols/c/ICFunctionSymbol.ts +21 -0
  142. package/src/transpiler/types/symbols/c/ICParameterInfo.ts +19 -0
  143. package/src/transpiler/types/symbols/c/ICStructSymbol.ts +21 -0
  144. package/src/transpiler/types/symbols/c/ICTypedefSymbol.ts +14 -0
  145. package/src/transpiler/types/symbols/c/ICVariableSymbol.ts +26 -0
  146. package/src/transpiler/types/symbols/c/TCSymbol.ts +26 -0
  147. package/src/transpiler/types/symbols/cpp/ICppBaseSymbol.ts +31 -0
  148. package/src/transpiler/types/symbols/cpp/ICppClassSymbol.ts +15 -0
  149. package/src/transpiler/types/symbols/cpp/ICppEnumMemberSymbol.ts +14 -0
  150. package/src/transpiler/types/symbols/cpp/ICppEnumSymbol.ts +14 -0
  151. package/src/transpiler/types/symbols/cpp/ICppFieldInfo.ts +16 -0
  152. package/src/transpiler/types/symbols/cpp/ICppFunctionSymbol.ts +21 -0
  153. package/src/transpiler/types/symbols/cpp/ICppNamespaceSymbol.ts +11 -0
  154. package/src/transpiler/types/symbols/cpp/ICppParameterInfo.ts +19 -0
  155. package/src/transpiler/types/symbols/cpp/ICppStructSymbol.ts +16 -0
  156. package/src/transpiler/types/symbols/cpp/ICppTypeAliasSymbol.ts +14 -0
  157. package/src/transpiler/types/symbols/cpp/ICppVariableSymbol.ts +23 -0
  158. package/src/transpiler/types/symbols/cpp/TCppSymbol.ts +30 -0
  159. package/src/utils/CppNamespaceUtils.ts +3 -4
  160. package/src/utils/FunctionUtils.ts +92 -0
  161. package/src/utils/ParameterUtils.ts +55 -0
  162. package/src/utils/PrimitiveKindUtils.ts +33 -0
  163. package/src/utils/ScopeUtils.ts +105 -0
  164. package/src/utils/TTypeUtils.ts +159 -0
  165. package/src/utils/TypeResolver.ts +132 -0
  166. package/src/utils/__tests__/CppNamespaceUtils.test.ts +92 -99
  167. package/src/utils/__tests__/FunctionUtils.test.ts +284 -0
  168. package/src/utils/__tests__/ParameterUtils.test.ts +174 -0
  169. package/src/utils/__tests__/PrimitiveKindUtils.test.ts +59 -0
  170. package/src/utils/__tests__/ScopeUtils.test.ts +53 -0
  171. package/src/utils/__tests__/TTypeUtils.test.ts +245 -0
  172. package/src/utils/__tests__/TypeResolver.test.ts +332 -0
  173. package/src/utils/cache/CacheManager.ts +91 -50
  174. package/src/utils/cache/__tests__/CacheManager.test.ts +180 -114
  175. package/src/transpiler/logic/symbols/AutoConstUpdater.ts +0 -93
  176. package/src/transpiler/logic/symbols/CSymbolCollector.ts +0 -648
  177. package/src/transpiler/logic/symbols/CppSymbolCollector.ts +0 -874
  178. package/src/transpiler/logic/symbols/SymbolCollectorContext.ts +0 -68
  179. package/src/transpiler/logic/symbols/__tests__/AutoConstUpdater.test.ts +0 -418
  180. package/src/transpiler/logic/symbols/__tests__/CSymbolCollector.test.ts +0 -685
  181. package/src/transpiler/logic/symbols/__tests__/CppSymbolCollector.test.ts +0 -1146
  182. package/src/transpiler/logic/symbols/__tests__/SymbolCollectorContext.test.ts +0 -290
  183. package/src/transpiler/logic/symbols/__tests__/cTestHelpers.ts +0 -43
  184. package/src/transpiler/logic/symbols/__tests__/cppTestHelpers.ts +0 -40
  185. package/src/transpiler/logic/symbols/cnext/__tests__/TSymbolAdapter.test.ts +0 -595
  186. package/src/transpiler/logic/symbols/cnext/adapters/TSymbolAdapter.ts +0 -345
  187. package/src/transpiler/logic/symbols/types/IBaseSymbol.ts +0 -27
  188. package/src/transpiler/logic/symbols/types/IBitmapSymbol.ts +0 -23
  189. package/src/transpiler/logic/symbols/types/ICollectorContext.ts +0 -19
  190. package/src/transpiler/logic/symbols/types/IConflict.ts +0 -20
  191. package/src/transpiler/logic/symbols/types/IFieldInfo.ts +0 -18
  192. package/src/transpiler/logic/symbols/types/IFunctionSymbol.ts +0 -25
  193. package/src/transpiler/logic/symbols/types/IParameterInfo.ts +0 -24
  194. package/src/transpiler/logic/symbols/types/IRegisterSymbol.ts +0 -20
  195. package/src/transpiler/logic/symbols/types/IScopeSymbol.ts +0 -19
  196. package/src/transpiler/logic/symbols/types/IStructSymbol.ts +0 -16
  197. package/src/transpiler/logic/symbols/types/IVariableSymbol.ts +0 -30
  198. package/src/transpiler/logic/symbols/types/TSymbol.ts +0 -36
  199. package/src/transpiler/logic/symbols/types/__tests__/SymbolGuards.test.ts +0 -244
  200. package/src/transpiler/logic/symbols/types/typeGuards.ts +0 -44
  201. package/src/utils/types/ESymbolKind.ts +0 -19
  202. package/src/utils/types/ISymbol.ts +0 -64
  203. /package/src/transpiler/{types → constants}/BITMAP_BACKING_TYPE.ts +0 -0
  204. /package/src/transpiler/{types → constants}/BITMAP_SIZE.ts +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "c-next",
3
- "version": "0.1.70",
3
+ "version": "0.1.71",
4
4
  "description": "A safer C for embedded systems development. Transpiles to clean, readable C.",
5
5
  "packageManager": "npm@11.9.0",
6
6
  "type": "module",
@@ -4,18 +4,15 @@
4
4
  */
5
5
 
6
6
  import { describe, it, expect, vi, beforeEach } from "vitest";
7
- import ESymbolKind from "../../utils/types/ESymbolKind";
8
7
 
9
- // Create mock collect function that we can control per test
10
- const mockCollect = vi.fn();
8
+ // Create mock resolve function that we can control per test
9
+ const mockResolve = vi.fn();
11
10
 
12
- // Mock CSymbolCollector before importing parseCHeader
13
- vi.mock("../../transpiler/logic/symbols/CSymbolCollector", () => {
11
+ // Mock CResolver before importing parseCHeader
12
+ vi.mock("../../transpiler/logic/symbols/c", () => {
14
13
  return {
15
- default: class MockCSymbolCollector {
16
- collect() {
17
- return mockCollect();
18
- }
14
+ default: {
15
+ resolve: () => mockResolve(),
19
16
  },
20
17
  };
21
18
  });
@@ -25,23 +22,28 @@ import parseCHeader from "../parseCHeader";
25
22
 
26
23
  describe("parseCHeader mocked scenarios", () => {
27
24
  beforeEach(() => {
28
- mockCollect.mockReset();
29
- // Default to returning empty array
30
- mockCollect.mockReturnValue([]);
25
+ mockResolve.mockReset();
26
+ // Default to returning empty result
27
+ mockResolve.mockReturnValue({ symbols: [], warnings: [] });
31
28
  });
32
29
 
33
30
  describe("mapSymbolKind default case", () => {
34
31
  it("maps Namespace kind to variable (default case)", () => {
35
32
  // Return a symbol with Namespace kind (not explicitly handled in switch)
36
- mockCollect.mockReturnValue([
37
- {
38
- name: "TestNamespace",
39
- kind: ESymbolKind.Namespace,
40
- type: undefined,
41
- parent: undefined,
42
- sourceLine: 1,
43
- },
44
- ]);
33
+ // Use TCSymbol format which then gets converted by CTSymbolAdapter
34
+ mockResolve.mockReturnValue({
35
+ symbols: [
36
+ {
37
+ name: "TestNamespace",
38
+ kind: "namespace",
39
+ sourceFile: "<header>",
40
+ sourceLine: 1,
41
+ sourceLanguage: 0,
42
+ isExported: true,
43
+ },
44
+ ],
45
+ warnings: [],
46
+ });
45
47
 
46
48
  const result = parseCHeader("// any valid C");
47
49
 
@@ -52,15 +54,19 @@ describe("parseCHeader mocked scenarios", () => {
52
54
  });
53
55
 
54
56
  it("maps Class kind to variable (default case)", () => {
55
- mockCollect.mockReturnValue([
56
- {
57
- name: "TestClass",
58
- kind: ESymbolKind.Class,
59
- type: "class",
60
- parent: undefined,
61
- sourceLine: 5,
62
- },
63
- ]);
57
+ mockResolve.mockReturnValue({
58
+ symbols: [
59
+ {
60
+ name: "TestClass",
61
+ kind: "class",
62
+ sourceFile: "<header>",
63
+ sourceLine: 5,
64
+ sourceLanguage: 0,
65
+ isExported: true,
66
+ },
67
+ ],
68
+ warnings: [],
69
+ });
64
70
 
65
71
  const result = parseCHeader("// any valid C");
66
72
 
@@ -69,15 +75,19 @@ describe("parseCHeader mocked scenarios", () => {
69
75
  });
70
76
 
71
77
  it("maps Bitmap kind to variable (default case)", () => {
72
- mockCollect.mockReturnValue([
73
- {
74
- name: "TestBitmap",
75
- kind: ESymbolKind.Bitmap,
76
- type: undefined,
77
- parent: undefined,
78
- sourceLine: 1,
79
- },
80
- ]);
78
+ mockResolve.mockReturnValue({
79
+ symbols: [
80
+ {
81
+ name: "TestBitmap",
82
+ kind: "bitmap",
83
+ sourceFile: "<header>",
84
+ sourceLine: 1,
85
+ sourceLanguage: 0,
86
+ isExported: true,
87
+ },
88
+ ],
89
+ warnings: [],
90
+ });
81
91
 
82
92
  const result = parseCHeader("// any valid C");
83
93
 
@@ -86,15 +96,20 @@ describe("parseCHeader mocked scenarios", () => {
86
96
  });
87
97
 
88
98
  it("defaults line to 0 when sourceLine is undefined", () => {
89
- mockCollect.mockReturnValue([
90
- {
91
- name: "NoLineSymbol",
92
- kind: ESymbolKind.Function,
93
- type: "void",
94
- parent: undefined,
95
- sourceLine: undefined, // No source line info
96
- },
97
- ]);
99
+ mockResolve.mockReturnValue({
100
+ symbols: [
101
+ {
102
+ name: "NoLineSymbol",
103
+ kind: "function",
104
+ type: "void",
105
+ sourceFile: "<header>",
106
+ sourceLine: undefined,
107
+ sourceLanguage: 0,
108
+ isExported: true,
109
+ },
110
+ ],
111
+ warnings: [],
112
+ });
98
113
 
99
114
  const result = parseCHeader("// any valid C");
100
115
 
@@ -104,9 +119,9 @@ describe("parseCHeader mocked scenarios", () => {
104
119
  });
105
120
 
106
121
  describe("error handling catch block", () => {
107
- it("returns error result when collector throws Error", () => {
108
- mockCollect.mockImplementation(() => {
109
- throw new Error("Collector failed");
122
+ it("returns error result when resolver throws Error", () => {
123
+ mockResolve.mockImplementation(() => {
124
+ throw new Error("Resolver failed");
110
125
  });
111
126
 
112
127
  const result = parseCHeader("int x;");
@@ -114,14 +129,14 @@ describe("parseCHeader mocked scenarios", () => {
114
129
  expect(result.success).toBe(false);
115
130
  expect(result.symbols).toHaveLength(0);
116
131
  expect(result.errors).toHaveLength(1);
117
- expect(result.errors[0].message).toBe("Collector failed");
132
+ expect(result.errors[0].message).toBe("Resolver failed");
118
133
  expect(result.errors[0].severity).toBe("error");
119
134
  expect(result.errors[0].line).toBe(1);
120
135
  expect(result.errors[0].column).toBe(0);
121
136
  });
122
137
 
123
138
  it("handles non-Error exceptions (string throw)", () => {
124
- mockCollect.mockImplementation(() => {
139
+ mockResolve.mockImplementation(() => {
125
140
  throw "String error message";
126
141
  });
127
142
 
@@ -132,7 +147,7 @@ describe("parseCHeader mocked scenarios", () => {
132
147
  });
133
148
 
134
149
  it("handles non-Error exceptions (number throw)", () => {
135
- mockCollect.mockImplementation(() => {
150
+ mockResolve.mockImplementation(() => {
136
151
  throw 42;
137
152
  });
138
153
 
@@ -1,38 +1,81 @@
1
1
  /**
2
2
  * Parse C/C++ header source and extract symbols for IDE features
3
+ * ADR-055 Phase 7: Direct TCSymbol → ISymbolInfo conversion (no ISymbol intermediate)
3
4
  */
4
5
 
5
6
  import { CharStream, CommonTokenStream } from "antlr4ng";
6
7
  import { CLexer } from "../transpiler/logic/parser/c/grammar/CLexer";
7
8
  import { CParser } from "../transpiler/logic/parser/c/grammar/CParser";
8
- import CSymbolCollector from "../transpiler/logic/symbols/CSymbolCollector";
9
- import ESymbolKind from "../utils/types/ESymbolKind";
9
+ import CResolver from "../transpiler/logic/symbols/c";
10
10
  import ISymbolInfo from "./types/ISymbolInfo";
11
11
  import IParseWithSymbolsResult from "./types/IParseWithSymbolsResult";
12
12
  import TSymbolKind from "./types/TSymbolKind";
13
+ import TCSymbol from "../transpiler/types/symbols/c/TCSymbol";
13
14
 
14
15
  /**
15
- * Map ESymbolKind to TSymbolKind for extension use
16
+ * Map TCSymbol kind to library TSymbolKind
16
17
  */
17
- function mapSymbolKind(kind: ESymbolKind): TSymbolKind {
18
+ function mapCSymbolKind(kind: TCSymbol["kind"]): TSymbolKind {
18
19
  switch (kind) {
19
- case ESymbolKind.Struct:
20
+ case "struct":
20
21
  return "struct";
21
- case ESymbolKind.Function:
22
+ case "function":
22
23
  return "function";
23
- case ESymbolKind.Variable:
24
+ case "variable":
24
25
  return "variable";
25
- case ESymbolKind.Enum:
26
+ case "enum":
26
27
  return "enum";
27
- case ESymbolKind.EnumMember:
28
+ case "enum_member":
28
29
  return "enumMember";
29
- case ESymbolKind.Type:
30
+ case "type":
30
31
  return "type";
31
32
  default:
32
33
  return "variable";
33
34
  }
34
35
  }
35
36
 
37
+ /**
38
+ * ADR-055 Phase 7: Convert TCSymbol directly to ISymbolInfo.
39
+ * Handles the discriminated union by extracting common fields and type-specific fields.
40
+ */
41
+ function convertTCSymbolsToISymbolInfo(
42
+ symbols: TCSymbol[],
43
+ filePath?: string,
44
+ ): ISymbolInfo[] {
45
+ return symbols.map((sym) => {
46
+ // Extract type and parent based on symbol kind
47
+ let type: string | undefined;
48
+ let parent: string | undefined;
49
+
50
+ switch (sym.kind) {
51
+ case "function":
52
+ type = sym.type;
53
+ break;
54
+ case "variable":
55
+ type = sym.type;
56
+ break;
57
+ case "enum_member":
58
+ parent = sym.parent;
59
+ break;
60
+ case "type":
61
+ type = sym.type;
62
+ break;
63
+ // struct and enum have no type field
64
+ }
65
+
66
+ return {
67
+ name: sym.name,
68
+ fullName: parent ? `${parent}.${sym.name}` : sym.name,
69
+ kind: mapCSymbolKind(sym.kind),
70
+ type,
71
+ parent,
72
+ line: sym.sourceLine ?? 0,
73
+ sourceFile: filePath,
74
+ language: "c",
75
+ };
76
+ });
77
+ }
78
+
36
79
  /**
37
80
  * Parse C/C++ header source and extract symbols for IDE features
38
81
  *
@@ -75,20 +118,10 @@ function parseCHeader(
75
118
  parser.removeErrorListeners();
76
119
 
77
120
  const tree = parser.compilationUnit();
78
- const collector = new CSymbolCollector(filePath ?? "<header>");
79
- const rawSymbols = collector.collect(tree);
121
+ const result = CResolver.resolve(tree, filePath ?? "<header>");
80
122
 
81
- // Transform ISymbol[] to ISymbolInfo[]
82
- const symbols: ISymbolInfo[] = rawSymbols.map((sym) => ({
83
- name: sym.name,
84
- fullName: sym.parent ? `${sym.parent}.${sym.name}` : sym.name,
85
- kind: mapSymbolKind(sym.kind),
86
- type: sym.type,
87
- parent: sym.parent,
88
- line: sym.sourceLine ?? 0,
89
- sourceFile: filePath,
90
- language: "c",
91
- }));
123
+ // ADR-055 Phase 7: Direct TCSymbol → ISymbolInfo conversion
124
+ const symbols = convertTCSymbolsToISymbolInfo(result.symbols, filePath);
92
125
 
93
126
  return {
94
127
  success: true,
@@ -1,55 +1,211 @@
1
1
  /**
2
2
  * Parse C-Next source and extract symbols for IDE features
3
+ * ADR-055 Phase 7: Direct TSymbol → ISymbolInfo conversion (no ISymbol intermediate)
3
4
  */
4
5
 
5
6
  import CNextSourceParser from "../transpiler/logic/parser/CNextSourceParser";
6
7
  import CNextResolver from "../transpiler/logic/symbols/cnext/index";
7
- import TSymbolAdapter from "../transpiler/logic/symbols/cnext/adapters/TSymbolAdapter";
8
- import SymbolTable from "../transpiler/logic/symbols/SymbolTable";
9
- import ESymbolKind from "../utils/types/ESymbolKind";
8
+ import SymbolNameUtils from "../transpiler/logic/symbols/cnext/utils/SymbolNameUtils";
9
+ import TypeResolver from "../utils/TypeResolver";
10
10
  import ISymbolInfo from "./types/ISymbolInfo";
11
11
  import IParseWithSymbolsResult from "./types/IParseWithSymbolsResult";
12
- import TSymbolKind from "./types/TSymbolKind";
12
+ import TSymbol from "../transpiler/types/symbols/TSymbol";
13
13
 
14
14
  /**
15
- * Map ESymbolKind to TSymbolKind for extension use
15
+ * ADR-055 Phase 7: Convert TSymbol directly to ISymbolInfo array.
16
+ * Expands compound symbols (bitmaps, enums, registers) into multiple ISymbolInfo entries.
16
17
  */
17
- function mapSymbolKind(kind: ESymbolKind): TSymbolKind {
18
- switch (kind) {
19
- case ESymbolKind.Namespace:
20
- return "namespace";
21
- case ESymbolKind.Struct:
22
- return "struct";
23
- case ESymbolKind.Register:
24
- return "register";
25
- case ESymbolKind.Function:
26
- return "function";
27
- case ESymbolKind.Variable:
28
- return "variable";
29
- case ESymbolKind.RegisterMember:
30
- return "registerMember";
31
- case ESymbolKind.Enum:
32
- return "enum";
33
- case ESymbolKind.EnumMember:
34
- return "enumMember";
35
- case ESymbolKind.Bitmap:
36
- return "bitmap";
37
- case ESymbolKind.BitmapField:
38
- return "bitmapField";
39
- default:
40
- return "variable";
18
+ function convertTSymbolsToISymbolInfo(symbols: TSymbol[]): ISymbolInfo[] {
19
+ const result: ISymbolInfo[] = [];
20
+
21
+ for (const symbol of symbols) {
22
+ switch (symbol.kind) {
23
+ case "bitmap":
24
+ result.push(...convertBitmap(symbol));
25
+ break;
26
+ case "enum":
27
+ result.push(...convertEnum(symbol));
28
+ break;
29
+ case "struct":
30
+ result.push(convertStruct(symbol));
31
+ break;
32
+ case "function":
33
+ result.push(...convertFunction(symbol));
34
+ break;
35
+ case "variable":
36
+ result.push(convertVariable(symbol));
37
+ break;
38
+ case "register":
39
+ result.push(...convertRegister(symbol));
40
+ break;
41
+ case "scope":
42
+ result.push(convertScope(symbol));
43
+ break;
44
+ }
41
45
  }
46
+
47
+ return result;
42
48
  }
43
49
 
44
- /**
45
- * Extract local name from full qualified name
46
- * e.g., "LED_toggle" with parent "LED" -> "toggle"
47
- */
48
- function extractLocalName(fullName: string, parent?: string): string {
49
- if (parent && fullName.startsWith(parent + "_")) {
50
- return fullName.substring(parent.length + 1);
50
+ function convertBitmap(
51
+ bitmap: import("../transpiler/types/symbols/IBitmapSymbol").default,
52
+ ): ISymbolInfo[] {
53
+ const result: ISymbolInfo[] = [];
54
+ const mangledName = SymbolNameUtils.getMangledName(bitmap);
55
+ const parent = bitmap.scope.name || undefined;
56
+
57
+ result.push({
58
+ name: bitmap.name,
59
+ fullName: mangledName,
60
+ kind: "bitmap",
61
+ type: bitmap.backingType,
62
+ parent,
63
+ line: bitmap.sourceLine,
64
+ });
65
+
66
+ // Add bitmap fields
67
+ for (const [fieldName, fieldInfo] of bitmap.fields) {
68
+ result.push({
69
+ name: fieldName,
70
+ fullName: `${mangledName}.${fieldName}`,
71
+ kind: "bitmapField",
72
+ parent: mangledName,
73
+ line: bitmap.sourceLine,
74
+ size: fieldInfo.width,
75
+ });
76
+ }
77
+
78
+ return result;
79
+ }
80
+
81
+ function convertEnum(
82
+ enumSym: import("../transpiler/types/symbols/IEnumSymbol").default,
83
+ ): ISymbolInfo[] {
84
+ const result: ISymbolInfo[] = [];
85
+ const mangledName = SymbolNameUtils.getMangledName(enumSym);
86
+ const parent = enumSym.scope.name || undefined;
87
+
88
+ result.push({
89
+ name: enumSym.name,
90
+ fullName: mangledName,
91
+ kind: "enum",
92
+ parent,
93
+ line: enumSym.sourceLine,
94
+ });
95
+
96
+ // Add enum members
97
+ for (const [memberName] of enumSym.members) {
98
+ result.push({
99
+ name: memberName,
100
+ fullName: `${mangledName}_${memberName}`,
101
+ kind: "enumMember",
102
+ parent: mangledName,
103
+ line: enumSym.sourceLine,
104
+ });
105
+ }
106
+
107
+ return result;
108
+ }
109
+
110
+ function convertStruct(
111
+ struct: import("../transpiler/types/symbols/IStructSymbol").default,
112
+ ): ISymbolInfo {
113
+ const mangledName = SymbolNameUtils.getMangledName(struct);
114
+ const parent = struct.scope.name || undefined;
115
+
116
+ return {
117
+ name: struct.name,
118
+ fullName: mangledName,
119
+ kind: "struct",
120
+ parent,
121
+ line: struct.sourceLine,
122
+ };
123
+ }
124
+
125
+ function convertFunction(
126
+ func: import("../transpiler/types/symbols/IFunctionSymbol").default,
127
+ ): ISymbolInfo[] {
128
+ const result: ISymbolInfo[] = [];
129
+ const mangledName = SymbolNameUtils.getMangledName(func);
130
+ const parent = func.scope.name || undefined;
131
+ const returnType = TypeResolver.getTypeName(func.returnType);
132
+
133
+ // Build signature
134
+ const paramTypes = func.parameters.map((p) =>
135
+ TypeResolver.getTypeName(p.type),
136
+ );
137
+ const signature = `${returnType} ${mangledName}(${paramTypes.join(", ")})`;
138
+
139
+ result.push({
140
+ name: func.name,
141
+ fullName: mangledName,
142
+ kind: "function",
143
+ type: returnType,
144
+ parent,
145
+ signature,
146
+ accessModifier: func.isExported ? "public" : "private",
147
+ line: func.sourceLine,
148
+ });
149
+
150
+ return result;
151
+ }
152
+
153
+ function convertVariable(
154
+ variable: import("../transpiler/types/symbols/IVariableSymbol").default,
155
+ ): ISymbolInfo {
156
+ const mangledName = SymbolNameUtils.getMangledName(variable);
157
+ const parent = variable.scope.name || undefined;
158
+ const typeStr = TypeResolver.getTypeName(variable.type);
159
+
160
+ return {
161
+ name: variable.name,
162
+ fullName: mangledName,
163
+ kind: "variable",
164
+ type: typeStr,
165
+ parent,
166
+ line: variable.sourceLine,
167
+ };
168
+ }
169
+
170
+ function convertRegister(
171
+ register: import("../transpiler/types/symbols/IRegisterSymbol").default,
172
+ ): ISymbolInfo[] {
173
+ const result: ISymbolInfo[] = [];
174
+ const mangledName = SymbolNameUtils.getMangledName(register);
175
+ const parent = register.scope.name || undefined;
176
+
177
+ result.push({
178
+ name: register.name,
179
+ fullName: mangledName,
180
+ kind: "register",
181
+ parent,
182
+ line: register.sourceLine,
183
+ });
184
+
185
+ // Add register members
186
+ for (const [memberName, memberInfo] of register.members) {
187
+ result.push({
188
+ name: memberName,
189
+ fullName: `${mangledName}.${memberName}`,
190
+ kind: "registerMember",
191
+ parent: mangledName,
192
+ accessModifier: memberInfo.access,
193
+ line: register.sourceLine,
194
+ });
51
195
  }
52
- return fullName;
196
+
197
+ return result;
198
+ }
199
+
200
+ function convertScope(
201
+ scope: import("../transpiler/types/symbols/IScopeSymbol").default,
202
+ ): ISymbolInfo {
203
+ return {
204
+ name: scope.name,
205
+ fullName: scope.name,
206
+ kind: "namespace",
207
+ line: scope.sourceLine,
208
+ };
53
209
  }
54
210
 
55
211
  /**
@@ -74,23 +230,9 @@ function parseWithSymbols(source: string): IParseWithSymbolsResult {
74
230
  // Parse C-Next source
75
231
  const { tree, errors } = CNextSourceParser.parse(source);
76
232
 
77
- // Collect symbols from the parse tree (ADR-055: use CNextResolver + TSymbolAdapter)
233
+ // ADR-055 Phase 7: Direct TSymbol ISymbolInfo conversion (no ISymbol intermediate)
78
234
  const tSymbols = CNextResolver.resolve(tree, "<source>");
79
- const symbolTable = new SymbolTable();
80
- const rawSymbols = TSymbolAdapter.toISymbols(tSymbols, symbolTable);
81
-
82
- // Transform ISymbol[] to ISymbolInfo[]
83
- const symbols: ISymbolInfo[] = rawSymbols.map((sym) => ({
84
- name: extractLocalName(sym.name, sym.parent),
85
- fullName: sym.name,
86
- kind: mapSymbolKind(sym.kind),
87
- type: sym.type,
88
- parent: sym.parent,
89
- signature: sym.signature,
90
- accessModifier: sym.accessModifier,
91
- line: sym.sourceLine,
92
- size: sym.size,
93
- }));
235
+ const symbols = convertTSymbolsToISymbolInfo(tSymbols);
94
236
 
95
237
  return {
96
238
  success: errors.length === 0,