Skip to content

Commit d555a9a

Browse files
committed
refactor: diagnostic
1 parent 409e6f1 commit d555a9a

File tree

15 files changed

+154
-21
lines changed

15 files changed

+154
-21
lines changed

AGENTS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
- Lint & format: `ruff check --fix && ruff format`
66
- Type checking: `ty check <dir_or_file>`
77
- Run tests: `uv run pytest`
8+
- Python: always use `uv`
89

910
## Code Style Guidelines
1011

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from __future__ import annotations
2+
3+
from .document import WithDocumentDiagnostic
4+
from .workspace import WithWorkspaceDiagnostic
5+
6+
__all__ = [
7+
"WithDocumentDiagnostic",
8+
"WithWorkspaceDiagnostic",
9+
]

src/lsp_client/capability/request/pull_diagnostic.py renamed to src/lsp_client/capability/diagnostic/document.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,12 @@
66
from loguru import logger
77

88
from lsp_client.jsonrpc.id import jsonrpc_uuid
9-
from lsp_client.protocol import (
10-
CapabilityClientProtocol,
11-
TextDocumentCapabilityProtocol,
12-
)
9+
from lsp_client.protocol import CapabilityClientProtocol, TextDocumentCapabilityProtocol
1310
from lsp_client.utils.types import AnyPath, lsp_type
1411

1512

