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