// 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 System.IO; using System.Linq; using Microsoft.DotNet.Internal.ProjectModel; using Microsoft.DotNet.Internal.ProjectModel.FileSystemGlobbing; using Microsoft.DotNet.Internal.ProjectModel.FileSystemGlobbing.Abstractions; namespace Microsoft.DotNet.Tools.Compiler { internal class ProjectGlobbingResolver { internal IEnumerable Resolve(IEnumerable values) { var currentDirectory = Directory.GetCurrentDirectory(); if (!values.Any()) { var fileName = Path.Combine(currentDirectory, Project.FileName); if (!File.Exists(fileName)) { throw new InvalidOperationException($"Couldn't find '{Project.FileName}' in current directory"); } yield return fileName; yield break; } foreach (var value in values) { var fileName = Path.Combine(currentDirectory, value); if (File.Exists(fileName)) { yield return value; continue; } fileName = Path.Combine(currentDirectory, value, Project.FileName); if (File.Exists(fileName)) { yield return fileName; continue; } var matcher = new Matcher(); matcher.AddInclude(value); var result = matcher.Execute(new DirectoryInfoWrapper(new DirectoryInfo(currentDirectory))); if (result.Files.Any()) { foreach (var filePatternMatch in result.Files) { yield return filePatternMatch.Path; } } else if (value.Contains("*")) { throw new InvalidOperationException($"Globbing pattern '{value}' did not match any files"); } else if (value.EndsWith(Project.FileName)) { throw new InvalidOperationException($"Could not find project file '{value}'"); } else { throw new InvalidOperationException($"Couldn't find '{Project.FileName}' in '{value}'"); } } } } }