Skip to content

Commit 7a0759c

Browse files
committed
feat(client): implement default server factory for LSP clients
1 parent 87b128a commit 7a0759c

File tree

6 files changed

+36
-11
lines changed

6 files changed

+36
-11
lines changed

src/lsp_client/client/abc.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import anyio
1111
import asyncer
1212
from anyio import AsyncContextManagerMixin
13-
from attrs import define, field
13+
from attrs import Factory, define, field
1414
from loguru import logger
1515

1616
from lsp_client.capability.build import (
@@ -51,7 +51,10 @@ class LSPClient(
5151
AsyncContextManagerMixin,
5252
ABC,
5353
):
54-
_server: LSPServer = field(alias="server")
54+
_server: LSPServer = field(
55+
alias="server",
56+
default=Factory(lambda self: self.create_default_server(), takes_self=True),
57+
)
5558

5659
_workspace: RawWorkspace = field(alias="workspace", factory=Path.cwd)
5760
sync_file: bool = True
@@ -87,6 +90,10 @@ def get_workspace(self) -> Workspace:
8790
def get_language_id(self) -> lsp_type.LanguageKind:
8891
"""The language ID of the client."""
8992

93+
@abstractmethod
94+
def create_default_server(self) -> LSPServer:
95+
"""Create the default server for this client."""
96+
9097
@abstractmethod
9198
async def ensure_installed(self) -> None:
9299
"""

src/lsp_client/clients/__init__.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
from .rust_analyzer import RustAnalyzerClient
88
from .typescript import TypescriptClient
99

10-
clients: Final = (
11-
PyreflyClient,
10+
local_clients: Final = (
1211
PyrightClient,
1312
RustAnalyzerClient,
13+
PyreflyClient,
1414
TypescriptClient,
1515
)
1616

@@ -22,5 +22,5 @@
2222
"PythonClient",
2323
"RustClient",
2424
"TypeScriptClient",
25-
"clients",
25+
"local_clients",
2626
]

src/lsp_client/clients/pyrefly.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,14 @@
3636
WithRespondWorkspaceFoldersRequest,
3737
)
3838
from lsp_client.client.abc import LSPClient
39+
from lsp_client.server.abc import LSPServer
40+
from lsp_client.server.docker import DockerServer
3941
from lsp_client.server.local import LocalServer
4042
from lsp_client.utils.types import lsp_type
4143

42-
PyreflyLocalServer = partial(LocalServer, command=["pyrefly", "lsp"])
44+
PyreflyDockerServer = partial(
45+
DockerServer, image="docker.io/lspcontainers/pyrefly"
46+
)
4347

4448

4549
@define
@@ -82,6 +86,10 @@ class PyreflyClient(
8286
def get_language_id(self) -> lsp_type.LanguageKind:
8387
return lsp_type.LanguageKind.Python
8488

89+
@override
90+
def create_default_server(self) -> LSPServer:
91+
return LocalServer(command=["pyrefly", "lsp"])
92+
8593
@override
8694
def create_initialization_options(self) -> dict[str, Any]:
8795
options: dict[str, Any] = {}

src/lsp_client/clients/pyright.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@
3535
WithRespondWorkspaceFoldersRequest,
3636
)
3737
from lsp_client.client.abc import LSPClient
38+
from lsp_client.server.abc import LSPServer
3839
from lsp_client.server.docker import DockerServer
3940
from lsp_client.server.local import LocalServer
4041
from lsp_client.utils.types import lsp_type
4142

42-
PyrightLocalServer = partial(LocalServer, command=["pyright-langserver", "--stdio"])
4343
PyrightDockerServer = partial(
4444
DockerServer, image="docker.io/lspcontainers/pyright-langserver"
4545
)
@@ -81,6 +81,10 @@ class PyrightClient(
8181
def get_language_id(self) -> lsp_type.LanguageKind:
8282
return lsp_type.LanguageKind.Python
8383

84+
@override
85+
def create_default_server(self) -> LSPServer:
86+
return LocalServer(command=["pyright-langserver", "--stdio"])
87+
8488
@override
8589
def create_initialization_options(self) -> dict[str, Any]:
8690
return {

src/lsp_client/clients/rust_analyzer.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,11 @@
3636
WithRespondWorkspaceFoldersRequest,
3737
)
3838
from lsp_client.client.abc import LSPClient
39+
from lsp_client.server.abc import LSPServer
3940
from lsp_client.server.docker import DockerServer
4041
from lsp_client.server.local import LocalServer
4142
from lsp_client.utils.types import lsp_type
4243

43-
RustAnalyzerLocalServer = partial(LocalServer, command=["rust-analyzer"])
4444
RustAnalyzerDockerServer = partial(
4545
DockerServer, image="docker.io/lspcontainers/rust-analyzer"
4646
)
@@ -86,6 +86,10 @@ class RustAnalyzerClient(
8686
def get_language_id(self) -> lsp_type.LanguageKind:
8787
return lsp_type.LanguageKind.Rust
8888

89+
@override
90+
def create_default_server(self) -> LSPServer:
91+
return LocalServer(command=["rust-analyzer"])
92+
8993
@override
9094
def create_initialization_options(self) -> dict[str, Any]:
9195
return {

src/lsp_client/clients/typescript.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,11 @@
3434
WithRespondWorkspaceFoldersRequest,
3535
)
3636
from lsp_client.client.abc import LSPClient
37+
from lsp_client.server.abc import LSPServer
3738
from lsp_client.server.docker import DockerServer
3839
from lsp_client.server.local import LocalServer
3940
from lsp_client.utils.types import lsp_type
4041

41-
TypescriptServer = partial(
42-
LocalServer, command=["typescript-language-server", "--stdio"]
43-
)
4442
TypescriptDockerServer = partial(DockerServer, image="docker.io/lspcontainers/tsserver")
4543

4644

@@ -83,6 +81,10 @@ class TypescriptClient(
8381
def get_language_id(self) -> lsp_type.LanguageKind:
8482
return lsp_type.LanguageKind.TypeScript
8583

84+
@override
85+
def create_default_server(self) -> LSPServer:
86+
return LocalServer(command=["typescript-language-server", "--stdio"])
87+
8688
@override
8789
def create_initialization_options(self) -> dict[str, Any]:
8890
return {

0 commit comments

Comments
 (0)