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.
- package/package.json +1 -1
- package/src/lib/__tests__/parseCHeader.mocked.test.ts +69 -54
- package/src/lib/parseCHeader.ts +56 -23
- package/src/lib/parseWithSymbols.ts +195 -53
- package/src/transpiler/Transpiler.ts +180 -63
- package/src/transpiler/logic/analysis/FunctionCallAnalyzer.ts +1 -2
- package/src/transpiler/logic/analysis/InitializationAnalyzer.ts +1 -2
- package/src/transpiler/logic/analysis/PassByValueAnalyzer.ts +51 -2
- package/src/transpiler/logic/analysis/__tests__/FunctionCallAnalyzer.test.ts +18 -12
- package/src/transpiler/logic/analysis/__tests__/InitializationAnalyzer.test.ts +9 -9
- package/src/transpiler/logic/analysis/__tests__/runAnalyzers.test.ts +5 -5
- package/src/transpiler/logic/symbols/SymbolTable.ts +729 -265
- package/src/transpiler/logic/symbols/SymbolUtils.ts +2 -2
- package/src/transpiler/logic/symbols/__tests__/SymbolTable.test.ts +415 -751
- package/src/transpiler/logic/symbols/c/__tests__/CResolver.integration.test.ts +573 -0
- package/src/transpiler/logic/symbols/c/__tests__/testHelpers.ts +20 -0
- package/src/transpiler/logic/symbols/c/collectors/EnumCollector.ts +82 -0
- package/src/transpiler/logic/symbols/c/collectors/FunctionCollector.ts +106 -0
- package/src/transpiler/logic/symbols/c/collectors/StructCollector.ts +173 -0
- package/src/transpiler/logic/symbols/c/collectors/TypedefCollector.ts +35 -0
- package/src/transpiler/logic/symbols/c/collectors/VariableCollector.ts +80 -0
- package/src/transpiler/logic/symbols/c/index.ts +333 -0
- package/src/transpiler/logic/symbols/c/utils/DeclaratorUtils.ts +269 -0
- package/src/transpiler/logic/symbols/cnext/__tests__/BitmapCollector.test.ts +50 -11
- package/src/transpiler/logic/symbols/cnext/__tests__/CNextResolver.integration.test.ts +45 -34
- package/src/transpiler/logic/symbols/cnext/__tests__/EnumCollector.test.ts +30 -13
- package/src/transpiler/logic/symbols/cnext/__tests__/FunctionCollector.test.ts +279 -64
- package/src/transpiler/logic/symbols/cnext/__tests__/RegisterCollector.test.ts +60 -13
- package/src/transpiler/logic/symbols/cnext/__tests__/ScopeCollector.test.ts +40 -37
- package/src/transpiler/logic/symbols/cnext/__tests__/StructCollector.test.ts +131 -45
- package/src/transpiler/logic/symbols/cnext/__tests__/TSymbolInfoAdapter.test.ts +223 -139
- package/src/transpiler/logic/symbols/cnext/__tests__/VariableCollector.test.ts +79 -25
- package/src/transpiler/logic/symbols/cnext/__tests__/testUtils.ts +53 -0
- package/src/transpiler/logic/symbols/cnext/adapters/TSymbolInfoAdapter.ts +83 -43
- package/src/transpiler/logic/symbols/cnext/collectors/BitmapCollector.ts +14 -13
- package/src/transpiler/logic/symbols/cnext/collectors/EnumCollector.ts +11 -10
- package/src/transpiler/logic/symbols/cnext/collectors/FunctionCollector.ts +83 -34
- package/src/transpiler/logic/symbols/cnext/collectors/RegisterCollector.ts +22 -18
- package/src/transpiler/logic/symbols/cnext/collectors/ScopeCollector.ts +53 -35
- package/src/transpiler/logic/symbols/cnext/collectors/StructCollector.ts +30 -23
- package/src/transpiler/logic/symbols/cnext/collectors/VariableCollector.ts +18 -19
- package/src/transpiler/logic/symbols/cnext/index.ts +36 -14
- package/src/transpiler/logic/symbols/cnext/types/IScopeCollectorResult.ts +2 -2
- package/src/transpiler/logic/symbols/cnext/utils/SymbolNameUtils.ts +27 -0
- package/src/transpiler/logic/symbols/cpp/__tests__/CppResolver.integration.test.ts +270 -0
- package/src/transpiler/logic/symbols/cpp/__tests__/testHelpers.ts +20 -0
- package/src/transpiler/logic/symbols/cpp/collectors/ClassCollector.ts +317 -0
- package/src/transpiler/logic/symbols/cpp/collectors/EnumCollector.ts +71 -0
- package/src/transpiler/logic/symbols/cpp/collectors/FunctionCollector.ts +155 -0
- package/src/transpiler/logic/symbols/cpp/collectors/NamespaceCollector.ts +65 -0
- package/src/transpiler/logic/symbols/cpp/collectors/TypeAliasCollector.ts +46 -0
- package/src/transpiler/logic/symbols/cpp/collectors/VariableCollector.ts +54 -0
- package/src/transpiler/logic/symbols/cpp/index.ts +366 -0
- package/src/transpiler/logic/symbols/cpp/utils/DeclaratorUtils.ts +248 -0
- package/src/transpiler/logic/symbols/shared/IExtractedParameter.ts +18 -0
- package/src/transpiler/logic/symbols/shared/ParameterExtractorUtils.ts +73 -0
- package/src/transpiler/output/codegen/CodeGenerator.ts +268 -1674
- package/src/transpiler/output/codegen/__tests__/CodeGenerator.test.ts +7 -1
- package/src/transpiler/output/codegen/assignment/AssignmentClassifier.ts +2 -1
- package/src/transpiler/output/codegen/assignment/handlers/AssignmentHandlerUtils.ts +7 -1
- package/src/transpiler/output/codegen/assignment/handlers/BitmapHandlers.ts +6 -2
- package/src/transpiler/output/codegen/assignment/handlers/RegisterHandlers.ts +2 -1
- package/src/transpiler/output/codegen/generators/declarationGenerators/ScopeGenerator.ts +21 -8
- package/src/transpiler/output/codegen/generators/declarationGenerators/ScopedRegisterGenerator.ts +3 -2
- package/src/transpiler/output/codegen/generators/expressions/CallExprUtils.ts +9 -3
- package/src/transpiler/output/codegen/generators/expressions/__tests__/CallExprGenerator.test.ts +3 -4
- package/src/transpiler/output/codegen/generators/expressions/__tests__/CallExprUtils.test.ts +4 -8
- package/src/transpiler/output/codegen/helpers/ArgumentGenerator.ts +236 -0
- package/src/transpiler/output/codegen/helpers/CppConstructorHelper.ts +3 -3
- package/src/transpiler/output/codegen/helpers/FunctionContextManager.ts +435 -0
- package/src/transpiler/output/codegen/helpers/StringOperationsHelper.ts +203 -0
- package/src/transpiler/output/codegen/helpers/SymbolLookupHelper.ts +8 -12
- package/src/transpiler/output/codegen/helpers/TypeRegistrationEngine.ts +520 -0
- package/src/transpiler/output/codegen/helpers/VariableDeclHelper.ts +735 -0
- package/src/transpiler/output/codegen/helpers/VariableDeclarationFormatter.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/ArgumentGenerator.test.ts +521 -0
- package/src/transpiler/output/codegen/helpers/__tests__/CppConstructorHelper.test.ts +4 -5
- package/src/transpiler/output/codegen/helpers/__tests__/FunctionContextManager.test.ts +983 -0
- package/src/transpiler/output/codegen/helpers/__tests__/StringOperationsHelper.test.ts +269 -0
- package/src/transpiler/output/codegen/helpers/__tests__/SymbolLookupHelper.test.ts +31 -32
- package/src/transpiler/output/codegen/helpers/__tests__/TypeRegistrationEngine.test.ts +186 -0
- package/src/transpiler/output/codegen/helpers/__tests__/VariableDeclHelper.test.ts +460 -0
- package/src/transpiler/output/codegen/helpers/types/IArgumentGeneratorCallbacks.ts +32 -0
- package/src/transpiler/output/codegen/resolution/EnumTypeResolver.ts +5 -1
- package/src/transpiler/output/codegen/types/IFunctionContextCallbacks.ts +12 -0
- package/src/transpiler/output/codegen/types/IVariableFormatInput.ts +1 -1
- package/src/transpiler/output/codegen/utils/QualifiedNameGenerator.ts +114 -0
- package/src/transpiler/output/codegen/utils/__tests__/QualifiedNameGenerator.test.ts +183 -0
- package/src/transpiler/output/headers/BaseHeaderGenerator.ts +4 -4
- package/src/transpiler/output/headers/ExternalTypeHeaderBuilder.ts +7 -7
- package/src/transpiler/output/headers/HeaderGenerator.ts +9 -7
- package/src/transpiler/output/headers/HeaderGeneratorUtils.ts +19 -20
- package/src/transpiler/output/headers/__tests__/BaseHeaderGenerator.test.ts +15 -18
- package/src/transpiler/output/headers/__tests__/CHeaderGenerator.test.ts +63 -64
- package/src/transpiler/output/headers/__tests__/CppHeaderGenerator.test.ts +36 -32
- package/src/transpiler/output/headers/__tests__/ExternalTypeHeaderBuilder.test.ts +26 -26
- package/src/transpiler/output/headers/__tests__/HeaderGenerator.test.ts +87 -59
- package/src/transpiler/output/headers/__tests__/HeaderGeneratorUtils.test.ts +57 -58
- package/src/transpiler/output/headers/adapters/HeaderSymbolAdapter.ts +222 -0
- package/src/transpiler/output/headers/adapters/__tests__/HeaderSymbolAdapter.test.ts +538 -0
- package/src/transpiler/output/headers/types/IGroupedSymbols.ts +8 -8
- package/src/transpiler/output/headers/types/IHeaderSymbol.ts +62 -0
- package/src/transpiler/state/CodeGenState.ts +20 -33
- package/src/transpiler/state/SymbolRegistry.ts +181 -0
- package/src/transpiler/{types → state}/TranspilerState.ts +1 -1
- package/src/transpiler/state/__tests__/CodeGenState.test.ts +67 -59
- package/src/transpiler/state/__tests__/SymbolRegistry.test.ts +249 -0
- package/src/transpiler/{types → state}/__tests__/TranspilerState.test.ts +1 -1
- package/src/transpiler/types/ICachedFileEntry.ts +1 -1
- package/src/transpiler/types/IConflict.ts +14 -0
- package/src/transpiler/types/IPipelineInput.ts +0 -3
- package/src/transpiler/types/ISerializedSymbol.ts +11 -0
- package/src/transpiler/types/TPrimitiveKind.ts +20 -0
- package/src/transpiler/types/TType.ts +103 -0
- package/src/transpiler/types/TVisibility.ts +6 -0
- package/src/transpiler/types/symbol-kinds/TSymbolKind.ts +10 -0
- package/src/transpiler/types/symbol-kinds/TSymbolKindC.ts +12 -0
- package/src/transpiler/types/symbol-kinds/TSymbolKindCNext.ts +16 -0
- package/src/transpiler/types/symbol-kinds/TSymbolKindCpp.ts +14 -0
- package/src/transpiler/types/symbols/IBaseSymbol.ts +31 -0
- package/src/transpiler/{logic/symbols/types → types/symbols}/IBitmapFieldInfo.ts +2 -2
- package/src/transpiler/types/symbols/IBitmapSymbol.ts +21 -0
- package/src/transpiler/{logic/symbols/types → types/symbols}/IEnumSymbol.ts +5 -6
- package/src/transpiler/types/symbols/IFieldInfo.ts +26 -0
- package/src/transpiler/types/symbols/IFunctionSymbol.ts +30 -0
- package/src/transpiler/types/symbols/IParameterInfo.ts +26 -0
- package/src/transpiler/{logic/symbols/types → types/symbols}/IRegisterMemberInfo.ts +4 -4
- package/src/transpiler/types/symbols/IRegisterSymbol.ts +18 -0
- package/src/transpiler/types/symbols/IScopeSymbol.ts +32 -0
- package/src/transpiler/{logic/symbols/types → types/symbols}/IStructFieldInfo.ts +2 -1
- package/src/transpiler/types/symbols/IStructSymbol.ts +15 -0
- package/src/transpiler/types/symbols/IVariableSymbol.ts +30 -0
- package/src/transpiler/types/symbols/SymbolGuards.ts +43 -0
- package/src/transpiler/types/symbols/TAnySymbol.ts +22 -0
- package/src/transpiler/types/symbols/TSymbol.ts +32 -0
- package/src/transpiler/types/symbols/__tests__/IBaseSymbol.test.ts +56 -0
- package/src/transpiler/types/symbols/__tests__/SymbolGuards.test.ts +57 -0
- package/src/transpiler/types/symbols/c/ICBaseSymbol.ts +28 -0
- package/src/transpiler/types/symbols/c/ICEnumMemberSymbol.ts +17 -0
- package/src/transpiler/types/symbols/c/ICEnumSymbol.ts +17 -0
- package/src/transpiler/types/symbols/c/ICFieldInfo.ts +16 -0
- package/src/transpiler/types/symbols/c/ICFunctionSymbol.ts +21 -0
- package/src/transpiler/types/symbols/c/ICParameterInfo.ts +19 -0
- package/src/transpiler/types/symbols/c/ICStructSymbol.ts +21 -0
- package/src/transpiler/types/symbols/c/ICTypedefSymbol.ts +14 -0
- package/src/transpiler/types/symbols/c/ICVariableSymbol.ts +26 -0
- package/src/transpiler/types/symbols/c/TCSymbol.ts +26 -0
- package/src/transpiler/types/symbols/cpp/ICppBaseSymbol.ts +31 -0
- package/src/transpiler/types/symbols/cpp/ICppClassSymbol.ts +15 -0
- package/src/transpiler/types/symbols/cpp/ICppEnumMemberSymbol.ts +14 -0
- package/src/transpiler/types/symbols/cpp/ICppEnumSymbol.ts +14 -0
- package/src/transpiler/types/symbols/cpp/ICppFieldInfo.ts +16 -0
- package/src/transpiler/types/symbols/cpp/ICppFunctionSymbol.ts +21 -0
- package/src/transpiler/types/symbols/cpp/ICppNamespaceSymbol.ts +11 -0
- package/src/transpiler/types/symbols/cpp/ICppParameterInfo.ts +19 -0
- package/src/transpiler/types/symbols/cpp/ICppStructSymbol.ts +16 -0
- package/src/transpiler/types/symbols/cpp/ICppTypeAliasSymbol.ts +14 -0
- package/src/transpiler/types/symbols/cpp/ICppVariableSymbol.ts +23 -0
- package/src/transpiler/types/symbols/cpp/TCppSymbol.ts +30 -0
- package/src/utils/CppNamespaceUtils.ts +3 -4
- package/src/utils/FunctionUtils.ts +92 -0
- package/src/utils/ParameterUtils.ts +55 -0
- package/src/utils/PrimitiveKindUtils.ts +33 -0
- package/src/utils/ScopeUtils.ts +105 -0
- package/src/utils/TTypeUtils.ts +159 -0
- package/src/utils/TypeResolver.ts +132 -0
- package/src/utils/__tests__/CppNamespaceUtils.test.ts +92 -99
- package/src/utils/__tests__/FunctionUtils.test.ts +284 -0
- package/src/utils/__tests__/ParameterUtils.test.ts +174 -0
- package/src/utils/__tests__/PrimitiveKindUtils.test.ts +59 -0
- package/src/utils/__tests__/ScopeUtils.test.ts +53 -0
- package/src/utils/__tests__/TTypeUtils.test.ts +245 -0
- package/src/utils/__tests__/TypeResolver.test.ts +332 -0
- package/src/utils/cache/CacheManager.ts +91 -50
- package/src/utils/cache/__tests__/CacheManager.test.ts +180 -114
- package/src/transpiler/logic/symbols/AutoConstUpdater.ts +0 -93
- package/src/transpiler/logic/symbols/CSymbolCollector.ts +0 -648
- package/src/transpiler/logic/symbols/CppSymbolCollector.ts +0 -874
- package/src/transpiler/logic/symbols/SymbolCollectorContext.ts +0 -68
- package/src/transpiler/logic/symbols/__tests__/AutoConstUpdater.test.ts +0 -418
- package/src/transpiler/logic/symbols/__tests__/CSymbolCollector.test.ts +0 -685
- package/src/transpiler/logic/symbols/__tests__/CppSymbolCollector.test.ts +0 -1146
- package/src/transpiler/logic/symbols/__tests__/SymbolCollectorContext.test.ts +0 -290
- package/src/transpiler/logic/symbols/__tests__/cTestHelpers.ts +0 -43
- package/src/transpiler/logic/symbols/__tests__/cppTestHelpers.ts +0 -40
- package/src/transpiler/logic/symbols/cnext/__tests__/TSymbolAdapter.test.ts +0 -595
- package/src/transpiler/logic/symbols/cnext/adapters/TSymbolAdapter.ts +0 -345
- package/src/transpiler/logic/symbols/types/IBaseSymbol.ts +0 -27
- package/src/transpiler/logic/symbols/types/IBitmapSymbol.ts +0 -23
- package/src/transpiler/logic/symbols/types/ICollectorContext.ts +0 -19
- package/src/transpiler/logic/symbols/types/IConflict.ts +0 -20
- package/src/transpiler/logic/symbols/types/IFieldInfo.ts +0 -18
- package/src/transpiler/logic/symbols/types/IFunctionSymbol.ts +0 -25
- package/src/transpiler/logic/symbols/types/IParameterInfo.ts +0 -24
- package/src/transpiler/logic/symbols/types/IRegisterSymbol.ts +0 -20
- package/src/transpiler/logic/symbols/types/IScopeSymbol.ts +0 -19
- package/src/transpiler/logic/symbols/types/IStructSymbol.ts +0 -16
- package/src/transpiler/logic/symbols/types/IVariableSymbol.ts +0 -30
- package/src/transpiler/logic/symbols/types/TSymbol.ts +0 -36
- package/src/transpiler/logic/symbols/types/__tests__/SymbolGuards.test.ts +0 -244
- package/src/transpiler/logic/symbols/types/typeGuards.ts +0 -44
- package/src/utils/types/ESymbolKind.ts +0 -19
- package/src/utils/types/ISymbol.ts +0 -64
- /package/src/transpiler/{types → constants}/BITMAP_BACKING_TYPE.ts +0 -0
- /package/src/transpiler/{types → constants}/BITMAP_SIZE.ts +0 -0
package/package.json
CHANGED
|
@@ -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
|
|
10
|
-
const
|
|
8
|
+
// Create mock resolve function that we can control per test
|
|
9
|
+
const mockResolve = vi.fn();
|
|
11
10
|
|
|
12
|
-
// Mock
|
|
13
|
-
vi.mock("../../transpiler/logic/symbols/
|
|
11
|
+
// Mock CResolver before importing parseCHeader
|
|
12
|
+
vi.mock("../../transpiler/logic/symbols/c", () => {
|
|
14
13
|
return {
|
|
15
|
-
default:
|
|
16
|
-
|
|
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
|
-
|
|
29
|
-
// Default to returning empty
|
|
30
|
-
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
|
108
|
-
|
|
109
|
-
throw new Error("
|
|
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("
|
|
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
|
-
|
|
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
|
-
|
|
150
|
+
mockResolve.mockImplementation(() => {
|
|
136
151
|
throw 42;
|
|
137
152
|
});
|
|
138
153
|
|
package/src/lib/parseCHeader.ts
CHANGED
|
@@ -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
|
|
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
|
|
16
|
+
* Map TCSymbol kind to library TSymbolKind
|
|
16
17
|
*/
|
|
17
|
-
function
|
|
18
|
+
function mapCSymbolKind(kind: TCSymbol["kind"]): TSymbolKind {
|
|
18
19
|
switch (kind) {
|
|
19
|
-
case
|
|
20
|
+
case "struct":
|
|
20
21
|
return "struct";
|
|
21
|
-
case
|
|
22
|
+
case "function":
|
|
22
23
|
return "function";
|
|
23
|
-
case
|
|
24
|
+
case "variable":
|
|
24
25
|
return "variable";
|
|
25
|
-
case
|
|
26
|
+
case "enum":
|
|
26
27
|
return "enum";
|
|
27
|
-
case
|
|
28
|
+
case "enum_member":
|
|
28
29
|
return "enumMember";
|
|
29
|
-
case
|
|
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
|
|
79
|
-
const rawSymbols = collector.collect(tree);
|
|
121
|
+
const result = CResolver.resolve(tree, filePath ?? "<header>");
|
|
80
122
|
|
|
81
|
-
//
|
|
82
|
-
const symbols
|
|
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
|
|
8
|
-
import
|
|
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
|
|
12
|
+
import TSymbol from "../transpiler/types/symbols/TSymbol";
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
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
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
233
|
+
// ADR-055 Phase 7: Direct TSymbol → ISymbolInfo conversion (no ISymbol intermediate)
|
|
78
234
|
const tSymbols = CNextResolver.resolve(tree, "<source>");
|
|
79
|
-
const
|
|
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,
|