Skip to content

Commit 598e44a

Browse files
updated show_flow_errors
1 parent ef6e70e commit 598e44a

File tree

5 files changed

+64
-24
lines changed

5 files changed

+64
-24
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ Manually:
8181
![](https://drive.google.com/uc?authuser=0&id=1Y0NS1eb8aFoxhdn75JLoGgZMPPpqld3Z&export=download)
8282
![](https://drive.google.com/uc?authuser=0&id=1lHXQGN3CoV5-IHAoesEmkiJBjnpU2Lxf&export=download)
8383

84+
See the [Wiki](https://github.com/pichillilorenzo/JavaScriptEnhancements/wiki) for complete examples and the other **features**.
85+
8486
## Support
8587

8688
Email me for any questions or doubts about this project on: [[email protected]](mailto:[email protected])

_generated_2017_12_31_at_21_13_44.py renamed to _generated_2018_01_01_at_16_07_42.py

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3555,7 +3555,7 @@ def on_hover_description_async(view, point, hover_zone, popup_position) :
35553555

35563556
func_action = lambda x: view.run_command("go_to_def", args={"point": point}) if x == "go_to_def" else ""
35573557

3558-
if html :
3558+
if html and not view.is_popup_visible() :
35593559
view.show_popup("""
35603560
<html><head></head><body>
35613561
"""+js_css+"""
@@ -3687,6 +3687,7 @@ def show_flow_errors(view) :
36873687

36883688
errors = []
36893689
description_by_row = {}
3690+
description_by_row_column = {}
36903691
regions = []
36913692
for deps in deps_list:
36923693
if deps.project_root is '/':
@@ -3756,9 +3757,9 @@ def show_flow_errors(view) :
37563757
description += operation["descr"]
37573758

37583759
if not description :
3759-
description += message['descr']
3760+
description += "'"+message['descr']+"'"
37603761
else :
3761-
description += ". " + message['descr']
3762+
description += " " + message['descr']
37623763

37633764
if row >= 0 :
37643765
row_description = description_by_row.get(row)
@@ -3769,6 +3770,8 @@ def show_flow_errors(view) :
37693770
}
37703771
if row_description and description not in row_description:
37713772
description_by_row[row]["description"] += '; ' + description
3773+
3774+
description_by_row_column[str(row)+":"+str(col)+":"+str(endcol)] = description
37723775

37733776
errors = result[1]['errors']
37743777

@@ -3777,7 +3780,7 @@ def show_flow_errors(view) :
37773780
'flow_error', regions, 'scope.js', 'dot',
37783781
sublime.DRAW_SQUIGGLY_UNDERLINE | sublime.DRAW_NO_FILL | sublime.DRAW_NO_OUTLINE
37793782
)
3780-
return {"errors": errors, "description_by_row": description_by_row}
3783+
return {"errors": errors, "description_by_row": description_by_row, "description_by_row_column": description_by_row_column}
37813784

37823785
view.erase_regions('flow_error')
37833786
view.set_status('flow_error', 'Flow: no errors')
@@ -3893,11 +3896,13 @@ def on_modified_async_with_thread(self, recheck=True) :
38933896

38943897
self.errors = []
38953898
self.description_by_row = {}
3899+
self.description_by_row_column = {}
38963900
result = show_flow_errors(view)
38973901

38983902
if result :
38993903
self.errors = result["errors"]
39003904
self.description_by_row = result["description_by_row"]
3905+
self.description_by_row_column = result["description_by_row_column"]
39013906

39023907
sublime.set_timeout_async(lambda: self.on_selection_modified_async())
39033908

@@ -3909,17 +3914,29 @@ def on_modified_async_with_thread(self, recheck=True) :
39093914

39103915
def on_hover(self, point, hover_zone) :
39113916
view = self.view
3912-
view.erase_phantoms("flow_error")
3913-
if hover_zone != sublime.HOVER_GUTTER :
3917+
#view.erase_phantoms("flow_error")
3918+
if hover_zone != sublime.HOVER_TEXT :
39143919
return
39153920

39163921
sel = sublime.Region(point, point)
3922+
39173923
if (not view.match_selector(
39183924
sel.begin(),
39193925
'source.js'
39203926
) and not view.find_by_selector("source.js.embedded.html")) or not self.errors or not view.get_regions("flow_error"):
39213927
hide_flow_errors(view)
39223928
return
3929+
3930+
is_hover_error = False
3931+
region_hover_error = None
3932+
for region in view.get_regions("flow_error"):
3933+
if region.contains(sel):
3934+
region_hover_error = region
3935+
is_hover_error = True
3936+
break
3937+
3938+
if not is_hover_error:
3939+
return
39233940

39243941
settings = get_project_settings()
39253942
if settings :
@@ -3940,12 +3957,13 @@ def on_hover(self, point, hover_zone) :
39403957
hide_flow_errors(view)
39413958
return
39423959

3943-
row, col = view.rowcol(sel.begin())
3960+
row_region, col_region = view.rowcol(region_hover_error.begin())
3961+
row_region, endcol_region = view.rowcol(region_hover_error.end())
39443962

3945-
error_for_row = self.description_by_row.get(row)
3963+
error = self.description_by_row_column[str(row_region)+":"+str(col_region)+":"+str(endcol_region)]
39463964

3947-
if error_for_row:
3948-
text = cgi.escape(error_for_row["description"]).split(" ")
3965+
if error:
3966+
text = cgi.escape(error).split(" ")
39493967
html = ""
39503968
i = 0
39513969
while i < len(text) - 1:
@@ -3956,9 +3974,10 @@ def on_hover(self, point, hover_zone) :
39563974
if len(text) % 2 != 0 :
39573975
html += text[len(text) - 1]
39583976

3959-
region_phantom = sublime.Region( view.text_point(row, error_for_row["col"]), view.text_point(row, error_for_row["col"]) )
3960-
sublime.set_timeout_async(lambda: view.add_phantom("flow_error", region_phantom, '<html style="padding: 0px; margin: 5px; background-color: rgba(255,255,255,0);"><body style="border-radius: 10px; padding: 10px; background-color: #F44336; margin: 0px;">'+html+'</body></html>', sublime.LAYOUT_BELOW))
3977+
row_region, col_region = view.rowcol(region_hover_error.begin())
3978+
row_region, endcol_region = view.rowcol(region_hover_error.end())
39613979

3980+
view.show_popup('<html style="font-size: 0.75em; font-weight: bold; padding: 0px; margin: 0px; background-color: rgba(255,255,255,1);"><body style="padding: 5px; background-color: #F44336; margin: 0px;">'+html+'<br><a style="margin-top: 10px; display: block; color: #000;" href="copy_to_clipboard">Copy</a></body></html>', sublime.COOPERATE_WITH_AUTO_COMPLETE | sublime.HIDE_ON_MOUSE_MOVE_AWAY, region_hover_error.begin(), 1150, 80, lambda action: sublime.set_clipboard(error) or view.hide_popup() )
39623981

39633982
def on_selection_modified_async(self, *args) :
39643983

helper/javascript_completions/handle_flow_errors_command.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ def show_flow_errors(view) :
1818

1919
errors = []
2020
description_by_row = {}
21+
description_by_row_column = {}
2122
regions = []
2223
for deps in deps_list:
2324
if deps.project_root is '/':
@@ -87,9 +88,9 @@ def show_flow_errors(view) :
8788
description += operation["descr"]
8889

8990
if not description :
90-
description += message['descr']
91+
description += "'"+message['descr']+"'"
9192
else :
92-
description += ". " + message['descr']
93+
description += " " + message['descr']
9394

9495
if row >= 0 :
9596
row_description = description_by_row.get(row)
@@ -100,6 +101,8 @@ def show_flow_errors(view) :
100101
}
101102
if row_description and description not in row_description:
102103
description_by_row[row]["description"] += '; ' + description
104+
105+
description_by_row_column[str(row)+":"+str(col)+":"+str(endcol)] = description
103106

104107
errors = result[1]['errors']
105108

@@ -108,7 +111,7 @@ def show_flow_errors(view) :
108111
'flow_error', regions, 'scope.js', 'dot',
109112
sublime.DRAW_SQUIGGLY_UNDERLINE | sublime.DRAW_NO_FILL | sublime.DRAW_NO_OUTLINE
110113
)
111-
return {"errors": errors, "description_by_row": description_by_row}
114+
return {"errors": errors, "description_by_row": description_by_row, "description_by_row_column": description_by_row_column}
112115

113116
view.erase_regions('flow_error')
114117
view.set_status('flow_error', 'Flow: no errors')

helper/javascript_completions/on_hover_description_event_listener.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ def on_hover_description_async(view, point, hover_zone, popup_position) :
236236

237237
func_action = lambda x: view.run_command("go_to_def", args={"point": point}) if x == "go_to_def" else ""
238238

239-
if html :
239+
if html and not view.is_popup_visible() :
240240
view.show_popup("""
241241
<html><head></head><body>
242242
"""+js_css+"""

helper/javascript_completions/show_flow_errors_view_event_listener.py

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,13 @@ def on_modified_async_with_thread(self, recheck=True) :
9494

9595
self.errors = []
9696
self.description_by_row = {}
97+
self.description_by_row_column = {}
9798
result = show_flow_errors(view)
9899

99100
if result :
100101
self.errors = result["errors"]
101102
self.description_by_row = result["description_by_row"]
103+
self.description_by_row_column = result["description_by_row_column"]
102104

103105
sublime.set_timeout_async(lambda: self.on_selection_modified_async())
104106

@@ -110,17 +112,29 @@ def on_modified_async_with_thread(self, recheck=True) :
110112

111113
def on_hover(self, point, hover_zone) :
112114
view = self.view
113-
view.erase_phantoms("flow_error")
114-
if hover_zone != sublime.HOVER_GUTTER :
115+
#view.erase_phantoms("flow_error")
116+
if hover_zone != sublime.HOVER_TEXT :
115117
return
116118

117119
sel = sublime.Region(point, point)
120+
118121
if (not view.match_selector(
119122
sel.begin(),
120123
'source.js'
121124
) and not view.find_by_selector("source.js.embedded.html")) or not self.errors or not view.get_regions("flow_error"):
122125
hide_flow_errors(view)
123126
return
127+
128+
is_hover_error = False
129+
region_hover_error = None
130+
for region in view.get_regions("flow_error"):
131+
if region.contains(sel):
132+
region_hover_error = region
133+
is_hover_error = True
134+
break
135+
136+
if not is_hover_error:
137+
return
124138

125139
settings = get_project_settings()
126140
if settings :
@@ -141,12 +155,13 @@ def on_hover(self, point, hover_zone) :
141155
hide_flow_errors(view)
142156
return
143157

144-
row, col = view.rowcol(sel.begin())
158+
row_region, col_region = view.rowcol(region_hover_error.begin())
159+
row_region, endcol_region = view.rowcol(region_hover_error.end())
145160

146-
error_for_row = self.description_by_row.get(row)
161+
error = self.description_by_row_column[str(row_region)+":"+str(col_region)+":"+str(endcol_region)]
147162

148-
if error_for_row:
149-
text = cgi.escape(error_for_row["description"]).split(" ")
163+
if error:
164+
text = cgi.escape(error).split(" ")
150165
html = ""
151166
i = 0
152167
while i < len(text) - 1:
@@ -157,9 +172,10 @@ def on_hover(self, point, hover_zone) :
157172
if len(text) % 2 != 0 :
158173
html += text[len(text) - 1]
159174

160-
region_phantom = sublime.Region( view.text_point(row, error_for_row["col"]), view.text_point(row, error_for_row["col"]) )
161-
sublime.set_timeout_async(lambda: view.add_phantom("flow_error", region_phantom, '<html style="padding: 0px; margin: 5px; background-color: rgba(255,255,255,0);"><body style="border-radius: 10px; padding: 10px; background-color: #F44336; margin: 0px;">'+html+'</body></html>', sublime.LAYOUT_BELOW))
175+
row_region, col_region = view.rowcol(region_hover_error.begin())
176+
row_region, endcol_region = view.rowcol(region_hover_error.end())
162177

178+
view.show_popup('<html style="font-size: 0.75em; font-weight: bold; padding: 0px; margin: 0px; background-color: rgba(255,255,255,1);"><body style="padding: 5px; background-color: #F44336; margin: 0px;">'+html+'<br><a style="margin-top: 10px; display: block; color: #000;" href="copy_to_clipboard">Copy</a></body></html>', sublime.COOPERATE_WITH_AUTO_COMPLETE | sublime.HIDE_ON_MOUSE_MOVE_AWAY, region_hover_error.begin(), 1150, 80, lambda action: sublime.set_clipboard(error) or view.hide_popup() )
163179

164180
def on_selection_modified_async(self, *args) :
165181

0 commit comments

Comments
 (0)