// Copyright (c) .NET Foundation and contributors. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. using System; using System.Collections.Generic; using Microsoft.Build.Evaluation; using Microsoft.Build.Construction; using Microsoft.DotNet.ProjectModel; using Microsoft.DotNet.Cli.Utils; using Microsoft.DotNet.Cli; using System.Linq; using System.IO; using Newtonsoft.Json; namespace Microsoft.DotNet.ProjectJsonMigration { public class AddItemTransform : ConditionalTransform { private ProjectRootElement _itemObjectGenerator = ProjectRootElement.Create(); private string _itemName; private string _includeValue; private string _excludeValue; private Func _includeValueFunc; private Func _excludeValueFunc; private bool _mergeExisting; private List> _metadata = new List>(); public AddItemTransform( string itemName, IEnumerable includeValues, IEnumerable excludeValues, Func condition, bool mergeExisting = false) : this(itemName, string.Join(";", includeValues), string.Join(";", excludeValues), condition, mergeExisting) { } public AddItemTransform( string itemName, Func includeValueFunc, Func excludeValueFunc, Func condition) : base(condition) { _itemName = itemName; _includeValueFunc = includeValueFunc; _excludeValueFunc = excludeValueFunc; } public AddItemTransform( string itemName, string includeValue, Func excludeValueFunc, Func condition) : base(condition) { _itemName = itemName; _includeValue = includeValue; _excludeValueFunc = excludeValueFunc; } public AddItemTransform( string itemName, Func includeValueFunc, string excludeValue, Func condition) : base(condition) { _itemName = itemName; _includeValueFunc = includeValueFunc; _excludeValue = excludeValue; } public AddItemTransform( string itemName, string includeValue, string excludeValue, Func condition, bool mergeExisting=false) : base(condition) { _itemName = itemName; _includeValue = includeValue; _excludeValue = excludeValue; _mergeExisting = mergeExisting; } public AddItemTransform WithMetadata(string metadataName, string metadataValue) { _metadata.Add(new ItemMetadataValue(metadataName, metadataValue)); return this; } public AddItemTransform WithMetadata(string metadataName, Func metadataValueFunc) { _metadata.Add(new ItemMetadataValue(metadataName, metadataValueFunc)); return this; } public AddItemTransform WithMetadata(ItemMetadataValue metadata) { _metadata.Add(metadata); return this; } public override ProjectItemElement ConditionallyTransform(T source) { string includeValue = _includeValue ?? _includeValueFunc(source); string excludeValue = _excludeValue ?? _excludeValueFunc(source); var item = _itemObjectGenerator.AddItem(_itemName, includeValue); item.Exclude = excludeValue; foreach (var metadata in _metadata) { item.AddMetadata(metadata.MetadataName, metadata.GetMetadataValue(source)); } return item; } } }