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
|
@@ -0,0 +1,520 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type Registration Engine
|
|
3
|
+
* Issue #791: Extracted from CodeGenerator to reduce file size
|
|
4
|
+
*
|
|
5
|
+
* Registers variable types from AST before code generation.
|
|
6
|
+
* This ensures type information is available for .length and
|
|
7
|
+
* other type-dependent operations regardless of declaration order.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import * as Parser from "../../../logic/parser/grammar/CNextParser";
|
|
11
|
+
import TIncludeHeader from "../generators/TIncludeHeader";
|
|
12
|
+
import TOverflowBehavior from "../types/TOverflowBehavior";
|
|
13
|
+
import TYPE_WIDTH from "../types/TYPE_WIDTH";
|
|
14
|
+
import CodeGenState from "../../../state/CodeGenState";
|
|
15
|
+
import TypeRegistrationUtils from "../TypeRegistrationUtils";
|
|
16
|
+
import QualifiedNameGenerator from "../utils/QualifiedNameGenerator";
|
|
17
|
+
import ArrayDimensionParser from "./ArrayDimensionParser";
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Callbacks required for type registration.
|
|
21
|
+
* Minimizes coupling to CodeGenerator.
|
|
22
|
+
*/
|
|
23
|
+
interface ITypeRegistrationCallbacks {
|
|
24
|
+
/** Evaluate a compile-time constant expression */
|
|
25
|
+
tryEvaluateConstant: (ctx: Parser.ExpressionContext) => number | undefined;
|
|
26
|
+
/** Request an include header */
|
|
27
|
+
requireInclude: (header: TIncludeHeader) => void;
|
|
28
|
+
/** Resolve qualified type names (optional, for C++ namespace support) */
|
|
29
|
+
resolveQualifiedType?: (identifiers: string[]) => string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Static class that registers variable types from the AST.
|
|
34
|
+
* Called during Stage 2 of code generation, before generating any code.
|
|
35
|
+
*/
|
|
36
|
+
class TypeRegistrationEngine {
|
|
37
|
+
// ============================================================================
|
|
38
|
+
// Public entry points
|
|
39
|
+
// ============================================================================
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Entry point: Register all variable types from the program tree.
|
|
43
|
+
*/
|
|
44
|
+
static register(
|
|
45
|
+
tree: Parser.ProgramContext,
|
|
46
|
+
callbacks: ITypeRegistrationCallbacks,
|
|
47
|
+
): void {
|
|
48
|
+
for (const decl of tree.declaration()) {
|
|
49
|
+
if (decl.variableDeclaration()) {
|
|
50
|
+
TypeRegistrationEngine.registerGlobalVariable(
|
|
51
|
+
decl.variableDeclaration()!,
|
|
52
|
+
callbacks,
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
if (decl.scopeDeclaration()) {
|
|
56
|
+
TypeRegistrationEngine.registerScopeMemberTypes(
|
|
57
|
+
decl.scopeDeclaration()!,
|
|
58
|
+
callbacks,
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Register a global variable's type information.
|
|
66
|
+
*/
|
|
67
|
+
static registerGlobalVariable(
|
|
68
|
+
varDecl: Parser.VariableDeclarationContext,
|
|
69
|
+
callbacks: ITypeRegistrationCallbacks,
|
|
70
|
+
): void {
|
|
71
|
+
TypeRegistrationEngine._trackVariableType(varDecl, callbacks);
|
|
72
|
+
if (varDecl.constModifier() && varDecl.expression()) {
|
|
73
|
+
const constName = varDecl.IDENTIFIER().getText();
|
|
74
|
+
const constValue = callbacks.tryEvaluateConstant(varDecl.expression()!);
|
|
75
|
+
if (constValue !== undefined) {
|
|
76
|
+
CodeGenState.constValues.set(constName, constValue);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Register type information for all members in a scope.
|
|
83
|
+
*/
|
|
84
|
+
static registerScopeMemberTypes(
|
|
85
|
+
scopeDecl: Parser.ScopeDeclarationContext,
|
|
86
|
+
callbacks: ITypeRegistrationCallbacks,
|
|
87
|
+
): void {
|
|
88
|
+
const scopeName = scopeDecl.IDENTIFIER().getText();
|
|
89
|
+
const savedScope = CodeGenState.currentScope;
|
|
90
|
+
CodeGenState.currentScope = scopeName;
|
|
91
|
+
|
|
92
|
+
for (const member of scopeDecl.scopeMember()) {
|
|
93
|
+
if (member.variableDeclaration()) {
|
|
94
|
+
const varDecl = member.variableDeclaration()!;
|
|
95
|
+
const varName = varDecl.IDENTIFIER().getText();
|
|
96
|
+
const fullName = QualifiedNameGenerator.forMember(scopeName, varName);
|
|
97
|
+
TypeRegistrationEngine._trackVariableTypeWithName(
|
|
98
|
+
varDecl,
|
|
99
|
+
fullName,
|
|
100
|
+
callbacks,
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
CodeGenState.currentScope = savedScope;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// ============================================================================
|
|
109
|
+
// Static helper methods (public)
|
|
110
|
+
// ============================================================================
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Parse array dimension from arrayType context.
|
|
114
|
+
* Returns the numeric size, or undefined if not a simple integer literal.
|
|
115
|
+
*/
|
|
116
|
+
static parseArrayTypeDimension(
|
|
117
|
+
arrayTypeCtx: Parser.ArrayTypeContext,
|
|
118
|
+
): number | undefined {
|
|
119
|
+
const dims = arrayTypeCtx.arrayTypeDimension();
|
|
120
|
+
if (dims.length === 0) {
|
|
121
|
+
return undefined;
|
|
122
|
+
}
|
|
123
|
+
const sizeExpr = dims[0].expression();
|
|
124
|
+
if (!sizeExpr) {
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
const size = Number.parseInt(sizeExpr.getText(), 10);
|
|
128
|
+
return Number.isNaN(size) ? undefined : size;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Resolve base type name from a type context.
|
|
133
|
+
* Handles primitive, scoped (this.Type), global, qualified, and user types.
|
|
134
|
+
* Returns null for special types like string<N> that need separate handling.
|
|
135
|
+
*/
|
|
136
|
+
static resolveBaseType(
|
|
137
|
+
typeCtx: Parser.TypeContext,
|
|
138
|
+
currentScope: string | null,
|
|
139
|
+
): string | null {
|
|
140
|
+
return TypeRegistrationEngine._resolveBaseTypeWithCallbacks(
|
|
141
|
+
typeCtx,
|
|
142
|
+
currentScope,
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Internal: Resolve base type with optional callback for qualified types.
|
|
148
|
+
* When resolveQualifiedType callback is provided, uses it for C++ namespace support.
|
|
149
|
+
*/
|
|
150
|
+
private static _resolveBaseTypeWithCallbacks(
|
|
151
|
+
typeCtx: Parser.TypeContext,
|
|
152
|
+
currentScope: string | null,
|
|
153
|
+
callbacks?: ITypeRegistrationCallbacks,
|
|
154
|
+
): string | null {
|
|
155
|
+
if (typeCtx.primitiveType()) {
|
|
156
|
+
return typeCtx.primitiveType()!.getText();
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (typeCtx.scopedType()) {
|
|
160
|
+
// ADR-016: Handle this.Type for scoped types (e.g., this.State -> Motor_State)
|
|
161
|
+
const typeName = typeCtx.scopedType()!.IDENTIFIER().getText();
|
|
162
|
+
return currentScope ? `${currentScope}_${typeName}` : typeName;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
if (typeCtx.globalType()) {
|
|
166
|
+
// Issue #478: Handle global.Type for global types inside scope
|
|
167
|
+
return typeCtx.globalType()!.IDENTIFIER().getText();
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
if (typeCtx.qualifiedType()) {
|
|
171
|
+
// ADR-016: Handle Scope.Type from outside scope
|
|
172
|
+
// Issue #388: Also handles C++ namespace types when callback is provided
|
|
173
|
+
const identifiers = typeCtx.qualifiedType()!.IDENTIFIER();
|
|
174
|
+
const identifierNames = identifiers.map((id) => id.getText());
|
|
175
|
+
|
|
176
|
+
// Use callback if provided for C++ namespace support
|
|
177
|
+
if (callbacks?.resolveQualifiedType) {
|
|
178
|
+
return callbacks.resolveQualifiedType(identifierNames);
|
|
179
|
+
}
|
|
180
|
+
return identifierNames.join("_");
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
if (typeCtx.userType()) {
|
|
184
|
+
return typeCtx.userType()!.getText();
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// String types and array types are handled separately
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// ============================================================================
|
|
192
|
+
// Variable tracking methods
|
|
193
|
+
// ============================================================================
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Track a single variable declaration.
|
|
197
|
+
* Used for local variable tracking during code generation.
|
|
198
|
+
*/
|
|
199
|
+
static trackVariable(
|
|
200
|
+
varDecl: Parser.VariableDeclarationContext,
|
|
201
|
+
callbacks: ITypeRegistrationCallbacks,
|
|
202
|
+
): void {
|
|
203
|
+
TypeRegistrationEngine._trackVariableType(varDecl, callbacks);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
private static _trackVariableType(
|
|
207
|
+
varDecl: Parser.VariableDeclarationContext,
|
|
208
|
+
callbacks: ITypeRegistrationCallbacks,
|
|
209
|
+
): void {
|
|
210
|
+
const name = varDecl.IDENTIFIER().getText();
|
|
211
|
+
TypeRegistrationEngine._trackVariableTypeWithName(varDecl, name, callbacks);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
private static _trackVariableTypeWithName(
|
|
215
|
+
varDecl: Parser.VariableDeclarationContext,
|
|
216
|
+
registryName: string,
|
|
217
|
+
callbacks: ITypeRegistrationCallbacks,
|
|
218
|
+
): void {
|
|
219
|
+
const typeCtx = varDecl.type();
|
|
220
|
+
const arrayDim = varDecl.arrayDimension();
|
|
221
|
+
const isConst = varDecl.constModifier() !== null;
|
|
222
|
+
|
|
223
|
+
const overflowMod = varDecl.overflowModifier();
|
|
224
|
+
const overflowBehavior: TOverflowBehavior =
|
|
225
|
+
overflowMod?.getText() === "wrap" ? "wrap" : "clamp";
|
|
226
|
+
|
|
227
|
+
const isAtomic = varDecl.atomicModifier() !== null;
|
|
228
|
+
|
|
229
|
+
if (
|
|
230
|
+
TypeRegistrationEngine._tryRegisterStringType(
|
|
231
|
+
registryName,
|
|
232
|
+
typeCtx,
|
|
233
|
+
arrayDim,
|
|
234
|
+
isConst,
|
|
235
|
+
overflowBehavior,
|
|
236
|
+
isAtomic,
|
|
237
|
+
callbacks,
|
|
238
|
+
)
|
|
239
|
+
) {
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
if (typeCtx.arrayType()) {
|
|
244
|
+
TypeRegistrationEngine._registerArrayTypeVariable(
|
|
245
|
+
registryName,
|
|
246
|
+
typeCtx.arrayType()!,
|
|
247
|
+
arrayDim,
|
|
248
|
+
isConst,
|
|
249
|
+
overflowBehavior,
|
|
250
|
+
isAtomic,
|
|
251
|
+
callbacks,
|
|
252
|
+
);
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
const baseType = TypeRegistrationEngine._resolveBaseTypeWithCallbacks(
|
|
257
|
+
typeCtx,
|
|
258
|
+
CodeGenState.currentScope,
|
|
259
|
+
callbacks,
|
|
260
|
+
);
|
|
261
|
+
if (!baseType) {
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
if (
|
|
266
|
+
TypeRegistrationEngine._tryRegisterEnumOrBitmapType(
|
|
267
|
+
registryName,
|
|
268
|
+
baseType,
|
|
269
|
+
isConst,
|
|
270
|
+
arrayDim,
|
|
271
|
+
overflowBehavior,
|
|
272
|
+
isAtomic,
|
|
273
|
+
callbacks,
|
|
274
|
+
)
|
|
275
|
+
) {
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
TypeRegistrationEngine._registerStandardType(
|
|
280
|
+
registryName,
|
|
281
|
+
baseType,
|
|
282
|
+
arrayDim,
|
|
283
|
+
isConst,
|
|
284
|
+
overflowBehavior,
|
|
285
|
+
isAtomic,
|
|
286
|
+
callbacks,
|
|
287
|
+
);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// ============================================================================
|
|
291
|
+
// String type registration
|
|
292
|
+
// ============================================================================
|
|
293
|
+
|
|
294
|
+
private static _tryRegisterStringType(
|
|
295
|
+
registryName: string,
|
|
296
|
+
typeCtx: Parser.TypeContext,
|
|
297
|
+
arrayDim: Parser.ArrayDimensionContext[] | null,
|
|
298
|
+
isConst: boolean,
|
|
299
|
+
overflowBehavior: TOverflowBehavior,
|
|
300
|
+
isAtomic: boolean,
|
|
301
|
+
callbacks: ITypeRegistrationCallbacks,
|
|
302
|
+
): boolean {
|
|
303
|
+
const stringCtx = typeCtx.stringType();
|
|
304
|
+
if (!stringCtx) {
|
|
305
|
+
return false;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
const intLiteral = stringCtx.INTEGER_LITERAL();
|
|
309
|
+
if (!intLiteral) {
|
|
310
|
+
return false;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
const capacity = Number.parseInt(intLiteral.getText(), 10);
|
|
314
|
+
callbacks.requireInclude("string");
|
|
315
|
+
const stringDim = capacity + 1;
|
|
316
|
+
|
|
317
|
+
const additionalDims = ArrayDimensionParser.parseSimpleDimensions(arrayDim);
|
|
318
|
+
const allDims =
|
|
319
|
+
additionalDims.length > 0 ? [...additionalDims, stringDim] : [stringDim];
|
|
320
|
+
|
|
321
|
+
CodeGenState.setVariableTypeInfo(registryName, {
|
|
322
|
+
baseType: "char",
|
|
323
|
+
bitWidth: 8,
|
|
324
|
+
isArray: true,
|
|
325
|
+
arrayDimensions: allDims,
|
|
326
|
+
isConst,
|
|
327
|
+
isString: true,
|
|
328
|
+
stringCapacity: capacity,
|
|
329
|
+
overflowBehavior,
|
|
330
|
+
isAtomic,
|
|
331
|
+
});
|
|
332
|
+
return true;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// ============================================================================
|
|
336
|
+
// Array and standard type registration
|
|
337
|
+
// ============================================================================
|
|
338
|
+
|
|
339
|
+
private static _registerArrayTypeVariable(
|
|
340
|
+
registryName: string,
|
|
341
|
+
arrayTypeCtx: Parser.ArrayTypeContext,
|
|
342
|
+
arrayDim: Parser.ArrayDimensionContext[] | null,
|
|
343
|
+
isConst: boolean,
|
|
344
|
+
overflowBehavior: TOverflowBehavior,
|
|
345
|
+
isAtomic: boolean,
|
|
346
|
+
callbacks: ITypeRegistrationCallbacks,
|
|
347
|
+
): void {
|
|
348
|
+
let baseType = "";
|
|
349
|
+
let bitWidth = 0;
|
|
350
|
+
|
|
351
|
+
if (arrayTypeCtx.primitiveType()) {
|
|
352
|
+
baseType = arrayTypeCtx.primitiveType()!.getText();
|
|
353
|
+
bitWidth = TYPE_WIDTH[baseType] || 0;
|
|
354
|
+
} else if (arrayTypeCtx.userType()) {
|
|
355
|
+
baseType = arrayTypeCtx.userType()!.getText();
|
|
356
|
+
|
|
357
|
+
const combinedArrayDim = arrayDim ?? [];
|
|
358
|
+
if (
|
|
359
|
+
TypeRegistrationEngine._tryRegisterEnumOrBitmapType(
|
|
360
|
+
registryName,
|
|
361
|
+
baseType,
|
|
362
|
+
isConst,
|
|
363
|
+
combinedArrayDim,
|
|
364
|
+
overflowBehavior,
|
|
365
|
+
isAtomic,
|
|
366
|
+
callbacks,
|
|
367
|
+
)
|
|
368
|
+
) {
|
|
369
|
+
const existingInfo = CodeGenState.getVariableTypeInfo(registryName);
|
|
370
|
+
if (existingInfo) {
|
|
371
|
+
const arrayTypeDim =
|
|
372
|
+
TypeRegistrationEngine.parseArrayTypeDimension(arrayTypeCtx);
|
|
373
|
+
const allDims = arrayTypeDim
|
|
374
|
+
? [arrayTypeDim, ...(existingInfo.arrayDimensions ?? [])]
|
|
375
|
+
: existingInfo.arrayDimensions;
|
|
376
|
+
CodeGenState.setVariableTypeInfo(registryName, {
|
|
377
|
+
...existingInfo,
|
|
378
|
+
isArray: true,
|
|
379
|
+
arrayDimensions: allDims,
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
if (!baseType) {
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
const arrayDimensions = TypeRegistrationEngine._collectArrayDimensions(
|
|
391
|
+
arrayTypeCtx,
|
|
392
|
+
arrayDim,
|
|
393
|
+
callbacks,
|
|
394
|
+
);
|
|
395
|
+
|
|
396
|
+
CodeGenState.setVariableTypeInfo(registryName, {
|
|
397
|
+
baseType,
|
|
398
|
+
bitWidth,
|
|
399
|
+
isArray: true,
|
|
400
|
+
arrayDimensions: arrayDimensions.length > 0 ? arrayDimensions : undefined,
|
|
401
|
+
isConst,
|
|
402
|
+
overflowBehavior,
|
|
403
|
+
isAtomic,
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
private static _collectArrayDimensions(
|
|
408
|
+
arrayTypeCtx: Parser.ArrayTypeContext,
|
|
409
|
+
arrayDim: Parser.ArrayDimensionContext[] | null,
|
|
410
|
+
callbacks: ITypeRegistrationCallbacks,
|
|
411
|
+
): number[] {
|
|
412
|
+
const arrayDimensions: number[] = [];
|
|
413
|
+
|
|
414
|
+
for (const dim of arrayTypeCtx.arrayTypeDimension()) {
|
|
415
|
+
const sizeExpr = dim.expression();
|
|
416
|
+
if (sizeExpr) {
|
|
417
|
+
const size = Number.parseInt(sizeExpr.getText(), 10);
|
|
418
|
+
if (!Number.isNaN(size)) {
|
|
419
|
+
arrayDimensions.push(size);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
const additionalDims = TypeRegistrationEngine._evaluateArrayDimensions(
|
|
425
|
+
arrayDim,
|
|
426
|
+
callbacks,
|
|
427
|
+
);
|
|
428
|
+
if (additionalDims) {
|
|
429
|
+
arrayDimensions.push(...additionalDims);
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
return arrayDimensions;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
private static _evaluateArrayDimensions(
|
|
436
|
+
arrayDim: Parser.ArrayDimensionContext[] | null,
|
|
437
|
+
_callbacks: ITypeRegistrationCallbacks,
|
|
438
|
+
): number[] | undefined {
|
|
439
|
+
return ArrayDimensionParser.parseAllDimensions(arrayDim, {
|
|
440
|
+
constValues: CodeGenState.constValues,
|
|
441
|
+
typeWidths: TYPE_WIDTH,
|
|
442
|
+
isKnownStruct: (name) => CodeGenState.isKnownStruct(name),
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
private static _registerStandardType(
|
|
447
|
+
registryName: string,
|
|
448
|
+
baseType: string,
|
|
449
|
+
arrayDim: Parser.ArrayDimensionContext[] | null,
|
|
450
|
+
isConst: boolean,
|
|
451
|
+
overflowBehavior: TOverflowBehavior,
|
|
452
|
+
isAtomic: boolean,
|
|
453
|
+
callbacks: ITypeRegistrationCallbacks,
|
|
454
|
+
): void {
|
|
455
|
+
const bitWidth = TYPE_WIDTH[baseType] || 0;
|
|
456
|
+
const isArray = arrayDim !== null && arrayDim.length > 0;
|
|
457
|
+
const arrayDimensions = isArray
|
|
458
|
+
? TypeRegistrationEngine._evaluateArrayDimensions(arrayDim, callbacks)
|
|
459
|
+
: undefined;
|
|
460
|
+
|
|
461
|
+
CodeGenState.setVariableTypeInfo(registryName, {
|
|
462
|
+
baseType,
|
|
463
|
+
bitWidth,
|
|
464
|
+
isArray,
|
|
465
|
+
arrayDimensions: isArray ? arrayDimensions : undefined,
|
|
466
|
+
isConst,
|
|
467
|
+
overflowBehavior,
|
|
468
|
+
isAtomic,
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
// ============================================================================
|
|
473
|
+
// Enum/bitmap type registration
|
|
474
|
+
// ============================================================================
|
|
475
|
+
|
|
476
|
+
private static _tryRegisterEnumOrBitmapType(
|
|
477
|
+
name: string,
|
|
478
|
+
baseType: string,
|
|
479
|
+
isConst: boolean,
|
|
480
|
+
arrayDim: Parser.ArrayDimensionContext[] | null,
|
|
481
|
+
overflowBehavior: TOverflowBehavior,
|
|
482
|
+
isAtomic: boolean,
|
|
483
|
+
callbacks: ITypeRegistrationCallbacks,
|
|
484
|
+
): boolean {
|
|
485
|
+
const registrationOptions = {
|
|
486
|
+
name,
|
|
487
|
+
baseType,
|
|
488
|
+
isConst,
|
|
489
|
+
overflowBehavior,
|
|
490
|
+
isAtomic,
|
|
491
|
+
};
|
|
492
|
+
|
|
493
|
+
if (
|
|
494
|
+
TypeRegistrationUtils.tryRegisterEnumType(
|
|
495
|
+
CodeGenState.symbols!,
|
|
496
|
+
registrationOptions,
|
|
497
|
+
)
|
|
498
|
+
) {
|
|
499
|
+
return true;
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
const bitmapDimensions = TypeRegistrationEngine._evaluateArrayDimensions(
|
|
503
|
+
arrayDim,
|
|
504
|
+
callbacks,
|
|
505
|
+
);
|
|
506
|
+
if (
|
|
507
|
+
TypeRegistrationUtils.tryRegisterBitmapType(
|
|
508
|
+
CodeGenState.symbols!,
|
|
509
|
+
registrationOptions,
|
|
510
|
+
bitmapDimensions,
|
|
511
|
+
)
|
|
512
|
+
) {
|
|
513
|
+
return true;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
return false;
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
export default TypeRegistrationEngine;
|