diff --git a/src/EditorFeatures/Core/Implementation/Diagnostics/AbstractDiagnosticsTaggerProvider.TaggerProvider.cs b/src/EditorFeatures/Core/Implementation/Diagnostics/AbstractDiagnosticsTaggerProvider.TaggerProvider.cs index 6171cce5f4d7c04fc58d13995ac9969682d11152..c3cda6f9447358c0156cf287194ae0585575e0ce 100644 --- a/src/EditorFeatures/Core/Implementation/Diagnostics/AbstractDiagnosticsTaggerProvider.TaggerProvider.cs +++ b/src/EditorFeatures/Core/Implementation/Diagnostics/AbstractDiagnosticsTaggerProvider.TaggerProvider.cs @@ -124,8 +124,7 @@ private void ProduceTags(TaggerContext context, DocumentSnapshotSpan spanT { if (_owner.IncludeDiagnostic(diagnosticData)) { - var actualSpan = diagnosticData - .GetExistingOrCalculatedTextSpan(sourceText) + var actualSpan = AdjustSpan(diagnosticData.GetExistingOrCalculatedTextSpan(sourceText), sourceText) .ToSnapshotSpan(editorSnapshot) .TranslateTo(requestedSnapshot, SpanTrackingMode.EdgeExclusive); @@ -142,6 +141,21 @@ private void ProduceTags(TaggerContext context, DocumentSnapshotSpan spanT } } + private TextSpan AdjustSpan(TextSpan span, SourceText text) + { + var start = Math.Max(0, Math.Min(span.Start, text.Length)); + var end = Math.Max(0, Math.Min(span.End, text.Length)); + + if (start > end) + { + var temp = end; + end = start; + start = temp; + } + + return TextSpan.FromBounds(start, end); + } + private bool IsSuppressed(NormalizedSnapshotSpanCollection suppressedSpans, SnapshotSpan span) { return suppressedSpans != null && suppressedSpans.IntersectsWith(span);