1613
@runtime_checkable
17-
class WithRequestPullDiagnostic(
14+
class WithDocumentDiagnostic(
1815
TextDocumentCapabilityProtocol,
1916
CapabilityClientProtocol,
2017
Protocol,
@@ -27,7 +24,7 @@ class WithRequestPullDiagnostic(
2724
@classmethod
2825
def iter_methods(cls) -> Iterator[str]:
2926
yield from super().iter_methods()
30-
yield from (lsp_type.TEXT_DOCUMENT_DIAGNOSTIC,)
27+
yield lsp_type.TEXT_DOCUMENT_DIAGNOSTIC
3128

3229
@override
3330
@classmethod
@@ -36,7 +33,6 @@ def register_text_document_capability(
3633
) -> None:
3734
super().register_text_document_capability(cap)
3835
cap.diagnostic = lsp_type.DiagnosticClientCapabilities(
39-
dynamic_registration=True,
4036
related_document_support=True,
4137
related_information=True,
4238
tag_support=lsp_type.ClientDiagnosticsTagOptions(
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
from __future__ import annotations
2+
3+
from collections.abc import Iterator
4+
from typing import Protocol, override, runtime_checkable
5+
6+
from lsp_client.jsonrpc.id import jsonrpc_uuid
7+
from lsp_client.protocol import (
8+
CapabilityClientProtocol,
9+
ServerRequestHook,
10+
ServerRequestHookProtocol,
11+
ServerRequestHookRegistry,
12+
WorkspaceCapabilityProtocol,
13+
)
14+
from lsp_client.utils.types import lsp_type
15+
16+
17+
@runtime_checkable
18+
class WithWorkspaceDiagnostic(
19+
WorkspaceCapabilityProtocol,
20+
ServerRequestHookProtocol,
21+
CapabilityClientProtocol,
22+
Protocol,
23+
):
24+
"""
25+
`workspace/diagnostic` - https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#workspace_diagnostic
26+
`workspace/diagnostic/refresh` - https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#diagnostic_refresh
27+
"""
28+
29+
@override
30+
@classmethod
31+
def iter_methods(cls) -> Iterator[str]:
32+
yield from super().iter_methods()
33+
yield lsp_type.WORKSPACE_DIAGNOSTIC
34+
yield lsp_type.WORKSPACE_DIAGNOSTIC_REFRESH
35+
36+
@override
37+
@classmethod
38+
def register_workspace_capability(
39+
cls, cap: lsp_type.WorkspaceClientCapabilities
40+
) -> None:
41+
super().register_workspace_capability(cap)
42+
cap.diagnostics = lsp_type.DiagnosticWorkspaceClientCapabilities(
43+
refresh_support=True,
44+
)
45+
46+
@override
47+
@classmethod
48+
def check_server_capability(cls, cap: lsp_type.ServerCapabilities) -> None:
49+
super().check_server_capability(cap)
50+
assert cap.diagnostic_provider
51+
assert cap.diagnostic_provider.workspace_diagnostics
52+
53+
async def _request_workspace_diagnostic(
54+
self, params: lsp_type.WorkspaceDiagnosticParams
55+
) -> lsp_type.WorkspaceDiagnosticReport:
56+
return await self.request(
57+
lsp_type.WorkspaceDiagnosticRequest(
58+
id=jsonrpc_uuid(),
59+
params=params,
60+
),
61+
schema=lsp_type.WorkspaceDiagnosticResponse,
62+
)
63+
64+
async def request_workspace_diagnostic(
65+
self,
66+
*,
67+
identifier: str | None = None,
68+
previous_result_ids: list[lsp_type.PreviousResultId] | None = None,
69+
) -> lsp_type.WorkspaceDiagnosticReport | None:
70+
"""
71+
`workspace/diagnostic` - Request diagnostic reports for the whole workspace.
72+
"""
73+
return await self._request_workspace_diagnostic(
74+
lsp_type.WorkspaceDiagnosticParams(
75+
identifier=identifier,
76+
previous_result_ids=previous_result_ids or [],
77+
)
78+
)
79+
80+
async def _respond_diagnostic_refresh(self, params: None) -> None:
81+
return None
82+
83+
async def respond_diagnostic_refresh(
84+
self, req: lsp_type.DiagnosticRefreshRequest
85+
) -> lsp_type.DiagnosticRefreshResponse:
86+
return lsp_type.DiagnosticRefreshResponse(
87+
id=req.id,
88+
result=await self._respond_diagnostic_refresh(req.params),
89+
)
90+
91+
@override
92+
def register_server_request_hooks(
93+
self, registry: ServerRequestHookRegistry
94+
) -> None:
95+
super().register_server_request_hooks(registry)
96+
registry.register(
97+
lsp_type.WORKSPACE_DIAGNOSTIC_REFRESH,
98+
ServerRequestHook(
99+
cls=lsp_type.DiagnosticRefreshRequest,
100+
execute=self.respond_diagnostic_refresh,
101+
),
102+
)

src/lsp_client/capability/request/__init__.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
from typing import Final
44

5+
from ..diagnostic.document import WithDocumentDiagnostic
6+
from ..diagnostic.workspace import WithWorkspaceDiagnostic
57
from .call_hierarchy import WithRequestCallHierarchy
68
from .code_action import WithRequestCodeAction
79
from .completion import WithRequestCompletion
@@ -12,7 +14,6 @@
1214
from .implementation import WithRequestImplementation
1315
from .inlay_hint import WithRequestInlayHint
1416
from .inline_value import WithRequestInlineValue
15-
from .pull_diagnostic import WithRequestPullDiagnostic
1617
from .reference import WithRequestReferences
1718
from .signature_help import WithRequestSignatureHelp
1819
from .type_definition import WithRequestTypeDefinition
@@ -30,15 +31,17 @@
3031
WithRequestImplementation,
3132
WithRequestInlayHint,
3233
WithRequestInlineValue,
33-
WithRequestPullDiagnostic,
34+
WithDocumentDiagnostic,
3435
WithRequestReferences,
3536
WithRequestSignatureHelp,
3637
WithRequestTypeDefinition,
3738
WithRequestTypeHierarchy,
39+
WithWorkspaceDiagnostic,
3840
WithRequestWorkspaceSymbol,
3941
)
4042

4143
__all__ = [
44+
"WithDocumentDiagnostic",
4245
"WithRequestCallHierarchy",
4346
"WithRequestCodeAction",
4447
"WithRequestCompletion",
@@ -49,11 +52,11 @@
4952
"WithRequestImplementation",
5053
"WithRequestInlayHint",
5154
"WithRequestInlineValue",
52-
"WithRequestPullDiagnostic",
5355
"WithRequestReferences",
5456
"WithRequestSignatureHelp",
5557
"WithRequestTypeDefinition",
5658
"WithRequestTypeHierarchy",
5759
"WithRequestWorkspaceSymbol",
60+
"WithWorkspaceDiagnostic",
5861
"capabilities",
5962
]

src/lsp_client/capability/request/inlay_hint.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ def register_text_document_capability(
3535
cls, cap: lsp_type.TextDocumentClientCapabilities
3636
) -> None:
3737
cap.inlay_hint = lsp_type.InlayHintClientCapabilities(
38-
dynamic_registration=True,
3938
resolve_support=lsp_type.ClientInlayHintResolveOptions(
4039
properties=[
4140
"tooltip",

src/lsp_client/capability/request/inline_value.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,7 @@ def iter_methods(cls) -> Iterator[str]:
2929
def register_text_document_capability(
3030
cls, cap: lsp_type.TextDocumentClientCapabilities
3131
) -> None:
32-
cap.inline_value = lsp_type.InlineValueClientCapabilities(
33-
dynamic_registration=True
34-
)
32+
cap.inline_value = lsp_type.InlineValueClientCapabilities()
3533

3634
@override
3735
@classmethod

src/lsp_client/capability/server_request/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from typing import Final
44

5+
from ..diagnostic.workspace import WithWorkspaceDiagnostic
56
from .configuration import WithRespondConfigurationRequest
67
from .inlay_hint_refresh import WithRespondInlayHintRefresh
78
from .show_document_request import WithRespondShowDocumentRequest
@@ -10,6 +11,7 @@
1011

1112
capabilities: Final = (
1213
WithRespondConfigurationRequest,
14+
WithWorkspaceDiagnostic,
1315
WithRespondInlayHintRefresh,
1416
WithRespondShowDocumentRequest,
1517
WithRespondShowMessageRequest,
@@ -22,5 +24,6 @@
2224
"WithRespondShowDocumentRequest",
2325
"WithRespondShowMessageRequest",
2426
"WithRespondWorkspaceFoldersRequest",
27+
"WithWorkspaceDiagnostic",
2528
"capabilities",
2629
]

src/lsp_client/clients/deno/client.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,15 @@
1313
WithNotifyDidChangeConfiguration,
1414
)
1515
from lsp_client.capability.request import (
16+
WithDocumentDiagnostic,
1617
WithRequestCallHierarchy,
18+
WithRequestCodeAction,
1719
WithRequestCompletion,
1820
WithRequestDefinition,
1921
WithRequestDocumentSymbol,
2022
WithRequestHover,
2123
WithRequestImplementation,
2224
WithRequestInlayHint,
23-
WithRequestPullDiagnostic,
2425
WithRequestReferences,
2526
WithRequestSignatureHelp,
2627
WithRequestTypeDefinition,
@@ -96,6 +97,7 @@ async def ensure_deno_installed() -> None:
9697
class DenoClient(
9798
Client,
9899
WithNotifyDidChangeConfiguration,
100+
WithRequestCodeAction,
99101
WithRequestHover,
100102
WithRequestCompletion,
101103
WithRequestDefinition,
@@ -105,7 +107,7 @@ class DenoClient(
105107
WithRequestCallHierarchy,
106108
WithRequestDocumentSymbol,
107109
WithRequestInlayHint,
108-
WithRequestPullDiagnostic,
110+
WithDocumentDiagnostic,
109111
WithRequestSignatureHelp,
110112
WithRequestWorkspaceSymbol,
111113
WithReceiveLogMessage,

src/lsp_client/clients/gopls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from lsp_client.capability.notification import WithNotifyDidChangeConfiguration
1313
from lsp_client.capability.request import (
1414
WithRequestCallHierarchy,
15+
WithRequestCodeAction,
1516
WithRequestCompletion,
1617
WithRequestDefinition,
1718
WithRequestDocumentSymbol,
@@ -76,6 +77,7 @@ class GoplsClient(
7677
GoClientBase,
7778
WithNotifyDidChangeConfiguration,
7879
WithRequestCallHierarchy,
80+
WithRequestCodeAction,
7981
WithRequestCompletion,
8082
WithRequestDefinition,
8183
WithRequestDocumentSymbol,

0 commit comments

Comments
 (0)