|
15 | 15 | class LspGotoCommand(LspTextCommand):
|
16 | 16 |
|
17 | 17 | method = ''
|
| 18 | + fallback_command = '' |
18 | 19 |
|
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) |
21 | 28 |
|
22 | 29 | def run(
|
23 | 30 | self,
|
24 | 31 | _: sublime.Edit,
|
25 | 32 | event: Optional[dict] = None,
|
26 | 33 | point: Optional[int] = None,
|
27 |
| - side_by_side: bool = False |
| 34 | + side_by_side: bool = False, |
| 35 | + fallback: bool = False |
28 | 36 | ) -> None:
|
29 | 37 | session = self.best_session(self.capability)
|
30 | 38 | position = get_position(self.view, event, point)
|
31 | 39 | if session and position is not None:
|
32 | 40 | params = text_document_position_params(self.view, position)
|
33 | 41 | 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) |
35 | 47 |
|
36 | 48 | def _handle_response_async(
|
37 | 49 | self,
|
38 | 50 | session: Session,
|
39 | 51 | side_by_side: bool,
|
| 52 | + fallback: bool, |
40 | 53 | response: Union[None, Location, List[Location], List[LocationLink]]
|
41 | 54 | ) -> None:
|
42 | 55 | if isinstance(response, dict):
|
43 | 56 | self.view.run_command("add_jump_record", {"selection": [(r.a, r.b) for r in self.view.sel()]})
|
44 | 57 | open_location_async(session, response, side_by_side)
|
45 | 58 | elif isinstance(response, list):
|
46 | 59 | 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) |
50 | 61 | elif len(response) == 1:
|
51 | 62 | self.view.run_command("add_jump_record", {"selection": [(r.a, r.b) for r in self.view.sel()]})
|
52 | 63 | open_location_async(session, response[0], side_by_side)
|
53 | 64 | else:
|
54 | 65 | self.view.run_command("add_jump_record", {"selection": [(r.a, r.b) for r in self.view.sel()]})
|
55 | 66 | sublime.set_timeout(functools.partial(LocationPicker, self.view, session, response, side_by_side))
|
56 | 67 | 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") |
60 | 80 |
|
61 | 81 |
|
62 | 82 | class LspSymbolDefinitionCommand(LspGotoCommand):
|
63 | 83 | method = "textDocument/definition"
|
64 | 84 | capability = method_to_capability(method)[0]
|
| 85 | + fallback_command = "goto_definition" |
65 | 86 |
|
66 | 87 |
|
67 | 88 | class LspSymbolTypeDefinitionCommand(LspGotoCommand):
|
|
0 commit comments