public ILspService CreateILspService(LspServices lspServices, WellKnownLspServerKinds serverKind) { var clientCapabilities = lspServices.GetRequiredService <IClientCapabilitiesProvider>().GetClientCapabilities(); var notificationManager = lspServices.GetRequiredService <ILanguageServerNotificationManager>(); return(new SemanticTokensRangeHandler(_globalOptions, _asyncListenerProvider, _lspWorkspaceRegistrationService, notificationManager, clientCapabilities)); }
public ILspService CreateILspService(LspServices lspServices, WellKnownLspServerKinds serverKind) { var logger = lspServices.GetRequiredService <ILspLogger>(); var telemetryLogger = lspServices.GetRequiredService <RequestTelemetryLogger>(); var miscFilesWorkspace = lspServices.GetService <LspMiscellaneousFilesWorkspace>(); return(new LspWorkspaceManager(logger, miscFilesWorkspace, _workspaceRegistrationService, telemetryLogger)); }
public static (IQueueItem, Task <TResponseType?>) Create( bool mutatesSolutionState, bool requiresLSPSolution, ClientCapabilities clientCapabilities, string methodName, TextDocumentIdentifier?textDocument, TRequestType request, IRequestHandler <TRequestType, TResponseType> handler, Guid activityId, ILspLogger logger, LspServices lspServices, CancellationToken cancellationToken) { var queueItem = new QueueItem <TRequestType, TResponseType>( mutatesSolutionState, requiresLSPSolution, clientCapabilities, methodName, textDocument, request, handler, activityId, logger, lspServices.GetRequiredService <RequestTelemetryLogger>(), cancellationToken); return(queueItem, queueItem._completionSource.Task); }
internal LanguageServerTarget( AbstractLspServiceProvider lspServiceProvider, JsonRpc jsonRpc, ICapabilitiesProvider capabilitiesProvider, IAsynchronousOperationListenerProvider listenerProvider, ILspLogger logger, ImmutableArray <string> supportedLanguages, WellKnownLspServerKinds serverKind) { _capabilitiesProvider = capabilitiesProvider; _logger = logger; _jsonRpc = jsonRpc; _jsonRpc.AddLocalRpcTarget(this); _jsonRpc.Disconnected += JsonRpc_Disconnected; _listener = listenerProvider.GetListener(FeatureAttribute.LanguageServer); // Add services that require base dependencies (jsonrpc) or are more complex to create to the set manually. _lspServices = lspServiceProvider.CreateServices(serverKind, ImmutableArray.Create( CreateLspServiceInstance <ILanguageServerNotificationManager>(new LanguageServerNotificationManager(_jsonRpc)), CreateLspServiceInstance(logger), CreateLspServiceInstance <IClientCapabilitiesProvider>(this))); _queue = new RequestExecutionQueue( supportedLanguages, serverKind, _lspServices); _queue.RequestServerShutdown += RequestExecutionQueue_Errored; _requestDispatcher = _lspServices.GetRequiredService <RequestDispatcher>(); var entryPointMethod = typeof(DelegatingEntryPoint).GetMethod(nameof(DelegatingEntryPoint.EntryPointAsync)); Contract.ThrowIfNull(entryPointMethod, $"{typeof(DelegatingEntryPoint).FullName} is missing method {nameof(DelegatingEntryPoint.EntryPointAsync)}"); foreach (var metadata in _requestDispatcher.GetRegisteredMethods()) { // Instead of concretely defining methods for each LSP method, we instead dynamically construct the // generic method info from the exported handler types. This allows us to define multiple handlers for // the same method but different type parameters. This is a key functionality to support TS external // access as we do not want to couple our LSP protocol version dll to theirs. // // We also do not use the StreamJsonRpc support for JToken as the rpc method parameters because we want // StreamJsonRpc to do the deserialization to handle streaming requests using IProgress<T>. var delegatingEntryPoint = new DelegatingEntryPoint(metadata.MethodName, this); var genericEntryPointMethod = entryPointMethod.MakeGenericMethod(metadata.RequestType, metadata.ResponseType); _jsonRpc.AddLocalRpcMethod(genericEntryPointMethod, delegatingEntryPoint, new JsonRpcMethodAttribute(metadata.MethodName) { UseSingleObjectParameterDeserialization = true }); }
public ILspService CreateILspService(LspServices lspServices, WellKnownLspServerKinds serverKind) { var completionListCache = lspServices.GetRequiredService <CompletionListCache>(); return(new CompletionResolveHandler(_globalOptions, completionListCache)); }
public static async Task <RequestContext?> CreateAsync( bool requiresLSPSolution, bool mutatesSolutionState, TextDocumentIdentifier?textDocument, WellKnownLspServerKinds serverKind, ClientCapabilities clientCapabilities, ImmutableArray <string> supportedLanguages, LspServices lspServices, CancellationToken queueCancellationToken, CancellationToken requestCancellationToken) { var lspWorkspaceManager = lspServices.GetRequiredService <LspWorkspaceManager>(); var logger = lspServices.GetRequiredService <ILspLogger>(); var documentChangeTracker = mutatesSolutionState ? (IDocumentChangeTracker)lspWorkspaceManager : new NonMutatingDocumentChangeTracker(); // Retrieve the current LSP tracked text as of this request. // This is safe as all creation of request contexts cannot happen concurrently. var trackedDocuments = lspWorkspaceManager.GetTrackedLspText(); // If the handler doesn't need an LSP solution we do two important things: // 1. We don't bother building the LSP solution for perf reasons // 2. We explicitly don't give the handler a solution or document, even if we could // so they're not accidentally operating on stale solution state. if (!requiresLSPSolution) { return(new RequestContext( solution: null, logger: logger, clientCapabilities: clientCapabilities, serverKind: serverKind, document: null, documentChangeTracker: documentChangeTracker, trackedDocuments: trackedDocuments, supportedLanguages: supportedLanguages, lspServices: lspServices, queueCancellationToken: queueCancellationToken)); } Solution?workspaceSolution; Document?document = null; if (textDocument is not null) { // we were given a request associated with a document. Find the corresponding roslyn document for this. // There are certain cases where we may be asked for a document that does not exist (for example a document is removed) // For example, document pull diagnostics can ask us after removal to clear diagnostics for a document. document = await lspWorkspaceManager.GetLspDocumentAsync(textDocument, requestCancellationToken).ConfigureAwait(false); } workspaceSolution = document?.Project.Solution ?? await lspWorkspaceManager.TryGetHostLspSolutionAsync(requestCancellationToken).ConfigureAwait(false); if (workspaceSolution == null) { logger.TraceError("Could not find appropriate solution for operation"); return(null); } var context = new RequestContext( workspaceSolution, logger, clientCapabilities, serverKind, document, documentChangeTracker, trackedDocuments, supportedLanguages, lspServices, queueCancellationToken); return(context); }
public T GetRequiredLspService <T>() where T : class, ILspService { return(_lspServices.GetRequiredService <T>()); }