private async Task TrackActiveSpansAsync(CancellationToken cancellationToken) { try { var openDocumentIds = _workspace.GetOpenDocumentIds().ToImmutableArray(); if (openDocumentIds.Length == 0) { return; } var baseActiveStatementSpans = await _encService.GetBaseActiveStatementSpansAsync(openDocumentIds, cancellationToken).ConfigureAwait(false); if (baseActiveStatementSpans.IsDefault) { // Edit session not in progress. return; } Debug.Assert(openDocumentIds.Length == baseActiveStatementSpans.Length); var currentSolution = _workspace.CurrentSolution; lock (_trackingSpans) { for (int i = 0; i < baseActiveStatementSpans.Length; i++) { var document = currentSolution.GetDocument(openDocumentIds[i]); if (document == null) { // Document has been deleted. continue; } if (!TryGetSnapshot(document, out var snapshot)) { // Document is not open in an editor or a corresponding snapshot doesn't exist anymore. continue; } if (!_trackingSpans.ContainsKey(document.Id)) { // Create tracking spans if they have not been created for this open document yet // (avoids race condition with DocumentOpen event handler). _trackingSpans.Add(document.Id, CreateTrackingSpans(snapshot, baseActiveStatementSpans[i])); } } } } catch (OperationCanceledException) { // nop } catch (Exception e) when(FatalError.ReportWithoutCrash(e)) { // nop } }