c-next 0.1.66 → 0.1.67
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/transpiler/Transpiler.ts +49 -42
- package/src/transpiler/logic/symbols/cnext/__tests__/TSymbolAdapter.test.ts +32 -82
- package/src/transpiler/logic/symbols/cnext/adapters/TSymbolAdapter.ts +17 -61
- package/src/transpiler/output/codegen/CodeGenerator.ts +22 -59
- package/src/transpiler/output/codegen/TypeResolver.ts +2 -2
- package/src/transpiler/output/codegen/TypeValidator.ts +1 -1
- package/src/transpiler/output/codegen/__tests__/CodeGenerator.coverage.test.ts +5 -4
- package/src/transpiler/output/codegen/__tests__/CodeGenerator.test.ts +665 -1315
- package/src/transpiler/output/codegen/__tests__/TypeResolver.test.ts +1 -1
- package/src/transpiler/output/codegen/__tests__/TypeValidator.resolution.test.ts +1 -1
- package/src/transpiler/output/codegen/__tests__/TypeValidator.test.ts +1 -1
- package/src/transpiler/output/codegen/analysis/MemberChainAnalyzer.ts +1 -1
- package/src/transpiler/output/codegen/analysis/StringLengthCounter.ts +1 -1
- package/src/transpiler/output/codegen/analysis/__tests__/MemberChainAnalyzer.test.ts +1 -1
- package/src/transpiler/output/codegen/analysis/__tests__/StringLengthCounter.test.ts +1 -1
- package/src/transpiler/output/codegen/assignment/AssignmentClassifier.ts +1 -1
- package/src/transpiler/output/codegen/assignment/__tests__/AssignmentClassifier.test.ts +1 -1
- package/src/transpiler/output/codegen/assignment/handlers/AccessPatternHandlers.ts +24 -27
- package/src/transpiler/output/codegen/assignment/handlers/ArrayHandlers.ts +25 -18
- package/src/transpiler/output/codegen/assignment/handlers/BitAccessHandlers.ts +27 -33
- package/src/transpiler/output/codegen/assignment/handlers/BitmapHandlers.ts +39 -42
- package/src/transpiler/output/codegen/assignment/handlers/RegisterHandlers.ts +39 -97
- package/src/transpiler/output/codegen/assignment/handlers/RegisterUtils.ts +75 -0
- package/src/transpiler/output/codegen/assignment/handlers/SimpleHandler.ts +9 -6
- package/src/transpiler/output/codegen/assignment/handlers/SpecialHandlers.ts +30 -22
- package/src/transpiler/output/codegen/assignment/handlers/StringHandlers.ts +42 -50
- package/src/transpiler/output/codegen/assignment/handlers/TAssignmentHandler.ts +6 -5
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/AccessPatternHandlers.test.ts +81 -134
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/ArrayHandlers.test.ts +85 -124
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/BitAccessHandlers.test.ts +82 -124
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/BitmapHandlers.test.ts +135 -297
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/RegisterHandlers.test.ts +105 -227
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/RegisterUtils.test.ts +214 -1
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/SpecialHandlers.test.ts +66 -127
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/StringHandlers.test.ts +37 -83
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/handlerTestUtils.ts +162 -0
- package/src/transpiler/output/codegen/helpers/ArrayInitHelper.ts +1 -1
- package/src/transpiler/output/codegen/helpers/AssignmentExpectedTypeResolver.ts +1 -1
- package/src/transpiler/output/codegen/helpers/AssignmentValidator.ts +1 -1
- package/src/transpiler/output/codegen/helpers/CppModeHelper.ts +1 -1
- package/src/transpiler/output/codegen/helpers/EnumAssignmentValidator.ts +1 -1
- package/src/transpiler/output/codegen/helpers/FloatBitHelper.ts +1 -1
- package/src/transpiler/output/codegen/helpers/StringDeclHelper.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/ArrayInitHelper.test.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/AssignmentExpectedTypeResolver.test.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/AssignmentValidator.test.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/CppModeHelper.test.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/EnumAssignmentValidator.test.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/FloatBitHelper.test.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/StringDeclHelper.test.ts +1 -1
- package/src/transpiler/output/codegen/resolution/EnumTypeResolver.ts +1 -1
- package/src/transpiler/output/codegen/resolution/ScopeResolver.ts +1 -1
- package/src/transpiler/output/codegen/resolution/SizeofResolver.ts +1 -1
- package/src/transpiler/output/codegen/resolution/__tests__/EnumTypeResolver.test.ts +1 -1
- package/src/transpiler/output/codegen/resolution/__tests__/SizeofResolver.test.ts +1 -1
- package/src/transpiler/output/codegen/types/ICodeGenApi.ts +57 -0
- package/src/transpiler/{output/codegen → state}/CodeGenState.ts +46 -26
- package/src/transpiler/{output/codegen → state}/__tests__/CodeGenState.test.ts +12 -2
- package/src/transpiler/output/codegen/assignment/handlers/IHandlerDeps.ts +0 -161
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import { CommonTokenStream, ParserRuleContext } from "antlr4ng";
|
|
7
7
|
import * as Parser from "../../logic/parser/grammar/CNextParser";
|
|
8
|
-
|
|
8
|
+
|
|
9
9
|
import ESymbolKind from "../../../utils/types/ESymbolKind";
|
|
10
10
|
import CommentExtractor from "../../logic/analysis/CommentExtractor";
|
|
11
11
|
import CommentFormatter from "./CommentFormatter";
|
|
@@ -67,7 +67,7 @@ import memberAccessChain from "./memberAccessChain";
|
|
|
67
67
|
import AssignmentHandlerRegistry from "./assignment/index";
|
|
68
68
|
import AssignmentClassifier from "./assignment/AssignmentClassifier";
|
|
69
69
|
import buildAssignmentContext from "./assignment/AssignmentContextBuilder";
|
|
70
|
-
|
|
70
|
+
// IHandlerDeps removed - handlers now use CodeGenState.generator directly
|
|
71
71
|
// Issue #461: LiteralUtils for parsing const values from symbol table
|
|
72
72
|
import LiteralUtils from "../../../utils/LiteralUtils";
|
|
73
73
|
// Issue #644: Extracted string length counter for strlen caching optimization
|
|
@@ -133,7 +133,7 @@ import TypeGenerationHelper from "./helpers/TypeGenerationHelper";
|
|
|
133
133
|
// Phase 5: Cast validation helper for improved testability
|
|
134
134
|
import CastValidator from "./helpers/CastValidator";
|
|
135
135
|
// Global state for code generation (simplifies debugging, eliminates DI complexity)
|
|
136
|
-
import CodeGenState from "
|
|
136
|
+
import CodeGenState from "../../state/CodeGenState";
|
|
137
137
|
// Unified parameter generation (Phase 1)
|
|
138
138
|
import ParameterInputAdapter from "./helpers/ParameterInputAdapter";
|
|
139
139
|
import ParameterSignatureBuilder from "./helpers/ParameterSignatureBuilder";
|
|
@@ -679,7 +679,7 @@ export default class CodeGenerator implements IOrchestrator {
|
|
|
679
679
|
currentScope: CodeGenState.currentScope,
|
|
680
680
|
isCppScopeSymbol: (name) => this.isCppScopeSymbol(name),
|
|
681
681
|
checkNeedsStructKeyword: (name) =>
|
|
682
|
-
CodeGenState.symbolTable
|
|
682
|
+
CodeGenState.symbolTable.checkNeedsStructKeyword(name),
|
|
683
683
|
validateCrossScopeVisibility: (scope, member) =>
|
|
684
684
|
ScopeResolver.validateCrossScopeVisibility(scope, member),
|
|
685
685
|
});
|
|
@@ -2117,13 +2117,11 @@ export default class CodeGenerator implements IOrchestrator {
|
|
|
2117
2117
|
/**
|
|
2118
2118
|
* Generate C code from a C-Next program
|
|
2119
2119
|
* @param tree The parsed C-Next program
|
|
2120
|
-
* @param symbolTable Optional symbol table for cross-language interop
|
|
2121
2120
|
* @param tokenStream Optional token stream for comment preservation (ADR-043)
|
|
2122
2121
|
* @param options Optional code generator options (e.g., debugMode)
|
|
2123
2122
|
*/
|
|
2124
2123
|
generate(
|
|
2125
2124
|
tree: Parser.ProgramContext,
|
|
2126
|
-
symbolTable?: SymbolTable,
|
|
2127
2125
|
tokenStream?: CommonTokenStream,
|
|
2128
2126
|
options?: ICodeGeneratorOptions,
|
|
2129
2127
|
): string {
|
|
@@ -2145,9 +2143,6 @@ export default class CodeGenerator implements IOrchestrator {
|
|
|
2145
2143
|
// Initialize options and configuration (after reset)
|
|
2146
2144
|
this.initializeGenerateOptions(options, tokenStream);
|
|
2147
2145
|
|
|
2148
|
-
// Store symbol table for function lookup (after reset)
|
|
2149
|
-
CodeGenState.symbolTable = symbolTable ?? null;
|
|
2150
|
-
|
|
2151
2146
|
// ADR-055: Use pre-collected symbolInfo from Pipeline (TSymbolInfoAdapter)
|
|
2152
2147
|
if (!options?.symbolInfo) {
|
|
2153
2148
|
throw new Error(
|
|
@@ -2198,6 +2193,9 @@ export default class CodeGenerator implements IOrchestrator {
|
|
|
2198
2193
|
// Reset global state first
|
|
2199
2194
|
CodeGenState.reset(targetCapabilities);
|
|
2200
2195
|
|
|
2196
|
+
// Set generator reference for handlers to use
|
|
2197
|
+
CodeGenState.generator = this;
|
|
2198
|
+
|
|
2201
2199
|
// Reset local context (will gradually migrate to CodeGenState)
|
|
2202
2200
|
this.context = CodeGenerator.createDefaultContext(targetCapabilities);
|
|
2203
2201
|
|
|
@@ -6026,54 +6024,14 @@ export default class CodeGenerator implements IOrchestrator {
|
|
|
6026
6024
|
// Issue #644: _generateBitMask removed, now delegating to BitUtils.generateMask
|
|
6027
6025
|
// ========================================================================
|
|
6028
6026
|
|
|
6029
|
-
// ADR-109:
|
|
6030
|
-
private buildHandlerDeps(): IHandlerDeps {
|
|
6031
|
-
return {
|
|
6032
|
-
symbols: CodeGenState.symbols!,
|
|
6033
|
-
typeRegistry: CodeGenState.typeRegistry,
|
|
6034
|
-
currentScope: CodeGenState.currentScope,
|
|
6035
|
-
currentParameters: CodeGenState.currentParameters,
|
|
6036
|
-
targetCapabilities: CodeGenState.targetCapabilities,
|
|
6037
|
-
generateExpression: (ctx) => this.generateExpression(ctx),
|
|
6038
|
-
tryEvaluateConstant: (ctx) => this.tryEvaluateConstant(ctx),
|
|
6039
|
-
generateAssignmentTarget: (ctx) => this.generateAssignmentTarget(ctx),
|
|
6040
|
-
isKnownStruct: (name) => this.isKnownStruct(name),
|
|
6041
|
-
isKnownScope: (name) => this.isKnownScope(name),
|
|
6042
|
-
getMemberTypeInfo: (structType, memberName) =>
|
|
6043
|
-
this.getMemberTypeInfo(structType, memberName),
|
|
6044
|
-
validateBitmapFieldLiteral: (expr, width, fieldName) =>
|
|
6045
|
-
TypeValidator.validateBitmapFieldLiteral(expr, width, fieldName),
|
|
6046
|
-
validateCrossScopeVisibility: (scopeName, memberName) =>
|
|
6047
|
-
this.validateCrossScopeVisibility(scopeName, memberName),
|
|
6048
|
-
checkArrayBounds: (arrayName, dimensions, indexExprs, line) =>
|
|
6049
|
-
TypeValidator.checkArrayBounds(
|
|
6050
|
-
arrayName,
|
|
6051
|
-
[...dimensions],
|
|
6052
|
-
[...indexExprs],
|
|
6053
|
-
line,
|
|
6054
|
-
(expr) => this.tryEvaluateConstant(expr),
|
|
6055
|
-
),
|
|
6056
|
-
analyzeMemberChainForBitAccess: (targetCtx) =>
|
|
6057
|
-
this.analyzeMemberChainForBitAccess(targetCtx),
|
|
6058
|
-
generateFloatBitWrite: (name, typeInfo, bitIndex, width, value) =>
|
|
6059
|
-
this.generateFloatBitWrite(name, typeInfo, bitIndex, width, value),
|
|
6060
|
-
foldBooleanToInt: (expr) => this.foldBooleanToInt(expr),
|
|
6061
|
-
markNeedsString: () => {
|
|
6062
|
-
this.requireInclude("string");
|
|
6063
|
-
},
|
|
6064
|
-
markClampOpUsed: (op, typeName) => this.markClampOpUsed(op, typeName),
|
|
6065
|
-
generateAtomicRMW: (target, cOp, value, typeInfo) =>
|
|
6066
|
-
this.generateAtomicRMW(target, cOp, value, typeInfo),
|
|
6067
|
-
};
|
|
6068
|
-
}
|
|
6027
|
+
// ADR-109: buildHandlerDeps removed - handlers now use CodeGenState.generator directly
|
|
6069
6028
|
|
|
6070
6029
|
/**
|
|
6071
6030
|
* Analyze a member chain target to detect bit access at the end.
|
|
6072
6031
|
* Issue #644: Delegates to MemberChainAnalyzer.
|
|
6073
6032
|
*/
|
|
6074
|
-
|
|
6075
|
-
|
|
6076
|
-
): {
|
|
6033
|
+
/** Public for handler access via CodeGenState.generator */
|
|
6034
|
+
analyzeMemberChainForBitAccess(targetCtx: Parser.AssignmentTargetContext): {
|
|
6077
6035
|
isBitAccess: boolean;
|
|
6078
6036
|
baseTarget?: string;
|
|
6079
6037
|
bitIndex?: string;
|
|
@@ -6089,7 +6047,8 @@ export default class CodeGenerator implements IOrchestrator {
|
|
|
6089
6047
|
* Generate float bit write using shadow variable + memcpy.
|
|
6090
6048
|
* Issue #644: Delegates to FloatBitHelper.
|
|
6091
6049
|
*/
|
|
6092
|
-
|
|
6050
|
+
/** Public for handler access via CodeGenState.generator */
|
|
6051
|
+
generateFloatBitWrite(
|
|
6093
6052
|
name: string,
|
|
6094
6053
|
typeInfo: TTypeInfo,
|
|
6095
6054
|
bitIndex: string,
|
|
@@ -6162,17 +6121,18 @@ export default class CodeGenerator implements IOrchestrator {
|
|
|
6162
6121
|
typeRegistry: CodeGenState.typeRegistry,
|
|
6163
6122
|
generateExpression: () => value,
|
|
6164
6123
|
});
|
|
6165
|
-
|
|
6124
|
+
// ADR-109: Handlers access CodeGenState directly, no deps needed
|
|
6166
6125
|
const assignmentKind = AssignmentClassifier.classify(assignCtx);
|
|
6167
6126
|
const handler = AssignmentHandlerRegistry.getHandler(assignmentKind);
|
|
6168
|
-
return handler(assignCtx
|
|
6127
|
+
return handler(assignCtx);
|
|
6169
6128
|
}
|
|
6170
6129
|
|
|
6171
6130
|
/**
|
|
6172
6131
|
* ADR-049: Generate atomic Read-Modify-Write operation
|
|
6173
6132
|
* Uses LDREX/STREX on platforms that support it, otherwise PRIMASK
|
|
6174
6133
|
*/
|
|
6175
|
-
|
|
6134
|
+
/** Public for handler access via CodeGenState.generator */
|
|
6135
|
+
generateAtomicRMW(
|
|
6176
6136
|
target: string,
|
|
6177
6137
|
cOp: string,
|
|
6178
6138
|
value: string,
|
|
@@ -6422,7 +6382,7 @@ export default class CodeGenerator implements IOrchestrator {
|
|
|
6422
6382
|
return null;
|
|
6423
6383
|
}
|
|
6424
6384
|
|
|
6425
|
-
// No expected enum type -
|
|
6385
|
+
// No expected enum type - bare enum members are not allowed without context
|
|
6426
6386
|
const matchingEnums: string[] = [];
|
|
6427
6387
|
for (const [enumName, members] of CodeGenState.symbols!.enumMembers) {
|
|
6428
6388
|
if (members.has(id)) {
|
|
@@ -6431,11 +6391,14 @@ export default class CodeGenerator implements IOrchestrator {
|
|
|
6431
6391
|
}
|
|
6432
6392
|
|
|
6433
6393
|
if (matchingEnums.length === 1) {
|
|
6434
|
-
|
|
6394
|
+
throw new Error(
|
|
6395
|
+
`error[E0424]: '${id}' is not defined; did you mean '${matchingEnums[0]}.${id}'?`,
|
|
6396
|
+
);
|
|
6435
6397
|
}
|
|
6436
6398
|
if (matchingEnums.length > 1) {
|
|
6399
|
+
const suggestions = matchingEnums.map((e) => `'${e}.${id}'`).join(" or ");
|
|
6437
6400
|
throw new Error(
|
|
6438
|
-
`
|
|
6401
|
+
`error[E0424]: '${id}' is not defined; did you mean ${suggestions}?`,
|
|
6439
6402
|
);
|
|
6440
6403
|
}
|
|
6441
6404
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Static class that reads from CodeGenState directly.
|
|
4
4
|
*/
|
|
5
5
|
import * as Parser from "../../logic/parser/grammar/CNextParser";
|
|
6
|
-
import CodeGenState from "
|
|
6
|
+
import CodeGenState from "../../state/CodeGenState";
|
|
7
7
|
import INTEGER_TYPES from "./types/INTEGER_TYPES";
|
|
8
8
|
import FLOAT_TYPES from "./types/FLOAT_TYPES";
|
|
9
9
|
import SIGNED_TYPES from "./types/SIGNED_TYPES";
|
|
@@ -73,7 +73,7 @@ class TypeResolver {
|
|
|
73
73
|
if (CodeGenState.symbols?.knownBitmaps.has(typeName)) {
|
|
74
74
|
return true;
|
|
75
75
|
}
|
|
76
|
-
if (CodeGenState.symbolTable
|
|
76
|
+
if (CodeGenState.symbolTable.getStructFields(typeName)) {
|
|
77
77
|
return true;
|
|
78
78
|
}
|
|
79
79
|
return false;
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import { existsSync } from "node:fs";
|
|
7
7
|
import { dirname, resolve, join } from "node:path";
|
|
8
8
|
import * as Parser from "../../logic/parser/grammar/CNextParser";
|
|
9
|
-
import CodeGenState from "
|
|
9
|
+
import CodeGenState from "../../state/CodeGenState";
|
|
10
10
|
import TypeResolver from "./TypeResolver";
|
|
11
11
|
import ExpressionUtils from "../../../utils/ExpressionUtils";
|
|
12
12
|
// SonarCloud S3776: Extracted literal parsing to reduce complexity
|
|
@@ -16,7 +16,7 @@ import * as Parser from "../../../logic/parser/grammar/CNextParser";
|
|
|
16
16
|
import SymbolTable from "../../../logic/symbols/SymbolTable";
|
|
17
17
|
import CNextResolver from "../../../logic/symbols/cnext/index";
|
|
18
18
|
import TSymbolInfoAdapter from "../../../logic/symbols/cnext/adapters/TSymbolInfoAdapter";
|
|
19
|
-
import CodeGenState from "
|
|
19
|
+
import CodeGenState from "../../../state/CodeGenState";
|
|
20
20
|
|
|
21
21
|
/**
|
|
22
22
|
* Helper to parse C-Next source and return tree + generator ready for testing.
|
|
@@ -39,7 +39,8 @@ function setupGenerator(
|
|
|
39
39
|
const symbols = TSymbolInfoAdapter.convert(tSymbols);
|
|
40
40
|
|
|
41
41
|
const generator = new CodeGenerator();
|
|
42
|
-
|
|
42
|
+
CodeGenState.symbolTable = symbolTable;
|
|
43
|
+
const code = generator.generate(tree, tokenStream, {
|
|
43
44
|
symbolInfo: symbols,
|
|
44
45
|
sourcePath: "test.cnx",
|
|
45
46
|
cppMode: options.cppMode ?? false,
|
|
@@ -512,7 +513,7 @@ describe("CodeGenerator Coverage Tests", () => {
|
|
|
512
513
|
scope Config {
|
|
513
514
|
public enum State { IDLE, RUNNING, STOPPED }
|
|
514
515
|
public void init() {
|
|
515
|
-
State s <- IDLE;
|
|
516
|
+
State s <- State.IDLE;
|
|
516
517
|
}
|
|
517
518
|
}
|
|
518
519
|
`;
|
|
@@ -1035,7 +1036,7 @@ describe("CodeGenerator Coverage Tests", () => {
|
|
|
1035
1036
|
public void increment() { counter +<- 1; }
|
|
1036
1037
|
public enum State { INIT, RUN }
|
|
1037
1038
|
public void setState() {
|
|
1038
|
-
State s <- INIT;
|
|
1039
|
+
State s <- State.INIT;
|
|
1039
1040
|
}
|
|
1040
1041
|
}
|
|
1041
1042
|
`;
|