private void ProduceTagsAsync(TaggerContext <TTag> context, DocumentSnapshotSpan spanToTag)
            {
                if (!_owner.IsEnabled)
                {
                    return;
                }

                var document = spanToTag.Document;

                if (document == null)
                {
                    return;
                }

                // Producing tags is simple.  We just grab the diagnostics we were already told about,
                // and we convert them to tag spans.
                object id;
                ImmutableArray <DiagnosticData> diagnostics;
                SourceText    sourceText;
                ITextSnapshot editorSnapshot;

                lock (_gate)
                {
                    id             = _latestId;
                    diagnostics    = _latestDiagnostics;
                    sourceText     = _latestSourceText;
                    editorSnapshot = _latestEditorSnapshot;
                }

                if (sourceText == null || editorSnapshot == null)
                {
                    return;
                }

                var project = document.Project;

                var requestedSnapshot = spanToTag.SnapshotSpan.Snapshot;
                var requestedSpan     = spanToTag.SnapshotSpan;
                var isLiveUpdate      = id is ISupportLiveUpdate;

                foreach (var diagnosticData in diagnostics)
                {
                    if (_owner.IncludeDiagnostic(diagnosticData))
                    {
                        var actualSpan = diagnosticData
                                         .GetExistingOrCalculatedTextSpan(sourceText)
                                         .ToSnapshotSpan(editorSnapshot)
                                         .TranslateTo(requestedSnapshot, SpanTrackingMode.EdgeExclusive);

                        if (actualSpan.IntersectsWith(requestedSpan))
                        {
                            var tagSpan = _owner.CreateTagSpan(isLiveUpdate, actualSpan, diagnosticData);
                            if (tagSpan != null)
                            {
                                context.AddTag(tagSpan);
                            }
                        }
                    }
                }
            }
            private void ProduceTags(TaggerContext <TTag> context, DocumentSnapshotSpan spanToTag)
            {
                try
                {
                    if (!_owner.IsEnabled)
                    {
                        return;
                    }

                    var document = spanToTag.Document;
                    if (document == null)
                    {
                        return;
                    }

                    // See if we've marked any spans as those we want to suppress diagnostics for.
                    // This can happen for buffers used in the preview workspace where some feature
                    // is generating code that it doesn't want errors shown for.
                    var buffer = spanToTag.SnapshotSpan.Snapshot.TextBuffer;
                    var suppressedDiagnosticsSpans = default(NormalizedSnapshotSpanCollection);
                    buffer?.Properties.TryGetProperty(PredefinedPreviewTaggerKeys.SuppressDiagnosticsSpansKey, out suppressedDiagnosticsSpans);

                    // Producing tags is simple.  We just grab the diagnostics we were already told about,
                    // and we convert them to tag spans.
                    object id;
                    ImmutableArray <DiagnosticData> diagnostics;
                    SourceText    sourceText;
                    ITextSnapshot editorSnapshot;
                    lock (_gate)
                    {
                        id             = _latestId;
                        diagnostics    = _latestDiagnostics;
                        sourceText     = _latestSourceText;
                        editorSnapshot = _latestEditorSnapshot;
                    }

                    if (sourceText == null || editorSnapshot == null)
                    {
                        return;
                    }

                    var project = document.Project;

                    var requestedSnapshot = spanToTag.SnapshotSpan.Snapshot;
                    var requestedSpan     = spanToTag.SnapshotSpan;
                    var isLiveUpdate      = id is ISupportLiveUpdate;

                    foreach (var diagnosticData in diagnostics)
                    {
                        if (_owner.IncludeDiagnostic(diagnosticData))
                        {
                            var actualSpan = diagnosticData
                                             .GetExistingOrCalculatedTextSpan(sourceText)
                                             .ToSnapshotSpan(editorSnapshot)
                                             .TranslateTo(requestedSnapshot, SpanTrackingMode.EdgeExclusive);

                            if (actualSpan.IntersectsWith(requestedSpan) &&
                                !IsSuppressed(suppressedDiagnosticsSpans, actualSpan))
                            {
                                var tagSpan = _owner.CreateTagSpan(isLiveUpdate, actualSpan, diagnosticData);
                                if (tagSpan != null)
                                {
                                    context.AddTag(tagSpan);
                                }
                            }
                        }
                    }
                }
                catch (ArgumentOutOfRangeException ex) when(FatalError.ReportWithoutCrash(ex))
                {
                    // https://devdiv.visualstudio.com/DefaultCollection/DevDiv/_workitems?id=428328&_a=edit&triage=false
                    // explicitly report NFW to find out what is causing us for out of range.
                    // stop crashing on such occations
                    return;
                }
            }
            private void ProduceTags(TaggerContext <TTag> context, DocumentSnapshotSpan spanToTag)
            {
                if (!_owner.IsEnabled)
                {
                    return;
                }

                var document = spanToTag.Document;

                if (document == null)
                {
                    return;
                }

                // See if we've marked any spans as those we want to suppress diagnostics for.
                // This can happen for buffers used in the preview workspace where some feature
                // is generating code that it doesn't want errors shown for.
                var buffer = spanToTag.SnapshotSpan.Snapshot.TextBuffer;
                NormalizedSnapshotSpanCollection suppressedDiagnosticsSpans = null;

                buffer?.Properties.TryGetProperty(PredefinedPreviewTaggerKeys.SuppressDiagnosticsSpansKey, out suppressedDiagnosticsSpans);

                // Producing tags is simple.  We just grab the diagnostics we were already told about,
                // and we convert them to tag spans.
                object id;
                ImmutableArray <DiagnosticData> diagnostics;
                SourceText    sourceText;
                ITextSnapshot editorSnapshot;

                lock (_gate)
                {
                    id             = _latestId;
                    diagnostics    = _latestDiagnostics;
                    sourceText     = _latestSourceText;
                    editorSnapshot = _latestEditorSnapshot;
                }

                if (sourceText == null || editorSnapshot == null)
                {
                    return;
                }

                var project = document.Project;

                var requestedSnapshot = spanToTag.SnapshotSpan.Snapshot;
                var requestedSpan     = spanToTag.SnapshotSpan;
                var isLiveUpdate      = id is ISupportLiveUpdate;

                foreach (var diagnosticData in diagnostics)
                {
                    if (_owner.IncludeDiagnostic(diagnosticData))
                    {
                        var actualSpan = diagnosticData
                                         .GetExistingOrCalculatedTextSpan(sourceText)
                                         .ToSnapshotSpan(editorSnapshot)
                                         .TranslateTo(requestedSnapshot, SpanTrackingMode.EdgeExclusive);

                        if (actualSpan.IntersectsWith(requestedSpan) &&
                            !IsSuppressed(suppressedDiagnosticsSpans, actualSpan))
                        {
                            var tagSpan = _owner.CreateTagSpan(isLiveUpdate, actualSpan, diagnosticData);
                            if (tagSpan != null)
                            {
                                context.AddTag(tagSpan);
                            }
                        }
                    }
                }
            }