// Copyright Epic Games, Inc. All Rights Reserved. #include "uLang/Toolchain/ProgramBuildManager.h" #include "uLang/Toolchain/ModularFeatureManager.h" namespace uLang { static TSRef MakeNewSemanticProgram() { const auto NewSemanticProgram = TSRef::New(); NewSemanticProgram->Initialize(); NewSemanticProgram->PopulateCoreAPI(); return NewSemanticProgram; } static SToolchainParams MakeToolchainParams(const SToolchainOverrides& ToolchainOverrides) { SToolchainParams ToolchainParams; // // Pre-Parse Injections if (ToolchainOverrides.PreParseInjections.IsSet()) { ToolchainParams.LayerInjections._PreParseInjections = *ToolchainOverrides.PreParseInjections; } else { ToolchainParams.LayerInjections._PreParseInjections = GetModularFeaturesOfType(); } // // Parser if (ToolchainOverrides.Parser.IsSet()) { if (ToolchainOverrides.Parser->IsValid()) { ToolchainParams.Parser = ToolchainOverrides.Parser->AsRef(); } } else { ToolchainParams.Parser = GetModularFeature(); } // // Post-Parse Injections if (ToolchainOverrides.PostParseInjections.IsSet()) { ToolchainParams.LayerInjections._PostParseInjections = *ToolchainOverrides.PostParseInjections; } else { ToolchainParams.LayerInjections._PostParseInjections = GetModularFeaturesOfType(); } // // Vst Filters if (ToolchainOverrides.PostVstFilters.IsSet()) { ToolchainParams.PostVstFilters = *ToolchainOverrides.PostVstFilters; } else { ToolchainParams.PostVstFilters = GetModularFeaturesOfType(); } // // Pre-SemanticAnalysis Injections if (ToolchainOverrides.PreSemAnalysisInjections.IsSet()) { ToolchainParams.LayerInjections._PreSemAnalysisInjections = *ToolchainOverrides.PreSemAnalysisInjections; } else { ToolchainParams.LayerInjections._PreSemAnalysisInjections = GetModularFeaturesOfType(); } // // Semantic Analyzer if (ToolchainOverrides.SemanticAnalyzer.IsSet()) { if (ToolchainOverrides.SemanticAnalyzer->IsValid()) { ToolchainParams.SemanticAnalyzer = ToolchainOverrides.SemanticAnalyzer->AsRef(); } } else { ToolchainParams.SemanticAnalyzer = GetModularFeature(); } // // Intra-SemanticAnalysis Injections if (ToolchainOverrides.IntraSemAnalysisInjections.IsSet()) { ToolchainParams.LayerInjections._IntraSemAnalysisInjections = *ToolchainOverrides.IntraSemAnalysisInjections; } else { ToolchainParams.LayerInjections._IntraSemAnalysisInjections = GetModularFeaturesOfType(); } // // Post-SemanticAnalysis Injections if (ToolchainOverrides.PostSemAnalysisInjections.IsSet()) { ToolchainParams.LayerInjections._PostSemAnalysisInjections = *ToolchainOverrides.PostSemAnalysisInjections; } else { ToolchainParams.LayerInjections._PostSemAnalysisInjections = GetModularFeaturesOfType(); } // // AST Filters if (ToolchainOverrides.PostSemanticAnalysisFilters.IsSet()) { ToolchainParams.PostSemanticAnalysisFilters = *ToolchainOverrides.PostSemanticAnalysisFilters; } else { ToolchainParams.PostSemanticAnalysisFilters = GetModularFeaturesOfType(); } // // IR Filters if (ToolchainOverrides.PostIrFilters.IsSet()) { ToolchainParams.PostIrFilters = *ToolchainOverrides.PostIrFilters; } else { ToolchainParams.PostIrFilters = GetModularFeaturesOfType(); } // // Pre-Translate Injections if (ToolchainOverrides.PreTranslateInjections.IsSet()) { ToolchainParams.LayerInjections._PreTranslateInjections = *ToolchainOverrides.PreTranslateInjections; } else { ToolchainParams.LayerInjections._PreTranslateInjections = GetModularFeaturesOfType(); } // // Pre-Link Injections if (ToolchainOverrides.PreLinkInjections.IsSet()) { ToolchainParams.LayerInjections._PreLinkInjections = *ToolchainOverrides.PreLinkInjections; } else { ToolchainParams.LayerInjections._PreLinkInjections = GetModularFeaturesOfType(); } // // Intermediate representation { ToolchainParams.IrGenerator = GetModularFeature(); } // // Backend/Assembler if (ToolchainOverrides.Assembler.IsSet()) { if (ToolchainOverrides.Assembler->IsValid()) { ToolchainParams.Assembler = ToolchainOverrides.Assembler->AsRef(); } } else { ToolchainParams.Assembler = GetModularFeature(); } return ToolchainParams; } CProgramBuildManager::CProgramBuildManager(const SBuildManagerParams& Params) : _Toolchain(CreateToolchain(MakeToolchainParams(Params._ToolchainOverrides))) , _ProgramContext(Params._ExistingProgram.IsValid() ? Params._ExistingProgram.AsRef() : MakeNewSemanticProgram()) , _SourceProject(TSRef::New("ProgramBuildManager")) { } SBuildResults CProgramBuildManager::BuildProject(const CSourceProject& SourceProject, const SBuildContext& BuildContext) { return _Toolchain->BuildProject(SourceProject, BuildContext, _ProgramContext); } ECompilerResult CProgramBuildManager::ParseSnippet(const uLang::TSRef& OutVst, const CUTF8StringView& TextSnippet, const SBuildContext& BuildContext) { return _Toolchain->ParseSnippet(OutVst, TextSnippet, BuildContext); } ECompilerResult CProgramBuildManager::SemanticAnalyzeVst(TOptional>& OutProgram, const TSRef& Vst, const SBuildContext& BuildContext) { return _Toolchain->SemanticAnalyzeVst(OutProgram, Vst, BuildContext, _ProgramContext); } ECompilerResult CProgramBuildManager::IrGenerateProgram(const TSRef& Program, const SBuildContext& BuildContext) { return _Toolchain->IrGenerateProgram(Program, BuildContext, _ProgramContext); } ECompilerResult CProgramBuildManager::AssembleProgram(const TSRef& Program, const SBuildContext& BuildContext) { return _Toolchain->AssembleProgram(Program, BuildContext, _ProgramContext); } ELinkerResult CProgramBuildManager::Link(const SBuildContext& BuildContext) { return _Toolchain->Link(BuildContext, _ProgramContext); } CProgramBuildManager::~CProgramBuildManager() { } void CProgramBuildManager::SetSourceProject(const TSRef& Project) { _SourceProject = Project; } void CProgramBuildManager::AddSourceSnippet(const TSRef& Snippet, const CUTF8StringView& PackageName, const CUTF8StringView& PackageVersePath) { _SourceProject->AddSnippet(Snippet, PackageName, PackageVersePath); } void CProgramBuildManager::RemoveSourceSnippet(const TSRef& Snippet) { _SourceProject->RemoveSnippet(Snippet); } const CSourceProject::SPackage& CProgramBuildManager::FindOrAddSourcePackage(const CUTF8StringView& PackageName, const CUTF8StringView& PackageVersePath) { return _SourceProject->FindOrAddPackage(PackageName, PackageVersePath); } void CProgramBuildManager::ResetSemanticProgram() { _ProgramContext = SProgramContext(MakeNewSemanticProgram()); } void CProgramBuildManager::EnablePackageUsage(bool bEnable) { bEnablePackageUsage = bEnable; } SBuildResults CProgramBuildManager::Build(const SBuildParams& Params, TSRef Diagnostics) { SBuildContext BuildContext(Diagnostics); BuildContext._Params = Params; if (bEnablePackageUsage) { BuildContext._PackageUsage.SetNew(); } ResetSemanticProgram(); //Jira SOL-1805, we may need to create a new source project here //_SourceProject = TSRef::New("ProgramBuildManager"); SBuildResults Results = _Toolchain->BuildProject(*_SourceProject, BuildContext, _ProgramContext); _PackageUsage = Move(BuildContext._PackageUsage); return Results; } } // namespace uLang