public async Task TestStreamingDocumentDiagnostics() { var markup = @"class A {"; using var testLspServer = CreateTestWorkspaceWithDiagnostics( markup, BackgroundAnalysisScope.OpenFilesAndProjects ); // Calling GetTextBuffer will effectively open the file. testLspServer.TestWorkspace.Documents.Single().GetTextBuffer(); var document = testLspServer.GetCurrentSolution().Projects.Single().Documents.Single(); await OpenDocumentAsync(testLspServer, document); var progress = BufferedProgress.Create <DiagnosticReport>(null); var results = await RunGetDocumentPullDiagnosticsAsync( testLspServer, testLspServer.GetCurrentSolution().Projects.Single().Documents.Single(), progress : progress ); Assert.Null(results); Assert.Equal("CS1513", progress.GetValues() !.Single().Diagnostics.Single().Code); }
public async Task TestStreamingWorkspaceDiagnostics() { var markup1 = @"class A {"; var markup2 = ""; using var workspace = CreateTestWorkspaceWithDiagnostics( new[] { markup1, markup2 }, BackgroundAnalysisScope.FullSolution); var queue = CreateRequestQueue(workspace.CurrentSolution); var server = GetLanguageServer(workspace.CurrentSolution); var results = await RunGetWorkspacePullDiagnosticsAsync(workspace, queue, server); Assert.Equal(2, results.Length); Assert.Equal("CS1513", results[0].Diagnostics.Single().Code); Assert.Equal(new Position { Line = 0, Character = 9 }, results[0].Diagnostics.Single().Range.Start); var progress = BufferedProgress.Create <DiagnosticReport>(null); results = await RunGetWorkspacePullDiagnosticsAsync(workspace, queue, server, progress : progress); Assert.Null(results); Assert.Equal("CS1513", progress.GetValues() ![0].Diagnostics ![0].Code);
public async Task <TReport[]?> HandleRequestAsync(TDiagnosticsParams diagnosticsParams, RequestContext context, CancellationToken cancellationToken) { Contract.ThrowIfNull(context.Solution); using var progress = BufferedProgress.Create(GetProgress(diagnosticsParams)); // Get the set of results the request said were previously reported. var previousResults = GetPreviousResults(diagnosticsParams); var documentToPreviousResultId = new Dictionary <Document, string?>(); if (previousResults != null) { // Go through the previousResults and check if we need to remove diagnostic information for any documents foreach (var previousResult in previousResults) { if (previousResult.TextDocument != null) { var document = context.Solution.GetDocument(previousResult.TextDocument); if (document == null) { // We can no longer get this document, return null for both diagnostics and resultId progress.Report(CreateReport(previousResult.TextDocument, diagnostics: null, resultId: null)); } else { // Cache the document to previousResultId mapping so we can easily retrieve the resultId later. documentToPreviousResultId[document] = previousResult.PreviousResultId; } } } } // Go through the documents that we need to process and call XamlPullDiagnosticService to get the diagnostic report foreach (var document in GetDocuments(context)) { var text = await document.GetTextAsync(cancellationToken).ConfigureAwait(false); var documentId = ProtocolConversions.DocumentToTextDocumentIdentifier(document); // If we can get a previousId of the document, use it, // otherwise use null as the previousId to pass into the XamlPullDiagnosticService var previousResultId = documentToPreviousResultId.TryGetValue(document, out var id) ? id : null; // Call XamlPullDiagnosticService to get the diagnostic report for this document. // We will compute what to report inside XamlPullDiagnosticService, for example, whether we should keep using the previousId or use a new resultId, // and the handler here just return the result get from XamlPullDiagnosticService. var diagnosticReport = await _xamlDiagnosticService.GetDiagnosticReportAsync(document, previousResultId, cancellationToken).ConfigureAwait(false); progress.Report(CreateReport( documentId, ConvertToVSDiagnostics(diagnosticReport.Diagnostics, document, text), diagnosticReport.ResultId)); } return(progress.GetValues()); }
private async Task <SymbolInformation[]?> SearchAsync(Solution solution, WorkspaceSymbolParams args, CancellationToken cancellationToken) { using var progress = BufferedProgress.Create(args.PartialResultToken); var tasks = solution.Projects.SelectMany(p => p.Documents).Select(d => SearchDocumentAndReportSymbolsAsync(d, args.Query, progress, cancellationToken)); await Task.WhenAll(tasks).ConfigureAwait(false); return(progress.GetValues()); }