File: Workspaces\TestWorkspaceServices.cs
Web Access
Project: src\src\Razor\src\Razor\test\Microsoft.AspNetCore.Razor.Test.Common.Tooling\Microsoft.AspNetCore.Razor.Test.Common.Tooling.csproj (Microsoft.AspNetCore.Razor.Test.Common.Tooling)
// 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.Collections.Generic;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Host;
using Microsoft.CodeAnalysis.Razor;
 
namespace Microsoft.AspNetCore.Razor.Test.Common.Workspaces;
 
internal class TestWorkspaceServices : HostWorkspaceServices
{
    private static readonly Workspace s_defaultWorkspace = TestWorkspace.Create();
 
    private readonly HostServices _hostServices;
    private readonly HostLanguageServices _languageServices;
    private readonly IEnumerable<IWorkspaceService> _workspaceServices;
    private readonly Workspace _workspace;
 
    public TestWorkspaceServices(
        HostServices hostServices,
        IEnumerable<IWorkspaceService> workspaceServices,
        IEnumerable<ILanguageService> languageServices,
        Workspace workspace)
    {
        _hostServices = hostServices;
        _workspaceServices = workspaceServices;
        _workspace = workspace;
 
        _languageServices = new TestLanguageServices(this, languageServices);
    }
 
    public override HostServices HostServices => _hostServices;
 
    public override Workspace Workspace => _workspace;
 
    public override TWorkspaceService? GetService<TWorkspaceService>()
        where TWorkspaceService : default
    {
        // Fallback to default host services to resolve Roslyn-specific features.
        return _workspaceServices.OfType<TWorkspaceService>().FirstOrDefault()
            ?? s_defaultWorkspace.Services.GetService<TWorkspaceService>();
    }
 
    public override HostLanguageServices GetLanguageServices(string languageName)
    {
        // Fallback to default host services to resolve Roslyn-specific features.
        return languageName == RazorLanguage.Name
            ? _languageServices
            : s_defaultWorkspace.Services.GetLanguageServices(languageName);
    }
 
    public override IEnumerable<string> SupportedLanguages { get; } = new[] { RazorLanguage.Name };
 
    public override bool IsSupported(string languageName)
        => languageName == RazorLanguage.Name;
 
    public override IEnumerable<TLanguageService> FindLanguageServices<TLanguageService>(MetadataFilter filter)
        => throw new NotImplementedException();
}