File: Graph\GraphBuildResult.cs
Web Access
Project: ..\..\..\src\Build\Microsoft.Build.csproj (Microsoft.Build)
// 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];
    }
}