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,8 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
2
|
import parse from "./testHelpers";
|
|
3
3
|
import BitmapCollector from "../collectors/BitmapCollector";
|
|
4
|
-
import ESymbolKind from "../../../../../utils/types/ESymbolKind";
|
|
5
4
|
import ESourceLanguage from "../../../../../utils/types/ESourceLanguage";
|
|
5
|
+
import TestScopeUtils from "./testUtils";
|
|
6
6
|
|
|
7
7
|
describe("BitmapCollector", () => {
|
|
8
8
|
describe("basic bitmap extraction", () => {
|
|
@@ -18,9 +18,13 @@ describe("BitmapCollector", () => {
|
|
|
18
18
|
`;
|
|
19
19
|
const tree = parse(code);
|
|
20
20
|
const bitmapCtx = tree.declaration(0)!.bitmapDeclaration()!;
|
|
21
|
-
const symbol = BitmapCollector.collect(
|
|
21
|
+
const symbol = BitmapCollector.collect(
|
|
22
|
+
bitmapCtx,
|
|
23
|
+
"test.cnx",
|
|
24
|
+
TestScopeUtils.getGlobalScope(),
|
|
25
|
+
);
|
|
22
26
|
|
|
23
|
-
expect(symbol.kind).toBe(
|
|
27
|
+
expect(symbol.kind).toBe("bitmap");
|
|
24
28
|
expect(symbol.name).toBe("Status");
|
|
25
29
|
expect(symbol.backingType).toBe("uint8_t");
|
|
26
30
|
expect(symbol.bitWidth).toBe(8);
|
|
@@ -47,7 +51,11 @@ describe("BitmapCollector", () => {
|
|
|
47
51
|
`;
|
|
48
52
|
const tree = parse(code);
|
|
49
53
|
const bitmapCtx = tree.declaration(0)!.bitmapDeclaration()!;
|
|
50
|
-
const symbol = BitmapCollector.collect(
|
|
54
|
+
const symbol = BitmapCollector.collect(
|
|
55
|
+
bitmapCtx,
|
|
56
|
+
"control.cnx",
|
|
57
|
+
TestScopeUtils.getGlobalScope(),
|
|
58
|
+
);
|
|
51
59
|
|
|
52
60
|
expect(symbol.name).toBe("Control");
|
|
53
61
|
expect(symbol.backingType).toBe("uint16_t");
|
|
@@ -68,7 +76,11 @@ describe("BitmapCollector", () => {
|
|
|
68
76
|
`;
|
|
69
77
|
const tree = parse(code);
|
|
70
78
|
const bitmapCtx = tree.declaration(0)!.bitmapDeclaration()!;
|
|
71
|
-
const symbol = BitmapCollector.collect(
|
|
79
|
+
const symbol = BitmapCollector.collect(
|
|
80
|
+
bitmapCtx,
|
|
81
|
+
"config.cnx",
|
|
82
|
+
TestScopeUtils.getGlobalScope(),
|
|
83
|
+
);
|
|
72
84
|
|
|
73
85
|
expect(symbol.name).toBe("Config");
|
|
74
86
|
expect(symbol.backingType).toBe("uint32_t");
|
|
@@ -85,7 +97,11 @@ describe("BitmapCollector", () => {
|
|
|
85
97
|
`;
|
|
86
98
|
const tree = parse(code);
|
|
87
99
|
const bitmapCtx = tree.declaration(0)!.bitmapDeclaration()!;
|
|
88
|
-
const symbol = BitmapCollector.collect(
|
|
100
|
+
const symbol = BitmapCollector.collect(
|
|
101
|
+
bitmapCtx,
|
|
102
|
+
"rgb.cnx",
|
|
103
|
+
TestScopeUtils.getGlobalScope(),
|
|
104
|
+
);
|
|
89
105
|
|
|
90
106
|
expect(symbol.name).toBe("RGB");
|
|
91
107
|
expect(symbol.backingType).toBe("uint32_t"); // 24-bit uses 32-bit backing
|
|
@@ -106,9 +122,16 @@ describe("BitmapCollector", () => {
|
|
|
106
122
|
`;
|
|
107
123
|
const tree = parse(code);
|
|
108
124
|
const bitmapCtx = tree.declaration(0)!.bitmapDeclaration()!;
|
|
109
|
-
const
|
|
125
|
+
const motorScope = TestScopeUtils.createMockScope("Motor");
|
|
126
|
+
const symbol = BitmapCollector.collect(
|
|
127
|
+
bitmapCtx,
|
|
128
|
+
"motor.cnx",
|
|
129
|
+
motorScope,
|
|
130
|
+
);
|
|
110
131
|
|
|
111
|
-
|
|
132
|
+
// With the new IScopeSymbol-based design, name is just "Flags" (not prefixed)
|
|
133
|
+
// The prefixing happens in TSymbolAdapter for backwards compatibility
|
|
134
|
+
expect(symbol.name).toBe("Flags");
|
|
112
135
|
});
|
|
113
136
|
});
|
|
114
137
|
|
|
@@ -123,7 +146,13 @@ describe("BitmapCollector", () => {
|
|
|
123
146
|
const tree = parse(code);
|
|
124
147
|
const bitmapCtx = tree.declaration(0)!.bitmapDeclaration()!;
|
|
125
148
|
|
|
126
|
-
expect(() =>
|
|
149
|
+
expect(() =>
|
|
150
|
+
BitmapCollector.collect(
|
|
151
|
+
bitmapCtx,
|
|
152
|
+
"test.cnx",
|
|
153
|
+
TestScopeUtils.getGlobalScope(),
|
|
154
|
+
),
|
|
155
|
+
).toThrow(
|
|
127
156
|
"Error: Bitmap 'TooMany' has 10 bits but bitmap8 requires exactly 8 bits",
|
|
128
157
|
);
|
|
129
158
|
});
|
|
@@ -138,7 +167,13 @@ describe("BitmapCollector", () => {
|
|
|
138
167
|
const tree = parse(code);
|
|
139
168
|
const bitmapCtx = tree.declaration(0)!.bitmapDeclaration()!;
|
|
140
169
|
|
|
141
|
-
expect(() =>
|
|
170
|
+
expect(() =>
|
|
171
|
+
BitmapCollector.collect(
|
|
172
|
+
bitmapCtx,
|
|
173
|
+
"test.cnx",
|
|
174
|
+
TestScopeUtils.getGlobalScope(),
|
|
175
|
+
),
|
|
176
|
+
).toThrow(
|
|
142
177
|
"Error: Bitmap 'TooFew' has 4 bits but bitmap8 requires exactly 8 bits",
|
|
143
178
|
);
|
|
144
179
|
});
|
|
@@ -154,7 +189,11 @@ describe("BitmapCollector", () => {
|
|
|
154
189
|
`;
|
|
155
190
|
const tree = parse(code);
|
|
156
191
|
const bitmapCtx = tree.declaration(0)!.bitmapDeclaration()!;
|
|
157
|
-
const symbol = BitmapCollector.collect(
|
|
192
|
+
const symbol = BitmapCollector.collect(
|
|
193
|
+
bitmapCtx,
|
|
194
|
+
"test.cnx",
|
|
195
|
+
TestScopeUtils.getGlobalScope(),
|
|
196
|
+
);
|
|
158
197
|
|
|
159
198
|
expect(symbol.sourceLine).toBe(3);
|
|
160
199
|
});
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
2
|
import parse from "./testHelpers";
|
|
3
3
|
import CNextResolver from "../index";
|
|
4
|
-
import
|
|
5
|
-
import SymbolGuards from "../../types/typeGuards";
|
|
4
|
+
import SymbolGuards from "../../../../types/symbols/SymbolGuards";
|
|
6
5
|
|
|
7
6
|
describe("CNextResolver Integration", () => {
|
|
8
7
|
describe("single declaration types", () => {
|
|
@@ -117,20 +116,24 @@ describe("CNextResolver Integration", () => {
|
|
|
117
116
|
expect(scope).toBeDefined();
|
|
118
117
|
expect(SymbolGuards.isScope(scope!)).toBe(true);
|
|
119
118
|
|
|
120
|
-
|
|
119
|
+
// Members now have bare names with scope references
|
|
120
|
+
const positionVar = symbols.find((s) => s.name === "position");
|
|
121
121
|
expect(positionVar).toBeDefined();
|
|
122
122
|
expect(SymbolGuards.isVariable(positionVar!)).toBe(true);
|
|
123
|
+
expect(positionVar!.scope.name).toBe("Motor");
|
|
123
124
|
|
|
124
|
-
const initFunc = symbols.find((s) => s.name === "
|
|
125
|
+
const initFunc = symbols.find((s) => s.name === "init");
|
|
125
126
|
expect(initFunc).toBeDefined();
|
|
126
127
|
if (SymbolGuards.isFunction(initFunc!)) {
|
|
127
128
|
expect(initFunc.visibility).toBe("public");
|
|
129
|
+
expect(initFunc.scope.name).toBe("Motor");
|
|
128
130
|
}
|
|
129
131
|
|
|
130
|
-
const updateFunc = symbols.find((s) => s.name === "
|
|
132
|
+
const updateFunc = symbols.find((s) => s.name === "update");
|
|
131
133
|
expect(updateFunc).toBeDefined();
|
|
132
134
|
if (SymbolGuards.isFunction(updateFunc!)) {
|
|
133
135
|
expect(updateFunc.visibility).toBe("private");
|
|
136
|
+
expect(updateFunc.scope.name).toBe("Motor");
|
|
134
137
|
}
|
|
135
138
|
});
|
|
136
139
|
|
|
@@ -153,13 +156,16 @@ describe("CNextResolver Integration", () => {
|
|
|
153
156
|
// Scope + enum + struct
|
|
154
157
|
expect(symbols.length).toBe(3);
|
|
155
158
|
|
|
156
|
-
|
|
159
|
+
// Nested types have bare names with scope references
|
|
160
|
+
const enumSym = symbols.find((s) => s.name === "State");
|
|
157
161
|
expect(enumSym).toBeDefined();
|
|
158
162
|
expect(SymbolGuards.isEnum(enumSym!)).toBe(true);
|
|
163
|
+
expect(enumSym!.scope.name).toBe("Motor");
|
|
159
164
|
|
|
160
|
-
const structSym = symbols.find((s) => s.name === "
|
|
165
|
+
const structSym = symbols.find((s) => s.name === "Config");
|
|
161
166
|
expect(structSym).toBeDefined();
|
|
162
167
|
expect(SymbolGuards.isStruct(structSym!)).toBe(true);
|
|
168
|
+
expect(structSym!.scope.name).toBe("Motor");
|
|
163
169
|
});
|
|
164
170
|
});
|
|
165
171
|
|
|
@@ -210,8 +216,10 @@ describe("CNextResolver Integration", () => {
|
|
|
210
216
|
// Scope + bitmap + register
|
|
211
217
|
expect(symbols.length).toBe(3);
|
|
212
218
|
|
|
213
|
-
|
|
219
|
+
// Both bitmap and register have bare names with scope references
|
|
220
|
+
const regSymbol = symbols.find((s) => s.name === "CTRL");
|
|
214
221
|
expect(regSymbol).toBeDefined();
|
|
222
|
+
expect(regSymbol!.scope.name).toBe("Motor");
|
|
215
223
|
if (SymbolGuards.isRegister(regSymbol!)) {
|
|
216
224
|
expect(regSymbol.members.get("FLAGS")?.bitmapType).toBe(
|
|
217
225
|
"Motor_CtrlFlags",
|
|
@@ -270,44 +278,32 @@ describe("CNextResolver Integration", () => {
|
|
|
270
278
|
// 1 bitmap (Status)
|
|
271
279
|
// 1 register (GPIO)
|
|
272
280
|
// 1 scope (Motor)
|
|
273
|
-
// 2 scope variables (
|
|
274
|
-
// 2 scope functions (
|
|
281
|
+
// 2 scope variables (position, direction)
|
|
282
|
+
// 2 scope functions (init, move)
|
|
275
283
|
// 1 top-level function (main)
|
|
276
284
|
// Total: 10
|
|
277
285
|
expect(symbols.length).toBe(10);
|
|
278
286
|
|
|
279
287
|
// Verify each type is present
|
|
280
|
-
const structSymbols = symbols.filter(
|
|
281
|
-
(s) => s.kind === ESymbolKind.Struct,
|
|
282
|
-
);
|
|
288
|
+
const structSymbols = symbols.filter((s) => s.kind === "struct");
|
|
283
289
|
expect(structSymbols.length).toBe(1);
|
|
284
290
|
|
|
285
|
-
const enumSymbols = symbols.filter((s) => s.kind ===
|
|
291
|
+
const enumSymbols = symbols.filter((s) => s.kind === "enum");
|
|
286
292
|
expect(enumSymbols.length).toBe(1);
|
|
287
293
|
|
|
288
|
-
const bitmapSymbols = symbols.filter(
|
|
289
|
-
(s) => s.kind === ESymbolKind.Bitmap,
|
|
290
|
-
);
|
|
294
|
+
const bitmapSymbols = symbols.filter((s) => s.kind === "bitmap");
|
|
291
295
|
expect(bitmapSymbols.length).toBe(1);
|
|
292
296
|
|
|
293
|
-
const registerSymbols = symbols.filter(
|
|
294
|
-
(s) => s.kind === ESymbolKind.Register,
|
|
295
|
-
);
|
|
297
|
+
const registerSymbols = symbols.filter((s) => s.kind === "register");
|
|
296
298
|
expect(registerSymbols.length).toBe(1);
|
|
297
299
|
|
|
298
|
-
const scopeSymbols = symbols.filter(
|
|
299
|
-
(s) => s.kind === ESymbolKind.Namespace,
|
|
300
|
-
);
|
|
300
|
+
const scopeSymbols = symbols.filter((s) => s.kind === "scope");
|
|
301
301
|
expect(scopeSymbols.length).toBe(1);
|
|
302
302
|
|
|
303
|
-
const functionSymbols = symbols.filter(
|
|
304
|
-
(s) => s.kind === ESymbolKind.Function,
|
|
305
|
-
);
|
|
303
|
+
const functionSymbols = symbols.filter((s) => s.kind === "function");
|
|
306
304
|
expect(functionSymbols.length).toBe(3);
|
|
307
305
|
|
|
308
|
-
const variableSymbols = symbols.filter(
|
|
309
|
-
(s) => s.kind === ESymbolKind.Variable,
|
|
310
|
-
);
|
|
306
|
+
const variableSymbols = symbols.filter((s) => s.kind === "variable");
|
|
311
307
|
expect(variableSymbols.length).toBe(2);
|
|
312
308
|
});
|
|
313
309
|
|
|
@@ -340,10 +336,22 @@ describe("CNextResolver Integration", () => {
|
|
|
340
336
|
expect(ledScope).toBeDefined();
|
|
341
337
|
expect(motorScope).toBeDefined();
|
|
342
338
|
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
expect(
|
|
346
|
-
expect(
|
|
339
|
+
// Functions have bare names with scope references
|
|
340
|
+
const onFunc = symbols.find((s) => s.name === "on");
|
|
341
|
+
expect(onFunc).toBeDefined();
|
|
342
|
+
expect(onFunc!.scope.name).toBe("LED");
|
|
343
|
+
|
|
344
|
+
const offFunc = symbols.find((s) => s.name === "off");
|
|
345
|
+
expect(offFunc).toBeDefined();
|
|
346
|
+
expect(offFunc!.scope.name).toBe("LED");
|
|
347
|
+
|
|
348
|
+
const startFunc = symbols.find((s) => s.name === "start");
|
|
349
|
+
expect(startFunc).toBeDefined();
|
|
350
|
+
expect(startFunc!.scope.name).toBe("Motor");
|
|
351
|
+
|
|
352
|
+
const stopFunc = symbols.find((s) => s.name === "stop");
|
|
353
|
+
expect(stopFunc).toBeDefined();
|
|
354
|
+
expect(stopFunc!.scope.name).toBe("Motor");
|
|
347
355
|
});
|
|
348
356
|
});
|
|
349
357
|
|
|
@@ -386,7 +394,10 @@ describe("CNextResolver Integration", () => {
|
|
|
386
394
|
const tree = parse(code);
|
|
387
395
|
const symbols = CNextResolver.resolve(tree, "test.cnx");
|
|
388
396
|
|
|
389
|
-
|
|
397
|
+
// Find buffer by bare name with scope reference
|
|
398
|
+
const bufferSymbol = symbols.find(
|
|
399
|
+
(s) => s.name === "buffer" && s.scope?.name === "Device",
|
|
400
|
+
);
|
|
390
401
|
expect(bufferSymbol).toBeDefined();
|
|
391
402
|
if (SymbolGuards.isVariable(bufferSymbol!)) {
|
|
392
403
|
expect(bufferSymbol.isArray).toBe(true);
|
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
1
|
+
import { describe, expect, it, beforeEach } from "vitest";
|
|
2
2
|
import parse from "./testHelpers";
|
|
3
|
+
import TestScopeUtils from "./testUtils";
|
|
3
4
|
import EnumCollector from "../collectors/EnumCollector";
|
|
4
|
-
import ESymbolKind from "../../../../../utils/types/ESymbolKind";
|
|
5
5
|
import ESourceLanguage from "../../../../../utils/types/ESourceLanguage";
|
|
6
6
|
|
|
7
7
|
describe("EnumCollector", () => {
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
TestScopeUtils.resetGlobalScope();
|
|
10
|
+
});
|
|
11
|
+
|
|
8
12
|
describe("basic enum extraction", () => {
|
|
9
13
|
it("collects a simple enum with auto-increment values", () => {
|
|
10
14
|
const code = `
|
|
@@ -16,13 +20,15 @@ describe("EnumCollector", () => {
|
|
|
16
20
|
`;
|
|
17
21
|
const tree = parse(code);
|
|
18
22
|
const enumCtx = tree.declaration(0)!.enumDeclaration()!;
|
|
19
|
-
const
|
|
23
|
+
const globalScope = TestScopeUtils.getGlobalScope();
|
|
24
|
+
const symbol = EnumCollector.collect(enumCtx, "test.cnx", globalScope);
|
|
20
25
|
|
|
21
|
-
expect(symbol.kind).toBe(
|
|
26
|
+
expect(symbol.kind).toBe("enum");
|
|
22
27
|
expect(symbol.name).toBe("Color");
|
|
23
28
|
expect(symbol.sourceFile).toBe("test.cnx");
|
|
24
29
|
expect(symbol.sourceLanguage).toBe(ESourceLanguage.CNext);
|
|
25
30
|
expect(symbol.isExported).toBe(true);
|
|
31
|
+
expect(symbol.scope).toBe(globalScope);
|
|
26
32
|
|
|
27
33
|
// Check members
|
|
28
34
|
expect(symbol.members.size).toBe(3);
|
|
@@ -41,7 +47,8 @@ describe("EnumCollector", () => {
|
|
|
41
47
|
`;
|
|
42
48
|
const tree = parse(code);
|
|
43
49
|
const enumCtx = tree.declaration(0)!.enumDeclaration()!;
|
|
44
|
-
const
|
|
50
|
+
const globalScope = TestScopeUtils.getGlobalScope();
|
|
51
|
+
const symbol = EnumCollector.collect(enumCtx, "test.cnx", globalScope);
|
|
45
52
|
|
|
46
53
|
expect(symbol.members.get("Low")).toBe(10);
|
|
47
54
|
expect(symbol.members.get("Medium")).toBe(20);
|
|
@@ -60,7 +67,8 @@ describe("EnumCollector", () => {
|
|
|
60
67
|
`;
|
|
61
68
|
const tree = parse(code);
|
|
62
69
|
const enumCtx = tree.declaration(0)!.enumDeclaration()!;
|
|
63
|
-
const
|
|
70
|
+
const globalScope = TestScopeUtils.getGlobalScope();
|
|
71
|
+
const symbol = EnumCollector.collect(enumCtx, "test.cnx", globalScope);
|
|
64
72
|
|
|
65
73
|
expect(symbol.members.get("Idle")).toBe(0);
|
|
66
74
|
expect(symbol.members.get("Running")).toBe(5);
|
|
@@ -81,7 +89,8 @@ describe("EnumCollector", () => {
|
|
|
81
89
|
`;
|
|
82
90
|
const tree = parse(code);
|
|
83
91
|
const enumCtx = tree.declaration(0)!.enumDeclaration()!;
|
|
84
|
-
const
|
|
92
|
+
const globalScope = TestScopeUtils.getGlobalScope();
|
|
93
|
+
const symbol = EnumCollector.collect(enumCtx, "test.cnx", globalScope);
|
|
85
94
|
|
|
86
95
|
expect(symbol.members.get("A")).toBe(1);
|
|
87
96
|
expect(symbol.members.get("B")).toBe(2);
|
|
@@ -99,7 +108,8 @@ describe("EnumCollector", () => {
|
|
|
99
108
|
`;
|
|
100
109
|
const tree = parse(code);
|
|
101
110
|
const enumCtx = tree.declaration(0)!.enumDeclaration()!;
|
|
102
|
-
const
|
|
111
|
+
const globalScope = TestScopeUtils.getGlobalScope();
|
|
112
|
+
const symbol = EnumCollector.collect(enumCtx, "test.cnx", globalScope);
|
|
103
113
|
|
|
104
114
|
expect(symbol.members.get("Bit0")).toBe(1);
|
|
105
115
|
expect(symbol.members.get("Bit1")).toBe(2);
|
|
@@ -109,7 +119,7 @@ describe("EnumCollector", () => {
|
|
|
109
119
|
});
|
|
110
120
|
|
|
111
121
|
describe("scoped enums", () => {
|
|
112
|
-
it("
|
|
122
|
+
it("uses scope reference properly", () => {
|
|
113
123
|
const code = `
|
|
114
124
|
enum State {
|
|
115
125
|
Off,
|
|
@@ -118,9 +128,12 @@ describe("EnumCollector", () => {
|
|
|
118
128
|
`;
|
|
119
129
|
const tree = parse(code);
|
|
120
130
|
const enumCtx = tree.declaration(0)!.enumDeclaration()!;
|
|
121
|
-
const
|
|
131
|
+
const motorScope = TestScopeUtils.createMockScope("Motor");
|
|
132
|
+
const symbol = EnumCollector.collect(enumCtx, "motor.cnx", motorScope);
|
|
122
133
|
|
|
123
|
-
expect(symbol.name).toBe("
|
|
134
|
+
expect(symbol.name).toBe("State");
|
|
135
|
+
expect(symbol.scope).toBe(motorScope);
|
|
136
|
+
expect(symbol.scope.name).toBe("Motor");
|
|
124
137
|
});
|
|
125
138
|
});
|
|
126
139
|
|
|
@@ -133,8 +146,11 @@ describe("EnumCollector", () => {
|
|
|
133
146
|
`;
|
|
134
147
|
const tree = parse(code);
|
|
135
148
|
const enumCtx = tree.declaration(0)!.enumDeclaration()!;
|
|
149
|
+
const globalScope = TestScopeUtils.getGlobalScope();
|
|
136
150
|
|
|
137
|
-
expect(() =>
|
|
151
|
+
expect(() =>
|
|
152
|
+
EnumCollector.collect(enumCtx, "test.cnx", globalScope),
|
|
153
|
+
).toThrow(
|
|
138
154
|
"Error: Negative values not allowed in enum (found -1 in Invalid.Bad)",
|
|
139
155
|
);
|
|
140
156
|
});
|
|
@@ -150,7 +166,8 @@ describe("EnumCollector", () => {
|
|
|
150
166
|
`;
|
|
151
167
|
const tree = parse(code);
|
|
152
168
|
const enumCtx = tree.declaration(0)!.enumDeclaration()!;
|
|
153
|
-
const
|
|
169
|
+
const globalScope = TestScopeUtils.getGlobalScope();
|
|
170
|
+
const symbol = EnumCollector.collect(enumCtx, "test.cnx", globalScope);
|
|
154
171
|
|
|
155
172
|
expect(symbol.sourceLine).toBe(3);
|
|
156
173
|
});
|