diff --git a/plugin/documents.py b/plugin/documents.py index 33afd3a57..3fd5a3c2e 100644 --- a/plugin/documents.py +++ b/plugin/documents.py @@ -4,6 +4,7 @@ from .completion import QueryCompletionsTask from .core.constants import HOVER_ENABLED_KEY from .core.logging import debug +from .core.open import open_in_browser from .core.panels import PanelName from .core.protocol import Diagnostic from .core.protocol import DiagnosticSeverity @@ -27,6 +28,7 @@ from .core.settings import userprefs from .core.signature_help import SigHelp from .core.types import basescope2languageid +from .core.types import ClientConfig from .core.types import debounced from .core.types import DebouncerNonThreadSafe from .core.types import FEATURES_TIMEOUT @@ -40,6 +42,7 @@ from .core.views import DOCUMENT_HIGHLIGHT_KINDS from .core.views import first_selection_region from .core.views import format_code_actions_for_quick_panel +from .core.views import format_diagnostic_for_html from .core.views import make_link from .core.views import MarkdownLangMap from .core.views import range_to_region @@ -176,7 +179,8 @@ def _setup(self) -> None: self._stored_selection = [] self._sighelp = None # type: Optional[SigHelp] self._lightbulb_line = None # type: Optional[int] - self._actions_by_config = [] # type: List[CodeActionsByConfigName] + self._diagnostics_for_selection = [] # type: List[Tuple[SessionBufferProtocol, List[Diagnostic]]] + self._code_actions_for_selection = [] # type: List[CodeActionsByConfigName] self._registered = False def _cleanup(self) -> None: @@ -471,17 +475,40 @@ def on_hover(self, point: int, hover_zone: int) -> None: if hover_zone == sublime.HOVER_TEXT and window and window.settings().get(HOVER_ENABLED_KEY, True): self.view.run_command("lsp_hover", {"point": point}) elif hover_zone == sublime.HOVER_GUTTER: - # Lightbulb must be visible and at the same line - if self._lightbulb_line != self.view.rowcol(point)[0]: - return - content = code_actions_content(self._actions_by_config) + sublime.set_timeout_async(partial(self._on_hover_gutter_async, point)) + + def _on_hover_gutter_async(self, point: int) -> None: + content = '' + if self._lightbulb_line == self.view.rowcol(point)[0]: + content += code_actions_content(self._code_actions_for_selection) + if userprefs().show_diagnostics_severity_level: + diagnostics_with_config = [] # type: List[Tuple[ClientConfig, Diagnostic]] + diagnostics_by_session_buffer = [] # type: List[Tuple[SessionBufferProtocol, List[Diagnostic]]] + max_severity_level = min(userprefs().show_diagnostics_severity_level, DiagnosticSeverity.Information) + if userprefs().diagnostics_gutter_marker: + diagnostics_by_session_buffer = self.diagnostics_intersecting_async(self.view.line(point))[0] + elif content: + diagnostics_by_session_buffer = self._diagnostics_for_selection if content: - show_lsp_popup( - self.view, - content, - flags=sublime.HIDE_ON_MOUSE_MOVE_AWAY, - location=point, - on_navigate=lambda href: self._on_navigate(href, point)) + max_severity_level = userprefs().show_diagnostics_severity_level + for sb, diagnostics in diagnostics_by_session_buffer: + diagnostics_with_config.extend( + (sb.session.config, diagnostic) for diagnostic in diagnostics + if diagnostic_severity(diagnostic) <= max_severity_level + ) + if diagnostics_with_config: + diagnostics_with_config.sort(key=lambda d: diagnostic_severity(d[1])) + content += '