Skip to content

Commit 7ad3911

Browse files
authored
Fix diagnostic regions being hidden by semantic regions (#1969)
1 parent 849a275 commit 7ad3911

File tree

3 files changed

+27
-20
lines changed

3 files changed

+27
-20
lines changed

plugin/core/sessions.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1083,7 +1083,7 @@ def __init__(self, manager: Manager, logger: Logger, workspace_folders: List[Wor
10831083
self._plugin = None # type: Optional[AbstractPlugin]
10841084
self._status_messages = {} # type: Dict[str, str]
10851085
self.diagnostics_manager = DiagnosticsManager()
1086-
self.semantic_tokens_map = get_semantic_tokens_map(config.semantic_tokens)
1086+
self._semantic_tokens_map = get_semantic_tokens_map(config.semantic_tokens)
10871087

10881088
def __getattr__(self, name: str) -> Any:
10891089
"""
@@ -1532,7 +1532,7 @@ def decode_semantic_token(
15321532
types_legend = tuple(cast(List[str], self.get_capability('semanticTokensProvider.legend.tokenTypes')))
15331533
modifiers_legend = tuple(cast(List[str], self.get_capability('semanticTokensProvider.legend.tokenModifiers')))
15341534
return decode_semantic_token(
1535-
types_legend, modifiers_legend, self.semantic_tokens_map, token_type_encoded, token_modifiers_encoded)
1535+
types_legend, modifiers_legend, self._semantic_tokens_map, token_type_encoded, token_modifiers_encoded)
15361536

15371537
# --- server request handlers --------------------------------------------------------------------------------------
15381538

plugin/session_buffer.py

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from .core.types import debounced
1313
from .core.types import Debouncer
1414
from .core.types import FEATURES_TIMEOUT
15-
from .core.typing import Any, Callable, Iterable, Optional, List, Dict, Tuple
15+
from .core.typing import Any, Callable, Iterable, Optional, List, Set, Dict, Tuple
1616
from .core.views import DIAGNOSTIC_SEVERITY
1717
from .core.views import diagnostic_severity
1818
from .core.views import did_change
@@ -61,12 +61,12 @@ def __init__(self, severity: int) -> None:
6161
class SemanticTokensData:
6262

6363
__slots__ = (
64-
'data', 'result_id', 'active_scopes', 'tokens', 'view_change_count', 'needs_refresh', 'pending_response')
64+
'data', 'result_id', 'active_region_keys', 'tokens', 'view_change_count', 'needs_refresh', 'pending_response')
6565

6666
def __init__(self) -> None:
6767
self.data = [] # type: List[int]
6868
self.result_id = None # type: Optional[str]
69-
self.active_scopes = [] # type: List[str]
69+
self.active_region_keys = set() # type: Set[int]
7070
self.tokens = [] # type: List[SemanticToken]
7171
self.view_change_count = 0
7272
self.needs_refresh = False
@@ -105,6 +105,8 @@ def __init__(self, session_view: SessionViewProtocol, buffer_id: int, uri: Docum
105105
self.diagnostics_debouncer = Debouncer()
106106
self.color_phantoms = sublime.PhantomSet(view, "lsp_color")
107107
self.semantic_tokens = SemanticTokensData()
108+
self._semantic_region_keys = {} # type: Dict[str, int]
109+
self._last_semantic_region_key = 0
108110
self._check_did_open(view)
109111
self._session.register_session_buffer_async(self)
110112

@@ -502,7 +504,7 @@ def _draw_semantic_tokens_async(self) -> None:
502504
if view is None:
503505
return
504506
self.semantic_tokens.tokens.clear()
505-
scope_regions = dict() # type: Dict[str, List[sublime.Region]]
507+
scope_regions = dict() # type: Dict[int, Tuple[str, List[sublime.Region]]]
506508
prev_line = 0
507509
prev_col_utf16 = 0
508510
for idx in range(0, len(self.semantic_tokens.data), 5):
@@ -526,7 +528,6 @@ def _draw_semantic_tokens_async(self) -> None:
526528
# This logic should not be cached (in the decode_semantic_token method) because otherwise new user
527529
# customizations in the color scheme for the scopes of custom token types would require a restart of
528530
# Sublime Text to take effect.
529-
# Note that the region keys for these scopes are not initialized in SessionView._initialize_region_keys.
530531
token_general_style = view.style_for_scope("meta.semantic-token")
531532
token_type_style = view.style_for_scope("meta.semantic-token.{}".format(token_type.lower()))
532533
if token_general_style["source_line"] != token_type_style["source_line"] or \
@@ -537,24 +538,30 @@ def _draw_semantic_tokens_async(self) -> None:
537538
scope = "meta.semantic-token.{}.lsp".format(token_type.lower())
538539
self.semantic_tokens.tokens.append(SemanticToken(r, token_type, token_modifiers))
539540
if scope:
540-
scope_regions.setdefault(scope, []).append(r)
541+
scope_regions.setdefault(self._get_semantic_region_key_for_scope(scope), (scope, []))[1].append(r)
541542
# don't update regions if there were additional changes to the buffer in the meantime
542543
if self.semantic_tokens.view_change_count != view.change_count():
543544
return
544-
for scope in self.semantic_tokens.active_scopes.copy():
545-
if scope not in scope_regions.keys():
546-
self.semantic_tokens.active_scopes.remove(scope)
545+
for region_key in self.semantic_tokens.active_region_keys.copy():
546+
if region_key not in scope_regions.keys():
547+
self.semantic_tokens.active_region_keys.remove(region_key)
547548
for sv in self.session_views:
548-
sv.view.erase_regions("lsp_{}".format(scope))
549-
for scope, regions in scope_regions.items():
550-
if scope not in self.semantic_tokens.active_scopes:
551-
self.semantic_tokens.active_scopes.append(scope)
549+
sv.view.erase_regions("lsp_semantic_{}".format(region_key))
550+
for region_key, (scope, regions) in scope_regions.items():
551+
if region_key not in self.semantic_tokens.active_region_keys:
552+
self.semantic_tokens.active_region_keys.add(region_key)
552553
for sv in self.session_views:
553-
sv.view.add_regions("lsp_{}".format(scope), regions, scope, flags=sublime.DRAW_NO_OUTLINE)
554+
sv.view.add_regions("lsp_semantic_{}".format(region_key), regions, scope, flags=sublime.DRAW_NO_OUTLINE)
555+
556+
def _get_semantic_region_key_for_scope(self, scope: str) -> int:
557+
if scope not in self._semantic_region_keys:
558+
self._last_semantic_region_key += 1
559+
self._semantic_region_keys[scope] = self._last_semantic_region_key
560+
return self._semantic_region_keys[scope]
554561

555562
def _clear_semantic_token_regions(self, view: sublime.View) -> None:
556-
for scope in self.semantic_tokens.active_scopes:
557-
view.erase_regions("lsp_{}".format(scope))
563+
for region_key in self.semantic_tokens.active_region_keys:
564+
view.erase_regions("lsp_semantic_{}".format(region_key))
558565

559566
def set_semantic_tokens_pending_refresh(self, needs_refresh: bool = True) -> None:
560567
self.semantic_tokens.needs_refresh = needs_refresh

plugin/session_view.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,8 @@ def _initialize_region_keys(self) -> None:
114114
document_highlight_kinds = ["text", "read", "write"]
115115
line_modes = ["m", "s"]
116116
self.view.add_regions(self.CODE_ACTIONS_KEY, r) # code actions lightbulb icon should always be on top
117-
for key, scope in self.session.semantic_tokens_map:
118-
self.view.add_regions("lsp_{} meta.semantic-token.{}.lsp".format(scope, key.lower()), r)
117+
for key in range(1, 100):
118+
self.view.add_regions("lsp_semantic_{}".format(key), r)
119119
if document_highlight_style == "fill":
120120
for kind in document_highlight_kinds:
121121
for mode in line_modes:

0 commit comments

Comments
 (0)