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.
- package/README.md +1 -0
- package/package.json +15 -9
- package/src/cli/ArgParser.ts +260 -0
- package/src/{commands → cli}/CleanCommand.ts +12 -37
- package/src/cli/Cli.ts +104 -0
- package/src/cli/ConfigLoader.ts +51 -0
- package/src/cli/ConfigPrinter.ts +69 -0
- package/src/cli/PlatformIOCommand.ts +177 -0
- package/src/cli/ResultPrinter.ts +52 -0
- package/src/cli/Runner.ts +124 -0
- package/src/cli/__tests__/ArgParser.test.ts +301 -0
- package/src/cli/__tests__/CleanCommand.test.ts +218 -0
- package/src/cli/__tests__/Cli.test.ts +319 -0
- package/src/cli/__tests__/ConfigLoader.test.ts +158 -0
- package/src/cli/__tests__/ConfigPrinter.test.ts +281 -0
- package/src/cli/__tests__/PlatformIOCommand.test.ts +235 -0
- package/src/cli/__tests__/ResultPrinter.test.ts +230 -0
- package/src/cli/__tests__/Runner.test.ts +300 -0
- package/src/cli/types/ICliConfig.ts +36 -0
- package/src/cli/types/ICliResult.ts +15 -0
- package/src/cli/types/IFileConfig.ts +28 -0
- package/src/cli/types/IParsedArgs.ts +41 -0
- package/src/index.ts +6 -665
- package/src/lib/parseWithSymbols.ts +5 -5
- package/src/lib/transpiler.ts +15 -15
- package/src/lib/types/ITranspileResult.ts +1 -1
- package/src/transpiler/Transpiler.ts +1272 -0
- package/src/transpiler/__tests__/Transpiler.test.ts +74 -0
- package/src/transpiler/data/CnxFileResolver.ts +76 -0
- package/src/transpiler/data/DependencyGraph.ts +114 -0
- package/src/{lib → transpiler/data}/IncludeResolver.ts +135 -7
- package/src/transpiler/data/IncludeTreeWalker.ts +152 -0
- package/src/transpiler/data/PathResolver.ts +191 -0
- package/src/transpiler/data/__tests__/DependencyGraph.test.ts +147 -0
- package/src/{lib → transpiler/data/__tests__}/IncludeResolver.test.ts +155 -1
- package/src/transpiler/data/__tests__/IncludeTreeWalker.test.ts +158 -0
- package/src/transpiler/data/__tests__/PathResolver.test.ts +328 -0
- package/src/transpiler/logic/IncludeExtractor.ts +41 -0
- package/src/transpiler/logic/StandaloneContextBuilder.ts +150 -0
- package/src/transpiler/logic/__tests__/IncludeExtractor.test.ts +113 -0
- package/src/{pipeline → transpiler/logic/__tests__}/detectCppSyntax.test.ts +1 -1
- package/src/transpiler/logic/analysis/AnalyzerContextBuilder.ts +58 -0
- package/src/{codegen → transpiler/logic/analysis}/CommentExtractor.test.ts +2 -2
- package/src/{codegen → transpiler/logic/analysis}/CommentExtractor.ts +4 -4
- package/src/{analysis → transpiler/logic/analysis}/DivisionByZeroAnalyzer.test.ts +2 -2
- package/src/{analysis → transpiler/logic/analysis}/DivisionByZeroAnalyzer.ts +5 -5
- package/src/{analysis → transpiler/logic/analysis}/FloatModuloAnalyzer.test.ts +2 -2
- package/src/{analysis → transpiler/logic/analysis}/FloatModuloAnalyzer.ts +5 -5
- package/src/{analysis → transpiler/logic/analysis}/FunctionCallAnalyzer.test.ts +5 -5
- package/src/{analysis → transpiler/logic/analysis}/FunctionCallAnalyzer.ts +6 -6
- package/src/{analysis → transpiler/logic/analysis}/InitializationAnalyzer.test.ts +5 -5
- package/src/{analysis → transpiler/logic/analysis}/InitializationAnalyzer.ts +7 -7
- package/src/transpiler/logic/analysis/ModificationAnalyzer.test.ts +322 -0
- package/src/transpiler/logic/analysis/ModificationAnalyzer.ts +134 -0
- package/src/{analysis → transpiler/logic/analysis}/NullCheckAnalyzer.test.ts +2 -2
- package/src/{analysis → transpiler/logic/analysis}/NullCheckAnalyzer.ts +3 -3
- package/src/{analysis → transpiler/logic/analysis}/ParameterNamingAnalyzer.test.ts +2 -2
- package/src/{analysis → transpiler/logic/analysis}/ParameterNamingAnalyzer.ts +2 -2
- package/src/{analysis → transpiler/logic/analysis}/StructFieldAnalyzer.ts +3 -3
- package/src/transpiler/logic/analysis/__tests__/AnalyzerContextBuilder.test.ts +137 -0
- package/src/{pipeline → transpiler/logic/analysis}/runAnalyzers.ts +11 -11
- package/src/{pipeline → transpiler/logic/parser}/CNextSourceParser.ts +3 -6
- package/src/transpiler/logic/parser/HeaderParser.ts +91 -0
- package/src/transpiler/logic/parser/__tests__/HeaderParser.test.ts +139 -0
- package/src/transpiler/logic/symbols/AutoConstUpdater.ts +93 -0
- package/src/{symbol_resolution → transpiler/logic/symbols}/CSymbolCollector.ts +4 -4
- package/src/{symbol_resolution → transpiler/logic/symbols}/CppSymbolCollector.ts +4 -4
- package/src/{symbol_resolution → transpiler/logic/symbols}/SymbolCollectorContext.ts +1 -1
- package/src/{symbol_resolution → transpiler/logic/symbols}/SymbolTable.test.ts +3 -3
- package/src/{symbol_resolution → transpiler/logic/symbols}/SymbolTable.ts +69 -3
- package/src/transpiler/logic/symbols/TransitiveEnumCollector.ts +105 -0
- package/src/transpiler/logic/symbols/__tests__/AutoConstUpdater.test.ts +416 -0
- package/src/{symbol_resolution → transpiler/logic/symbols}/__tests__/CppSymbolCollector.test.ts +7 -7
- package/src/{symbol_resolution → transpiler/logic/symbols}/__tests__/SymbolCollectorContext.test.ts +3 -3
- package/src/transpiler/logic/symbols/__tests__/SymbolTable.test.ts +226 -0
- package/src/transpiler/logic/symbols/__tests__/TransitiveEnumCollector.test.ts +361 -0
- package/src/{symbol_resolution → transpiler/logic/symbols}/__tests__/cppTestHelpers.ts +2 -2
- package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/__tests__/BitmapCollector.test.ts +2 -2
- package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/__tests__/CNextResolver.integration.test.ts +1 -1
- package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/__tests__/EnumCollector.test.ts +2 -2
- package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/__tests__/FunctionCollector.test.ts +2 -2
- package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/__tests__/RegisterCollector.test.ts +2 -2
- package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/__tests__/ScopeCollector.test.ts +2 -2
- package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/__tests__/StructCollector.test.ts +2 -2
- package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/__tests__/TSymbolAdapter.test.ts +2 -2
- package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/__tests__/TSymbolInfoAdapter.test.ts +2 -2
- package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/__tests__/VariableCollector.test.ts +2 -2
- package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/__tests__/testHelpers.ts +2 -2
- package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/adapters/TSymbolAdapter.ts +2 -2
- package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/adapters/TSymbolInfoAdapter.ts +8 -8
- package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/collectors/BitmapCollector.ts +5 -5
- package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/collectors/EnumCollector.ts +3 -3
- package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/collectors/FunctionCollector.ts +3 -3
- package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/collectors/RegisterCollector.ts +3 -3
- package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/collectors/ScopeCollector.ts +3 -3
- package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/collectors/StructCollector.ts +4 -4
- package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/collectors/VariableCollector.ts +3 -3
- package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/index.ts +2 -2
- package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/utils/TypeUtils.ts +2 -2
- package/src/{symbol_resolution → transpiler/logic/symbols}/types/IBaseSymbol.ts +1 -1
- package/src/{symbol_resolution → transpiler/logic/symbols}/types/IBitmapSymbol.ts +1 -1
- package/src/{symbol_resolution → transpiler/logic/symbols}/types/ICollectorContext.ts +1 -1
- package/src/{symbol_resolution → transpiler/logic/symbols}/types/IConflict.ts +1 -1
- package/src/{symbol_resolution → transpiler/logic/symbols}/types/IEnumSymbol.ts +1 -1
- package/src/{symbol_resolution → transpiler/logic/symbols}/types/IFunctionSymbol.ts +1 -1
- package/src/{symbol_resolution → transpiler/logic/symbols}/types/IRegisterSymbol.ts +1 -1
- package/src/{symbol_resolution → transpiler/logic/symbols}/types/IScopeSymbol.ts +1 -1
- package/src/{symbol_resolution → transpiler/logic/symbols}/types/IStructSymbol.ts +1 -1
- package/src/{symbol_resolution → transpiler/logic/symbols}/types/IVariableSymbol.ts +1 -1
- package/src/{symbol_resolution → transpiler/logic/symbols}/types/__tests__/SymbolGuards.test.ts +2 -2
- package/src/{symbol_resolution → transpiler/logic/symbols}/types/typeGuards.ts +1 -1
- package/src/{codegen → transpiler/output/codegen}/CodeGenerator.ts +358 -165
- package/src/{codegen → transpiler/output/codegen}/CommentFormatter.test.ts +2 -2
- package/src/{codegen → transpiler/output/codegen}/CommentFormatter.ts +2 -2
- package/src/{codegen → transpiler/output/codegen}/TypeResolver.test.ts +1 -1
- package/src/{codegen → transpiler/output/codegen}/TypeResolver.ts +4 -4
- package/src/{codegen → transpiler/output/codegen}/TypeValidator.test.ts +1 -1
- package/src/{codegen → transpiler/output/codegen}/TypeValidator.ts +4 -4
- package/src/transpiler/output/codegen/__tests__/ExpressionWalker.test.ts +372 -0
- package/src/{codegen → transpiler/output/codegen}/__tests__/TypeValidator.resolution.test.ts +3 -3
- package/src/{codegen → transpiler/output/codegen}/assignment/AssignmentClassifier.ts +32 -32
- package/src/{codegen → transpiler/output/codegen}/assignment/AssignmentContextBuilder.ts +1 -1
- package/src/{codegen → transpiler/output/codegen}/assignment/IAssignmentContext.ts +1 -1
- package/src/{codegen → transpiler/output/codegen}/assignment/handlers/AccessPatternHandlers.ts +1 -1
- package/src/{codegen → transpiler/output/codegen}/assignment/handlers/BitAccessHandlers.ts +1 -1
- package/src/{codegen → transpiler/output/codegen}/assignment/handlers/BitmapHandlers.ts +1 -1
- package/src/{codegen → transpiler/output/codegen}/assignment/handlers/IHandlerDeps.ts +3 -3
- package/src/{codegen → transpiler/output/codegen}/assignment/handlers/RegisterHandlers.ts +2 -2
- package/src/{codegen → transpiler/output/codegen}/assignment/handlers/SpecialHandlers.ts +1 -1
- package/src/{codegen → transpiler/output/codegen}/assignment/handlers/StringHandlers.ts +2 -2
- package/src/{codegen → transpiler/output/codegen}/generators/IGeneratorInput.ts +3 -3
- package/src/{codegen → transpiler/output/codegen}/generators/IOrchestrator.ts +1 -1
- package/src/{codegen → transpiler/output/codegen}/generators/declarationGenerators/BitmapGenerator.ts +1 -1
- package/src/{codegen → transpiler/output/codegen}/generators/declarationGenerators/EnumGenerator.ts +1 -1
- package/src/{codegen → transpiler/output/codegen}/generators/declarationGenerators/FunctionGenerator.ts +1 -1
- package/src/{codegen → transpiler/output/codegen}/generators/declarationGenerators/RegisterGenerator.ts +1 -1
- package/src/{codegen → transpiler/output/codegen}/generators/declarationGenerators/ScopeGenerator.ts +1 -1
- package/src/{codegen → transpiler/output/codegen}/generators/declarationGenerators/ScopedRegisterGenerator.ts +1 -1
- package/src/{codegen → transpiler/output/codegen}/generators/declarationGenerators/StructGenerator.ts +1 -1
- package/src/{codegen → transpiler/output/codegen}/generators/expressions/BinaryExprGenerator.ts +1 -1
- package/src/{codegen → transpiler/output/codegen}/generators/expressions/BinaryExprUtils.ts +1 -1
- package/src/{codegen → transpiler/output/codegen}/generators/expressions/CallExprGenerator.ts +2 -2
- package/src/{codegen → transpiler/output/codegen}/generators/expressions/ExpressionGenerator.ts +1 -1
- package/src/{codegen → transpiler/output/codegen}/generators/expressions/LiteralGenerator.ts +1 -1
- package/src/{codegen → transpiler/output/codegen}/generators/expressions/UnaryExprGenerator.ts +1 -1
- package/src/{codegen → transpiler/output/codegen}/generators/statements/ControlFlowGenerator.ts +1 -1
- package/src/{codegen → transpiler/output/codegen}/generators/statements/CriticalGenerator.ts +1 -1
- package/src/{codegen → transpiler/output/codegen}/generators/statements/SwitchGenerator.ts +1 -1
- package/src/{codegen → transpiler/output/codegen}/generators/support/CommentUtils.test.ts +3 -3
- package/src/{codegen → transpiler/output/codegen}/generators/support/CommentUtils.ts +2 -2
- package/src/{codegen → transpiler/output/codegen}/generators/support/IncludeGenerator.ts +8 -48
- package/src/transpiler/output/codegen/subscript/SubscriptClassifier.ts +96 -0
- package/src/transpiler/output/codegen/subscript/TSubscriptKind.ts +13 -0
- package/src/transpiler/output/codegen/subscript/__tests__/SubscriptClassifier.test.ts +211 -0
- package/src/{codegen → transpiler/output/codegen}/types/ICodeGeneratorOptions.ts +2 -2
- package/src/{codegen → transpiler/output/codegen}/types/ITypeResolverDeps.ts +4 -4
- package/src/{codegen → transpiler/output/codegen}/types/ITypeValidatorDeps.ts +4 -4
- package/src/{codegen → transpiler/output/codegen}/types/TTypeInfo.ts +1 -0
- package/src/{codegen → transpiler/output/codegen}/types/TYPE_MAP.ts +1 -1
- package/src/transpiler/output/headers/ExternalTypeHeaderBuilder.ts +65 -0
- package/src/{codegen → transpiler/output/headers}/HeaderGenerator.test.ts +5 -5
- package/src/{codegen → transpiler/output/headers}/HeaderGenerator.ts +11 -11
- package/src/transpiler/output/headers/__tests__/ExternalTypeHeaderBuilder.test.ts +219 -0
- package/src/{codegen/headerGenerators → transpiler/output/headers/generators}/IHeaderTypeInput.ts +1 -1
- package/src/{codegen/headerGenerators → transpiler/output/headers/generators}/generateStructHeader.ts +1 -1
- package/src/{codegen/headerGenerators → transpiler/output/headers/generators}/mapType.ts +1 -1
- package/src/{pipeline → transpiler}/types/ICachedFileEntry.ts +1 -1
- package/src/{codegen/generators/ISymbolInfo.ts → transpiler/types/ICodeGenSymbols.ts} +3 -7
- package/src/{pipeline → transpiler}/types/IFileResult.ts +4 -0
- package/src/transpiler/types/ITranspileContext.ts +49 -0
- package/src/transpiler/types/ITranspileContribution.ts +32 -0
- package/src/{pipeline/types/IPipelineConfig.ts → transpiler/types/ITranspilerConfig.ts} +3 -3
- package/src/{pipeline/types/IPipelineResult.ts → transpiler/types/ITranspilerResult.ts} +4 -4
- package/src/transpiler/types/TranspilerState.ts +199 -0
- package/src/transpiler/types/__tests__/TranspilerState.test.ts +242 -0
- package/src/utils/CppNamespaceUtils.test.ts +4 -4
- package/src/utils/CppNamespaceUtils.ts +3 -3
- package/src/utils/ExpressionUtils.test.ts +2 -2
- package/src/utils/ExpressionUtils.ts +1 -1
- package/src/utils/LiteralUtils.test.ts +2 -2
- package/src/utils/LiteralUtils.ts +1 -1
- package/src/{pipeline → utils/cache}/CacheManager.ts +114 -7
- package/src/{pipeline → utils/cache}/__tests__/CacheManager.test.ts +514 -1
- package/src/pipeline/Pipeline.ts +0 -1715
- package/src/project/Project.ts +0 -233
- package/src/project/__tests__/Project.test.ts +0 -368
- package/src/project/types/IProjectConfig.ts +0 -48
- package/src/project/types/IProjectResult.ts +0 -27
- /package/src/{project → transpiler/data}/FileDiscovery.ts +0 -0
- /package/src/{lib → transpiler/data}/IncludeDiscovery.ts +0 -0
- /package/src/{lib → transpiler/data}/InputExpansion.ts +0 -0
- /package/src/{project → transpiler/data}/types/EFileType.ts +0 -0
- /package/src/{project → transpiler/data}/types/IDiscoveredFile.ts +0 -0
- /package/src/{project → transpiler/data}/types/IDiscoveryOptions.ts +0 -0
- /package/src/{analysis → transpiler/logic/analysis}/GrammarCoverageListener.ts +0 -0
- /package/src/{analysis → transpiler/logic/analysis}/ScopeStack.test.ts +0 -0
- /package/src/{analysis → transpiler/logic/analysis}/ScopeStack.ts +0 -0
- /package/src/{analysis → transpiler/logic/analysis}/types/IBaseAnalysisError.ts +0 -0
- /package/src/{analysis → transpiler/logic/analysis}/types/IDeclarationInfo.ts +0 -0
- /package/src/{analysis → transpiler/logic/analysis}/types/IDivisionByZeroError.ts +0 -0
- /package/src/{analysis → transpiler/logic/analysis}/types/IFloatModuloError.ts +0 -0
- /package/src/{analysis → transpiler/logic/analysis}/types/IFunctionCallError.ts +0 -0
- /package/src/{analysis → transpiler/logic/analysis}/types/IGrammarCoverageReport.ts +0 -0
- /package/src/{analysis → transpiler/logic/analysis}/types/IInitializationError.ts +0 -0
- /package/src/{analysis → transpiler/logic/analysis}/types/INullCheckError.ts +0 -0
- /package/src/{analysis → transpiler/logic/analysis}/types/IParameterNamingError.ts +0 -0
- /package/src/{analysis → transpiler/logic/analysis}/types/IStructFieldError.ts +0 -0
- /package/src/{analysis → transpiler/logic/analysis}/types/__tests__/IBaseAnalysisError.test.ts +0 -0
- /package/src/{pipeline → transpiler/logic}/detectCppSyntax.ts +0 -0
- /package/src/{pipeline → transpiler/logic/parser}/__tests__/CNextSourceParser.test.ts +0 -0
- /package/src/{antlr_parser → transpiler/logic/parser}/c/grammar/C.interp +0 -0
- /package/src/{antlr_parser → transpiler/logic/parser}/c/grammar/C.tokens +0 -0
- /package/src/{antlr_parser → transpiler/logic/parser}/c/grammar/CLexer.interp +0 -0
- /package/src/{antlr_parser → transpiler/logic/parser}/c/grammar/CLexer.tokens +0 -0
- /package/src/{antlr_parser → transpiler/logic/parser}/c/grammar/CLexer.ts +0 -0
- /package/src/{antlr_parser → transpiler/logic/parser}/c/grammar/CListener.ts +0 -0
- /package/src/{antlr_parser → transpiler/logic/parser}/c/grammar/CParser.ts +0 -0
- /package/src/{antlr_parser → transpiler/logic/parser}/c/grammar/CVisitor.ts +0 -0
- /package/src/{antlr_parser → transpiler/logic/parser}/cpp/grammar/CPP14Lexer.interp +0 -0
- /package/src/{antlr_parser → transpiler/logic/parser}/cpp/grammar/CPP14Lexer.tokens +0 -0
- /package/src/{antlr_parser → transpiler/logic/parser}/cpp/grammar/CPP14Lexer.ts +0 -0
- /package/src/{antlr_parser → transpiler/logic/parser}/cpp/grammar/CPP14Parser.interp +0 -0
- /package/src/{antlr_parser → transpiler/logic/parser}/cpp/grammar/CPP14Parser.tokens +0 -0
- /package/src/{antlr_parser → transpiler/logic/parser}/cpp/grammar/CPP14Parser.ts +0 -0
- /package/src/{antlr_parser → transpiler/logic/parser}/cpp/grammar/CPP14ParserListener.ts +0 -0
- /package/src/{antlr_parser → transpiler/logic/parser}/cpp/grammar/CPP14ParserVisitor.ts +0 -0
- /package/src/{antlr_parser → transpiler/logic/parser}/grammar/CNext.interp +0 -0
- /package/src/{antlr_parser → transpiler/logic/parser}/grammar/CNext.tokens +0 -0
- /package/src/{antlr_parser → transpiler/logic/parser}/grammar/CNextLexer.interp +0 -0
- /package/src/{antlr_parser → transpiler/logic/parser}/grammar/CNextLexer.tokens +0 -0
- /package/src/{antlr_parser → transpiler/logic/parser}/grammar/CNextLexer.ts +0 -0
- /package/src/{antlr_parser → transpiler/logic/parser}/grammar/CNextListener.ts +0 -0
- /package/src/{antlr_parser → transpiler/logic/parser}/grammar/CNextParser.ts +0 -0
- /package/src/{antlr_parser → transpiler/logic/parser}/grammar/CNextVisitor.ts +0 -0
- /package/src/{preprocessor → transpiler/logic/preprocessor}/Preprocessor.ts +0 -0
- /package/src/{preprocessor → transpiler/logic/preprocessor}/ToolchainDetector.ts +0 -0
- /package/src/{preprocessor → transpiler/logic/preprocessor}/types/IPreprocessOptions.ts +0 -0
- /package/src/{preprocessor → transpiler/logic/preprocessor}/types/IPreprocessResult.ts +0 -0
- /package/src/{preprocessor → transpiler/logic/preprocessor}/types/ISourceMapping.ts +0 -0
- /package/src/{preprocessor → transpiler/logic/preprocessor}/types/IToolchain.ts +0 -0
- /package/src/{symbol_resolution → transpiler/logic/symbols}/SymbolUtils.test.ts +0 -0
- /package/src/{symbol_resolution → transpiler/logic/symbols}/SymbolUtils.ts +0 -0
- /package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/types/IScopeCollectorResult.ts +0 -0
- /package/src/{symbol_resolution → transpiler/logic/symbols}/cnext/utils/ExpressionEvaluator.ts +0 -0
- /package/src/{symbol_resolution → transpiler/logic/symbols}/types/IBitmapFieldInfo.ts +0 -0
- /package/src/{symbol_resolution → transpiler/logic/symbols}/types/IFieldInfo.ts +0 -0
- /package/src/{symbol_resolution → transpiler/logic/symbols}/types/IParameterInfo.ts +0 -0
- /package/src/{symbol_resolution → transpiler/logic/symbols}/types/IRegisterMemberInfo.ts +0 -0
- /package/src/{symbol_resolution → transpiler/logic/symbols}/types/IStructFieldInfo.ts +0 -0
- /package/src/{symbol_resolution → transpiler/logic/symbols}/types/TSymbol.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/TypeRegistrationUtils.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/__tests__/TypeRegistrationUtils.test.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/assignment/AssignmentKind.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/assignment/__tests__/AssignmentClassifier.test.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/assignment/handlers/ArrayHandlers.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/assignment/handlers/RegisterUtils.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/assignment/handlers/SimpleHandler.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/assignment/handlers/TAssignmentHandler.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/assignment/handlers/__tests__/RegisterUtils.test.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/assignment/handlers/__tests__/StringHandlers.test.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/assignment/handlers/index.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/assignment/index.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/generators/GeneratorRegistry.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/generators/IGeneratorOutput.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/generators/IGeneratorState.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/generators/TGeneratorEffect.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/generators/TGeneratorFn.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/generators/TIncludeHeader.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/generators/expressions/AccessExprGenerator.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/generators/expressions/CallExprUtils.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/generators/expressions/__tests__/BinaryExprUtils.test.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/generators/expressions/__tests__/CallExprUtils.test.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/generators/statements/AtomicGenerator.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/generators/support/HelperGenerator.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/memberAccessChain.test.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/memberAccessChain.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/types/C_TYPE_WIDTH.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/types/FLOAT_TYPES.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/types/ICallbackTypeInfo.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/types/IFunctionSignature.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/types/IHeaderOptions.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/types/INTEGER_TYPES.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/types/ITargetCapabilities.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/types/SIGNED_TYPES.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/types/TOverflowBehavior.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/types/TParameterInfo.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/types/TYPE_LIMITS.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/types/TYPE_RANGES.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/types/TYPE_WIDTH.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/types/UNSIGNED_TYPES.ts +0 -0
- /package/src/{codegen → transpiler/output/codegen}/types/WIDER_TYPE_MAP.ts +0 -0
- /package/src/{codegen/headerGenerators → transpiler/output/headers/generators}/generateBitmapHeader.test.ts +0 -0
- /package/src/{codegen/headerGenerators → transpiler/output/headers/generators}/generateBitmapHeader.ts +0 -0
- /package/src/{codegen/headerGenerators → transpiler/output/headers/generators}/generateEnumHeader.test.ts +0 -0
- /package/src/{codegen/headerGenerators → transpiler/output/headers/generators}/generateEnumHeader.ts +0 -0
- /package/src/{codegen/headerGenerators → transpiler/output/headers/generators}/generateStructHeader.test.ts +0 -0
- /package/src/{codegen/headerGenerators → transpiler/output/headers/generators}/mapType.test.ts +0 -0
- /package/src/{codegen → transpiler}/types/BITMAP_BACKING_TYPE.ts +0 -0
- /package/src/{codegen → transpiler}/types/BITMAP_SIZE.ts +0 -0
- /package/src/{codegen → transpiler}/types/ECommentType.ts +0 -0
- /package/src/{pipeline → transpiler}/types/ICacheConfig.ts +0 -0
- /package/src/{pipeline → transpiler}/types/ICacheSymbols.ts +0 -0
- /package/src/{codegen → transpiler}/types/IComment.ts +0 -0
- /package/src/{codegen → transpiler}/types/ICommentError.ts +0 -0
- /package/src/{pipeline → transpiler}/types/ISerializedSymbol.ts +0 -0
- /package/src/{pipeline → utils}/cache/CacheKeyGenerator.ts +0 -0
- /package/src/{pipeline → utils}/cache/__tests__/CacheKeyGenerator.test.ts +0 -0
- /package/src/{constants → utils/constants}/TypeConstants.test.ts +0 -0
- /package/src/{constants → utils/constants}/TypeConstants.ts +0 -0
- /package/src/{constants → utils/constants}/TypeMappings.ts +0 -0
- /package/src/{types → utils/types}/ESourceLanguage.ts +0 -0
- /package/src/{types → utils/types}/ESymbolKind.ts +0 -0
- /package/src/{types → utils/types}/ISymbol.ts +0 -0
package/README.md
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
[](LICENSE)
|
|
6
6
|
[](https://sonarcloud.io/summary/new_code?id=jlaustill_c-next)
|
|
7
7
|
[](https://sonarcloud.io/summary/new_code?id=jlaustill_c-next)
|
|
8
|
+
[](https://jlaustill.github.io/c-next/coverage/)
|
|
8
9
|
[](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.
|
|
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/
|
|
11
|
-
"antlr:c": "antlr4ng -Dlanguage=TypeScript -visitor -listener -o src/
|
|
12
|
-
"antlr:cpp:lexer": "antlr4ng -Dlanguage=TypeScript -o src/
|
|
13
|
-
"antlr:cpp:parser": "antlr4ng -Dlanguage=TypeScript -visitor -listener -o src/
|
|
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/
|
|
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,
|
|
7
|
-
import {
|
|
8
|
-
import InputExpansion from "../
|
|
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 =
|
|
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;
|