using System;
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
namespace LocalMcp.UnityServer
{
#if UNITY_EDITOR
/// <summary>
/// Provides compile status checking and wait functionality
/// </summary>
public static class CompileWaitHelper
{
/// <summary>
/// Checks if Unity is currently compiling scripts
/// </summary>
public static string GetCompileStatus(object id)
{
try
{
var result = new CompileStatusResult
{
isCompiling = EditorApplication.isCompiling,
isUpdating = EditorApplication.isUpdating,
canProceed = !EditorApplication.isCompiling && !EditorApplication.isUpdating
};
var response = JsonRpcResponse.Success(result, id);
return response.ToJson();
}
catch (Exception e)
{
Debug.LogError($"[MCP] GetCompileStatus error: {e.Message}\n{e.StackTrace}");
return JsonRpcResponseHelper.ErrorMessage($"Failed to get compile status: {e.Message}", id);
}
}
/// <summary>
/// Waits for compilation to complete (non-blocking check)
/// Use this to check if it's safe to proceed with operations that require compiled scripts
/// </summary>
public static string WaitForCompile(string paramsJson, object id)
{
try
{
var parameters = JsonUtility.FromJson<WaitForCompileParams>(paramsJson);
double timeout = parameters.timeout > 0 ? parameters.timeout : 30.0;
if (EditorApplication.isCompiling)
{
return JsonRpcResponseHelper.ErrorMessage(
$"Unity is currently compiling scripts. Please retry after compilation completes. " +
$"Use unity.compile.status to check compilation status.",
id
);
}
if (EditorApplication.isUpdating)
{
return JsonRpcResponseHelper.ErrorMessage(
"Unity is currently updating assets. Please retry after update completes.",
id
);
}
var result = new WaitForCompileResult
{
success = true,
canProceed = true,
message = "Compilation is complete. Safe to proceed."
};
var response = JsonRpcResponse.Success(result, id);
return response.ToJson();
}
catch (Exception e)
{
Debug.LogError($"[MCP] WaitForCompile error: {e.Message}\n{e.StackTrace}");
return JsonRpcResponseHelper.ErrorMessage($"Failed to wait for compile: {e.Message}", id);
}
}
/// <summary>
/// Helper method to create compile-in-progress error message
/// </summary>
public static string CreateCompileInProgressError(object id)
{
return JsonRpcResponseHelper.ErrorMessage(
"Unity is currently compiling scripts. Please use 'unity.compile.status' to check " +
"compilation status, then retry after compilation completes.",
id
);
}
/// <summary>
/// Helper method to check if operations can proceed
/// </summary>
public static bool CanProceed()
{
return !EditorApplication.isCompiling && !EditorApplication.isUpdating;
}
}
#region Data Structures
[Serializable]
public class CompileStatusResult
{
public bool isCompiling;
public bool isUpdating;
public bool canProceed;
}
[Serializable]
public class WaitForCompileParams
{
public double timeout; // Timeout in seconds (default: 30)
}
[Serializable]
public class WaitForCompileResult
{
public bool success;
public bool canProceed;
public string message;
}
#endregion
#endif
}