Skip to content

Commit a6edba3

Browse files
authored
Fix tagged diagnostics flickering on document changes (#2274)
1 parent fb623c4 commit a6edba3

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

plugin/session_view.py

+18-5
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,19 @@
1919
import functools
2020
import sublime
2121

22-
DIAGNOSTIC_TAG_VALUES = [v for (k, v) in DiagnosticTag.__dict__.items() if not k.startswith('_')]
22+
DIAGNOSTIC_TAG_VALUES = [v for (k, v) in DiagnosticTag.__dict__.items() if not k.startswith('_')] # type: List[int]
2323
HOVER_HIGHLIGHT_KEY = "lsp_hover_highlight"
2424

2525

26+
class TagData:
27+
__slots__ = ('key', 'regions', 'scope')
28+
29+
def __init__(self, key: str, regions: List[sublime.Region] = [], scope: str = '') -> None:
30+
self.key = key
31+
self.regions = regions
32+
self.scope = scope
33+
34+
2635
class SessionView:
2736
"""
2837
Holds state per session per view.
@@ -286,24 +295,28 @@ def present_diagnostics_async(self, is_view_visible: bool) -> None:
286295
def _draw_diagnostics(self, severity: int, max_severity_level: int, flags: int, multiline: bool) -> None:
287296
ICON_FLAGS = sublime.HIDE_ON_MINIMAP | sublime.DRAW_NO_FILL | sublime.DRAW_NO_OUTLINE
288297
key = self.diagnostics_key(severity, multiline)
289-
key_tags = {tag: '{}_tags_{}'.format(key, tag) for tag in DIAGNOSTIC_TAG_VALUES}
290-
for key_tag in key_tags.values():
291-
self.view.erase_regions(key_tag)
298+
tags = {tag: TagData('{}_tags_{}'.format(key, tag)) for tag in DIAGNOSTIC_TAG_VALUES}
292299
data = self.session_buffer.data_per_severity.get((severity, multiline))
293300
if data and severity <= max_severity_level:
294301
non_tag_regions = data.regions
295302
for tag, regions in data.regions_with_tag.items():
296303
tag_scope = self.diagnostics_tag_scope(tag)
297304
# Trick to only add tag regions if there is a corresponding color scheme scope defined.
298305
if tag_scope and 'background' in self.view.style_for_scope(tag_scope):
299-
self.view.add_regions(key_tags[tag], regions, tag_scope, flags=sublime.DRAW_NO_OUTLINE)
306+
tags[tag].regions = regions
307+
tags[tag].scope = tag_scope
300308
else:
301309
non_tag_regions.extend(regions)
302310
self.view.add_regions("{}_icon".format(key), non_tag_regions, data.scope, data.icon, ICON_FLAGS)
303311
self.view.add_regions("{}_underline".format(key), non_tag_regions, data.scope, "", flags)
304312
else:
305313
self.view.erase_regions("{}_icon".format(key))
306314
self.view.erase_regions("{}_underline".format(key))
315+
for data in tags.values():
316+
if data.regions:
317+
self.view.add_regions(data.key, data.regions, data.scope, flags=sublime.DRAW_NO_OUTLINE)
318+
else:
319+
self.view.erase_regions(data.key)
307320

308321
def on_request_started_async(self, request_id: int, request: Request) -> None:
309322
self._active_requests[request_id] = ActiveRequest(self, request_id, request)

0 commit comments

Comments
 (0)