diff --git a/src/solidlsp/language_servers/dart_language_server.py b/src/solidlsp/language_servers/dart_language_server.py index 702bc9a9..42ba5cfa 100644 --- a/src/solidlsp/language_servers/dart_language_server.py +++ b/src/solidlsp/language_servers/dart_language_server.py @@ -27,8 +27,8 @@ class DartLanguageServer(SolidLanguageServer): "dart", ) - @staticmethod - def _setup_runtime_dependencies(logger: "LanguageServerLogger") -> str: + @classmethod + def _setup_runtime_dependencies(cls, logger: "LanguageServerLogger") -> str: platform_id = PlatformUtils.get_platform_id() runtime_dependencies = [ @@ -79,7 +79,7 @@ class DartLanguageServer(SolidLanguageServer): assert len(runtime_dependencies) == 1 dependency = runtime_dependencies[0] - dart_ls_dir = os.path.join(os.path.dirname(__file__), "static", "dart-language-server") + dart_ls_dir = cls.ls_resources_dir() dart_executable_path = os.path.join(dart_ls_dir, dependency["binaryName"]) if not os.path.exists(dart_ls_dir): diff --git a/src/solidlsp/language_servers/eclipse_jdtls.py b/src/solidlsp/language_servers/eclipse_jdtls.py index 0dce4cfe..5ebb378c 100644 --- a/src/solidlsp/language_servers/eclipse_jdtls.py +++ b/src/solidlsp/language_servers/eclipse_jdtls.py @@ -152,8 +152,8 @@ class EclipseJDTLS(SolidLanguageServer): "lib", # General ] - @staticmethod - def _setupRuntimeDependencies(logger: LanguageServerLogger, config: LanguageServerConfig) -> RuntimeDependencyPaths: + @classmethod + def _setupRuntimeDependencies(cls, logger: LanguageServerLogger, config: LanguageServerConfig) -> RuntimeDependencyPaths: """ Setup runtime dependencies for EclipseJDTLS and return the paths. """ @@ -231,8 +231,6 @@ class EclipseJDTLS(SolidLanguageServer): }, } - os.makedirs(str(PurePath(os.path.abspath(os.path.dirname(__file__)), "static")), exist_ok=True) - # assert platformId.value in [ # "linux-x64", # "win-x64", @@ -240,8 +238,8 @@ class EclipseJDTLS(SolidLanguageServer): gradle_path = str( PurePath( - os.path.abspath(os.path.dirname(__file__)), - "static/gradle-7.3.3", + cls.ls_resources_dir(), + "gradle-7.3.3", ) ) @@ -256,7 +254,7 @@ class EclipseJDTLS(SolidLanguageServer): assert os.path.exists(gradle_path) dependency = runtime_dependencies["vscode-java"][platformId.value] - vscode_java_path = str(PurePath(os.path.abspath(os.path.dirname(__file__)), "static", dependency["relative_extraction_path"])) + vscode_java_path = str(PurePath(cls.ls_resources_dir(), dependency["relative_extraction_path"])) os.makedirs(vscode_java_path, exist_ok=True) jre_home_path = str(PurePath(vscode_java_path, dependency["jre_home_path"])) jre_path = str(PurePath(vscode_java_path, dependency["jre_path"])) @@ -285,9 +283,7 @@ class EclipseJDTLS(SolidLanguageServer): assert os.path.exists(jdtls_readonly_config_path) dependency = runtime_dependencies["intellicode"]["platform-agnostic"] - intellicode_directory_path = str( - PurePath(os.path.abspath(os.path.dirname(__file__)), "static", dependency["relative_extraction_path"]) - ) + intellicode_directory_path = str(PurePath(cls.ls_resources_dir(), dependency["relative_extraction_path"])) os.makedirs(intellicode_directory_path, exist_ok=True) intellicode_jar_path = str(PurePath(intellicode_directory_path, dependency["intellicode_jar_path"])) intellisense_members_path = str(PurePath(intellicode_directory_path, dependency["intellisense_members_path"])) diff --git a/src/solidlsp/language_servers/intelephense.py b/src/solidlsp/language_servers/intelephense.py index e971c7dd..e52c8228 100644 --- a/src/solidlsp/language_servers/intelephense.py +++ b/src/solidlsp/language_servers/intelephense.py @@ -32,8 +32,8 @@ class Intelephense(SolidLanguageServer): # - cache: commonly used for caching return super().is_ignored_dirname(dirname) or dirname in ["node_modules", "vendor", "cache"] - @staticmethod - def _setup_runtime_dependencies(logger: LanguageServerLogger, config: LanguageServerConfig) -> str: + @classmethod + def _setup_runtime_dependencies(cls, logger: LanguageServerLogger, config: LanguageServerConfig) -> str: """ Setup runtime dependencies for Intelephense and return the command to start the server. """ @@ -57,7 +57,7 @@ class Intelephense(SolidLanguageServer): assert is_npm_installed, "npm is not installed or isn't in PATH. Please install npm and try again." # Install intelephense if not already installed - intelephense_ls_dir = os.path.join(os.path.dirname(__file__), "static", "php-lsp") + intelephense_ls_dir = os.path.join(cls.ls_resources_dir(), "php-lsp") os.makedirs(intelephense_ls_dir, exist_ok=True) intelephense_executable_path = os.path.join(intelephense_ls_dir, "node_modules", ".bin", "intelephense") if not os.path.exists(intelephense_executable_path): diff --git a/src/solidlsp/language_servers/kotlin_language_server.py b/src/solidlsp/language_servers/kotlin_language_server.py index e89e5c7e..ef2a77ca 100644 --- a/src/solidlsp/language_servers/kotlin_language_server.py +++ b/src/solidlsp/language_servers/kotlin_language_server.py @@ -53,8 +53,8 @@ class KotlinLanguageServer(SolidLanguageServer): "kotlin", ) - @staticmethod - def _setup_runtime_dependencies(logger: LanguageServerLogger, config: LanguageServerConfig) -> KotlinRuntimeDependencyPaths: + @classmethod + def _setup_runtime_dependencies(cls, logger: LanguageServerLogger, config: LanguageServerConfig) -> KotlinRuntimeDependencyPaths: """ Setup runtime dependencies for Kotlin Language Server and return the paths. """ @@ -111,7 +111,7 @@ class KotlinLanguageServer(SolidLanguageServer): java_dependency = runtime_dependencies["java"][platform_id.value] # Setup paths for dependencies - static_dir = os.path.join(os.path.dirname(__file__), "static", "kotlin_language_server") + static_dir = os.path.join(cls.ls_resources_dir(), "kotlin_language_server") os.makedirs(static_dir, exist_ok=True) # Setup Java paths diff --git a/src/solidlsp/language_servers/omnisharp.py b/src/solidlsp/language_servers/omnisharp.py index 2f043b62..046d1e84 100644 --- a/src/solidlsp/language_servers/omnisharp.py +++ b/src/solidlsp/language_servers/omnisharp.py @@ -63,7 +63,7 @@ class OmniSharp(SolidLanguageServer): """ Creates an OmniSharp instance. This class is not meant to be instantiated directly. Use LanguageServer.create() instead. """ - omnisharp_executable_path, dll_path = self.setupRuntimeDependencies(logger, config) + omnisharp_executable_path, dll_path = self._setup_runtime_dependencies(logger, config) slnfilename = find_least_depth_sln_file(repository_root_path) if slnfilename is None: @@ -137,8 +137,8 @@ class OmniSharp(SolidLanguageServer): return d - @staticmethod - def setupRuntimeDependencies(logger: LanguageServerLogger, config: LanguageServerConfig) -> tuple[str, str]: + @classmethod + def _setup_runtime_dependencies(cls, logger: LanguageServerLogger, config: LanguageServerConfig) -> tuple[str, str]: """ Setup runtime dependencies for OmniSharp. """ @@ -181,7 +181,7 @@ class OmniSharp(SolidLanguageServer): assert "OmniSharp" in runtime_dependencies assert "RazorOmnisharp" in runtime_dependencies - omnisharp_ls_dir = os.path.join(os.path.dirname(__file__), "static", "OmniSharp") + omnisharp_ls_dir = os.path.join(cls.ls_resources_dir(), "OmniSharp") if not os.path.exists(omnisharp_ls_dir): os.makedirs(omnisharp_ls_dir) FileUtils.download_and_extract_archive(logger, runtime_dependencies["OmniSharp"]["url"], omnisharp_ls_dir, "zip") @@ -189,7 +189,7 @@ class OmniSharp(SolidLanguageServer): assert os.path.exists(omnisharp_executable_path) os.chmod(omnisharp_executable_path, stat.S_IEXEC) - razor_omnisharp_ls_dir = os.path.join(os.path.dirname(__file__), "static", "RazorOmnisharp") + razor_omnisharp_ls_dir = os.path.join(cls.ls_resources_dir(), "RazorOmnisharp") if not os.path.exists(razor_omnisharp_ls_dir): os.makedirs(razor_omnisharp_ls_dir) FileUtils.download_and_extract_archive(logger, runtime_dependencies["RazorOmnisharp"]["url"], razor_omnisharp_ls_dir, "zip") diff --git a/src/solidlsp/language_servers/rust_analyzer.py b/src/solidlsp/language_servers/rust_analyzer.py index 7edab82c..4d968ae3 100644 --- a/src/solidlsp/language_servers/rust_analyzer.py +++ b/src/solidlsp/language_servers/rust_analyzer.py @@ -44,8 +44,8 @@ class RustAnalyzer(SolidLanguageServer): def is_ignored_dirname(self, dirname: str) -> bool: return super().is_ignored_dirname(dirname) or dirname in ["target"] - @staticmethod - def _setup_runtime_dependencies(logger: LanguageServerLogger, config: LanguageServerConfig) -> str: + @classmethod + def _setup_runtime_dependencies(cls, logger: LanguageServerLogger, config: LanguageServerConfig) -> str: """ Setup runtime dependencies for rust_analyzer and return the command to start the server. """ @@ -87,7 +87,7 @@ class RustAnalyzer(SolidLanguageServer): assert len(runtime_dependencies) == 1 dependency = runtime_dependencies[0] - rustanalyzer_ls_dir = os.path.join(os.path.dirname(__file__), "static", "RustAnalyzer") + rustanalyzer_ls_dir = os.path.join(cls.ls_resources_dir(), "RustAnalyzer") rustanalyzer_executable_path = os.path.join(rustanalyzer_ls_dir, dependency["binaryName"]) if not os.path.exists(rustanalyzer_ls_dir): os.makedirs(rustanalyzer_ls_dir) diff --git a/src/solidlsp/language_servers/terraform_ls.py b/src/solidlsp/language_servers/terraform_ls.py index df6fea42..658c5345 100644 --- a/src/solidlsp/language_servers/terraform_ls.py +++ b/src/solidlsp/language_servers/terraform_ls.py @@ -63,9 +63,8 @@ class TerraformLS(SolidLanguageServer): else: raise RuntimeError(f"terraform version command failed with return code {result.returncode}: {result.stderr}") - # Note: needs to remain static because it's called before init is complete - @staticmethod - def _setup_runtime_dependencies(logger: LanguageServerLogger) -> str: + @classmethod + def _setup_runtime_dependencies(cls, logger: LanguageServerLogger) -> str: """ Setup runtime dependencies for terraform-ls. Downloads and installs terraform-ls if not already present. @@ -121,12 +120,8 @@ class TerraformLS(SolidLanguageServer): ), f"Expected exactly one runtime dependency for platform {platform_id.value}, found {len(runtime_dependencies)}" dependency = runtime_dependencies[0] - terraform_ls_dir = os.path.join(os.path.dirname(__file__), "static", "terraform-ls") + terraform_ls_dir = os.path.join(cls.ls_resources_dir(), "terraform-ls") terraform_ls_executable_path = os.path.join(terraform_ls_dir, dependency["binaryName"]) - - if not os.path.exists(terraform_ls_dir): - os.makedirs(terraform_ls_dir) - if not os.path.exists(terraform_ls_executable_path): logger.log(f"Downloading terraform-ls from {dependency['url']}", logging.INFO) FileUtils.download_and_extract_archive(logger, dependency["url"], terraform_ls_dir, dependency["archiveType"]) diff --git a/src/solidlsp/language_servers/typescript_language_server.py b/src/solidlsp/language_servers/typescript_language_server.py index c0130d35..175adfa7 100644 --- a/src/solidlsp/language_servers/typescript_language_server.py +++ b/src/solidlsp/language_servers/typescript_language_server.py @@ -64,8 +64,8 @@ class TypeScriptLanguageServer(SolidLanguageServer): "coverage", ] - @staticmethod - def _setup_runtime_dependencies(logger: LanguageServerLogger, config: LanguageServerConfig) -> str: + @classmethod + def _setup_runtime_dependencies(cls, logger: LanguageServerLogger, config: LanguageServerConfig) -> str: """ Setup runtime dependencies for TypeScript Language Server and return the command to start the server. """ @@ -94,7 +94,7 @@ class TypeScriptLanguageServer(SolidLanguageServer): "command": "npm install --prefix ./ typescript-language-server@4.3.3", }, ] - tsserver_ls_dir = os.path.join(os.path.dirname(__file__), "static", "ts-lsp") + tsserver_ls_dir = os.path.join(cls.ls_resources_dir(), "ts-lsp") tsserver_executable_path = os.path.join(tsserver_ls_dir, "typescript-language-server") # Verify both node and npm are installed