public static async Task <ILanguageClient> StartServerWithTextAsync(TestContext testContext, string text, DocumentUri documentUri, Action <LanguageClientOptions>?onClientOptions = null, Server.CreationOptions?creationOptions = null) { var diagnosticsPublished = new TaskCompletionSource <PublishDiagnosticsParams>(); creationOptions ??= new Server.CreationOptions(); creationOptions = creationOptions with { FileResolver = creationOptions.FileResolver ?? new InMemoryFileResolver(new Dictionary <Uri, string> { [documentUri.ToUri()] = text, }) }; var client = await IntegrationTestHelper.StartServerWithClientConnectionAsync( testContext, options => { onClientOptions?.Invoke(options); options.OnPublishDiagnostics(p => { testContext.WriteLine($"Received {p.Diagnostics.Count()} diagnostic(s)."); diagnosticsPublished.SetResult(p); }); }, creationOptions); // send open document notification client.DidOpenTextDocument(TextDocumentParamHelper.CreateDidOpenDocumentParams(documentUri, text, 0)); testContext.WriteLine($"Opened file {documentUri}."); // notifications don't produce responses, // but our server should send us diagnostics when it receives the notification await IntegrationTestHelper.WithTimeoutAsync(diagnosticsPublished.Task); return(client); }
public static async Task <LanguageServerHelper> StartServerWithClientConnectionAsync(TestContext testContext, Action <LanguageClientOptions> onClientOptions, Server.CreationOptions?creationOptions = null) { var clientPipe = new Pipe(); var serverPipe = new Pipe(); creationOptions ??= new Server.CreationOptions(); creationOptions = creationOptions with { SnippetsProvider = creationOptions.SnippetsProvider ?? SnippetsProvider, FileResolver = creationOptions.FileResolver ?? new InMemoryFileResolver(new Dictionary <Uri, string>()), ModuleRestoreScheduler = creationOptions.ModuleRestoreScheduler ?? BicepTestConstants.ModuleRestoreScheduler }; var server = new Server(serverPipe.Reader, clientPipe.Writer, creationOptions); var _ = server.RunAsync(CancellationToken.None); // do not wait on this async method, or you'll be waiting a long time! var client = LanguageClient.PreInit(options => { options .WithInput(clientPipe.Reader) .WithOutput(serverPipe.Writer) .OnInitialize((client, request, cancellationToken) => { testContext.WriteLine("Language client initializing."); return(Task.CompletedTask); }) .OnInitialized((client, request, response, cancellationToken) => { testContext.WriteLine("Language client initialized."); return(Task.CompletedTask); }) .OnStarted((client, cancellationToken) => { testContext.WriteLine("Language client started."); return(Task.CompletedTask); }) .OnLogTrace(@params => testContext.WriteLine($"TRACE: {@params.Message} VERBOSE: {@params.Verbose}")) .OnLogMessage(@params => testContext.WriteLine($"{@params.Type}: {@params.Message}")); onClientOptions(options); }); await client.Initialize(CancellationToken.None); testContext.WriteLine("LanguageClient initialize finished."); return(new(server, client)); }
public static async Task <MultiFileLanguageServerHelper> StartLanguageServer(TestContext testContext, Server.CreationOptions?creationOptions = null) { var notificationRouter = new ConcurrentDictionary <DocumentUri, TaskCompletionSource <PublishDiagnosticsParams> >(); var helper = await LanguageServerHelper.StartServerWithClientConnectionAsync( testContext, onClientOptions : options => { options.OnPublishDiagnostics(p => { testContext.WriteLine($"Received {p.Diagnostics.Count()} diagnostic(s)."); if (notificationRouter.TryGetValue(p.Uri, out var completionSource)) { completionSource.SetResult(p); return; } throw new AssertFailedException($"Task completion source was not registered for document uri '{p.Uri}'."); }); }, creationOptions : creationOptions); return(new(helper.Server, helper.Client, notificationRouter)); }