Skip to content

Commit 4c3a680

Browse files
committed
Refactor LSP capability interfaces to include base methods and direct return pattern
1 parent a9776d3 commit 4c3a680

26 files changed

+519
-281
lines changed

src/lsp_client/capability/notification/did_change_configuration.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,14 @@ def check_server_capability(cls, cap: lsp_type.ServerCapabilities) -> None:
3737
super().check_server_capability(cap)
3838
return
3939

40-
async def notify_change_configuration(self, settings: Any | None) -> None:
40+
async def _notify_change_configuration(
41+
self, params: lsp_type.DidChangeConfigurationParams
42+
) -> None:
4143
return await self.notify(
42-
lsp_type.DidChangeConfigurationNotification(
43-
params=lsp_type.DidChangeConfigurationParams(settings=settings)
44-
),
44+
lsp_type.DidChangeConfigurationNotification(params=params)
45+
)
46+
47+
async def notify_change_configuration(self, settings: Any | None) -> None:
48+
return await self._notify_change_configuration(
49+
lsp_type.DidChangeConfigurationParams(settings=settings)
4550
)

src/lsp_client/capability/notification/text_document_synchronize.py

Lines changed: 48 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -45,29 +45,61 @@ def check_server_capability(cls, cap: lsp_type.ServerCapabilities) -> None:
4545
super().check_server_capability(cap)
4646
assert cap.text_document_sync
4747

