From a6edba3d254c25307f4818b34c84e5cf89e147d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Ch=C5=82odnicki?= Date: Thu, 18 May 2023 12:27:25 +0200 Subject: [PATCH] Fix tagged diagnostics flickering on document changes (#2274) --- plugin/session_view.py | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/plugin/session_view.py b/plugin/session_view.py index 0aa36ba3c..0ff3b623d 100644 --- a/plugin/session_view.py +++ b/plugin/session_view.py @@ -19,10 +19,19 @@ import functools import sublime -DIAGNOSTIC_TAG_VALUES = [v for (k, v) in DiagnosticTag.__dict__.items() if not k.startswith('_')] +DIAGNOSTIC_TAG_VALUES = [v for (k, v) in DiagnosticTag.__dict__.items() if not k.startswith('_')] # type: List[int] HOVER_HIGHLIGHT_KEY = "lsp_hover_highlight" +class TagData: + __slots__ = ('key', 'regions', 'scope') + + def __init__(self, key: str, regions: List[sublime.Region] = [], scope: str = '') -> None: + self.key = key + self.regions = regions + self.scope = scope + + class SessionView: """ Holds state per session per view. @@ -286,9 +295,7 @@ def present_diagnostics_async(self, is_view_visible: bool) -> None: def _draw_diagnostics(self, severity: int, max_severity_level: int, flags: int, multiline: bool) -> None: ICON_FLAGS = sublime.HIDE_ON_MINIMAP | sublime.DRAW_NO_FILL | sublime.DRAW_NO_OUTLINE key = self.diagnostics_key(severity, multiline) - key_tags = {tag: '{}_tags_{}'.format(key, tag) for tag in DIAGNOSTIC_TAG_VALUES} - for key_tag in key_tags.values(): - self.view.erase_regions(key_tag) + tags = {tag: TagData('{}_tags_{}'.format(key, tag)) for tag in DIAGNOSTIC_TAG_VALUES} data = self.session_buffer.data_per_severity.get((severity, multiline)) if data and severity <= max_severity_level: non_tag_regions = data.regions @@ -296,7 +303,8 @@ def _draw_diagnostics(self, severity: int, max_severity_level: int, flags: int, tag_scope = self.diagnostics_tag_scope(tag) # Trick to only add tag regions if there is a corresponding color scheme scope defined. if tag_scope and 'background' in self.view.style_for_scope(tag_scope): - self.view.add_regions(key_tags[tag], regions, tag_scope, flags=sublime.DRAW_NO_OUTLINE) + tags[tag].regions = regions + tags[tag].scope = tag_scope else: non_tag_regions.extend(regions) self.view.add_regions("{}_icon".format(key), non_tag_regions, data.scope, data.icon, ICON_FLAGS) @@ -304,6 +312,11 @@ def _draw_diagnostics(self, severity: int, max_severity_level: int, flags: int, else: self.view.erase_regions("{}_icon".format(key)) self.view.erase_regions("{}_underline".format(key)) + for data in tags.values(): + if data.regions: + self.view.add_regions(data.key, data.regions, data.scope, flags=sublime.DRAW_NO_OUTLINE) + else: + self.view.erase_regions(data.key) def on_request_started_async(self, request_id: int, request: Request) -> None: self._active_requests[request_id] = ActiveRequest(self, request_id, request)