File: SetRidAgnosticValueForProjects.cs
Web Access
Project: src\msbuild\src\Tasks\Microsoft.Build.Tasks.csproj (Microsoft.Build.Tasks.Core)
// 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.Linq;
using Microsoft.Build.Framework;
using Microsoft.Build.Shared;
using Microsoft.Build.Utilities;

namespace Microsoft.Build.Tasks
{
    [MSBuildMultiThreadableTask]
    public sealed class SetRidAgnosticValueForProjects : TaskExtension
    {
        public ITaskItem[] Projects { get; set; } = Array.Empty<ITaskItem>();

        [Output]
        public ITaskItem[] UpdatedProjects { get; set; } = Array.Empty<ITaskItem>();

        public override bool Execute()
        {
            UpdatedProjects = Projects
                .Select(p =>
                {
                    var hasSingleTargetFrameworkString = p.GetMetadata("HasSingleTargetFramework");
                    if (!ConversionUtilities.ValidBooleanFalse(hasSingleTargetFrameworkString))
                    {
                        // No change to item, it should already have a single-valued IsRidAgnostic value
                        return p;
                    }
                    var updatedItem = new TaskItem(p);

                    var nearestTargetFramework = p.GetMetadata("NearestTargetFramework");
                    if (string.IsNullOrEmpty(nearestTargetFramework))
                    {
                        return p;
                    }

                    var targetFrameworksArray = p.GetMetadata("TargetFrameworks").Split(';');

                    int targetFrameworkIndex = Array.IndexOf(targetFrameworksArray, nearestTargetFramework);
                    if (targetFrameworkIndex < 0)
                    {
                        return p;
                    }

                    var isRidAgnosticArray = p.GetMetadata("IsRidAgnostic").Split(';');
                    if (isRidAgnosticArray.Length != targetFrameworksArray.Length)
                    {
                        return p;
                    }

                    updatedItem.SetMetadata("IsRidAgnostic", isRidAgnosticArray[targetFrameworkIndex]);

                    return updatedItem;
                })
                .ToArray();

            return true;
        }
    }
}