Files
FlaxEngine/Source/Editor/Scripting/ScriptsBuilder.h
2023-01-10 15:29:37 +01:00

132 lines
5.1 KiB
C++

// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
#pragma once
#include "Engine/Core/Delegate.h"
#include "Engine/Core/Types/String.h"
#include "Engine/Scripting/ScriptingType.h"
/// <summary>
/// Game scrips building service. Compiles user C# scripts into binary assemblies. Exposes many events used to track scripts compilation and reloading.
/// </summary>
API_CLASS(Static, Namespace="FlaxEditor") class ScriptsBuilder
{
DECLARE_SCRIPTING_TYPE_NO_SPAWN(ScriptsBuilder);
public:
typedef Delegate<const String&, const String&, int32> CompileMsgDelegate;
public:
/// <summary>
/// Action called on compilation end, bool param is true if success, otherwise false
/// </summary>
static Delegate<bool> OnCompilationEnd;
/// <summary>
/// Action called when compilation success
/// </summary>
static Action OnCompilationSuccess;
/// <summary>
/// Action called when compilation fails
/// </summary>
static Action OnCompilationFailed;
public:
/// <summary>
/// Gets amount of source code compile actions since Editor startup.
/// </summary>
API_PROPERTY() static int32 GetCompilationsCount();
/// <summary>
/// Checks if last scripting building failed due to errors.
/// </summary>
/// <returns>True if last compilation result was a fail, otherwise false.</returns>
API_PROPERTY() static bool LastCompilationFailed();
/// <summary>
/// Returns true if source code has been edited.
/// </summary>
/// <returns>True if source code is dirty, otherwise false.</returns>
API_PROPERTY() static bool IsSourceDirty();
/// <summary>
/// Returns true if source code workspace has been edited (source file moved or deleted).
/// </summary>
/// <returns>True if source code workspace is dirty, otherwise false.</returns>
API_PROPERTY() static bool IsSourceWorkspaceDirty();
/// <summary>
/// Returns true if source code has been edited and is dirty for given amount of time
/// </summary>
/// <param name="timeout">Time to use for checking.</param>
/// <returns>True if source code is dirty, otherwise false.</returns>
static bool IsSourceDirtyFor(const TimeSpan& timeout);
/// <summary>
/// Returns true if scripts are being now compiled/reloaded.
/// </summary>
/// <returns>True if scripts are being compiled/reloaded now.</returns>
API_PROPERTY() static bool IsCompiling();
/// <summary>
/// Returns true if source code has been compiled and assemblies are ready to load.
/// </summary>
/// <returns>True if assemblies are ready to load.</returns>
API_PROPERTY() static bool IsReady();
/// <summary>
/// Indicates that scripting directory has been modified so scripts need to be rebuild.
/// </summary>
API_FUNCTION() static void MarkWorkspaceDirty();
/// <summary>
/// Checks if need to compile source code. If so calls compilation.
/// </summary>
API_FUNCTION() static void CheckForCompile();
/// <summary>
/// Requests project source code compilation.
/// </summary>
API_FUNCTION() static void Compile();
/// <summary>
/// Invokes the Flax.Build tool in the current project workspace and waits for the process end (blocking). Prints the build tool output to the log. Can be invoked from any thread.
/// </summary>
/// <param name="args">The Flax.Build tool invocation arguments.</param>
/// <param name="workingDir">The custom working directory. Use empty or null to execute build tool in the project folder.</param>
/// <returns>True if failed, otherwise false.</returns>
API_FUNCTION() static bool RunBuildTool(const StringView& args, const StringView& workingDir = StringView::Empty);
/// <summary>
/// Generates the project files.
/// </summary>
/// <param name="customArgs">The additional Flax.Build tool invocation arguments.</param>
/// <returns>True if failed, otherwise false.</returns>
API_FUNCTION() static bool GenerateProject(const StringView& customArgs = StringView::Empty);
/// <summary>
/// Tries to find a script type with the given name.
/// </summary>
/// <param name="scriptName">The script full name.</param>
/// <returns>Found script type or null if missing or invalid name.</returns>
API_FUNCTION() static MClass* FindScript(const StringView& scriptName);
// Gets the list of existing in-build code editors.
API_FUNCTION() static void GetExistingEditors(int32* result, int32 count);
// Gets the options for the game scripts to use for the Editor.
API_FUNCTION() static void GetBinariesConfiguration(API_PARAM(Out) StringView& target, API_PARAM(Out) StringView& platform, API_PARAM(Out) StringView& architecture, API_PARAM(Out) StringView& configuration);
static void GetBinariesConfiguration(const Char*& target, const Char*& platform, const Char*& architecture, const Char*& configuration);
public:
/// <summary>
/// Filters the project namespace text value to be valid (remove whitespace characters and other invalid ones).
/// </summary>
/// <param name="value">The in/out value.</param>
static void FilterNamespaceText(String& value);
};