Skip to content

Commit 775cbc0

Browse files
author
Orta
authored
Merge pull request #726 from bertilnilsson/master
Configurable error visibility options and gutter errors tooltip
2 parents 1f2dbf2 + 268ddfe commit 775cbc0

File tree

5 files changed

+51
-30
lines changed

5 files changed

+51
-30
lines changed

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,9 @@ for OS-specific shortcuts.
9898

9999
These settings can be overridden in `Packages/User/TypeScript.sublime-settings`, which you can open by going to `Preferences` -> `Package Settings` -> `TypeScript` -> `TypeScript Settings - User`.
100100

101-
- `error_color`: the color of the squiggly lines drawn underneath type errors; either an empty string for the default color, or one of `"region.redish"`, `"region.orangish"`, `"region.yellowish"`, `"region.greenish"`, `"region.bluish"`, `"region.purplish"`, `"region.pinkish"`
101+
- `error_color`: the color of the lines drawn underneath/around type errors; either an empty string for the default color, or one of `"region.redish"`, `"region.orangish"`, `"region.yellowish"`, `"region.greenish"`, `"region.bluish"`, `"region.purplish"`, `"region.pinkish"`
102+
- `error_icon`: specifies a gutter icon, defaults to nothing can be set to `"dot"`, `"circle"`, `"bookmark"` or any other value accepted by Sublime Text
103+
- `error_outlined`: will draw type errors with a solid outline instead of the default which is a squiggly line underneath
102104
- `quick_info_popup_max_width`: the max width of the quick info popup, default 1024
103105

104106
Project System

TypeScript.sublime-settings

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,7 @@
55

66
// empty string, or one of "region.redish", "region.orangish", "region.yellowish", "region.greenish", "region.bluish", "region.purplish", "region.pinkish"
77
"error_color": "",
8+
"error_icon": "",
9+
"error_outlined": false,
810
"quick_info_popup_max_width": 1024
911
}

typescript/commands/quick_info.py

Lines changed: 39 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -64,23 +64,21 @@ def handle_quick_info(self, quick_info_resp_dict, display_point):
6464
else:
6565
self.view.erase_status("typescript_info")
6666

67-
# process tooltips
68-
error_html = self.get_error_text_html(display_point)
69-
if TOOLTIP_SUPPORT and (info_str != "" or doc_str != "" or error_html != ""):
70-
if self.template is None:
71-
self.template = Template(load_quickinfo_and_error_popup_template())
72-
html = self.get_popup_html(error_html, info_str, doc_str)
67+
# Fetch any errors and show tooltips if available
68+
error_html = self.get_error_text_html(sublime.Region(display_point, display_point))
69+
if info_str != "" or doc_str != "" or error_html != "":
70+
self.show_tooltip_popup(display_point, error_html, info_str, doc_str)
7371

74-
settings = sublime.load_settings("TypeScript.sublime-settings")
75-
self.view.show_popup(html, flags=sublime.HIDE_ON_MOUSE_MOVE_AWAY, location=display_point, max_height=300, max_width=settings.get("quick_info_popup_max_width") or self.view.viewport_extent()[0])
72+
def show_tooltip_popup(self, display_point, error, info, doc):
73+
if not TOOLTIP_SUPPORT:
74+
return
7675

77-
def get_popup_html(self, error, info, doc):
7876
theme_styles = get_theme_styles(self.view)
7977

8078
parameters = {
81-
"error": error,
82-
"info_str": info,
83-
"doc_str": doc,
79+
"error": error or '',
80+
"info_str": info or '',
81+
"doc_str": doc or '',
8482
"typeStyles": theme_styles["type"],
8583
"keywordStyles": theme_styles["keyword"],
8684
"nameStyles": theme_styles["name"],
@@ -95,26 +93,40 @@ def get_popup_html(self, error, info, doc):
9593
"textStyles": theme_styles["text"]
9694
}
9795

98-
return self.template.substitute(parameters)
96+
if self.template is None:
97+
self.template = Template(load_quickinfo_and_error_popup_template())
98+
html = self.template.substitute(parameters)
9999

100-
def get_error_text_html(self, pt):
100+
settings = sublime.load_settings("TypeScript.sublime-settings")
101+
self.view.show_popup(
102+
html,
103+
flags=sublime.HIDE_ON_MOUSE_MOVE_AWAY,
104+
location=display_point,
105+
max_height=300,
106+
max_width=settings.get("quick_info_popup_max_width") or self.view.viewport_extent()[0]
107+
)
108+
109+
def get_error_text_html(self, span):
101110
client_info = cli.get_or_add_file(self.view.file_name())
102-
error_text = ""
103-
for (region, text) in client_info.errors['syntacticDiag']:
104-
if region.contains(pt):
105-
error_text = text
106-
break
107-
for (region, text) in client_info.errors['semanticDiag']:
108-
if region.contains(pt):
109-
error_text = text
110-
break
111-
return escape_html(error_text)
112-
113-
def run(self, text, hover_point=None):
111+
all_errors = client_info.errors['syntacticDiag'] + client_info.errors['semanticDiag']
112+
113+
errors = []
114+
for (region, text) in all_errors:
115+
if region.intersects(span):
116+
errors.append(escape_html(text))
117+
118+
return '<br/>'.join(errors)
119+
120+
def run(self, text, hover_point=None, hover_zone=None):
114121
check_update_view(self.view)
115122
display_point = self.view.sel()[0].begin() if hover_point is None else hover_point
116123
word_at_sel = self.view.classify(display_point)
117-
if word_at_sel & SUBLIME_WORD_MASK:
124+
if hover_zone == sublime.HOVER_GUTTER:
125+
line_span = self.view.full_line(display_point)
126+
error_html = self.get_error_text_html(line_span)
127+
if error_html:
128+
self.show_tooltip_popup(display_point, error_html, None, None)
129+
elif word_at_sel & SUBLIME_WORD_MASK:
118130
cli.service.quick_info_full(self.view.file_name(), get_location_from_position(self.view, display_point), lambda response: self.handle_quick_info(response, display_point))
119131
else:
120132
self.view.erase_status("typescript_info")

typescript/listeners/idle.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,12 @@ def show_errors(self, diagno_event_body, syntactic):
162162
sublime.DRAW_OUTLINED)
163163
else:
164164
settings = sublime.load_settings("TypeScript.sublime-settings")
165-
view.add_regions(region_key, error_regions, settings.get("error_color") or "invalid.illegal", "",
165+
view.add_regions(region_key,
166+
error_regions,
167+
settings.get("error_color", "invalid.illegal"),
168+
settings.get("error_icon", ""),
169+
sublime.DRAW_OUTLINED
170+
if settings.get("error_outlined") else
166171
sublime.DRAW_NO_FILL +
167172
sublime.DRAW_NO_OUTLINE +
168173
sublime.DRAW_SQUIGGLY_UNDERLINE)

typescript/listeners/quick_info_tool_tip.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
class QuickInfoToolTipEventListener:
77
def on_hover(self, view, point, hover_zone):
8-
view.run_command('typescript_quick_info_doc', {"hover_point": point})
8+
view.run_command('typescript_quick_info_doc', {"hover_point": point, "hover_zone": hover_zone})
99

1010
listen = QuickInfoToolTipEventListener()
1111
EventHub.subscribe("on_hover", listen.on_hover)

0 commit comments

Comments
 (0)