-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdiagnostics-underline.py
77 lines (69 loc) · 3.58 KB
/
diagnostics-underline.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
from __future__ import annotations
import sublime
import sublime_plugin
from .api import mir, run_future
from .api.types import DiagnosticSeverity, DiagnosticTag
from .api.helpers import parse_uri, range_to_region
class MirDiagnosticListener(sublime_plugin.ViewEventListener):
def __init__(self, view):
super().__init__(view)
self.cleanup = None
def on_activated(self):
if self.cleanup:
return
self.cleanup = mir.on_did_change_diagnostics(self.on_did_change_diagnostics)
def on_load(self):
if self.cleanup:
return
self.cleanup = mir.on_did_change_diagnostics(self.on_did_change_diagnostics)
def on_did_change_diagnostics(self, uris: list[str]):
run_future(self.draw_diagnotsics(uris))
async def draw_diagnotsics(self, uris: list[str]):
window = self.view.window()
if not window:
return
for uri in uris:
_, file_name = parse_uri(uri)
view = next(iter([v for w in sublime.windows() for v in w.views() if v.file_name() == file_name]), None)
if not view:
continue
results = await mir.get_diagnostics(view)
errors = []
deprecated = []
unnecessary = []
warnings = []
infos = []
hints = []
for _, diagnostics in results:
for diagnostic in diagnostics:
region = range_to_region(view, diagnostic['range'])
severity = diagnostic.get('severity', DiagnosticSeverity.Information)
tags = diagnostic.get('tags', [])
if DiagnosticTag.Unnecessary in tags:
unnecessary.append(region)
elif DiagnosticTag.Deprecated in tags:
deprecated.append(region)
elif severity == DiagnosticSeverity.Error:
errors.append(region)
elif severity == DiagnosticSeverity.Warning:
warnings.append(region)
elif severity == DiagnosticSeverity.Hint:
hints.append(region)
elif severity == DiagnosticSeverity.Information:
infos.append(region)
view.erase_regions('mir-deprecated')
view.add_regions('mir-deprecated', deprecated, 'markup.unnecessary', flags=sublime.DRAW_NO_OUTLINE | sublime.NO_UNDO)
view.erase_regions('mir-unnecessary')
view.add_regions('mir-unnecessary', unnecessary, 'markup.unnecessary', flags=sublime.DRAW_NO_OUTLINE | sublime.NO_UNDO)
view.erase_regions('mir-hints')
view.add_regions('mir-hints', hints, 'comment', flags=sublime.DRAW_SQUIGGLY_UNDERLINE | sublime.DRAW_NO_OUTLINE | sublime.DRAW_NO_FILL | sublime.NO_UNDO)
view.erase_regions('mir-infos')
view.add_regions('mir-infos', infos, 'comment', flags=sublime.DRAW_SQUIGGLY_UNDERLINE | sublime.DRAW_NO_OUTLINE | sublime.DRAW_NO_FILL | sublime.NO_UNDO)
view.erase_regions('mir-warnings')
view.add_regions('mir-warnings', warnings, 'region.yellowish', flags=sublime.DRAW_SQUIGGLY_UNDERLINE | sublime.DRAW_NO_OUTLINE | sublime.DRAW_NO_FILL | sublime.NO_UNDO)
view.erase_regions('mir-errors')
view.add_regions('mir-errors', errors, 'region.redish', flags=sublime.DRAW_SQUIGGLY_UNDERLINE | sublime.DRAW_NO_OUTLINE | sublime.DRAW_NO_FILL | sublime.NO_UNDO)
def on_close(self):
if self.cleanup:
self.cleanup()
self.cleanup = None