diff --git a/src/serena/util/inspection.py b/src/serena/util/inspection.py index 24c21719..4a859c1f 100644 --- a/src/serena/util/inspection.py +++ b/src/serena/util/inspection.py @@ -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 diff --git a/src/solidlsp/ls.py b/src/solidlsp/ls.py index 3934a836..b33846ba 100644 --- a/src/solidlsp/ls.py +++ b/src/solidlsp/ls.py @@ -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 diff --git a/src/solidlsp/ls_config.py b/src/solidlsp/ls_config.py index e5df9011..efb55a87 100644 --- a/src/solidlsp/ls_config.py +++ b/src/solidlsp/ls_config.py @@ -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")