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.
Files changed (81) hide show
  1. package/README.md +2 -2
  2. package/dist/index.js +7645 -5941
  3. package/dist/index.js.map +4 -4
  4. package/grammar/CNext.g4 +8 -0
  5. package/package.json +1 -3
  6. package/src/transpiler/Transpiler.ts +286 -26
  7. package/src/transpiler/__tests__/compileCommandsDiscovery.integration.test.ts +94 -0
  8. package/src/transpiler/__tests__/externalSymbolRecovery.integration.test.ts +215 -0
  9. package/src/transpiler/logic/__tests__/detectAssemblySyntax.test.ts +116 -0
  10. package/src/transpiler/logic/analysis/FunctionCallAnalyzer.ts +8 -0
  11. package/src/transpiler/logic/analysis/MixedTypeCategoryAnalyzer.ts +408 -0
  12. package/src/transpiler/logic/analysis/PassByValueAnalyzer.ts +16 -97
  13. package/src/transpiler/logic/analysis/ReturnPathAnalyzer.ts +171 -0
  14. package/src/transpiler/logic/analysis/__tests__/MixedTypeCategoryAnalyzer.test.ts +346 -0
  15. package/src/transpiler/logic/analysis/__tests__/ReturnPathAnalyzer.test.ts +232 -0
  16. package/src/transpiler/logic/analysis/runAnalyzers.ts +23 -2
  17. package/src/transpiler/logic/analysis/types/IMixedTypeCategoryError.ts +17 -0
  18. package/src/transpiler/logic/analysis/types/IReturnPathError.ts +12 -0
  19. package/src/transpiler/logic/detectAssemblySyntax.ts +80 -0
  20. package/src/transpiler/logic/parser/grammar/CNext.interp +4 -1
  21. package/src/transpiler/logic/parser/grammar/CNext.tokens +169 -167
  22. package/src/transpiler/logic/parser/grammar/CNextLexer.interp +4 -1
  23. package/src/transpiler/logic/parser/grammar/CNextLexer.tokens +169 -167
  24. package/src/transpiler/logic/parser/grammar/CNextLexer.ts +545 -541
  25. package/src/transpiler/logic/parser/grammar/CNextListener.ts +11 -0
  26. package/src/transpiler/logic/parser/grammar/CNextParser.ts +1257 -1185
  27. package/src/transpiler/logic/parser/grammar/CNextVisitor.ts +7 -0
  28. package/src/transpiler/logic/preprocessor/CompileCommandsReader.ts +332 -0
  29. package/src/transpiler/logic/preprocessor/ExternalDeclarationOracle.ts +202 -0
  30. package/src/transpiler/logic/preprocessor/Preprocessor.ts +24 -6
  31. package/src/transpiler/logic/preprocessor/ToolchainDetector.ts +42 -1
  32. package/src/transpiler/logic/preprocessor/__tests__/CompileCommandsReader.test.ts +216 -0
  33. package/src/transpiler/logic/preprocessor/__tests__/ExternalDeclarationOracle.test.ts +153 -0
  34. package/src/transpiler/logic/preprocessor/__tests__/Preprocessor.test.ts +43 -18
  35. package/src/transpiler/logic/preprocessor/__tests__/ToolchainDetector.crossCompiler.test.ts +75 -0
  36. package/src/transpiler/logic/preprocessor/__tests__/fixtures/oracle/dependent.h +7 -0
  37. package/src/transpiler/logic/preprocessor/__tests__/fixtures/oracle/predecessor.h +5 -0
  38. package/src/transpiler/logic/preprocessor/types/ICompileCommandsResult.ts +14 -0
  39. package/src/transpiler/logic/preprocessor/types/IPreprocessOptions.ts +17 -0
  40. package/src/transpiler/logic/symbols/SymbolTable.ts +45 -0
  41. package/src/transpiler/logic/symbols/__tests__/SymbolTable.test.ts +49 -0
  42. package/src/transpiler/output/MisraSuppressionUtils.ts +52 -0
  43. package/src/transpiler/output/__tests__/MisraSuppressionUtils.test.ts +67 -0
  44. package/src/transpiler/output/codegen/CodeGenerator.ts +45 -4
  45. package/src/transpiler/output/codegen/TypeResolver.ts +148 -0
  46. package/src/transpiler/output/codegen/TypeValidator.ts +179 -81
  47. package/src/transpiler/output/codegen/__tests__/CodeGenerator.test.ts +13 -1
  48. package/src/transpiler/output/codegen/__tests__/TypeResolver.test.ts +93 -0
  49. package/src/transpiler/output/codegen/__tests__/TypeValidator.alwaysTrueLoop.test.ts +91 -0
  50. package/src/transpiler/output/codegen/__tests__/TypeValidator.test.ts +86 -14
  51. package/src/transpiler/output/codegen/assignment/AssignmentClassifier.ts +13 -0
  52. package/src/transpiler/output/codegen/assignment/AssignmentKind.ts +1 -1
  53. package/src/transpiler/output/codegen/assignment/handlers/AccessPatternHandlers.ts +20 -12
  54. package/src/transpiler/output/codegen/assignment/handlers/ArrayHandlers.ts +424 -22
  55. package/src/transpiler/output/codegen/assignment/handlers/BitAccessHandlers.ts +31 -18
  56. package/src/transpiler/output/codegen/assignment/handlers/BitmapHandlers.ts +7 -8
  57. package/src/transpiler/output/codegen/assignment/handlers/RegisterHandlers.ts +6 -8
  58. package/src/transpiler/output/codegen/assignment/handlers/RegisterUtils.ts +12 -10
  59. package/src/transpiler/output/codegen/assignment/handlers/SimpleHandler.ts +3 -7
  60. package/src/transpiler/output/codegen/assignment/handlers/SpecialHandlers.ts +7 -9
  61. package/src/transpiler/output/codegen/assignment/handlers/StringHandlers.ts +12 -10
  62. package/src/transpiler/output/codegen/assignment/handlers/__tests__/ArrayHandlers.test.ts +479 -11
  63. package/src/transpiler/output/codegen/generators/IOrchestrator.ts +3 -0
  64. package/src/transpiler/output/codegen/generators/expressions/CallExprGenerator.ts +28 -15
  65. package/src/transpiler/output/codegen/generators/expressions/PostfixExpressionGenerator.ts +26 -13
  66. package/src/transpiler/output/codegen/generators/expressions/__tests__/PostfixExpressionGenerator.test.ts +129 -1
  67. package/src/transpiler/output/codegen/generators/statements/ControlFlowGenerator.ts +64 -8
  68. package/src/transpiler/output/codegen/generators/statements/__tests__/ControlFlowGenerator.test.ts +8 -5
  69. package/src/transpiler/output/codegen/helpers/AssignmentExpectedTypeResolver.ts +30 -2
  70. package/src/transpiler/output/codegen/helpers/StringDeclHelper.ts +16 -13
  71. package/src/transpiler/output/codegen/helpers/__tests__/AssignmentExpectedTypeResolver.test.ts +19 -0
  72. package/src/transpiler/output/codegen/helpers/__tests__/StringDeclHelper.test.ts +57 -11
  73. package/src/transpiler/output/codegen/subscript/SubscriptClassifier.ts +30 -11
  74. package/src/transpiler/output/codegen/subscript/TSubscriptKind.ts +1 -1
  75. package/src/transpiler/output/codegen/subscript/__tests__/SubscriptClassifier.test.ts +38 -6
  76. package/src/transpiler/output/headers/HeaderGeneratorUtils.ts +65 -24
  77. package/src/transpiler/state/CodeGenState.ts +20 -16
  78. package/src/transpiler/types/ICachedFileEntry.ts +7 -0
  79. package/src/utils/cache/CacheManager.ts +13 -2
  80. package/src/utils/cache/__tests__/CacheManager.test.ts +18 -1
  81. 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 = gen().generateExpression(subscripts[0]);
42
- const width = gen().generateExpression(subscripts[1]);
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 = gen().tryEvaluateConstant(subscripts[0]);
58
- const widthConst = gen().tryEvaluateConstant(subscripts[1]);
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 = gen().generateAssignmentTarget(ctx.targetCtx);
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 = gen().generateAssignmentTarget(ctx.targetCtx);
59
+ const target = CodeGenState.requireGenerator().generateAssignmentTarget(
60
+ ctx.targetCtx,
61
+ );
66
62
 
67
- return gen().generateAtomicRMW(
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 = gen().generateAssignmentTarget(ctx.targetCtx);
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 = gen().generateAssignmentTarget(ctx.targetCtx);
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 = gen().generateAssignmentTarget(ctx.targetCtx);
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 = gen().generateExpression(ctx.subscripts[0]);
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 = gen().generateExpression(ctx.subscripts[0]);
186
+ const index = CodeGenState.requireGenerator().generateExpression(
187
+ ctx.subscripts[0],
188
+ );
187
189
  return StringUtils.copyToStructFieldArrayElement(
188
190
  structName,
189
191
  fieldName,