Skip to content

Commit

Permalink
Render Code Lenses as phantoms
Browse files Browse the repository at this point in the history
  • Loading branch information
Rapptz committed Jun 19, 2021
1 parent 7be03e5 commit 9960ddd
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 5 deletions.
36 changes: 32 additions & 4 deletions plugin/code_lens.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ class CodeLensView:

def __init__(self, view: sublime.View) -> None:
self.view = view
self._phantom = sublime.PhantomSet(view, self.CODE_LENS_KEY)
self._code_lenses = {} # type: Dict[Tuple[int, int], List[CodeLensData]]

def clear(self) -> None:
Expand All @@ -82,6 +83,7 @@ def _region_key(self, index: int) -> str:
return '{0}.{1}'.format(self.CODE_LENS_KEY, index)

def clear_view(self) -> None:
self._phantom.update([])
self.clear_annotations()

def handle_response(self, session_name: str, response: List[CodeLens]) -> None:
Expand Down Expand Up @@ -131,10 +133,36 @@ def resolved_code_lens(self) -> Iterable[CodeLensData]:
if lens.is_resolved():
yield lens

def render(self) -> None:
accent = self.view.style_for_scope("region.greenish markup.accent.codelens.lsp")["foreground"]
for index, lens in enumerate(self._flat_iteration()):
self.view.add_regions(self._region_key(index), [lens.region], "", "", 0, [lens.small_html], accent)
def _get_phantom_region(self, region: sublime.Region) -> sublime.Region:
"""Takes the current region and puts the phantom on the line above, properly indented.
Code-lenses are typically shown above the code in VSCode.
"""
line = self.view.substr(self.view.line(region))
offset = 0
for ch in line:
if ch.isspace():
offset += 1
else:
break

row, _ = self.view.rowcol_utf16(region.a)
point = self.view.text_point_utf16(max(row - 1, 0), offset, clamp_column=True)
return sublime.Region(point)

def render(self, mode: str) -> None:
if mode == 'annotation':
accent = self.view.style_for_scope("region.greenish markup.accent.codelens.lsp")["foreground"]
for index, lens in enumerate(self._flat_iteration()):
self.view.add_regions(self._region_key(index), [lens.region], "", "", 0, [lens.small_html], accent)
else: # 'phantom'
phantoms = []
for key, group in self._code_lenses.items():
region = sublime.Region(*key)
phantom_region = self._get_phantom_region(region)
html = '\n<small style="font-family: system">|</small>\n'.join(lens.small_html for lens in group)
phantoms.append(sublime.Phantom(phantom_region, html, sublime.LAYOUT_BELOW))
self._phantom.update(phantoms)

def get_resolved_code_lenses_for_region(self, region: sublime.Region) -> Generator[CodeLens, None, None]:
region = self.view.line(region)
Expand Down
3 changes: 2 additions & 1 deletion plugin/session_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,8 @@ def resolve_visible_code_lenses_async(self) -> None:
Request("codeLens/resolve", code_lens.data, self.view)
).then(callback)
promises.append(promise)
Promise.all(promises).then(lambda _: self._code_lenses.render())
mode = userprefs().show_code_lens
Promise.all(promises).then(lambda _: self._code_lenses.render(mode))

def get_resolved_code_lenses_for_region(self, region: sublime.Region) -> Generator[CodeLens, None, None]:
yield from self._code_lenses.get_resolved_code_lenses_for_region(region)
Expand Down

0 comments on commit 9960ddd

Please sign in to comment.