Support for using experimental language servers

This commit is contained in:
Michael Panchenko authored and Michael Panchenko committed 2025-07-16 18:12:54 +02:00
1 parent cf866bb168
commit b9aadb3455
3 files changed
+36 -17

No files matched your search

+1 -1
View File
@@ -36,7 +36,7 @@ def determine_programming_language_composition(repo_path: str, rel_path_to_gitig
language_counts: dict[str, int] = {}
total_files = len(all_files)
for language in Language:
for language in Language.iter_all(include_experimental=False):
matcher = language.get_source_fn_matcher()
count = 0
+9 -13
View File
@@ -118,16 +118,15 @@ class SolidLanguageServer(ABC):
ls: SolidLanguageServer
if config.code_language == Language.PYTHON:
# We can also use jedi
# from solidlsp.language_servers.jedi_server import JediServer
#
# ls = JediServer(config, logger, repository_root_path)
from solidlsp.language_servers.pyright_server import (
PyrightServer,
)
ls = PyrightServer(config, logger, repository_root_path)
elif config.code_language == Language.PYTHON_JEDI:
from solidlsp.language_servers.jedi_server import JediServer
ls = JediServer(config, logger, repository_root_path)
elif config.code_language == Language.JAVA:
from solidlsp.language_servers.eclipse_jdtls import (
EclipseJDTLS,
@@ -150,27 +149,24 @@ class SolidLanguageServer(ABC):
ls = RustAnalyzer(config, logger, repository_root_path)
elif config.code_language == Language.CSHARP:
# You can also switch to OmniSharp if you prefer that
# But OmniSharp seems to crash and has some issues with newer C# versions
# from solidlsp.language_servers.omnisharp.omnisharp import OmniSharp
# ls = OmniSharp(config, logger, repository_root_path)
from solidlsp.language_servers.csharp_language_server import CSharpLanguageServer
ls = CSharpLanguageServer(config, logger, repository_root_path)
elif config.code_language == Language.CSHARP_OMNISHARP:
from solidlsp.language_servers.omnisharp.omnisharp import OmniSharp
ls = OmniSharp(config, logger, repository_root_path)
elif config.code_language == Language.TYPESCRIPT:
from solidlsp.language_servers.typescript_language_server import (
TypeScriptLanguageServer,
)
ls = TypeScriptLanguageServer(config, logger, repository_root_path)
elif config.code_language == Language.TYPESCRIPT_VTS:
# VTS based Language Server implementation, need to experiment to see if it improves performance
# from solidlsp.language_servers.vts_language_server import VtsLanguageServer
#
# ls = VtsLanguageServer(config, logger, repository_root_path)
from solidlsp.language_servers.vts_language_server import VtsLanguageServer
ls = VtsLanguageServer(config, logger, repository_root_path)
elif config.code_language == Language.GO:
from solidlsp.language_servers.gopls import Gopls
+26 -3
View File
@@ -3,8 +3,10 @@ Configuration objects for language servers
"""
import fnmatch
from collections.abc import Iterable
from dataclasses import dataclass, field
from enum import Enum
from typing import Self
class FilenameMatcher:
@@ -40,17 +42,38 @@ class Language(str, Enum):
CLOJURE = "clojure"
ELIXIR = "elixir"
TERRAFORM = "terraform"
# Experimental or deprecated Language Servers
TYPESCRIPT_VTS = "typescript_vts"
"""Use the typescript language server through the natively bundled vscode extension via https://github.com/yioneko/vtsls"""
PYTHON_JEDI = "python_jedi"
"""Jedi language server for Python (instead of pyright, which is the default)"""
CSHARP_OMNISHARP = "csharp_omnisharp"
"""OmniSharp language server for C# (instead of the default csharp-ls by microsoft).
Currently has problems with finding references, and generally seems less stable and performant.
"""
@classmethod
def iter_all(cls, include_experimental: bool = False) -> Iterable[Self]:
for lang in cls:
if include_experimental or not lang.is_experimental():
yield lang
def is_experimental(self) -> bool:
"""
Check if the language server is experimental or deprecated.
"""
return self in {self.TYPESCRIPT_VTS, self.PYTHON_JEDI, self.CSHARP_OMNISHARP}
def __str__(self) -> str:
return self.value
def get_source_fn_matcher(self) -> FilenameMatcher:
match self:
case self.PYTHON:
case self.PYTHON | self.PYTHON_JEDI:
return FilenameMatcher("*.py", "*.pyi")
case self.JAVA:
return FilenameMatcher("*.java")
case self.TYPESCRIPT:
case self.TYPESCRIPT | self.TYPESCRIPT_VTS:
# see https://github.com/oraios/serena/issues/204
path_patterns = []
for prefix in ["c", "m", ""]:
@@ -58,7 +81,7 @@ class Language(str, Enum):
for base_pattern in ["ts", "js"]:
path_patterns.append(f"*.{prefix}{base_pattern}{postfix}")
return FilenameMatcher(*path_patterns)
case self.CSHARP:
case self.CSHARP | self.CSHARP_OMNISHARP:
return FilenameMatcher("*.cs")
case self.RUST:
return FilenameMatcher("*.rs")