File: AdhocWorkspaceServices.cs
Web Access
Project: src\src\Razor\src\Razor\src\Microsoft.CodeAnalysis.Razor.Workspaces\Microsoft.CodeAnalysis.Razor.Workspaces.csproj (Microsoft.CodeAnalysis.Razor.Workspaces)
// 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.Collections.Immutable;
using Microsoft.CodeAnalysis.Host;
 
namespace Microsoft.CodeAnalysis.Razor.Workspaces;
 
internal sealed class AdhocWorkspaceServices : HostWorkspaceServices
{
    private readonly AdhocServices _hostServices;
    private readonly AdhocLanguageServices _languageServices;
    private readonly ImmutableArray<IWorkspaceService> _workspaceServices;
    private readonly Workspace _workspace;
    private readonly HostWorkspaceServices _fallbackServices;
 
    public AdhocWorkspaceServices(
        AdhocServices hostServices,
        ImmutableArray<IWorkspaceService> workspaceServices,
        ImmutableArray<ILanguageService> languageServices,
        Workspace workspace,
        HostWorkspaceServices fallbackServices)
    {
        _hostServices = hostServices;
        _workspaceServices = workspaceServices;
        _workspace = workspace;
        _fallbackServices = fallbackServices;
        _languageServices = new AdhocLanguageServices(this, languageServices);
    }
 
    public override HostServices HostServices => _hostServices;
 
    public override Workspace Workspace => _workspace;
 
    public override TWorkspaceService? GetService<TWorkspaceService>()
        where TWorkspaceService : default
    {
        foreach (var service in _workspaceServices)
        {
            if (service is TWorkspaceService workspaceService)
            {
                return workspaceService;
            }
        }
 
        // Fallback to default host services to resolve roslyn specific features.
        return _fallbackServices.GetService<TWorkspaceService>();
    }
 
    public override HostLanguageServices GetLanguageServices(string languageName)
    {
        if (languageName == RazorLanguage.Name)
        {
            return _languageServices;
        }
 
        // Fallback to default host services to resolve roslyn specific features.
        return _fallbackServices.GetLanguageServices(languageName);
    }
 
    public override IEnumerable<string> SupportedLanguages => new[] { RazorLanguage.Name };
 
    public override bool IsSupported(string languageName) => languageName == RazorLanguage.Name;
 
    public override IEnumerable<TLanguageService> FindLanguageServices<TLanguageService>(MetadataFilter filter)
        => throw new NotImplementedException();
}