File: ExternalAccess\UnitTesting\API\NewUnitTestingIncrementalAnalyzerProvider.cs
Web Access
Project: src\src\Features\Core\Portable\Microsoft.CodeAnalysis.Features.csproj (Microsoft.CodeAnalysis.Features)
// 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 Microsoft.CodeAnalysis.ExternalAccess.UnitTesting.SolutionCrawler;
using Microsoft.CodeAnalysis.Host;
using Roslyn.Utilities;
 
namespace Microsoft.CodeAnalysis.ExternalAccess.UnitTesting.Api;
 
internal sealed partial class NewUnitTestingIncrementalAnalyzerProvider : IUnitTestingIncrementalAnalyzerProvider
{
    private readonly string? _workspaceKind;
    private readonly SolutionServices _services;
    private readonly INewUnitTestingIncrementalAnalyzerProviderImplementation _incrementalAnalyzerProvider;
 
    private IUnitTestingIncrementalAnalyzer? _lazyAnalyzer;
 
    private NewUnitTestingIncrementalAnalyzerProvider(
        string? workspaceKind,
        SolutionServices services,
        INewUnitTestingIncrementalAnalyzerProviderImplementation incrementalAnalyzerProvider)
    {
        _workspaceKind = workspaceKind;
        _services = services;
        _incrementalAnalyzerProvider = incrementalAnalyzerProvider;
    }
 
    // NOTE: We're currently expecting the analyzer to be singleton, so that
    //       analyzers returned when calling this method twice would pass a reference equality check.
    //       One instance should be created by SolutionCrawler, another one by us, when calling the
    //       UnitTestingSolutionCrawlerServiceAccessor.Reanalyze method.
    public IUnitTestingIncrementalAnalyzer CreateIncrementalAnalyzer()
        => _lazyAnalyzer ??= new NewUnitTestingIncrementalAnalyzer(_incrementalAnalyzerProvider.CreateIncrementalAnalyzer());
 
    public void Reanalyze()
    {
        var solutionCrawlerService = _services.GetService<IUnitTestingSolutionCrawlerService>();
        solutionCrawlerService?.Reanalyze(
            _workspaceKind, _services, this.CreateIncrementalAnalyzer(), projectIds: null, documentIds: null);
    }
 
    public static NewUnitTestingIncrementalAnalyzerProvider? TryRegister(string? workspaceKind, SolutionServices services, string analyzerName, INewUnitTestingIncrementalAnalyzerProviderImplementation provider)
    {
        Contract.ThrowIfNull(workspaceKind);
        var solutionCrawlerRegistrationService = services.GetService<IUnitTestingSolutionCrawlerRegistrationService>();
        if (solutionCrawlerRegistrationService == null)
        {
            return null;
        }
 
        var analyzerProvider = new NewUnitTestingIncrementalAnalyzerProvider(workspaceKind, services, provider);
 
        var metadata = new UnitTestingIncrementalAnalyzerProviderMetadata(
            analyzerName,
            [workspaceKind]);
 
        solutionCrawlerRegistrationService.AddAnalyzerProvider(analyzerProvider, metadata);
        return analyzerProvider;
    }
}