// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "uLang/Toolchain/Toolchain.h" #include "uLang/Common/Containers/SharedPointer.h" #include "uLang/Common/Containers/Array.h" #include "uLang/CompilerPasses/IPostIrFilter.h" #include "uLang/CompilerPasses/IPostSemanticAnalysisFilter.h" #include "uLang/Diagnostics/Diagnostics.h" #define UE_API VERSECOMPILER_API namespace uLang { // Forward declarations class CUTF8StringView; struct SToolchainOverrides { TOptional> Parser; TOptional> PostVstFilters; TOptional> SemanticAnalyzer; TOptional> PostSemanticAnalysisFilters; TOptional> PostIrFilters; TOptional> Assembler; TOptional> PreParseInjections; TOptional> PostParseInjections; TOptional> PreSemAnalysisInjections; TOptional> IntraSemAnalysisInjections; TOptional> PostSemAnalysisInjections; TOptional> PreTranslateInjections; TOptional> PreLinkInjections; }; struct SBuildManagerParams { // For the pieces of this that are set, the toolchain will be constructed // using those specified parts -- for the other toolchain pieces, the // build-manager will perform auto-discovery to fill the rest out. SToolchainOverrides _ToolchainOverrides; //SToolchainParams _ToolchainParams; TSPtr _ExistingProgram; // Optional existing program }; class CProgramBuildManager : public CSharedMix { public: UE_API CProgramBuildManager(const SBuildManagerParams& Params); UE_API ~CProgramBuildManager(); UE_API void SetSourceProject(const TSRef& Project); UE_API void AddSourceSnippet(const TSRef& Snippet, const CUTF8StringView& PackageName, const CUTF8StringView& PackageVersePath); UE_API void RemoveSourceSnippet(const TSRef& Snippet); UE_API const CSourceProject::SPackage& FindOrAddSourcePackage(const CUTF8StringView& PackageName, const CUTF8StringView& PackageVersePath); UE_API SBuildResults Build(const SBuildParams& Params, TSRef Diagnostics); const TSRef& GetToolchain() const { return _Toolchain; } const SProgramContext& GetProgramContext() const { return _ProgramContext; } const TSRef& GetSourceProject() const { return _SourceProject; } const TUPtr& GetPackageUsage() const { return _PackageUsage; } TArray TakeLocalizationInfo() { return _Toolchain->TakeLocalizationInfo(); } TArray TakeStringInfo() { return _Toolchain->TakeStringInfo(); } UE_API SBuildResults BuildProject(const CSourceProject& SourceProject, const SBuildContext& BuildContext); UE_API ECompilerResult ParseSnippet(const uLang::TSRef& OutVst, const CUTF8StringView& TextSnippet, const SBuildContext& BuildContext); UE_API ECompilerResult SemanticAnalyzeVst(TOptional>& OutProgram, const TSRef& Vst, const SBuildContext& BuildContext); UE_API ECompilerResult IrGenerateProgram(const TSRef& Program, const SBuildContext& BuildContext); UE_API ECompilerResult AssembleProgram(const TSRef& Program, const SBuildContext& BuildContext); UE_API ELinkerResult Link(const SBuildContext& BuildContext); UE_API void ResetSemanticProgram(); const TSPtr& GetProjectVst() const { return _Toolchain->GetProjectVst(); } void SetProjectVst(const TSRef& NewProject) { return _Toolchain->SetProjectVst(NewProject); } UE_API void EnablePackageUsage(bool bEnable = true); private: UE_API void OnBuildDiagnostic(const TSRef& Diagnostic); UE_API void OnBuildStatistic(const SBuildEventInfo& EventInfo); TSRef _Toolchain; SProgramContext _ProgramContext; TSRef _SourceProject; TUPtr _PackageUsage; bool bEnablePackageUsage = false; }; } // namespace uLang #undef UE_API