File: src\RoslynAnalyzers\Utilities\Compiler\AdditionalFileProvider.cs
Web Access
Project: src\src\RoslynAnalyzers\Microsoft.CodeAnalysis.AnalyzerUtilities\Microsoft.CodeAnalysis.AnalyzerUtilities.csproj (Microsoft.CodeAnalysis.AnalyzerUtilities)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Diagnostics;
 
namespace Analyzer.Utilities
{
    /// <summary>
    /// Provider that allows analyzers to easily find and use
    /// <see href="https://github.com/dotnet/roslyn/blob/main/docs/analyzers/Using%20Additional%20Files.md">additional files</see>.
    /// </summary>
    internal sealed class AdditionalFileProvider
    {
        private readonly ImmutableArray<AdditionalText> _additionalFiles;
 
        internal AdditionalFileProvider(ImmutableArray<AdditionalText> additionalFiles)
        {
            _additionalFiles = additionalFiles;
        }
 
        /// <summary>
        /// Creates an instance of this provider from the specified <see cref="AnalyzerOptions"/>.
        /// </summary>
        /// <param name="options">Options passed to a <see cref="DiagnosticAnalyzer"/>.</param>
        /// <returns>An instance of <see cref="AdditionalFileProvider"/>.</returns>
        public static AdditionalFileProvider FromOptions(AnalyzerOptions options)
            => new(options.AdditionalFiles);
 
        /// <summary>
        /// Returns the first additional file whose name is the specified <paramref name="fileName"/>.
        /// </summary>
        /// <param name="fileName">Name of the file, including extension, to return.</param>
        /// <returns>An additional file or <c>null</c> if no file can be found.</returns>
        public AdditionalText? GetFile(string fileName)
            => _additionalFiles.FirstOrDefault(x => Path.GetFileName(x.Path).Equals(fileName, StringComparison.OrdinalIgnoreCase));
 
        /// <summary>
        /// Returns all additional files whose names match the specified <paramref name="pattern"/>.
        /// </summary>
        /// <param name="pattern">A regular expression.</param>
        /// <returns>An enumeration of additional files whose names match the pattern.</returns>
        public IEnumerable<AdditionalText> GetMatchingFiles(string pattern)
            => _additionalFiles.Where(x => Regex.IsMatch(Path.GetFileName(x.Path), pattern, RegexOptions.IgnoreCase));
    }
}