|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using Microsoft.Build.Exceptions;
using Microsoft.Build.Execution;
namespace Microsoft.Build.Graph
{
public sealed class GraphBuildResult : BuildResultBase
{
/// <summary>
/// Constructor creates a build result with results for each graph node.
/// </summary>
/// <param name="submissionId">The id of the build submission.</param>
/// <param name="resultsByNode">The set of results for each graph node.</param>
internal GraphBuildResult(int submissionId, IReadOnlyDictionary<ProjectGraphNode, BuildResult> resultsByNode)
{
SubmissionId = submissionId;
ResultsByNode = resultsByNode;
}
/// <summary>
/// Constructs a graph build result with an exception
/// </summary>
/// <param name="submissionId">The id of the build submission.</param>
/// <param name="exception">The exception, if any.</param>
internal GraphBuildResult(int submissionId, Exception exception)
{
SubmissionId = submissionId;
Exception = exception;
ResultsByNode = ImmutableDictionary<ProjectGraphNode, BuildResult>.Empty;
}
/// <summary>
/// Returns the submission id.
/// </summary>
public override int SubmissionId { get; }
/// <summary>
/// Returns a flag indicating if a circular dependency was detected.
/// </summary>
public override bool CircularDependency => Exception is CircularDependencyException;
/// <summary>
/// Returns the exception generated while this result was run, if any.
/// </summary>
public override Exception? Exception { get; internal set; }
/// <summary>
/// Returns the overall result for this result set.
/// </summary>
public override BuildResultCode OverallResult
{
get
{
if (Exception != null)
{
return BuildResultCode.Failure;
}
foreach (KeyValuePair<ProjectGraphNode, BuildResult> result in ResultsByNode)
{
if (result.Value.OverallResult == BuildResultCode.Failure)
{
return BuildResultCode.Failure;
}
}
return BuildResultCode.Success;
}
}
/// <summary>
/// Returns an enumerator for all build results in this graph build result
/// </summary>
public IReadOnlyDictionary<ProjectGraphNode, BuildResult> ResultsByNode { get; }
/// <summary>
/// Indexer which sets or returns results for the specified node
/// </summary>
/// <param name="node">The node</param>
/// <returns>The results for the specified node</returns>
/// <exception>KeyNotFoundException is returned if the specified node doesn't exist when reading this property.</exception>
public BuildResult this[ProjectGraphNode node] => ResultsByNode[node];
}
}
|