Skip to content

Commit 418d993

Browse files
authored
Optionally fallback to goto_definition in lsp_symbol_definition (#1986)
1 parent 980f954 commit 418d993

File tree

3 files changed

+36
-11
lines changed

3 files changed

+36
-11
lines changed

Default.sublime-keymap

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,8 @@
171171
// {
172172
// "command": "lsp_symbol_definition",
173173
// "args": {
174-
// "side_by_side": false
174+
// "side_by_side": false,
175+
// "fallback": false
175176
// },
176177
// "keys": [
177178
// "f12"

docs/src/features.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ In addition to the basic "Goto Definition", the protocol also provides further r
3131
- Goto Declaration
3232
- Goto Implementation
3333

34+
Additionally, the LSP's "Goto Definition" command can fall back to the built-in Sublime's "Goto Definition" if the `fallback` argument is set to `true`.
35+
This way, when there are no results found the built-in "Goto Definition" command will be triggered.
36+
3437
## Find References
3538

3639
[Example GIF 1](https://user-images.githubusercontent.com/6579999/128551752-b37fe407-148c-41cf-b1e4-6fe96ed0f77c.gif)

plugin/goto.py

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,53 +15,74 @@
1515
class LspGotoCommand(LspTextCommand):
1616

1717
method = ''
18+
fallback_command = ''
1819

19-
def is_enabled(self, event: Optional[dict] = None, point: Optional[int] = None, side_by_side: bool = False) -> bool:
20-
return super().is_enabled(event, point)
20+
def is_enabled(
21+
self,
22+
event: Optional[dict] = None,
23+
point: Optional[int] = None,
24+
side_by_side: bool = False,
25+
fallback: bool = False
26+
) -> bool:
27+
return fallback or super().is_enabled(event, point)
2128

2229
def run(
2330
self,
2431
_: sublime.Edit,
2532
event: Optional[dict] = None,
2633
point: Optional[int] = None,
27-
side_by_side: bool = False
34+
side_by_side: bool = False,
35+
fallback: bool = False
2836
) -> None:
2937
session = self.best_session(self.capability)
3038
position = get_position(self.view, event, point)
3139
if session and position is not None:
3240
params = text_document_position_params(self.view, position)
3341
request = Request(self.method, params, self.view, progress=True)
34-
session.send_request(request, functools.partial(self._handle_response_async, session, side_by_side))
42+
session.send_request(
43+
request, functools.partial(self._handle_response_async, session, side_by_side, fallback)
44+
)
45+
else:
46+
self._handle_no_results(fallback, side_by_side)
3547

3648
def _handle_response_async(
3749
self,
3850
session: Session,
3951
side_by_side: bool,
52+
fallback: bool,
4053
response: Union[None, Location, List[Location], List[LocationLink]]
4154
) -> None:
4255
if isinstance(response, dict):
4356
self.view.run_command("add_jump_record", {"selection": [(r.a, r.b) for r in self.view.sel()]})
4457
open_location_async(session, response, side_by_side)
4558
elif isinstance(response, list):
4659
if len(response) == 0:
47-
window = self.view.window()
48-
if window:
49-
window.status_message("No results found")
60+
self._handle_no_results(fallback, side_by_side)
5061
elif len(response) == 1:
5162
self.view.run_command("add_jump_record", {"selection": [(r.a, r.b) for r in self.view.sel()]})
5263
open_location_async(session, response[0], side_by_side)
5364
else:
5465
self.view.run_command("add_jump_record", {"selection": [(r.a, r.b) for r in self.view.sel()]})
5566
sublime.set_timeout(functools.partial(LocationPicker, self.view, session, response, side_by_side))
5667
else:
57-
window = self.view.window()
58-
if window:
59-
window.status_message("No results found")
68+
self._handle_no_results(fallback, side_by_side)
69+
70+
def _handle_no_results(self, fallback: bool = False, side_by_side: bool = False) -> None:
71+
window = self.view.window()
72+
73+
if not window:
74+
return
75+
76+
if fallback and self.fallback_command:
77+
window.run_command(self.fallback_command, {"side_by_side": side_by_side})
78+
else:
79+
window.status_message("No results found")
6080

6181

6282
class LspSymbolDefinitionCommand(LspGotoCommand):
6383
method = "textDocument/definition"
6484
capability = method_to_capability(method)[0]
85+
fallback_command = "goto_definition"
6586

6687

6788
class LspSymbolTypeDefinitionCommand(LspGotoCommand):

0 commit comments

Comments
 (0)