c-next 0.1.50 → 0.1.52

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 (313) hide show
  1. package/README.md +1 -0
  2. package/package.json +15 -9
  3. package/src/cli/ArgParser.ts +260 -0
  4. package/src/{commands → cli}/CleanCommand.ts +12 -37
  5. package/src/cli/Cli.ts +104 -0
  6. package/src/cli/ConfigLoader.ts +51 -0
  7. package/src/cli/ConfigPrinter.ts +69 -0
  8. package/src/cli/PlatformIOCommand.ts +177 -0
  9. package/src/cli/ResultPrinter.ts +52 -0
  10. package/src/cli/Runner.ts +124 -0
  11. package/src/cli/__tests__/ArgParser.test.ts +301 -0
  12. package/src/cli/__tests__/CleanCommand.test.ts +218 -0
  13. package/src/cli/__tests__/Cli.test.ts +319 -0
  14. package/src/cli/__tests__/ConfigLoader.test.ts +158 -0
  15. package/src/cli/__tests__/ConfigPrinter.test.ts +281 -0
  16. package/src/cli/__tests__/PlatformIOCommand.test.ts +235 -0
  17. package/src/cli/__tests__/ResultPrinter.test.ts +230 -0
  18. package/src/cli/__tests__/Runner.test.ts +300 -0
  19. package/src/cli/types/ICliConfig.ts +36 -0
  20. package/src/cli/types/ICliResult.ts +15 -0
  21. package/src/cli/types/IFileConfig.ts +28 -0
  22. package/src/cli/types/IParsedArgs.ts +41 -0
  23. package/src/index.ts +6 -665
  24. package/src/lib/parseWithSymbols.ts +5 -5
  25. package/src/lib/transpiler.ts +15 -15
  26. package/src/lib/types/ITranspileResult.ts +1 -1
  27. package/src/transpiler/Transpiler.ts +1272 -0
  28. package/src/transpiler/__tests__/Transpiler.test.ts +74 -0
  29. package/src/transpiler/data/CnxFileResolver.ts +76 -0
  30. package/src/transpiler/data/DependencyGraph.ts +114 -0
  31. package/src/{lib → transpiler/data}/IncludeResolver.ts +135 -7
  32. package/src/transpiler/data/IncludeTreeWalker.ts +152 -0
  33. package/src/transpiler/data/PathResolver.ts +191 -0
  34. package/src/transpiler/data/__tests__/DependencyGraph.test.ts +147 -0
  35. package/src/{lib → transpiler/data/__tests__}/IncludeResolver.test.ts +155 -1
  36. package/src/transpiler/data/__tests__/IncludeTreeWalker.test.ts +158 -0
  37. package/src/transpiler/data/__tests__/PathResolver.test.ts +328 -0
  38. package/src/transpiler/logic/IncludeExtractor.ts +41 -0
  39. package/src/transpiler/logic/StandaloneContextBuilder.ts +150 -0
  40. package/src/transpiler/logic/__tests__/IncludeExtractor.test.ts +113 -0
  41. package/src/{pipeline → transpiler/logic/__tests__}/detectCppSyntax.test.ts +1 -1
  42. package/src/transpiler/logic/analysis/AnalyzerContextBuilder.ts +58 -0
  43. package/src/{codegen → transpiler/logic/analysis}/CommentExtractor.test.ts +2 -2
  44. package/src/{codegen → transpiler/logic/analysis}/CommentExtractor.ts +4 -4
  45. package/src/{analysis → transpiler/logic/analysis}/DivisionByZeroAnalyzer.test.ts +2 -2
  46. package/src/{analysis → transpiler/logic/analysis}/DivisionByZeroAnalyzer.ts +5 -5
  47. package/src/{analysis → transpiler/logic/analysis}/FloatModuloAnalyzer.test.ts +2 -2
  48. package/src/{analysis → transpiler/logic/analysis}/FloatModuloAnalyzer.ts +5 -5
  49. package/src/{analysis → transpiler/logic/analysis}/FunctionCallAnalyzer.test.ts +5 -5
  50. package/src/{analysis → transpiler/logic/analysis}/FunctionCallAnalyzer.ts +6 -6
  51. package/src/{analysis → transpiler/logic/analysis}/InitializationAnalyzer.test.ts +5 -5
  52. package/src/{analysis → transpiler/logic/analysis}/InitializationAnalyzer.ts +7 -7
  53. package/src/transpiler/logic/analysis/ModificationAnalyzer.test.ts +322 -0
  54. package/src/transpiler/logic/analysis/ModificationAnalyzer.ts +134 -0
  55. package/src/{analysis → transpiler/logic/analysis}/NullCheckAnalyzer.test.ts +2 -2
  56. package/src/{analysis → transpiler/logic/analysis}/NullCheckAnalyzer.ts +3 -3
  57. package/src/{analysis → transpiler/logic/analysis}/ParameterNamingAnalyzer.test.ts +2 -2
  58. package/src/{analysis → transpiler/logic/analysis}/ParameterNamingAnalyzer.ts +2 -2
  59. package/src/{analysis → transpiler/logic/analysis}/StructFieldAnalyzer.ts +3 -3
  60. package/src/transpiler/logic/analysis/__tests__/AnalyzerContextBuilder.test.ts +137 -0
  61. package/src/{pipeline → transpiler/logic/analysis}/runAnalyzers.ts +11 -11
  62. package/src/{pipeline → transpiler/logic/parser}/CNextSourceParser.ts +3 -6
  63. package/src/transpiler/logic/parser/HeaderParser.ts +91 -0
  64. package/src/transpiler/logic/parser/__tests__/HeaderParser.test.ts +139 -0
  65. package/src/transpiler/logic/symbols/AutoConstUpdater.ts +93 -0
  66. package/src/{symbol_resolution → transpiler/logic/symbols}/CSymbolCollector.ts +4 -4
  67. package/src/{symbol_resolution → transpiler/logic/symbols}/CppSymbolCollector.ts +4 -4
  68. package/src/{symbol_resolution → transpiler/logic/symbols}/SymbolCollectorContext.ts +1 -1
  69. package/src/{symbol_resolution → transpiler/logic/symbols}/SymbolTable.test.ts +3 -3
  70. package/src/{symbol_resolution → transpiler/logic/symbols}/SymbolTable.ts +69 -3
  71. package/src/transpiler/logic/symbols/TransitiveEnumCollector.ts +105 -0
  72. package/src/transpiler/logic/symbols/__tests__/AutoConstUpdater.test.ts +416 -0
  73. package/src/{symbol_resolution → transpiler/logic/symbols}/__tests__/CppSymbolCollector.test.ts +7 -7
  74. package/src/{symbol_resolution → transpiler/logic/symbols}/__tests__/SymbolCollectorContext.test.ts +3 -3
  75. package/src/transpiler/logic/symbols/__tests__/SymbolTable.test.ts +226 -0
  76. package/src/transpiler/logic/symbols/__tests__/TransitiveEnumCollector.test.ts +361 -0
  77. package/src/{symbol_resolution → transpiler/logic/symbols}/__tests__/cppTestHelpers.ts +2 -2
  78. package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/__tests__/BitmapCollector.test.ts +2 -2
  79. package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/__tests__/CNextResolver.integration.test.ts +1 -1
  80. package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/__tests__/EnumCollector.test.ts +2 -2
  81. package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/__tests__/FunctionCollector.test.ts +2 -2
  82. package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/__tests__/RegisterCollector.test.ts +2 -2
  83. package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/__tests__/ScopeCollector.test.ts +2 -2
  84. package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/__tests__/StructCollector.test.ts +2 -2
  85. package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/__tests__/TSymbolAdapter.test.ts +2 -2
  86. package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/__tests__/TSymbolInfoAdapter.test.ts +2 -2
  87. package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/__tests__/VariableCollector.test.ts +2 -2
  88. package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/__tests__/testHelpers.ts +2 -2
  89. package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/adapters/TSymbolAdapter.ts +2 -2
  90. package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/adapters/TSymbolInfoAdapter.ts +8 -8
  91. package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/collectors/BitmapCollector.ts +5 -5
  92. package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/collectors/EnumCollector.ts +3 -3
  93. package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/collectors/FunctionCollector.ts +3 -3
  94. package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/collectors/RegisterCollector.ts +3 -3
  95. package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/collectors/ScopeCollector.ts +3 -3
  96. package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/collectors/StructCollector.ts +4 -4
  97. package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/collectors/VariableCollector.ts +3 -3
  98. package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/index.ts +2 -2
  99. package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/utils/TypeUtils.ts +2 -2
  100. package/src/{symbol_resolution → transpiler/logic/symbols}/types/IBaseSymbol.ts +1 -1
  101. package/src/{symbol_resolution → transpiler/logic/symbols}/types/IBitmapSymbol.ts +1 -1
  102. package/src/{symbol_resolution → transpiler/logic/symbols}/types/ICollectorContext.ts +1 -1
  103. package/src/{symbol_resolution → transpiler/logic/symbols}/types/IConflict.ts +1 -1
  104. package/src/{symbol_resolution → transpiler/logic/symbols}/types/IEnumSymbol.ts +1 -1
  105. package/src/{symbol_resolution → transpiler/logic/symbols}/types/IFunctionSymbol.ts +1 -1
  106. package/src/{symbol_resolution → transpiler/logic/symbols}/types/IRegisterSymbol.ts +1 -1
  107. package/src/{symbol_resolution → transpiler/logic/symbols}/types/IScopeSymbol.ts +1 -1
  108. package/src/{symbol_resolution → transpiler/logic/symbols}/types/IStructSymbol.ts +1 -1
  109. package/src/{symbol_resolution → transpiler/logic/symbols}/types/IVariableSymbol.ts +1 -1
  110. package/src/{symbol_resolution → transpiler/logic/symbols}/types/__tests__/SymbolGuards.test.ts +2 -2
  111. package/src/{symbol_resolution → transpiler/logic/symbols}/types/typeGuards.ts +1 -1
  112. package/src/{codegen → transpiler/output/codegen}/CodeGenerator.ts +358 -165
  113. package/src/{codegen → transpiler/output/codegen}/CommentFormatter.test.ts +2 -2
  114. package/src/{codegen → transpiler/output/codegen}/CommentFormatter.ts +2 -2
  115. package/src/{codegen → transpiler/output/codegen}/TypeResolver.test.ts +1 -1
  116. package/src/{codegen → transpiler/output/codegen}/TypeResolver.ts +4 -4
  117. package/src/{codegen → transpiler/output/codegen}/TypeValidator.test.ts +1 -1
  118. package/src/{codegen → transpiler/output/codegen}/TypeValidator.ts +4 -4
  119. package/src/transpiler/output/codegen/__tests__/ExpressionWalker.test.ts +372 -0
  120. package/src/{codegen → transpiler/output/codegen}/__tests__/TypeValidator.resolution.test.ts +3 -3
  121. package/src/{codegen → transpiler/output/codegen}/assignment/AssignmentClassifier.ts +32 -32
  122. package/src/{codegen → transpiler/output/codegen}/assignment/AssignmentContextBuilder.ts +1 -1
  123. package/src/{codegen → transpiler/output/codegen}/assignment/IAssignmentContext.ts +1 -1
  124. package/src/{codegen → transpiler/output/codegen}/assignment/handlers/AccessPatternHandlers.ts +1 -1
  125. package/src/{codegen → transpiler/output/codegen}/assignment/handlers/BitAccessHandlers.ts +1 -1
  126. package/src/{codegen → transpiler/output/codegen}/assignment/handlers/BitmapHandlers.ts +1 -1
  127. package/src/{codegen → transpiler/output/codegen}/assignment/handlers/IHandlerDeps.ts +3 -3
  128. package/src/{codegen → transpiler/output/codegen}/assignment/handlers/RegisterHandlers.ts +2 -2
  129. package/src/{codegen → transpiler/output/codegen}/assignment/handlers/SpecialHandlers.ts +1 -1
  130. package/src/{codegen → transpiler/output/codegen}/assignment/handlers/StringHandlers.ts +2 -2
  131. package/src/{codegen → transpiler/output/codegen}/generators/IGeneratorInput.ts +3 -3
  132. package/src/{codegen → transpiler/output/codegen}/generators/IOrchestrator.ts +1 -1
  133. package/src/{codegen → transpiler/output/codegen}/generators/declarationGenerators/BitmapGenerator.ts +1 -1
  134. package/src/{codegen → transpiler/output/codegen}/generators/declarationGenerators/EnumGenerator.ts +1 -1
  135. package/src/{codegen → transpiler/output/codegen}/generators/declarationGenerators/FunctionGenerator.ts +1 -1
  136. package/src/{codegen → transpiler/output/codegen}/generators/declarationGenerators/RegisterGenerator.ts +1 -1
  137. package/src/{codegen → transpiler/output/codegen}/generators/declarationGenerators/ScopeGenerator.ts +1 -1
  138. package/src/{codegen → transpiler/output/codegen}/generators/declarationGenerators/ScopedRegisterGenerator.ts +1 -1
  139. package/src/{codegen → transpiler/output/codegen}/generators/declarationGenerators/StructGenerator.ts +1 -1
  140. package/src/{codegen → transpiler/output/codegen}/generators/expressions/BinaryExprGenerator.ts +1 -1
  141. package/src/{codegen → transpiler/output/codegen}/generators/expressions/BinaryExprUtils.ts +1 -1
  142. package/src/{codegen → transpiler/output/codegen}/generators/expressions/CallExprGenerator.ts +2 -2
  143. package/src/{codegen → transpiler/output/codegen}/generators/expressions/ExpressionGenerator.ts +1 -1
  144. package/src/{codegen → transpiler/output/codegen}/generators/expressions/LiteralGenerator.ts +1 -1
  145. package/src/{codegen → transpiler/output/codegen}/generators/expressions/UnaryExprGenerator.ts +1 -1
  146. package/src/{codegen → transpiler/output/codegen}/generators/statements/ControlFlowGenerator.ts +1 -1
  147. package/src/{codegen → transpiler/output/codegen}/generators/statements/CriticalGenerator.ts +1 -1
  148. package/src/{codegen → transpiler/output/codegen}/generators/statements/SwitchGenerator.ts +1 -1
  149. package/src/{codegen → transpiler/output/codegen}/generators/support/CommentUtils.test.ts +3 -3
  150. package/src/{codegen → transpiler/output/codegen}/generators/support/CommentUtils.ts +2 -2
  151. package/src/{codegen → transpiler/output/codegen}/generators/support/IncludeGenerator.ts +8 -48
  152. package/src/transpiler/output/codegen/subscript/SubscriptClassifier.ts +96 -0
  153. package/src/transpiler/output/codegen/subscript/TSubscriptKind.ts +13 -0
  154. package/src/transpiler/output/codegen/subscript/__tests__/SubscriptClassifier.test.ts +211 -0
  155. package/src/{codegen → transpiler/output/codegen}/types/ICodeGeneratorOptions.ts +2 -2
  156. package/src/{codegen → transpiler/output/codegen}/types/ITypeResolverDeps.ts +4 -4
  157. package/src/{codegen → transpiler/output/codegen}/types/ITypeValidatorDeps.ts +4 -4
  158. package/src/{codegen → transpiler/output/codegen}/types/TTypeInfo.ts +1 -0
  159. package/src/{codegen → transpiler/output/codegen}/types/TYPE_MAP.ts +1 -1
  160. package/src/transpiler/output/headers/ExternalTypeHeaderBuilder.ts +65 -0
  161. package/src/{codegen → transpiler/output/headers}/HeaderGenerator.test.ts +5 -5
  162. package/src/{codegen → transpiler/output/headers}/HeaderGenerator.ts +11 -11
  163. package/src/transpiler/output/headers/__tests__/ExternalTypeHeaderBuilder.test.ts +219 -0
  164. package/src/{codegen/headerGenerators → transpiler/output/headers/generators}/IHeaderTypeInput.ts +1 -1
  165. package/src/{codegen/headerGenerators → transpiler/output/headers/generators}/generateStructHeader.ts +1 -1
  166. package/src/{codegen/headerGenerators → transpiler/output/headers/generators}/mapType.ts +1 -1
  167. package/src/{pipeline → transpiler}/types/ICachedFileEntry.ts +1 -1
  168. package/src/{codegen/generators/ISymbolInfo.ts → transpiler/types/ICodeGenSymbols.ts} +3 -7
  169. package/src/{pipeline → transpiler}/types/IFileResult.ts +4 -0
  170. package/src/transpiler/types/ITranspileContext.ts +49 -0
  171. package/src/transpiler/types/ITranspileContribution.ts +32 -0
  172. package/src/{pipeline/types/IPipelineConfig.ts → transpiler/types/ITranspilerConfig.ts} +3 -3
  173. package/src/{pipeline/types/IPipelineResult.ts → transpiler/types/ITranspilerResult.ts} +4 -4
  174. package/src/transpiler/types/TranspilerState.ts +199 -0
  175. package/src/transpiler/types/__tests__/TranspilerState.test.ts +242 -0
  176. package/src/utils/CppNamespaceUtils.test.ts +4 -4
  177. package/src/utils/CppNamespaceUtils.ts +3 -3
  178. package/src/utils/ExpressionUtils.test.ts +2 -2
  179. package/src/utils/ExpressionUtils.ts +1 -1
  180. package/src/utils/LiteralUtils.test.ts +2 -2
  181. package/src/utils/LiteralUtils.ts +1 -1
  182. package/src/{pipeline → utils/cache}/CacheManager.ts +114 -7
  183. package/src/{pipeline → utils/cache}/__tests__/CacheManager.test.ts +514 -1
  184. package/src/pipeline/Pipeline.ts +0 -1715
  185. package/src/project/Project.ts +0 -233
  186. package/src/project/__tests__/Project.test.ts +0 -368
  187. package/src/project/types/IProjectConfig.ts +0 -48
  188. package/src/project/types/IProjectResult.ts +0 -27
  189. /package/src/{project → transpiler/data}/FileDiscovery.ts +0 -0
  190. /package/src/{lib → transpiler/data}/IncludeDiscovery.ts +0 -0
  191. /package/src/{lib → transpiler/data}/InputExpansion.ts +0 -0
  192. /package/src/{project → transpiler/data}/types/EFileType.ts +0 -0
  193. /package/src/{project → transpiler/data}/types/IDiscoveredFile.ts +0 -0
  194. /package/src/{project → transpiler/data}/types/IDiscoveryOptions.ts +0 -0
  195. /package/src/{analysis → transpiler/logic/analysis}/GrammarCoverageListener.ts +0 -0
  196. /package/src/{analysis → transpiler/logic/analysis}/ScopeStack.test.ts +0 -0
  197. /package/src/{analysis → transpiler/logic/analysis}/ScopeStack.ts +0 -0
  198. /package/src/{analysis → transpiler/logic/analysis}/types/IBaseAnalysisError.ts +0 -0
  199. /package/src/{analysis → transpiler/logic/analysis}/types/IDeclarationInfo.ts +0 -0
  200. /package/src/{analysis → transpiler/logic/analysis}/types/IDivisionByZeroError.ts +0 -0
  201. /package/src/{analysis → transpiler/logic/analysis}/types/IFloatModuloError.ts +0 -0
  202. /package/src/{analysis → transpiler/logic/analysis}/types/IFunctionCallError.ts +0 -0
  203. /package/src/{analysis → transpiler/logic/analysis}/types/IGrammarCoverageReport.ts +0 -0
  204. /package/src/{analysis → transpiler/logic/analysis}/types/IInitializationError.ts +0 -0
  205. /package/src/{analysis → transpiler/logic/analysis}/types/INullCheckError.ts +0 -0
  206. /package/src/{analysis → transpiler/logic/analysis}/types/IParameterNamingError.ts +0 -0
  207. /package/src/{analysis → transpiler/logic/analysis}/types/IStructFieldError.ts +0 -0
  208. /package/src/{analysis → transpiler/logic/analysis}/types/__tests__/IBaseAnalysisError.test.ts +0 -0
  209. /package/src/{pipeline → transpiler/logic}/detectCppSyntax.ts +0 -0
  210. /package/src/{pipeline → transpiler/logic/parser}/__tests__/CNextSourceParser.test.ts +0 -0
  211. /package/src/{antlr_parser → transpiler/logic/parser}/c/grammar/C.interp +0 -0
  212. /package/src/{antlr_parser → transpiler/logic/parser}/c/grammar/C.tokens +0 -0
  213. /package/src/{antlr_parser → transpiler/logic/parser}/c/grammar/CLexer.interp +0 -0
  214. /package/src/{antlr_parser → transpiler/logic/parser}/c/grammar/CLexer.tokens +0 -0
  215. /package/src/{antlr_parser → transpiler/logic/parser}/c/grammar/CLexer.ts +0 -0
  216. /package/src/{antlr_parser → transpiler/logic/parser}/c/grammar/CListener.ts +0 -0
  217. /package/src/{antlr_parser → transpiler/logic/parser}/c/grammar/CParser.ts +0 -0
  218. /package/src/{antlr_parser → transpiler/logic/parser}/c/grammar/CVisitor.ts +0 -0
  219. /package/src/{antlr_parser → transpiler/logic/parser}/cpp/grammar/CPP14Lexer.interp +0 -0
  220. /package/src/{antlr_parser → transpiler/logic/parser}/cpp/grammar/CPP14Lexer.tokens +0 -0
  221. /package/src/{antlr_parser → transpiler/logic/parser}/cpp/grammar/CPP14Lexer.ts +0 -0
  222. /package/src/{antlr_parser → transpiler/logic/parser}/cpp/grammar/CPP14Parser.interp +0 -0
  223. /package/src/{antlr_parser → transpiler/logic/parser}/cpp/grammar/CPP14Parser.tokens +0 -0
  224. /package/src/{antlr_parser → transpiler/logic/parser}/cpp/grammar/CPP14Parser.ts +0 -0
  225. /package/src/{antlr_parser → transpiler/logic/parser}/cpp/grammar/CPP14ParserListener.ts +0 -0
  226. /package/src/{antlr_parser → transpiler/logic/parser}/cpp/grammar/CPP14ParserVisitor.ts +0 -0
  227. /package/src/{antlr_parser → transpiler/logic/parser}/grammar/CNext.interp +0 -0
  228. /package/src/{antlr_parser → transpiler/logic/parser}/grammar/CNext.tokens +0 -0
  229. /package/src/{antlr_parser → transpiler/logic/parser}/grammar/CNextLexer.interp +0 -0
  230. /package/src/{antlr_parser → transpiler/logic/parser}/grammar/CNextLexer.tokens +0 -0
  231. /package/src/{antlr_parser → transpiler/logic/parser}/grammar/CNextLexer.ts +0 -0
  232. /package/src/{antlr_parser → transpiler/logic/parser}/grammar/CNextListener.ts +0 -0
  233. /package/src/{antlr_parser → transpiler/logic/parser}/grammar/CNextParser.ts +0 -0
  234. /package/src/{antlr_parser → transpiler/logic/parser}/grammar/CNextVisitor.ts +0 -0
  235. /package/src/{preprocessor → transpiler/logic/preprocessor}/Preprocessor.ts +0 -0
  236. /package/src/{preprocessor → transpiler/logic/preprocessor}/ToolchainDetector.ts +0 -0
  237. /package/src/{preprocessor → transpiler/logic/preprocessor}/types/IPreprocessOptions.ts +0 -0
  238. /package/src/{preprocessor → transpiler/logic/preprocessor}/types/IPreprocessResult.ts +0 -0
  239. /package/src/{preprocessor → transpiler/logic/preprocessor}/types/ISourceMapping.ts +0 -0
  240. /package/src/{preprocessor → transpiler/logic/preprocessor}/types/IToolchain.ts +0 -0
  241. /package/src/{symbol_resolution → transpiler/logic/symbols}/SymbolUtils.test.ts +0 -0
  242. /package/src/{symbol_resolution → transpiler/logic/symbols}/SymbolUtils.ts +0 -0
  243. /package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/types/IScopeCollectorResult.ts +0 -0
  244. /package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/utils/ExpressionEvaluator.ts +0 -0
  245. /package/src/{symbol_resolution → transpiler/logic/symbols}/types/IBitmapFieldInfo.ts +0 -0
  246. /package/src/{symbol_resolution → transpiler/logic/symbols}/types/IFieldInfo.ts +0 -0
  247. /package/src/{symbol_resolution → transpiler/logic/symbols}/types/IParameterInfo.ts +0 -0
  248. /package/src/{symbol_resolution → transpiler/logic/symbols}/types/IRegisterMemberInfo.ts +0 -0
  249. /package/src/{symbol_resolution → transpiler/logic/symbols}/types/IStructFieldInfo.ts +0 -0
  250. /package/src/{symbol_resolution → transpiler/logic/symbols}/types/TSymbol.ts +0 -0
  251. /package/src/{codegen → transpiler/output/codegen}/TypeRegistrationUtils.ts +0 -0
  252. /package/src/{codegen → transpiler/output/codegen}/__tests__/TypeRegistrationUtils.test.ts +0 -0
  253. /package/src/{codegen → transpiler/output/codegen}/assignment/AssignmentKind.ts +0 -0
  254. /package/src/{codegen → transpiler/output/codegen}/assignment/__tests__/AssignmentClassifier.test.ts +0 -0
  255. /package/src/{codegen → transpiler/output/codegen}/assignment/handlers/ArrayHandlers.ts +0 -0
  256. /package/src/{codegen → transpiler/output/codegen}/assignment/handlers/RegisterUtils.ts +0 -0
  257. /package/src/{codegen → transpiler/output/codegen}/assignment/handlers/SimpleHandler.ts +0 -0
  258. /package/src/{codegen → transpiler/output/codegen}/assignment/handlers/TAssignmentHandler.ts +0 -0
  259. /package/src/{codegen → transpiler/output/codegen}/assignment/handlers/__tests__/RegisterUtils.test.ts +0 -0
  260. /package/src/{codegen → transpiler/output/codegen}/assignment/handlers/__tests__/StringHandlers.test.ts +0 -0
  261. /package/src/{codegen → transpiler/output/codegen}/assignment/handlers/index.ts +0 -0
  262. /package/src/{codegen → transpiler/output/codegen}/assignment/index.ts +0 -0
  263. /package/src/{codegen → transpiler/output/codegen}/generators/GeneratorRegistry.ts +0 -0
  264. /package/src/{codegen → transpiler/output/codegen}/generators/IGeneratorOutput.ts +0 -0
  265. /package/src/{codegen → transpiler/output/codegen}/generators/IGeneratorState.ts +0 -0
  266. /package/src/{codegen → transpiler/output/codegen}/generators/TGeneratorEffect.ts +0 -0
  267. /package/src/{codegen → transpiler/output/codegen}/generators/TGeneratorFn.ts +0 -0
  268. /package/src/{codegen → transpiler/output/codegen}/generators/TIncludeHeader.ts +0 -0
  269. /package/src/{codegen → transpiler/output/codegen}/generators/expressions/AccessExprGenerator.ts +0 -0
  270. /package/src/{codegen → transpiler/output/codegen}/generators/expressions/CallExprUtils.ts +0 -0
  271. /package/src/{codegen → transpiler/output/codegen}/generators/expressions/__tests__/BinaryExprUtils.test.ts +0 -0
  272. /package/src/{codegen → transpiler/output/codegen}/generators/expressions/__tests__/CallExprUtils.test.ts +0 -0
  273. /package/src/{codegen → transpiler/output/codegen}/generators/statements/AtomicGenerator.ts +0 -0
  274. /package/src/{codegen → transpiler/output/codegen}/generators/support/HelperGenerator.ts +0 -0
  275. /package/src/{codegen → transpiler/output/codegen}/memberAccessChain.test.ts +0 -0
  276. /package/src/{codegen → transpiler/output/codegen}/memberAccessChain.ts +0 -0
  277. /package/src/{codegen → transpiler/output/codegen}/types/C_TYPE_WIDTH.ts +0 -0
  278. /package/src/{codegen → transpiler/output/codegen}/types/FLOAT_TYPES.ts +0 -0
  279. /package/src/{codegen → transpiler/output/codegen}/types/ICallbackTypeInfo.ts +0 -0
  280. /package/src/{codegen → transpiler/output/codegen}/types/IFunctionSignature.ts +0 -0
  281. /package/src/{codegen → transpiler/output/codegen}/types/IHeaderOptions.ts +0 -0
  282. /package/src/{codegen → transpiler/output/codegen}/types/INTEGER_TYPES.ts +0 -0
  283. /package/src/{codegen → transpiler/output/codegen}/types/ITargetCapabilities.ts +0 -0
  284. /package/src/{codegen → transpiler/output/codegen}/types/SIGNED_TYPES.ts +0 -0
  285. /package/src/{codegen → transpiler/output/codegen}/types/TOverflowBehavior.ts +0 -0
  286. /package/src/{codegen → transpiler/output/codegen}/types/TParameterInfo.ts +0 -0
  287. /package/src/{codegen → transpiler/output/codegen}/types/TYPE_LIMITS.ts +0 -0
  288. /package/src/{codegen → transpiler/output/codegen}/types/TYPE_RANGES.ts +0 -0
  289. /package/src/{codegen → transpiler/output/codegen}/types/TYPE_WIDTH.ts +0 -0
  290. /package/src/{codegen → transpiler/output/codegen}/types/UNSIGNED_TYPES.ts +0 -0
  291. /package/src/{codegen → transpiler/output/codegen}/types/WIDER_TYPE_MAP.ts +0 -0
  292. /package/src/{codegen/headerGenerators → transpiler/output/headers/generators}/generateBitmapHeader.test.ts +0 -0
  293. /package/src/{codegen/headerGenerators → transpiler/output/headers/generators}/generateBitmapHeader.ts +0 -0
  294. /package/src/{codegen/headerGenerators → transpiler/output/headers/generators}/generateEnumHeader.test.ts +0 -0
  295. /package/src/{codegen/headerGenerators → transpiler/output/headers/generators}/generateEnumHeader.ts +0 -0
  296. /package/src/{codegen/headerGenerators → transpiler/output/headers/generators}/generateStructHeader.test.ts +0 -0
  297. /package/src/{codegen/headerGenerators → transpiler/output/headers/generators}/mapType.test.ts +0 -0
  298. /package/src/{codegen → transpiler}/types/BITMAP_BACKING_TYPE.ts +0 -0
  299. /package/src/{codegen → transpiler}/types/BITMAP_SIZE.ts +0 -0
  300. /package/src/{codegen → transpiler}/types/ECommentType.ts +0 -0
  301. /package/src/{pipeline → transpiler}/types/ICacheConfig.ts +0 -0
  302. /package/src/{pipeline → transpiler}/types/ICacheSymbols.ts +0 -0
  303. /package/src/{codegen → transpiler}/types/IComment.ts +0 -0
  304. /package/src/{codegen → transpiler}/types/ICommentError.ts +0 -0
  305. /package/src/{pipeline → transpiler}/types/ISerializedSymbol.ts +0 -0
  306. /package/src/{pipeline → utils}/cache/CacheKeyGenerator.ts +0 -0
  307. /package/src/{pipeline → utils}/cache/__tests__/CacheKeyGenerator.test.ts +0 -0
  308. /package/src/{constants → utils/constants}/TypeConstants.test.ts +0 -0
  309. /package/src/{constants → utils/constants}/TypeConstants.ts +0 -0
  310. /package/src/{constants → utils/constants}/TypeMappings.ts +0 -0
  311. /package/src/{types → utils/types}/ESourceLanguage.ts +0 -0
  312. /package/src/{types → utils/types}/ESymbolKind.ts +0 -0
  313. /package/src/{types → utils/types}/ISymbol.ts +0 -0