48+
async def _notify_text_document_opened(
49+
self, params: lsp_type.DidOpenTextDocumentParams
50+
) -> None:
51+
return await self.notify(
52+
lsp_type.DidOpenTextDocumentNotification(params=params)
53+
)
54+
4855
async def notify_text_document_opened(
4956
self, file_path: AnyPath, file_content: str
5057
) -> None:
51-
await self.notify(
52-
msg=lsp_type.DidOpenTextDocumentNotification(
53-
params=lsp_type.DidOpenTextDocumentParams(
54-
text_document=lsp_type.TextDocumentItem(
55-
uri=self.as_uri(file_path),
56-
language_id=self.get_language_id(),
57-
version=0, # Version 0 for the initial open
58-
text=file_content,
59-
)
58+
return await self._notify_text_document_opened(
59+
lsp_type.DidOpenTextDocumentParams(
60+
text_document=lsp_type.TextDocumentItem(
61+
uri=self.as_uri(file_path),
62+
language_id=self.get_language_id(),
63+
version=0, # Version 0 for the initial open
64+
text=file_content,
6065
)
6166
)
6267
)
6368

69+
async def _notify_text_document_changed(
70+
self, params: lsp_type.DidChangeTextDocumentParams
71+
) -> None:
72+
return await self.notify(
73+
lsp_type.DidChangeTextDocumentNotification(params=params)
74+
)
75+
76+
async def notify_text_document_changed(
77+
self,
78+
file_path: AnyPath,
79+
content_changes: Sequence[lsp_type.TextDocumentContentChangeEvent],
80+
version: int = 0,
81+
) -> None:
82+
return await self._notify_text_document_changed(
83+
lsp_type.DidChangeTextDocumentParams(
84+
text_document=lsp_type.VersionedTextDocumentIdentifier(
85+
uri=self.as_uri(file_path), version=version
86+
),
87+
content_changes=list(content_changes),
88+
)
89+
)
90+
91+
async def _notify_text_document_closed(
92+
self, params: lsp_type.DidCloseTextDocumentParams
93+
) -> None:
94+
return await self.notify(
95+
lsp_type.DidCloseTextDocumentNotification(params=params)
96+
)
97+
6498
async def notify_text_document_closed(self, file_path: AnyPath) -> None:
65-
await self.notify(
66-
msg=lsp_type.DidCloseTextDocumentNotification(
67-
params=lsp_type.DidCloseTextDocumentParams(
68-
text_document=lsp_type.TextDocumentIdentifier(
69-
uri=self.as_uri(file_path)
70-
),
71-
)
99+
return await self._notify_text_document_closed(
100+
lsp_type.DidCloseTextDocumentParams(
101+
text_document=lsp_type.TextDocumentIdentifier(
102+
uri=self.as_uri(file_path)
103+
),
72104
)
73105
)

src/lsp_client/capability/request/call_hierarchy.py

Lines changed: 82 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -46,22 +46,51 @@ def check_server_capability(cls, cap: lsp_type.ServerCapabilities) -> None:
4646
super().check_server_capability(cap)
4747
assert cap.call_hierarchy_provider
4848

49+
async def _request_call_hierarchy_prepare(
50+
self, params: lsp_type.CallHierarchyPrepareParams
51+
) -> lsp_type.CallHierarchyPrepareResult:
52+
return await self.request(
53+
lsp_type.CallHierarchyPrepareRequest(
54+
id=jsonrpc_uuid(),
55+
params=params,
56+
),
57+
schema=lsp_type.CallHierarchyPrepareResponse,
58+
)
59+
60+
async def _request_call_hierarchy_incoming_calls(
61+
self, params: lsp_type.CallHierarchyIncomingCallsParams
62+
) -> lsp_type.CallHierarchyIncomingCallsResult:
63+
return await self.request(
64+
lsp_type.CallHierarchyIncomingCallsRequest(
65+
id=jsonrpc_uuid(),
66+
params=params,
67+
),
68+
schema=lsp_type.CallHierarchyIncomingCallsResponse,
69+
)
70+
71+
async def _request_call_hierarchy_outgoing_calls(
72+
self, params: lsp_type.CallHierarchyOutgoingCallsParams
73+
) -> lsp_type.CallHierarchyOutgoingCallsResult:
74+
return await self.request(
75+
lsp_type.CallHierarchyOutgoingCallsRequest(
76+
id=jsonrpc_uuid(),
77+
params=params,
78+
),
79+
schema=lsp_type.CallHierarchyOutgoingCallsResponse,
80+
)
81+
4982
async def prepare_call_hierarchy(
5083
self, file_path: AnyPath, position: Position
5184
) -> Sequence[lsp_type.CallHierarchyItem] | None:
52-
return await self.file_request(
53-
lsp_type.CallHierarchyPrepareRequest(
54-
id=jsonrpc_uuid(),
55-
params=lsp_type.CallHierarchyPrepareParams(
85+
async with self.open_files(file_path):
86+
return await self._request_call_hierarchy_prepare(
87+
lsp_type.CallHierarchyPrepareParams(
5688
text_document=lsp_type.TextDocumentIdentifier(
5789
uri=self.as_uri(file_path)
5890
),
5991
position=position,
60-
),
61-
),
62-
schema=lsp_type.CallHierarchyPrepareResponse,
63-
file_paths=[file_path],
64-
)
92+
)
93+
)
6594

6695
async def request_call_hierarchy_incoming_call(
6796
self, file_path: AnyPath, position: Position
@@ -71,30 +100,33 @@ async def request_call_hierarchy_incoming_call(
71100
all incoming calls for each definition.
72101
"""
73102

74-
prepared = await self.prepare_call_hierarchy(file_path, position)
103+
async with self.open_files(file_path):
104+
prepared = await self._request_call_hierarchy_prepare(
105+
lsp_type.CallHierarchyPrepareParams(
106+
text_document=lsp_type.TextDocumentIdentifier(
107+
uri=self.as_uri(file_path)
108+
),
109+
position=position,
110+
)
111+
)
75112

76-
if not prepared:
77-
return None
113+
if not prepared:
114+
return None
78115

79-
calls: list[lsp_type.CallHierarchyIncomingCall] = []
116+
calls: list[lsp_type.CallHierarchyIncomingCall] = []
80117

81-
async def request(item: lsp_type.CallHierarchyItem) -> None:
82-
if resp := await self.file_request(
83-
req=lsp_type.CallHierarchyIncomingCallsRequest(
84-
id=jsonrpc_uuid(),
85-
params=lsp_type.CallHierarchyIncomingCallsParams(item=item),
86-
),
87-
schema=lsp_type.CallHierarchyIncomingCallsResponse,
88-
file_paths=[file_path],
89-
):
90-
calls.extend(resp)
118+
async def request(item: lsp_type.CallHierarchyItem) -> None:
119+
if resp := await self._request_call_hierarchy_incoming_calls(
120+
lsp_type.CallHierarchyIncomingCallsParams(item=item)
121+
):
122+
calls.extend(resp)
91123

92-
async with asyncer.create_task_group() as tg:
93-
for item in prepared:
94-
tg.soonify(request)(item)
124+
async with asyncer.create_task_group() as tg:
125+
for item in prepared:
126+
tg.soonify(request)(item)
95127

96-
if calls:
97-
return calls
128+
if calls:
129+
return calls
98130

99131
async def request_call_hierarchy_outgoing_call(
100132
self, file_path: AnyPath, position: Position
@@ -104,27 +136,30 @@ async def request_call_hierarchy_outgoing_call(
104136
all outgoing calls for each definition.
105137
"""
106138

107-
prepared = await self.prepare_call_hierarchy(file_path, position)
139+
async with self.open_files(file_path):
140+
prepared = await self._request_call_hierarchy_prepare(
141+
lsp_type.CallHierarchyPrepareParams(
142+
text_document=lsp_type.TextDocumentIdentifier(
143+
uri=self.as_uri(file_path)
144+
),
145+
position=position,
146+
)
147+
)
108148

109-
if not prepared:
110-
return None
149+
if not prepared:
150+
return None
111151

112-
calls: list[lsp_type.CallHierarchyOutgoingCall] = []
152+
calls: list[lsp_type.CallHierarchyOutgoingCall] = []
113153

114-
async def append_calls(item: lsp_type.CallHierarchyItem) -> None:
115-
if resp := await self.file_request(
116-
req=lsp_type.CallHierarchyOutgoingCallsRequest(
117-
id=jsonrpc_uuid(),
118-
params=lsp_type.CallHierarchyOutgoingCallsParams(item=item),
119-
),
120-
schema=lsp_type.CallHierarchyOutgoingCallsResponse,
121-
file_paths=[file_path],
122-
):
123-
calls.extend(resp)
154+
async def append_calls(item: lsp_type.CallHierarchyItem) -> None:
155+
if resp := await self._request_call_hierarchy_outgoing_calls(
156+
lsp_type.CallHierarchyOutgoingCallsParams(item=item)
157+
):
158+
calls.extend(resp)
124159

125-
async with asyncer.create_task_group() as tg:
126-
for item in prepared:
127-
tg.soonify(append_calls)(item)
160+
async with asyncer.create_task_group() as tg:
161+
for item in prepared:
162+
tg.soonify(append_calls)(item)
128163

129-
if calls:
130-
return calls
164+
if calls:
165+
return calls

src/lsp_client/capability/request/completion.py

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,28 @@ def check_server_capability(cls, cap: lsp_type.ServerCapabilities) -> None:
5454
super().check_server_capability(cap)
5555
assert cap.completion_provider
5656

57+
async def _request_completion(
58+
self, params: lsp_type.CompletionParams
59+
) -> lsp_type.CompletionResponse:
60+
return await self.request(
61+
lsp_type.CompletionRequest(
62+
id=jsonrpc_uuid(),
63+
params=params,
64+
),
65+
schema=lsp_type.CompletionResponse,
66+
)
67+
68+
async def _request_completion_resolve(
69+
self, params: lsp_type.CompletionItem
70+
) -> lsp_type.CompletionResolveResponse:
71+
return await self.request(
72+
lsp_type.CompletionResolveRequest(
73+
id=jsonrpc_uuid(),
74+
params=params,
75+
),
76+
schema=lsp_type.CompletionResolveResponse,
77+
)
78+
5779
async def request_completion(
5880
self,
5981
file_path: AnyPath,
@@ -67,20 +89,17 @@ async def request_completion(
6789
trigger_kind=trigger_kind,
6890
trigger_character=trigger_character,
6991
)
70-
result = await self.file_request(
71-
lsp_type.CompletionRequest(
72-
id=jsonrpc_uuid(),
73-
params=lsp_type.CompletionParams(
92+
93+
async with self.open_files(file_path):
94+
result = await self._request_completion(
95+
lsp_type.CompletionParams(
7496
text_document=lsp_type.TextDocumentIdentifier(
7597
uri=self.as_uri(file_path)
7698
),
7799
position=position,
78100
context=context,
79-
),
80-
),
81-
schema=lsp_type.CompletionResponse,
82-
file_paths=[file_path],
83-
)
101+
)
102+
)
84103

85104
match result:
86105
case lsp_type.CompletionList(items=items):
@@ -108,10 +127,4 @@ async def request_completion_resolve(
108127
self,
109128
item: lsp_type.CompletionItem,
110129
) -> lsp_type.CompletionItem:
111-
return await self.request(
112-
lsp_type.CompletionResolveRequest(
113-
id=jsonrpc_uuid(),
114-
params=item,
115-
),
116-
schema=lsp_type.CompletionResolveResponse,
117-
)
130+
return await self._request_completion_resolve(item)

src/lsp_client/capability/request/declaration.py

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,17 @@ def check_server_capability(cls, cap: lsp_type.ServerCapabilities) -> None:
4141
super().check_server_capability(cap)
4242
assert cap.declaration_provider
4343

44+
async def _request_declaration(
45+
self, params: lsp_type.DeclarationParams
46+
) -> lsp_type.DeclarationResponse:
47+
return await self.request(
48+
lsp_type.DeclarationRequest(
49+
id=jsonrpc_uuid(),
50+
params=params,
51+
),
52+
schema=lsp_type.DeclarationResponse,
53+
)
54+
4455
async def request_declaration(
4556
self, file_path: AnyPath, position: Position
4657
) -> (
@@ -49,19 +60,15 @@ async def request_declaration(
4960
| Sequence[lsp_type.LocationLink]
5061
| None
5162
):
52-
return await self.file_request(
53-
lsp_type.DeclarationRequest(
54-
id=jsonrpc_uuid(),
55-
params=lsp_type.DeclarationParams(
63+
async with self.open_files(file_path):
64+
return await self._request_declaration(
65+
lsp_type.DeclarationParams(
5666
text_document=lsp_type.TextDocumentIdentifier(
5767
uri=self.as_uri(file_path)
5868
),
5969
position=position,
60-
),
61-
),
62-
schema=lsp_type.DeclarationResponse,
63-
file_paths=[file_path],
64-
)
70+
)
71+
)
6572

6673
async def request_declaration_locations(
6774
self, file_path: AnyPath, position: Position

0 commit comments

Comments
 (0)