using Microsoft.Build.Execution;
namespace SharpIDE.Application.Features.Build;
public static class BuildManagerExtensions
{
///
/// Convenience method. Submits a lone build request and returns a Task that will complete when results are available.
///
/// Thrown if a build is already in progress.
public static async Task BuildAsync(this BuildManager buildManager, BuildParameters parameters, BuildRequestData requestData, CancellationToken cancellationToken = default)
{
BuildResult result;
buildManager.BeginBuild(parameters);
try
{
var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
await using var _ = cancellationToken.Register(() => buildManager.CancelAllSubmissions()).ConfigureAwait(false);
try
{
var buildSubmission = buildManager.PendBuildRequest(requestData);
buildSubmission.ExecuteAsync(sub =>
{
var buildResult = sub.BuildResult!;
tcs.SetResult(buildResult);
}, null);
}
catch (Exception ex)
{
tcs.SetException(ex);
}
result = await tcs.Task.ConfigureAwait(false);
}
finally
{
buildManager.EndBuild();
}
return result;
}
}