Skip to content

Commit 5f4900f

Browse files
committed
feat: add LanguageClient class for dynamic language-based client selection
1 parent 9a5851d commit 5f4900f

File tree

2 files changed

+67
-0
lines changed

2 files changed

+67
-0
lines changed

src/lsp_client/clients/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44

55
from .deno import DenoClient
66
from .gopls import GoplsClient
7+
from .language_client import Language, LanguageClient
78
from .pyrefly import PyreflyClient
89
from .pyright import PyrightClient
910
from .rust_analyzer import RustAnalyzerClient
11+
from .ty import TyClient
1012
from .typescript import TypescriptClient
1113

1214
GoClient = GoplsClient
@@ -21,14 +23,18 @@
2123
RustAnalyzerClient,
2224
DenoClient,
2325
TypescriptClient,
26+
TyClient,
2427
)
2528

2629
__all__ = [
2730
"DenoClient",
2831
"GoClient",
2932
"GoplsClient",
33+
"Language",
34+
"LanguageClient",
3035
"PyreflyClient",
3136
"PythonClient",
3237
"RustClient",
38+
"TyClient",
3339
"TypeScriptClient",
3440
]
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
from __future__ import annotations
2+
3+
from typing import TYPE_CHECKING, Literal, override
4+
5+
from attrs import define
6+
7+
from lsp_client.client.abc import Client
8+
9+
if TYPE_CHECKING:
10+
from lsp_client.client.lang import LanguageConfig
11+
from lsp_client.server import DefaultServers
12+
from lsp_client.utils.types import lsp_type
13+
14+
15+
Language = Literal["python", "rust", "go", "typescript", "deno"]
16+
17+
18+
@define(kw_only=True)
19+
class LanguageClient(Client):
20+
language: Language
21+
22+
def _get_delegate(self) -> Client:
23+
from .deno import DenoClient
24+
from .gopls import GoplsClient
25+
from .pyright import PyrightClient
26+
from .rust_analyzer import RustAnalyzerClient
27+
from .typescript import TypescriptClient
28+
29+
match self.language:
30+
case "python":
31+
cls = PyrightClient
32+
case "rust":
33+
cls = RustAnalyzerClient
34+
case "go":
35+
cls = GoplsClient
36+
case "typescript":
37+
cls = TypescriptClient
38+
case "deno":
39+
cls = DenoClient
40+
case _:
41+
raise ValueError(f"Unsupported language: {self.language}")
42+
43+
return cls(
44+
server=self._server_arg,
45+
workspace=self._workspace_arg,
46+
sync_file=self.sync_file,
47+
request_timeout=self.request_timeout,
48+
initialization_options=self.initialization_options,
49+
)
50+
51+
@override
52+
def get_language_config(self) -> LanguageConfig:
53+
return self._get_delegate().get_language_config()
54+
55+
@override
56+
def create_default_servers(self) -> DefaultServers:
57+
return self._get_delegate().create_default_servers()
58+
59+
@override
60+
def check_server_compatibility(self, info: lsp_type.ServerInfo | None) -> None:
61+
return self._get_delegate().check_server_compatibility(info)

0 commit comments

Comments
 (0)