package/README.md CHANGED
@@ -5,6 +5,7 @@
5
5
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
6
6
  [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=jlaustill_c-next&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=jlaustill_c-next)
7
7
  [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=jlaustill_c-next&metric=coverage)](https://sonarcloud.io/summary/new_code?id=jlaustill_c-next)
8
+ [![Coverage Report](https://img.shields.io/badge/Coverage-Report-blue)](https://jlaustill.github.io/c-next/coverage/)
8
9
  [![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=jlaustill_c-next&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=jlaustill_c-next)
9
10
 
10
11
  A safer C for embedded systems development. Transpiles to clean, readable C.
package/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "c-next",
3
- "version": "0.1.50",
3
+ "version": "0.1.52",
4
4
  "description": "A safer C for embedded systems development. Transpiles to clean, readable C.",
5
5
  "main": "src/index.ts",
6
6
  "bin": {
7
7
  "cnext": "./bin/cnext.js"
8
8
  },
9
9
  "scripts": {
10
- "antlr": "antlr4ng -Dlanguage=TypeScript -visitor -listener -o src/antlr_parser grammar/CNext.g4",
11
- "antlr:c": "antlr4ng -Dlanguage=TypeScript -visitor -listener -o src/antlr_parser/c grammar/C.g4",
12
- "antlr:cpp:lexer": "antlr4ng -Dlanguage=TypeScript -o src/antlr_parser/cpp grammar/CPP14Lexer.g4",
13
- "antlr:cpp:parser": "antlr4ng -Dlanguage=TypeScript -visitor -listener -o src/antlr_parser/cpp -lib src/antlr_parser/cpp/grammar grammar/CPP14Parser.g4",
10
+ "antlr": "antlr4ng -Dlanguage=TypeScript -visitor -listener -o src/transpiler/logic/parser grammar/CNext.g4",
11
+ "antlr:c": "antlr4ng -Dlanguage=TypeScript -visitor -listener -o src/transpiler/logic/parser/c grammar/C.g4",
12
+ "antlr:cpp:lexer": "antlr4ng -Dlanguage=TypeScript -o src/transpiler/logic/parser/cpp grammar/CPP14Lexer.g4",
13
+ "antlr:cpp:parser": "antlr4ng -Dlanguage=TypeScript -visitor -listener -o src/transpiler/logic/parser/cpp -lib src/transpiler/logic/parser/cpp/grammar grammar/CPP14Parser.g4",
14
14
  "antlr:cpp": "npm run antlr:cpp:lexer && npm run antlr:cpp:parser",
15
15
  "antlr:all": "npm run antlr && npm run antlr:c && npm run antlr:cpp",
16
16
  "start": "tsx src/index.ts",
@@ -21,11 +21,13 @@
21
21
  "test:q": "tsx scripts/test.ts -q",
22
22
  "test:update": "tsx scripts/test.ts --update",
23
23
  "analyze": "./scripts/static-analysis.sh",
24
- "clean": "rm -rf src/antlr_parser",
24
+ "clean": "rm -rf src/transpiler/logic/parser/grammar src/transpiler/logic/parser/c/grammar src/transpiler/logic/parser/cpp/grammar",
25
25
  "prettier:check": "prettier --check .",
26
26
  "prettier:fix": "prettier --write .",
27
- "oxlint:check": "oxlint src/",
28
- "oxlint:fix": "oxlint src/ --fix",
27
+ "oxlint:check": "oxlint src/ --ignore-pattern '**/parser/grammar/**' --ignore-pattern '**/parser/c/grammar/**' --ignore-pattern '**/parser/cpp/grammar/**'",
28
+ "oxlint:fix": "oxlint src/ --ignore-pattern '**/parser/grammar/**' --ignore-pattern '**/parser/c/grammar/**' --ignore-pattern '**/parser/cpp/grammar/**' --fix",
29
+ "depcruise": "depcruise src/transpiler --config .dependency-cruiser.cjs",
30
+ "depcruise:graph": "depcruise src/transpiler --config .dependency-cruiser.cjs --output-type dot | dot -T svg > dependency-graph.svg",
29
31
  "prepare": "husky",
30
32
  "prepublishOnly": "npm run prettier:check && npm run oxlint:check && npm test",
31
33
  "coverage:check": "tsx scripts/coverage-checker.ts check",
@@ -74,8 +76,10 @@
74
76
  ],
75
77
  "devDependencies": {
76
78
  "@types/node": "^25.0.3",
79
+ "@types/yargs": "^17.0.35",
77
80
  "@vitest/coverage-v8": "^3.2.4",
78
81
  "antlr4ng-cli": "^2.0.0",
82
+ "dependency-cruiser": "^17.3.7",
79
83
  "husky": "^9.1.7",
80
84
  "knip": "^5.82.1",
81
85
  "lint-staged": "^16.2.7",
@@ -84,9 +88,11 @@
84
88
  "vitest": "^3.0.0"
85
89
  },
86
90
  "dependencies": {
91
+ "@n1ru4l/toposort": "^0.0.1",
87
92
  "antlr4ng": "^3.0.16",
88
93
  "tsx": "^4.21.0",
89
- "typescript": "^5.9.3"
94
+ "typescript": "^5.9.3",
95
+ "yargs": "^18.0.0"
90
96
  },
91
97
  "lint-staged": {
92
98
  "*": [
@@ -0,0 +1,260 @@
1
+ /**
2
+ * ArgParser
3
+ * Parses command-line arguments using yargs
4
+ */
5
+
6
+ import yargs from "yargs";
7
+ import { hideBin } from "yargs/helpers";
8
+ import ConfigPrinter from "./ConfigPrinter";
9
+ import IParsedArgs from "./types/IParsedArgs";
10
+
11
+ /**
12
+ * Interface for yargs parsed result
13
+ */
14
+ interface IYargsResult {
15
+ _: (string | number)[];
16
+ o?: string;
17
+ output?: string;
18
+ "header-out"?: string;
19
+ "base-path"?: string;
20
+ cpp: boolean;
21
+ include: string[];
22
+ target?: string;
23
+ D: string[];
24
+ parse: boolean;
25
+ clean: boolean;
26
+ config: boolean;
27
+ verbose: boolean;
28
+ debug: boolean;
29
+ preprocess: boolean;
30
+ cache: boolean;
31
+ "pio-install": boolean;
32
+ "pio-uninstall": boolean;
33
+ }
34
+
35
+ /**
36
+ * Configure yargs with all options
37
+ */
38
+ function configureYargs(args: string[], argv: string[]) {
39
+ return (
40
+ yargs(args)
41
+ .scriptName("cnext")
42
+ .usage(
43
+ `Usage:
44
+ cnext <file.cnx> Single file (outputs file.c)
45
+ cnext <file.cnx> -o <output.c> Single file with explicit output
46
+ cnext <files...> -o <dir> Multi-file mode
47
+ cnext <dir> Directory mode (recursive)
48
+
49
+ A safer C for embedded systems development.`,
50
+ )
51
+
52
+ // Output options
53
+ .option("o", {
54
+ alias: "output",
55
+ type: "string",
56
+ describe: "Output file or directory (default: same dir as input)",
57
+ requiresArg: true,
58
+ })
59
+ .option("header-out", {
60
+ type: "string",
61
+ describe: "Output directory for header files",
62
+ requiresArg: true,
63
+ })
64
+ .option("base-path", {
65
+ type: "string",
66
+ describe:
67
+ "Strip path prefix from header output (use with --header-out)",
68
+ requiresArg: true,
69
+ })
70
+
71
+ // Compilation options
72
+ .option("cpp", {
73
+ type: "boolean",
74
+ describe: "Output .cpp instead of .c (for C++ features like Serial)",
75
+ default: false,
76
+ })
77
+ .option("include", {
78
+ type: "string",
79
+ array: true,
80
+ describe: "Additional include directory (can repeat)",
81
+ requiresArg: true,
82
+ default: [] as string[],
83
+ })
84
+ .option("target", {
85
+ type: "string",
86
+ describe: "Target platform for atomic code gen (ADR-049)",
87
+ requiresArg: true,
88
+ })
89
+ .option("D", {
90
+ type: "string",
91
+ array: true,
92
+ describe: "Define preprocessor macro",
93
+ default: [] as string[],
94
+ })
95
+
96
+ // Mode flags
97
+ .option("parse", {
98
+ type: "boolean",
99
+ describe: "Parse only, don't generate code",
100
+ default: false,
101
+ })
102
+ .option("clean", {
103
+ type: "boolean",
104
+ describe: "Delete generated files for all .cnx sources",
105
+ default: false,
106
+ })
107
+ .option("config", {
108
+ type: "boolean",
109
+ describe: "Show effective configuration and exit",
110
+ default: false,
111
+ })
112
+
113
+ // Debug/development options
114
+ .option("verbose", {
115
+ type: "boolean",
116
+ describe: "Show include path discovery",
117
+ default: false,
118
+ })
119
+ .option("debug", {
120
+ type: "boolean",
121
+ describe: "Generate panic-on-overflow helpers (ADR-044)",
122
+ default: false,
123
+ })
124
+ .option("preprocess", {
125
+ type: "boolean",
126
+ describe:
127
+ "Run C preprocessor on headers (use --no-preprocess to disable)",
128
+ default: true,
129
+ })
130
+ .option("cache", {
131
+ type: "boolean",
132
+ describe: "Enable symbol cache (use --no-cache to disable)",
133
+ default: true,
134
+ })
135
+
136
+ // PlatformIO integration
137
+ .option("pio-install", {
138
+ type: "boolean",
139
+ describe: "Setup PlatformIO integration",
140
+ default: false,
141
+ })
142
+ .option("pio-uninstall", {
143
+ type: "boolean",
144
+ describe: "Remove PlatformIO integration",
145
+ default: false,
146
+ })
147
+
148
+ // Config file documentation (shown in help)
149
+ .epilogue(
150
+ `Examples:
151
+ cnext main.cnx # Outputs main.c (same dir)
152
+ cnext main.cnx -o build/main.c # Explicit output path
153
+ cnext src/*.cnx -o build/ # Multiple files to directory
154
+ cnext src/ # Compile all .cnx files in src/ (recursive)
155
+
156
+ Target platforms: teensy41, cortex-m7, cortex-m4, cortex-m3, cortex-m0+, cortex-m0, avr
157
+
158
+ Config files (searched in order, JSON format):
159
+ cnext.config.json, .cnext.json, .cnextrc
160
+
161
+ Config options:
162
+ cppRequired Output .cpp instead of .c (boolean)
163
+ noCache Disable symbol caching (boolean)
164
+ include Additional include directories (string[])
165
+ output Output directory for generated files (string)
166
+ headerOut Separate directory for header files (string)
167
+ target Target platform for atomic code gen (string)
168
+ debugMode Generate panic-on-overflow helpers (boolean)`,
169
+ )
170
+
171
+ // Version from package.json
172
+ .version(
173
+ "version",
174
+ "Show version",
175
+ `cnext v${ConfigPrinter.getVersion()}`,
176
+ )
177
+ .alias("version", "v")
178
+
179
+ // Help
180
+ .help("help")
181
+ .alias("help", "h")
182
+
183
+ // Fail handler for unknown options
184
+ .fail((msg, err, yargsInstance) => {
185
+ if (err) throw err;
186
+ // Check for -I flag (common GCC mistake)
187
+ const hasIFlag = argv.some((arg) => arg.startsWith("-I"));
188
+ if (hasIFlag) {
189
+ console.error("Error: Unknown flag '-I...'");
190
+ console.error(" Did you mean: --include <dir>");
191
+ console.error("");
192
+ console.error("Example:");
193
+ console.error(" cnext src --include path/to/headers");
194
+ process.exit(1);
195
+ }
196
+ console.error(msg);
197
+ console.error("");
198
+ yargsInstance.showHelp();
199
+ process.exit(1);
200
+ })
201
+ );
202
+ }
203
+
204
+ /**
205
+ * Parse command-line arguments using yargs
206
+ */
207
+ class ArgParser {
208
+ /**
209
+ * Parse command-line arguments into a structured object
210
+ * @param argv - Command-line arguments (typically process.argv)
211
+ * @returns Parsed arguments object
212
+ */
213
+ static parse(argv: string[]): IParsedArgs {
214
+ const args = hideBin(argv);
215
+
216
+ // Show help and exit 0 when no arguments provided
217
+ if (args.length === 0) {
218
+ configureYargs([], argv).showHelp("log"); // Output to stdout, not stderr
219
+ process.exit(0);
220
+ }
221
+
222
+ const parsed = configureYargs(args, argv).parseSync() as IYargsResult;
223
+
224
+ // Parse -D defines into a record
225
+ const defines: Record<string, string | boolean> = {};
226
+ for (const define of parsed.D) {
227
+ const eqIndex = define.indexOf("=");
228
+ if (eqIndex > 0) {
229
+ defines[define.slice(0, eqIndex)] = define.slice(eqIndex + 1);
230
+ } else {
231
+ defines[define] = true;
232
+ }
233
+ }
234
+
235
+ // Get input files from positional args (everything that isn't an option)
236
+ const inputFiles = parsed._.map(String);
237
+
238
+ return {
239
+ inputFiles,
240
+ outputPath: parsed.o ?? "",
241
+ includeDirs: parsed.include,
242
+ defines,
243
+ cppRequired: parsed.cpp,
244
+ target: parsed.target,
245
+ preprocess: parsed.preprocess,
246
+ verbose: parsed.verbose,
247
+ noCache: !parsed.cache,
248
+ parseOnly: parsed.parse,
249
+ headerOutDir: parsed["header-out"],
250
+ basePath: parsed["base-path"],
251
+ cleanMode: parsed.clean,
252
+ showConfig: parsed.config,
253
+ pioInstall: parsed["pio-install"],
254
+ pioUninstall: parsed["pio-uninstall"],
255
+ debugMode: parsed.debug,
256
+ };
257
+ }
258
+ }
259
+
260
+ export default ArgParser;
@@ -3,9 +3,10 @@
3
3
  * Deletes generated files (.c, .cpp, .h, .hpp) that have matching .cnx sources
4
4
  */
5
5
 
6
- import { basename, join, relative, resolve } from "node:path";
7
- import { existsSync, statSync, unlinkSync } from "node:fs";
8
- import InputExpansion from "../lib/InputExpansion";
6
+ import { basename, join, resolve } from "node:path";
7
+ import { unlinkSync } from "node:fs";
8
+ import InputExpansion from "../transpiler/data/InputExpansion";
9
+ import PathResolver from "../transpiler/data/PathResolver";
9
10
 
10
11
  /**
11
12
  * Command to clean generated output files
@@ -48,6 +49,13 @@ class CleanCommand {
48
49
  ? resolve(headerOutDir)
49
50
  : resolvedOutDir;
50
51
 
52
+ // Issue #586: Use PathResolver for consistent path calculation
53
+ const pathResolver = new PathResolver({
54
+ inputs,
55
+ outDir,
56
+ headerOutDir,
57
+ });
58
+
51
59
  let deletedCount = 0;
52
60
 
53
61
  // For each .cnx file, calculate and delete generated files
@@ -55,7 +63,7 @@ class CleanCommand {
55
63
  const baseName = basename(cnxFile).replace(/\.cnx$|\.cnext$/, "");
56
64
 
57
65
  // Calculate relative path from input directories
58
- const relativePath = this.getRelativePath(cnxFile, inputs);
66
+ const relativePath = pathResolver.getRelativePathFromInputs(cnxFile);
59
67
 
60
68
  // Code files (.c and .cpp) go to outDir
61
69
  const codeExtensions = [".c", ".cpp"];
@@ -92,39 +100,6 @@ class CleanCommand {
92
100
  }
93
101
  }
94
102
 
95
- /**
96
- * Get relative path of a file from input directories.
97
- * Returns undefined if file is not under any input directory.
98
- *
99
- * When undefined is returned (e.g., for single file inputs), the caller
100
- * falls back to using just the basename, which is correct behavior since
101
- * there's no directory structure to preserve.
102
- */
103
- private static getRelativePath(
104
- filePath: string,
105
- inputs: string[],
106
- ): string | undefined {
107
- for (const input of inputs) {
108
- const resolvedInput = resolve(input);
109
-
110
- // Skip file inputs - only directories can establish relative structure.
111
- // For single file inputs like "cnext myfile.cnx -o build", we return
112
- // undefined and the caller uses baseName, which is the correct behavior.
113
- if (existsSync(resolvedInput) && statSync(resolvedInput).isFile()) {
114
- continue;
115
- }
116
-
117
- const rel = relative(resolvedInput, filePath);
118
-
119
- // Check if file is under this input directory
120
- if (rel && !rel.startsWith("..")) {
121
- return rel;
122
- }
123
- }
124
-
125
- return undefined;
126
- }
127
-
128
103
  /**
129
104
  * Delete a file if it exists
130
105
  * @returns true if file was deleted, false otherwise
package/src/cli/Cli.ts ADDED
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Cli
3
+ * Main CLI orchestrator that handles argument parsing, config loading,
4
+ * and dispatching to appropriate commands
5
+ */
6
+
7
+ import { dirname, resolve } from "node:path";
8
+ import ArgParser from "./ArgParser";
9
+ import ConfigLoader from "./ConfigLoader";
10
+ import ConfigPrinter from "./ConfigPrinter";
11
+ import PlatformIOCommand from "./PlatformIOCommand";
12
+ import CleanCommand from "./CleanCommand";
13
+ import ICliResult from "./types/ICliResult";
14
+ import ICliConfig from "./types/ICliConfig";
15
+ import IParsedArgs from "./types/IParsedArgs";
16
+ import IFileConfig from "./types/IFileConfig";
17
+
18
+ /**
19
+ * Main CLI orchestrator
20
+ */
21
+ class Cli {
22
+ /**
23
+ * Run the CLI
24
+ * @returns CLI result with configuration for Runner if transpilation should run
25
+ */
26
+ static run(): ICliResult {
27
+ // Parse arguments (yargs handles --help and --version automatically)
28
+ const args = ArgParser.parse(process.argv);
29
+
30
+ // Early exits for PlatformIO commands
31
+ if (args.pioInstall) {
32
+ PlatformIOCommand.install();
33
+ return { shouldRun: false, exitCode: 0 };
34
+ }
35
+
36
+ if (args.pioUninstall) {
37
+ PlatformIOCommand.uninstall();
38
+ return { shouldRun: false, exitCode: 0 };
39
+ }
40
+
41
+ // Load config file (searches up from input file directory)
42
+ const configDir =
43
+ args.inputFiles.length > 0
44
+ ? dirname(resolve(args.inputFiles[0]))
45
+ : process.cwd();
46
+ const fileConfig = ConfigLoader.load(configDir);
47
+
48
+ // Merge CLI args with file config
49
+ const config = this.mergeConfig(args, fileConfig);
50
+
51
+ // Handle --config: show effective configuration
52
+ if (args.showConfig) {
53
+ ConfigPrinter.showConfig(config, fileConfig);
54
+ return { shouldRun: false, exitCode: 0 };
55
+ }
56
+
57
+ // Validate inputs
58
+ if (config.inputs.length === 0) {
59
+ console.error("Error: No input files specified");
60
+ console.error("Run 'cnext --help' for usage information");
61
+ return { shouldRun: false, exitCode: 1 };
62
+ }
63
+
64
+ // Handle --clean: delete generated files
65
+ if (args.cleanMode) {
66
+ CleanCommand.execute(
67
+ config.inputs,
68
+ config.outputPath,
69
+ config.headerOutDir,
70
+ );
71
+ return { shouldRun: false, exitCode: 0 };
72
+ }
73
+
74
+ return { shouldRun: true, exitCode: 0, config };
75
+ }
76
+
77
+ /**
78
+ * Merge CLI arguments with file configuration
79
+ * CLI flags take precedence over config file values
80
+ */
81
+ private static mergeConfig(
82
+ args: IParsedArgs,
83
+ fileConfig: IFileConfig,
84
+ ): ICliConfig {
85
+ return {
86
+ inputs: args.inputFiles,
87
+ outputPath: args.outputPath || fileConfig.output || "",
88
+ // Merge include dirs: config includes come first, CLI includes override/append
89
+ includeDirs: [...(fileConfig.include ?? []), ...args.includeDirs],
90
+ defines: args.defines,
91
+ preprocess: args.preprocess,
92
+ verbose: args.verbose,
93
+ cppRequired: args.cppRequired ?? fileConfig.cppRequired ?? false,
94
+ noCache: args.noCache || fileConfig.noCache === true,
95
+ parseOnly: args.parseOnly,
96
+ headerOutDir: args.headerOutDir ?? fileConfig.headerOut,
97
+ basePath: args.basePath ?? fileConfig.basePath,
98
+ target: args.target ?? fileConfig.target,
99
+ debugMode: args.debugMode || fileConfig.debugMode,
100
+ };
101
+ }
102
+ }
103
+
104
+ export default Cli;
@@ -0,0 +1,51 @@
1
+ /**
2
+ * ConfigLoader
3
+ * Loads configuration from project config files
4
+ */
5
+
6
+ import { dirname, resolve } from "node:path";
7
+ import { existsSync, readFileSync } from "node:fs";
8
+ import IFileConfig from "./types/IFileConfig";
9
+
10
+ /**
11
+ * Config file names in priority order (highest first)
12
+ */
13
+ const CONFIG_FILES = ["cnext.config.json", ".cnext.json", ".cnextrc"];
14
+
15
+ /**
16
+ * Load configuration from project directory
17
+ */
18
+ class ConfigLoader {
19
+ /**
20
+ * Load config from project directory, searching up the directory tree
21
+ * @param startDir - Directory to start searching from
22
+ * @returns Loaded configuration (empty object if no config found)
23
+ */
24
+ static load(startDir: string): IFileConfig {
25
+ let dir = resolve(startDir);
26
+
27
+ while (dir !== dirname(dir)) {
28
+ // Stop at filesystem root
29
+ for (const configFile of CONFIG_FILES) {
30
+ const configPath = resolve(dir, configFile);
31
+ if (existsSync(configPath)) {
32
+ try {
33
+ const content = readFileSync(configPath, "utf-8");
34
+ const config = JSON.parse(content) as IFileConfig;
35
+ config._path = configPath;
36
+ return config;
37
+ } catch (err) {
38
+ const message = err instanceof Error ? err.message : String(err);
39
+ console.error(`Warning: Failed to parse ${configPath}: ${message}`);
40
+ return {};
41
+ }
42
+ }
43
+ }
44
+ dir = dirname(dir);
45
+ }
46
+
47
+ return {}; // No config found
48
+ }
49
+ }
50
+
51
+ export default ConfigLoader;
@@ -0,0 +1,69 @@
1
+ /**
2
+ * ConfigPrinter
3
+ * Displays effective configuration and provides version info
4
+ */
5
+
6
+ import ICliConfig from "./types/ICliConfig";
7
+ import IFileConfig from "./types/IFileConfig";
8
+
9
+ // Read version from package.json to ensure consistency
10
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
11
+ const packageJson = require("../../package.json");
12
+
13
+ /**
14
+ * Version string from package.json
15
+ */
16
+ const VERSION = packageJson.version as string;
17
+
18
+ /**
19
+ * Print effective configuration and version info
20
+ */
21
+ class ConfigPrinter {
22
+ /**
23
+ * Get the current version string
24
+ */
25
+ static getVersion(): string {
26
+ return VERSION;
27
+ }
28
+
29
+ /**
30
+ * Display effective configuration
31
+ * @param config - Merged effective configuration
32
+ * @param fileConfig - Configuration loaded from file (for displaying path)
33
+ */
34
+ static showConfig(config: ICliConfig, fileConfig: IFileConfig): void {
35
+ console.log("Effective configuration:");
36
+ console.log("");
37
+ console.log(" Config file: " + (fileConfig._path ?? "(none)"));
38
+ console.log(" cppRequired: " + config.cppRequired);
39
+ console.log(" debugMode: " + (config.debugMode ?? false));
40
+ console.log(" target: " + (config.target ?? "(none)"));
41
+ console.log(" noCache: " + config.noCache);
42
+ console.log(" preprocess: " + config.preprocess);
43
+ console.log(
44
+ " output: " + (config.outputPath || "(same dir as input)"),
45
+ );
46
+ console.log(
47
+ " headerOut: " + (config.headerOutDir ?? "(same as output)"),
48
+ );
49
+ console.log(" basePath: " + (config.basePath ?? "(none)"));
50
+ console.log(
51
+ " include: " + (config.includeDirs.length > 0 ? "" : "(none)"),
52
+ );
53
+ for (const dir of config.includeDirs) {
54
+ console.log(" - " + dir);
55
+ }
56
+ console.log(
57
+ " defines: " +
58
+ (Object.keys(config.defines).length > 0 ? "" : "(none)"),
59
+ );
60
+ for (const [key, value] of Object.entries(config.defines)) {
61
+ console.log(" - " + key + (value === true ? "" : "=" + value));
62
+ }
63
+ console.log("");
64
+ console.log("Source:");
65
+ console.log(" CLI flags take precedence over config file values");
66
+ }
67
+ }
68
+
69
+ export default ConfigPrinter;