File: LanguageServer\RazorInProcLanguageClientCapabilitiesProvider.cs
Web Access
Project: src\src\EditorFeatures\Core\Microsoft.CodeAnalysis.EditorFeatures.csproj (Microsoft.CodeAnalysis.EditorFeatures)
// 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.Composition;
using System.Text.RegularExpressions;
using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.CodeAnalysis.LanguageServer;
using Microsoft.CodeAnalysis.LanguageServer.ExternalAccess.Razor;
using Microsoft.CodeAnalysis.LanguageServer.Handler;
using Microsoft.CodeAnalysis.LanguageServer.Handler.InlineCompletions;
using Roslyn.LanguageServer.Protocol;
 
[ExportCSharpVisualBasicStatelessLspService(typeof(ICapabilitiesProvider), WellKnownLspServerKinds.RazorLspServer), Shared]
[method: ImportingConstructor]
[method: Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
internal sealed class RazorInProcLanguageClientCapabilitiesProvider(DefaultCapabilitiesProvider defaultCapabilitiesProvider) : ICapabilitiesProvider
{
    public ServerCapabilities GetCapabilities(ClientCapabilities clientCapabilities)
    {
        var capabilities = defaultCapabilitiesProvider.GetCapabilities(clientCapabilities);
 
        // Razor doesn't use workspace symbols, so disable to prevent duplicate results (with LiveshareLanguageClient) in liveshare.
        capabilities.WorkspaceSymbolProvider = false;
 
        if (capabilities is VSInternalServerCapabilities vsServerCapabilities)
        {
            vsServerCapabilities.SupportsDiagnosticRequests = true;
            vsServerCapabilities.SpellCheckingProvider = true;
            vsServerCapabilities.Experimental ??= new Dictionary<string, bool>();
            vsServerCapabilities.MapCodeProvider = true;
            var experimental = (Dictionary<string, bool>)vsServerCapabilities.Experimental;
            experimental[SimplifyMethodHandler.SimplifyMethodMethodName] = true;
            experimental[FormatNewFileHandler.FormatNewFileMethodName] = true;
            experimental[SemanticTokensRangesHandler.SemanticRangesMethodName] = true;
 
            var regexExpression = string.Join("|", InlineCompletionsHandler.BuiltInSnippets);
            var regex = new Regex(regexExpression, RegexOptions.Compiled | RegexOptions.Singleline, TimeSpan.FromSeconds(1));
            vsServerCapabilities.InlineCompletionOptions = new VSInternalInlineCompletionOptions
            {
                Pattern = regex
            };
 
            return vsServerCapabilities;
        }
 
        return capabilities;
    }
}