c-next 0.2.17 → 0.2.18
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/README.md +2 -2
- package/dist/index.js +7645 -5941
- package/dist/index.js.map +4 -4
- package/grammar/CNext.g4 +8 -0
- package/package.json +1 -3
- package/src/transpiler/Transpiler.ts +286 -26
- package/src/transpiler/__tests__/compileCommandsDiscovery.integration.test.ts +94 -0
- package/src/transpiler/__tests__/externalSymbolRecovery.integration.test.ts +215 -0
- package/src/transpiler/logic/__tests__/detectAssemblySyntax.test.ts +116 -0
- package/src/transpiler/logic/analysis/FunctionCallAnalyzer.ts +8 -0
- package/src/transpiler/logic/analysis/MixedTypeCategoryAnalyzer.ts +408 -0
- package/src/transpiler/logic/analysis/PassByValueAnalyzer.ts +16 -97
- package/src/transpiler/logic/analysis/ReturnPathAnalyzer.ts +171 -0
- package/src/transpiler/logic/analysis/__tests__/MixedTypeCategoryAnalyzer.test.ts +346 -0
- package/src/transpiler/logic/analysis/__tests__/ReturnPathAnalyzer.test.ts +232 -0
- package/src/transpiler/logic/analysis/runAnalyzers.ts +23 -2
- package/src/transpiler/logic/analysis/types/IMixedTypeCategoryError.ts +17 -0
- package/src/transpiler/logic/analysis/types/IReturnPathError.ts +12 -0
- package/src/transpiler/logic/detectAssemblySyntax.ts +80 -0
- package/src/transpiler/logic/parser/grammar/CNext.interp +4 -1
- package/src/transpiler/logic/parser/grammar/CNext.tokens +169 -167
- package/src/transpiler/logic/parser/grammar/CNextLexer.interp +4 -1
- package/src/transpiler/logic/parser/grammar/CNextLexer.tokens +169 -167
- package/src/transpiler/logic/parser/grammar/CNextLexer.ts +545 -541
- package/src/transpiler/logic/parser/grammar/CNextListener.ts +11 -0
- package/src/transpiler/logic/parser/grammar/CNextParser.ts +1257 -1185
- package/src/transpiler/logic/parser/grammar/CNextVisitor.ts +7 -0
- package/src/transpiler/logic/preprocessor/CompileCommandsReader.ts +332 -0
- package/src/transpiler/logic/preprocessor/ExternalDeclarationOracle.ts +202 -0
- package/src/transpiler/logic/preprocessor/Preprocessor.ts +24 -6
- package/src/transpiler/logic/preprocessor/ToolchainDetector.ts +42 -1
- package/src/transpiler/logic/preprocessor/__tests__/CompileCommandsReader.test.ts +216 -0
- package/src/transpiler/logic/preprocessor/__tests__/ExternalDeclarationOracle.test.ts +153 -0
- package/src/transpiler/logic/preprocessor/__tests__/Preprocessor.test.ts +43 -18
- package/src/transpiler/logic/preprocessor/__tests__/ToolchainDetector.crossCompiler.test.ts +75 -0
- package/src/transpiler/logic/preprocessor/__tests__/fixtures/oracle/dependent.h +7 -0
- package/src/transpiler/logic/preprocessor/__tests__/fixtures/oracle/predecessor.h +5 -0
- package/src/transpiler/logic/preprocessor/types/ICompileCommandsResult.ts +14 -0
- package/src/transpiler/logic/preprocessor/types/IPreprocessOptions.ts +17 -0
- package/src/transpiler/logic/symbols/SymbolTable.ts +45 -0
- package/src/transpiler/logic/symbols/__tests__/SymbolTable.test.ts +49 -0
- package/src/transpiler/output/MisraSuppressionUtils.ts +52 -0
- package/src/transpiler/output/__tests__/MisraSuppressionUtils.test.ts +67 -0
- package/src/transpiler/output/codegen/CodeGenerator.ts +45 -4
- package/src/transpiler/output/codegen/TypeResolver.ts +148 -0
- package/src/transpiler/output/codegen/TypeValidator.ts +179 -81
- package/src/transpiler/output/codegen/__tests__/CodeGenerator.test.ts +13 -1
- package/src/transpiler/output/codegen/__tests__/TypeResolver.test.ts +93 -0
- package/src/transpiler/output/codegen/__tests__/TypeValidator.alwaysTrueLoop.test.ts +91 -0
- package/src/transpiler/output/codegen/__tests__/TypeValidator.test.ts +86 -14
- package/src/transpiler/output/codegen/assignment/AssignmentClassifier.ts +13 -0
- package/src/transpiler/output/codegen/assignment/AssignmentKind.ts +1 -1
- package/src/transpiler/output/codegen/assignment/handlers/AccessPatternHandlers.ts +20 -12
- package/src/transpiler/output/codegen/assignment/handlers/ArrayHandlers.ts +424 -22
- package/src/transpiler/output/codegen/assignment/handlers/BitAccessHandlers.ts +31 -18
- package/src/transpiler/output/codegen/assignment/handlers/BitmapHandlers.ts +7 -8
- package/src/transpiler/output/codegen/assignment/handlers/RegisterHandlers.ts +6 -8
- package/src/transpiler/output/codegen/assignment/handlers/RegisterUtils.ts +12 -10
- package/src/transpiler/output/codegen/assignment/handlers/SimpleHandler.ts +3 -7
- package/src/transpiler/output/codegen/assignment/handlers/SpecialHandlers.ts +7 -9
- package/src/transpiler/output/codegen/assignment/handlers/StringHandlers.ts +12 -10
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/ArrayHandlers.test.ts +479 -11
- package/src/transpiler/output/codegen/generators/IOrchestrator.ts +3 -0
- package/src/transpiler/output/codegen/generators/expressions/CallExprGenerator.ts +28 -15
- package/src/transpiler/output/codegen/generators/expressions/PostfixExpressionGenerator.ts +26 -13
- package/src/transpiler/output/codegen/generators/expressions/__tests__/PostfixExpressionGenerator.test.ts +129 -1
- package/src/transpiler/output/codegen/generators/statements/ControlFlowGenerator.ts +64 -8
- package/src/transpiler/output/codegen/generators/statements/__tests__/ControlFlowGenerator.test.ts +8 -5
- package/src/transpiler/output/codegen/helpers/AssignmentExpectedTypeResolver.ts +30 -2
- package/src/transpiler/output/codegen/helpers/StringDeclHelper.ts +16 -13
- package/src/transpiler/output/codegen/helpers/__tests__/AssignmentExpectedTypeResolver.test.ts +19 -0
- package/src/transpiler/output/codegen/helpers/__tests__/StringDeclHelper.test.ts +57 -11
- package/src/transpiler/output/codegen/subscript/SubscriptClassifier.ts +30 -11
- package/src/transpiler/output/codegen/subscript/TSubscriptKind.ts +1 -1
- package/src/transpiler/output/codegen/subscript/__tests__/SubscriptClassifier.test.ts +38 -6
- package/src/transpiler/output/headers/HeaderGeneratorUtils.ts +65 -24
- package/src/transpiler/state/CodeGenState.ts +20 -16
- package/src/transpiler/types/ICachedFileEntry.ts +7 -0
- package/src/utils/cache/CacheManager.ts +13 -2
- package/src/utils/cache/__tests__/CacheManager.test.ts +18 -1
- package/src/utils/constants/TypeConstants.ts +13 -0
|
@@ -7,12 +7,6 @@
|
|
|
7
7
|
import BitUtils from "../../../../../utils/BitUtils";
|
|
8
8
|
import TypeCheckUtils from "../../../../../utils/TypeCheckUtils";
|
|
9
9
|
import CodeGenState from "../../../../state/CodeGenState";
|
|
10
|
-
import type ICodeGenApi from "../../types/ICodeGenApi";
|
|
11
|
-
|
|
12
|
-
/** Get typed generator reference */
|
|
13
|
-
function gen(): ICodeGenApi {
|
|
14
|
-
return CodeGenState.generator as ICodeGenApi;
|
|
15
|
-
}
|
|
16
10
|
|
|
17
11
|
/** Result from extracting bit range expressions */
|
|
18
12
|
interface IBitRangeParams {
|
|
@@ -38,8 +32,12 @@ class RegisterUtils {
|
|
|
38
32
|
static extractBitRangeParams(
|
|
39
33
|
subscripts: readonly unknown[],
|
|
40
34
|
): IBitRangeParams {
|
|
41
|
-
const start =
|
|
42
|
-
|
|
35
|
+
const start = CodeGenState.requireGenerator().generateExpression(
|
|
36
|
+
subscripts[0],
|
|
37
|
+
);
|
|
38
|
+
const width = CodeGenState.requireGenerator().generateExpression(
|
|
39
|
+
subscripts[1],
|
|
40
|
+
);
|
|
43
41
|
const mask = BitUtils.generateMask(width);
|
|
44
42
|
return { start, width, mask };
|
|
45
43
|
}
|
|
@@ -54,8 +52,12 @@ class RegisterUtils {
|
|
|
54
52
|
subscripts: readonly unknown[],
|
|
55
53
|
value: string,
|
|
56
54
|
): IOptimizationResult {
|
|
57
|
-
const startConst =
|
|
58
|
-
|
|
55
|
+
const startConst = CodeGenState.requireGenerator().tryEvaluateConstant(
|
|
56
|
+
subscripts[0],
|
|
57
|
+
);
|
|
58
|
+
const widthConst = CodeGenState.requireGenerator().tryEvaluateConstant(
|
|
59
|
+
subscripts[1],
|
|
60
|
+
);
|
|
59
61
|
|
|
60
62
|
if (
|
|
61
63
|
startConst === undefined ||
|
|
@@ -10,18 +10,12 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import IAssignmentContext from "../IAssignmentContext";
|
|
12
12
|
import CodeGenState from "../../../../state/CodeGenState";
|
|
13
|
-
import type ICodeGenApi from "../../types/ICodeGenApi";
|
|
14
13
|
import NarrowingCastHelper from "../../helpers/NarrowingCastHelper.js";
|
|
15
14
|
import TypeResolver from "../../TypeResolver.js";
|
|
16
15
|
import TYPE_MAP from "../../types/TYPE_MAP.js";
|
|
17
16
|
import CppModeHelper from "../../helpers/CppModeHelper.js";
|
|
18
17
|
import COMPOUND_TO_BINARY from "../../types/COMPOUND_TO_BINARY.js";
|
|
19
18
|
|
|
20
|
-
/** Get typed generator reference */
|
|
21
|
-
function gen(): ICodeGenApi {
|
|
22
|
-
return CodeGenState.generator as ICodeGenApi;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
19
|
/**
|
|
26
20
|
* Try to handle compound assignment on narrow types (MISRA 10.3).
|
|
27
21
|
* Returns the generated code if handled, null otherwise.
|
|
@@ -100,7 +94,9 @@ function tryHandleIntToFloatConversion(
|
|
|
100
94
|
* i16_val &<- 0xFF => i16_val = (int16_t)(i16_val & 0xFF); // MISRA 10.3
|
|
101
95
|
*/
|
|
102
96
|
function handleSimpleAssignment(ctx: IAssignmentContext): string {
|
|
103
|
-
const target =
|
|
97
|
+
const target = CodeGenState.requireGenerator().generateAssignmentTarget(
|
|
98
|
+
ctx.targetCtx,
|
|
99
|
+
);
|
|
104
100
|
|
|
105
101
|
// Try compound assignment narrowing cast (MISRA 10.3)
|
|
106
102
|
const compoundResult = tryHandleCompoundNarrowingCast(ctx, target);
|
|
@@ -11,12 +11,6 @@ import TypeCheckUtils from "../../../../../utils/TypeCheckUtils";
|
|
|
11
11
|
import TAssignmentHandler from "./TAssignmentHandler";
|
|
12
12
|
import CodeGenState from "../../../../state/CodeGenState";
|
|
13
13
|
import TTypeInfo from "../../types/TTypeInfo";
|
|
14
|
-
import type ICodeGenApi from "../../types/ICodeGenApi";
|
|
15
|
-
|
|
16
|
-
/** Get typed generator reference */
|
|
17
|
-
function gen(): ICodeGenApi {
|
|
18
|
-
return CodeGenState.generator as ICodeGenApi;
|
|
19
|
-
}
|
|
20
14
|
|
|
21
15
|
/** Maps C operators to clamp helper operation names */
|
|
22
16
|
const CLAMP_OP_MAP: Record<string, string> = {
|
|
@@ -62,9 +56,11 @@ function getTargetTypeInfo(ctx: IAssignmentContext): {
|
|
|
62
56
|
*/
|
|
63
57
|
function handleAtomicRMW(ctx: IAssignmentContext): string {
|
|
64
58
|
const { typeInfo } = getTargetTypeInfo(ctx);
|
|
65
|
-
const target =
|
|
59
|
+
const target = CodeGenState.requireGenerator().generateAssignmentTarget(
|
|
60
|
+
ctx.targetCtx,
|
|
61
|
+
);
|
|
66
62
|
|
|
67
|
-
return
|
|
63
|
+
return CodeGenState.requireGenerator().generateAtomicRMW(
|
|
68
64
|
target,
|
|
69
65
|
ctx.cOp,
|
|
70
66
|
ctx.generatedValue,
|
|
@@ -80,7 +76,9 @@ function handleAtomicRMW(ctx: IAssignmentContext): string {
|
|
|
80
76
|
*/
|
|
81
77
|
function handleOverflowClamp(ctx: IAssignmentContext): string {
|
|
82
78
|
const { typeInfo } = getTargetTypeInfo(ctx);
|
|
83
|
-
const target =
|
|
79
|
+
const target = CodeGenState.requireGenerator().generateAssignmentTarget(
|
|
80
|
+
ctx.targetCtx,
|
|
81
|
+
);
|
|
84
82
|
|
|
85
83
|
// Floats use native C arithmetic (overflow to infinity)
|
|
86
84
|
if (TypeCheckUtils.usesNativeArithmetic(typeInfo!.baseType)) {
|
|
@@ -15,12 +15,6 @@ import StringUtils from "../../../../../utils/StringUtils";
|
|
|
15
15
|
import TypeCheckUtils from "../../../../../utils/TypeCheckUtils";
|
|
16
16
|
import TAssignmentHandler from "./TAssignmentHandler";
|
|
17
17
|
import CodeGenState from "../../../../state/CodeGenState";
|
|
18
|
-
import type ICodeGenApi from "../../types/ICodeGenApi";
|
|
19
|
-
|
|
20
|
-
/** Get typed generator reference */
|
|
21
|
-
function gen(): ICodeGenApi {
|
|
22
|
-
return CodeGenState.generator as ICodeGenApi;
|
|
23
|
-
}
|
|
24
18
|
|
|
25
19
|
/**
|
|
26
20
|
* Validate compound operators are not used with strings.
|
|
@@ -47,7 +41,9 @@ function handleSimpleStringAssignment(ctx: IAssignmentContext): string {
|
|
|
47
41
|
|
|
48
42
|
CodeGenState.needsString = true;
|
|
49
43
|
|
|
50
|
-
const target =
|
|
44
|
+
const target = CodeGenState.requireGenerator().generateAssignmentTarget(
|
|
45
|
+
ctx.targetCtx,
|
|
46
|
+
);
|
|
51
47
|
return StringUtils.copyWithNull(target, ctx.generatedValue, capacity);
|
|
52
48
|
}
|
|
53
49
|
|
|
@@ -111,7 +107,9 @@ function handleStringThisMember(ctx: IAssignmentContext): string {
|
|
|
111
107
|
|
|
112
108
|
CodeGenState.needsString = true;
|
|
113
109
|
|
|
114
|
-
const target =
|
|
110
|
+
const target = CodeGenState.requireGenerator().generateAssignmentTarget(
|
|
111
|
+
ctx.targetCtx,
|
|
112
|
+
);
|
|
115
113
|
return StringUtils.copyWithNull(target, ctx.generatedValue, capacity);
|
|
116
114
|
}
|
|
117
115
|
|
|
@@ -149,7 +147,9 @@ function handleStringArrayElement(ctx: IAssignmentContext): string {
|
|
|
149
147
|
|
|
150
148
|
CodeGenState.needsString = true;
|
|
151
149
|
|
|
152
|
-
const index =
|
|
150
|
+
const index = CodeGenState.requireGenerator().generateExpression(
|
|
151
|
+
ctx.subscripts[0],
|
|
152
|
+
);
|
|
153
153
|
return StringUtils.copyToArrayElement(
|
|
154
154
|
name,
|
|
155
155
|
index,
|
|
@@ -183,7 +183,9 @@ function handleStringStructArrayElement(ctx: IAssignmentContext): string {
|
|
|
183
183
|
|
|
184
184
|
CodeGenState.needsString = true;
|
|
185
185
|
|
|
186
|
-
const index =
|
|
186
|
+
const index = CodeGenState.requireGenerator().generateExpression(
|
|
187
|
+
ctx.subscripts[0],
|
|
188
|
+
);
|
|
187
189
|
return StringUtils.copyToStructFieldArrayElement(
|
|
188
190
|
structName,
|
|
189
191
|
fieldName,
|