Skip to content

Commit 3acfdfe

Browse files
committed
update
1 parent 8afa2c5 commit 3acfdfe

File tree

17 files changed

+153
-363
lines changed

17 files changed

+153
-363
lines changed

src/lsap/capability/abc.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from typing import Protocol
33

44
from attrs import define
5+
from lsp_client import Client
56
from lsp_client.protocol import CapabilityClientProtocol
67
from pydantic import BaseModel
78

@@ -10,8 +11,8 @@ class ClientProtocol(CapabilityClientProtocol, Protocol): ...
1011

1112

1213
@define
13-
class Capability[C: ClientProtocol, Req: BaseModel, Resp: BaseModel](ABC):
14-
client: C
14+
class Capability[Req: BaseModel, Resp: BaseModel](ABC):
15+
client: Client
1516

1617
@abstractmethod
1718
async def __call__(self, req: Req) -> Resp | None: ...

src/lsap/capability/definition.py

Lines changed: 21 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,28 @@
11
from __future__ import annotations
22

33
from functools import cached_property
4-
from typing import Protocol, Sequence, override, runtime_checkable
4+
from typing import Sequence, override
55

66
import asyncer
77
from attrs import define
88
from lsp_client.capability.request import (
99
WithRequestDeclaration,
1010
WithRequestDefinition,
11-
WithRequestDocumentSymbol,
12-
WithRequestHover,
1311
WithRequestTypeDefinition,
1412
)
1513
from lsprotocol.types import Location
1614

17-
from lsap.exception import UnsupportedCapabilityError
1815
from lsap.schema.definition import DefinitionRequest, DefinitionResponse
1916
from lsap.schema.models import SymbolCodeInfo
17+
from lsap.utils.capability import ensure_capability
2018

21-
from .abc import Capability, ClientProtocol
19+
from .abc import Capability
2220
from .locate import LocateCapability
2321
from .symbol import SymbolCapability
2422

2523

26-
@runtime_checkable
27-
class DefinitionClient(
28-
WithRequestDefinition,
29-
WithRequestDocumentSymbol,
30-
WithRequestHover,
31-
ClientProtocol,
32-
Protocol,
33-
): ...
34-
35-
3624
@define
37-
class DefinitionCapability(
38-
Capability[DefinitionClient, DefinitionRequest, DefinitionResponse]
39-
):
25+
class DefinitionCapability(Capability[DefinitionRequest, DefinitionResponse]):
4026
@cached_property
4127
def locate(self) -> LocateCapability:
4228
return LocateCapability(self.client)
@@ -55,31 +41,25 @@ async def __call__(self, req: DefinitionRequest) -> DefinitionResponse | None:
5541
locations: Sequence[Location] | None = None
5642
match req.mode:
5743
case "definition":
58-
locations = await self.client.request_definition_locations(
59-
file_path, lsp_pos
60-
)
44+
locations = await ensure_capability(
45+
self.client, WithRequestDefinition
46+
).request_definition_locations(file_path, lsp_pos)
6147
case "declaration":
62-
if not isinstance(self.client, WithRequestDeclaration):
63-
raise UnsupportedCapabilityError(
64-
"Client does not support 'textDocument/declaration'. "
65-
"To find declarations, you can: "
66-
"1) Use 'definition' mode (most language servers treat them similarly); "
67-
"2) For C/C++, check corresponding header files manually."
68-
)
69-
locations = await self.client.request_declaration_locations(
70-
file_path, lsp_pos
71-
)
48+
locations = await ensure_capability(
49+
self.client,
50+
WithRequestDeclaration,
51+
error="To find declarations, you can: "
52+
"1) Use 'definition' mode (most language servers treat them similarly); "
53+
"2) For C/C++, check corresponding header files manually.",
54+
).request_declaration_locations(file_path, lsp_pos)
7255
case "type_definition":
73-
if not isinstance(self.client, WithRequestTypeDefinition):
74-
raise UnsupportedCapabilityError(
75-
"Client does not support 'textDocument/typeDefinition'. "
76-
"To find type definitions, you can: "
77-
"1) Use 'definition' on the type name itself if visible; "
78-
"2) Use 'hover' to see the type name and then search for it."
79-
)
80-
locations = await self.client.request_type_definition_locations(
81-
file_path, lsp_pos
82-
)
56+
locations = await ensure_capability(
57+
self.client,
58+
WithRequestTypeDefinition,
59+
error="To find type definitions, you can: "
60+
"1) Use 'definition' on the type name itself if visible; "
61+
"2) Use 'hover' to see the type name and then search for it.",
62+
).request_type_definition_locations(file_path, lsp_pos)
8363

8464
if not locations:
8565
return None

src/lsap/capability/draft/__init__.py

Lines changed: 0 additions & 4 deletions
This file was deleted.

src/lsap/capability/draft/completion.py

Lines changed: 0 additions & 99 deletions
This file was deleted.

src/lsap/capability/draft/diagnostics.py

Lines changed: 0 additions & 92 deletions
This file was deleted.

src/lsap/capability/hover.py

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,19 @@
11
from __future__ import annotations
22

33
from functools import cached_property
4-
from typing import Protocol, runtime_checkable
54

65
from attrs import define
7-
from lsp_client.capability.request import WithRequestDocumentSymbol, WithRequestHover
6+
from lsp_client.capability.request import WithRequestHover
87

98
from lsap.schema.hover import HoverRequest, HoverResponse
9+
from lsap.utils.capability import ensure_capability
1010

11-
from .abc import Capability, ClientProtocol
11+
from .abc import Capability
1212
from .locate import LocateCapability
1313

1414

15-
@runtime_checkable
16-
class HoverClient(
17-
WithRequestHover,
18-
WithRequestDocumentSymbol,
19-
ClientProtocol,
20-
Protocol,
21-
): ...
22-
23-
2415
@define
25-
class HoverCapability(Capability[HoverClient, HoverRequest, HoverResponse]):
16+
class HoverCapability(Capability[HoverRequest, HoverResponse]):
2617
@cached_property
2718
def locate(self) -> LocateCapability:
2819
return LocateCapability(self.client)
@@ -32,7 +23,9 @@ async def __call__(self, req: HoverRequest) -> HoverResponse | None:
3223
return None
3324

3425
file_path, lsp_pos = loc_resp.file_path, loc_resp.position.to_lsp()
35-
hover = await self.client.request_hover(file_path, lsp_pos)
26+
hover = await ensure_capability(self.client, WithRequestHover).request_hover(
27+
file_path, lsp_pos
28+
)
3629

3730
if hover is None:
3831
return None

0 commit comments

Comments
 (0)