From 4a3590bcdef1a79b3e27635e8137406ba56c1ae0 Mon Sep 17 00:00:00 2001 From: Michael Panchenko Date: Thu, 20 Nov 2025 15:05:58 +0700 Subject: [PATCH] More types, less type: ignore Thanks to Claude Code --- .../language_servers/elm_language_server.py | 9 ++++----- .../erlang_language_server.py | 15 +++++++-------- .../fortran_language_server.py | 15 +++++++-------- src/solidlsp/language_servers/lua_ls.py | 17 ++++++++--------- src/solidlsp/language_servers/marksman.py | 13 ++++++------- src/solidlsp/language_servers/solargraph.py | 14 ++++++-------- .../language_servers/sourcekit_lsp.py | 13 ++++++------- src/solidlsp/language_servers/zls.py | 19 +++++++++---------- 8 files changed, 53 insertions(+), 62 deletions(-) diff --git a/src/solidlsp/language_servers/elm_language_server.py b/src/solidlsp/language_servers/elm_language_server.py index 4d3a3805..f75af40c 100644 --- a/src/solidlsp/language_servers/elm_language_server.py +++ b/src/solidlsp/language_servers/elm_language_server.py @@ -1,4 +1,3 @@ -# type: ignore """ Provides Elm specific instantiation of the LanguageServer class. Contains various configurations and settings specific to Elm. """ @@ -144,17 +143,17 @@ class ElmLanguageServer(SolidLanguageServer): } ], } - return initialize_params + return initialize_params # type: ignore[return-value] - def _start_server(self): + def _start_server(self) -> None: """ Starts the Elm Language Server, waits for the server to be ready and yields the LanguageServer instance. """ - def do_nothing(params): + def do_nothing(params: dict) -> None: return - def window_log_message(msg): + def window_log_message(msg: dict) -> None: self.logger.log(f"LSP: window/logMessage: {msg}", logging.INFO) self.server.on_notification("window/logMessage", window_log_message) diff --git a/src/solidlsp/language_servers/erlang_language_server.py b/src/solidlsp/language_servers/erlang_language_server.py index 755283f8..36651688 100644 --- a/src/solidlsp/language_servers/erlang_language_server.py +++ b/src/solidlsp/language_servers/erlang_language_server.py @@ -1,4 +1,3 @@ -# type: ignore """Erlang Language Server implementation using Erlang LS.""" import logging @@ -62,7 +61,7 @@ class ErlangLanguageServer(SolidLanguageServer): return False @classmethod - def _get_erlang_version(cls): + def _get_erlang_version(cls) -> str | None: """Get the installed Erlang/OTP version or None if not found.""" try: result = subprocess.run(["erl", "-version"], check=False, capture_output=True, text=True, timeout=10) @@ -81,13 +80,13 @@ class ErlangLanguageServer(SolidLanguageServer): except (subprocess.SubprocessError, FileNotFoundError): return False - def _start_server(self): + def _start_server(self) -> None: """Start Erlang LS server process with proper initialization waiting.""" - def register_capability_handler(params): + def register_capability_handler(params: dict) -> None: return - def window_log_message(msg): + def window_log_message(msg: dict) -> None: """Handle window/logMessage notifications from Erlang LS""" message_text = msg.get("message", "") self.logger.log(f"LSP: window/logMessage: {message_text}", logging.INFO) @@ -110,10 +109,10 @@ class ErlangLanguageServer(SolidLanguageServer): self.server_ready.set() break - def do_nothing(params): + def do_nothing(params: dict) -> None: return - def check_server_ready(params): + def check_server_ready(params: dict) -> None: """Handle $/progress notifications from Erlang LS as fallback.""" value = params.get("value", {}) @@ -155,7 +154,7 @@ class ErlangLanguageServer(SolidLanguageServer): } self.logger.log("Sending initialize request to Erlang LS", logging.INFO) - init_response = self.server.send.initialize(initialize_params) + init_response = self.server.send.initialize(initialize_params) # type: ignore[arg-type] # Verify server capabilities if "capabilities" in init_response: diff --git a/src/solidlsp/language_servers/fortran_language_server.py b/src/solidlsp/language_servers/fortran_language_server.py index 141959be..993c21fa 100644 --- a/src/solidlsp/language_servers/fortran_language_server.py +++ b/src/solidlsp/language_servers/fortran_language_server.py @@ -1,4 +1,3 @@ -# type: ignore """ Fortran Language Server implementation using fortls. """ @@ -126,7 +125,7 @@ class FortranLanguageServer(SolidLanguageServer): # Create modified symbol with corrected selectionRange corrected_symbol = symbol.copy() - corrected_symbol["selectionRange"] = new_sel_range + corrected_symbol["selectionRange"] = new_sel_range # type: ignore[typeddict-item] self.logger.log( f"Fixed fortls selectionRange for {identifier_name}: char {start_char} -> {identifier_start}", @@ -175,7 +174,7 @@ class FortranLanguageServer(SolidLanguageServer): return DocumentSymbols(fixed_root_symbols) @staticmethod - def _check_fortls_installation(): + def _check_fortls_installation() -> str: """Check if fortls is available.""" fortls_path = shutil.which("fortls") if fortls_path is None: @@ -256,18 +255,18 @@ class FortranLanguageServer(SolidLanguageServer): } ], } - return initialize_params + return initialize_params # type: ignore[return-value] - def _start_server(self): + def _start_server(self) -> None: """Start Fortran Language Server process.""" - def window_log_message(msg): + def window_log_message(msg: dict) -> None: self.logger.log(f"Fortran LSP: window/logMessage: {msg}", logging.INFO) - def do_nothing(params): + def do_nothing(params: dict) -> None: return - def register_capability_handler(params): + def register_capability_handler(params: dict) -> None: return # Register LSP message handlers diff --git a/src/solidlsp/language_servers/lua_ls.py b/src/solidlsp/language_servers/lua_ls.py index d96cb395..0ff6b7c4 100644 --- a/src/solidlsp/language_servers/lua_ls.py +++ b/src/solidlsp/language_servers/lua_ls.py @@ -1,4 +1,3 @@ -# type: ignore """ Provides Lua specific instantiation of the LanguageServer class using lua-language-server. """ @@ -38,7 +37,7 @@ class LuaLanguageServer(SolidLanguageServer): return super().is_ignored_dirname(dirname) or dirname in [".luarocks", "lua_modules", "node_modules", "build", "dist", ".cache"] @staticmethod - def _get_lua_ls_path(): + def _get_lua_ls_path() -> str | None: """Get the path to lua-language-server executable.""" # First check if it's in PATH lua_ls = shutil.which("lua-language-server") @@ -70,7 +69,7 @@ class LuaLanguageServer(SolidLanguageServer): return None @staticmethod - def _download_lua_ls(): + def _download_lua_ls() -> str: """Download and install lua-language-server if not present.""" system = platform.system() machine = platform.machine().lower() @@ -141,7 +140,7 @@ class LuaLanguageServer(SolidLanguageServer): raise RuntimeError("Failed to find lua-language-server executable after extraction") @staticmethod - def _setup_runtime_dependency(): + def _setup_runtime_dependency() -> str: """ Check if required Lua runtime dependencies are available. Downloads lua-language-server if not present. @@ -255,18 +254,18 @@ class LuaLanguageServer(SolidLanguageServer): }, }, } - return initialize_params + return initialize_params # type: ignore[return-value] - def _start_server(self): + def _start_server(self) -> None: """Start Lua Language Server process""" - def register_capability_handler(params): + def register_capability_handler(params: dict) -> None: return - def window_log_message(msg: dict): + def window_log_message(msg: dict) -> None: self.logger.log(f"LSP: window/logMessage: {msg}", logging.INFO) - def do_nothing(params): + def do_nothing(params: dict) -> None: return self.server.on_request("client/registerCapability", register_capability_handler) diff --git a/src/solidlsp/language_servers/marksman.py b/src/solidlsp/language_servers/marksman.py index f463869d..85919113 100644 --- a/src/solidlsp/language_servers/marksman.py +++ b/src/solidlsp/language_servers/marksman.py @@ -1,4 +1,3 @@ -# type: ignore """ Provides Markdown specific instantiation of the LanguageServer class using marksman. Contains various configurations and settings specific to Markdown. @@ -131,9 +130,9 @@ class Marksman(SolidLanguageServer): "documentSymbol": { "dynamicRegistration": True, "hierarchicalDocumentSymbolSupport": True, - "symbolKind": {"valueSet": list(range(1, 27))}, + "symbolKind": {"valueSet": list(range(1, 27))}, # type: ignore[arg-type] }, - "hover": {"dynamicRegistration": True, "contentFormat": ["markdown", "plaintext"]}, + "hover": {"dynamicRegistration": True, "contentFormat": ["markdown", "plaintext"]}, # type: ignore[list-item] "codeAction": {"dynamicRegistration": True}, }, "workspace": { @@ -151,18 +150,18 @@ class Marksman(SolidLanguageServer): } return initialize_params - def _start_server(self): + def _start_server(self) -> None: """ Starts the Marksman Language Server and waits for it to be ready. """ - def register_capability_handler(_params): + def register_capability_handler(_params: dict) -> None: return - def window_log_message(msg): + def window_log_message(msg: dict) -> None: self.logger.log(f"LSP: window/logMessage: {msg}", logging.INFO) - def do_nothing(_params): + def do_nothing(_params: dict) -> None: return self.server.on_request("client/registerCapability", register_capability_handler) diff --git a/src/solidlsp/language_servers/solargraph.py b/src/solidlsp/language_servers/solargraph.py index b379bc0c..61249cde 100644 --- a/src/solidlsp/language_servers/solargraph.py +++ b/src/solidlsp/language_servers/solargraph.py @@ -1,4 +1,3 @@ -# type: ignore """ Provides Ruby specific instantiation of the LanguageServer class using Solargraph. Contains various configurations and settings specific to Ruby. @@ -12,7 +11,6 @@ import re import shutil import subprocess import threading -from typing import cast from overrides import override @@ -136,7 +134,7 @@ class Solargraph(SolidLanguageServer): if bundle_cmd.startswith("bin/"): bundle_full_path = os.path.join(repository_root_path, bundle_cmd) else: - bundle_full_path = find_executable_with_extensions(bundle_cmd) + bundle_full_path = find_executable_with_extensions(bundle_cmd) # type: ignore[assignment] if bundle_full_path and os.path.exists(bundle_full_path): bundle_path = bundle_full_path if bundle_cmd.startswith("bin/") else bundle_cmd break @@ -284,7 +282,7 @@ class Solargraph(SolidLanguageServer): "rootPath": repository_absolute_path, "rootUri": root_uri, "initializationOptions": { - "exclude": exclude_patterns, + "exclude": exclude_patterns, # type: ignore[dict-item] }, "capabilities": { "workspace": { @@ -293,11 +291,11 @@ class Solargraph(SolidLanguageServer): "textDocument": { "documentSymbol": { "hierarchicalDocumentSymbolSupport": True, - "symbolKind": {"valueSet": list(range(1, 27))}, + "symbolKind": {"valueSet": list(range(1, 27))}, # type: ignore[arg-type] }, }, }, - "trace": "verbose", + "trace": "verbose", # type: ignore[typeddict-item] "workspaceFolders": [ { "uri": root_uri, @@ -305,7 +303,7 @@ class Solargraph(SolidLanguageServer): } ], } - return cast(InitializeParams, initialize_params) + return initialize_params # type: ignore[return-value] def _start_server(self) -> None: """ @@ -320,7 +318,7 @@ class Solargraph(SolidLanguageServer): self.resolve_main_method_available.set() return - def lang_status_handler(params): + def lang_status_handler(params: dict) -> None: self.logger.log(f"LSP: language/status: {params}", logging.INFO) if params.get("type") == "ServiceReady" and params.get("message") == "Service is ready.": self.logger.log("Solargraph service is ready.", logging.INFO) diff --git a/src/solidlsp/language_servers/sourcekit_lsp.py b/src/solidlsp/language_servers/sourcekit_lsp.py index ff3e7df4..d21eac4d 100644 --- a/src/solidlsp/language_servers/sourcekit_lsp.py +++ b/src/solidlsp/language_servers/sourcekit_lsp.py @@ -1,4 +1,3 @@ -# type: ignore import logging import os import pathlib @@ -63,7 +62,7 @@ class SourceKitLSP(SolidLanguageServer): self.server_ready = threading.Event() self.request_id = 0 self._did_sleep_before_requesting_references = False - self._initialization_timestamp = None + self._initialization_timestamp: float | None = None @staticmethod def _get_initialize_params(repository_absolute_path: str) -> InitializeParams: @@ -306,18 +305,18 @@ class SourceKitLSP(SolidLanguageServer): ], } - return initialize_params + return initialize_params # type: ignore[return-value] - def _start_server(self): + def _start_server(self) -> None: """Start sourcekit-lsp server process""" - def register_capability_handler(_params): + def register_capability_handler(_params: dict) -> None: return - def window_log_message(msg): + def window_log_message(msg: dict) -> None: self.logger.log(f"LSP: window/logMessage: {msg}", logging.INFO) - def do_nothing(_params): + def do_nothing(_params: dict) -> None: return self.server.on_request("client/registerCapability", register_capability_handler) diff --git a/src/solidlsp/language_servers/zls.py b/src/solidlsp/language_servers/zls.py index e218d4e8..9ab8daac 100644 --- a/src/solidlsp/language_servers/zls.py +++ b/src/solidlsp/language_servers/zls.py @@ -1,4 +1,3 @@ -# type: ignore """ Provides Zig specific instantiation of the LanguageServer class using ZLS (Zig Language Server). """ @@ -36,7 +35,7 @@ class ZigLanguageServer(SolidLanguageServer): return super().is_ignored_dirname(dirname) or dirname in ["zig-cache", "zig-out", ".zig-cache", "node_modules", "build", "dist"] @staticmethod - def _get_zig_version(): + def _get_zig_version() -> str | None: """Get the installed Zig version or None if not found.""" try: result = subprocess.run(["zig", "version"], capture_output=True, text=True, check=False) @@ -47,7 +46,7 @@ class ZigLanguageServer(SolidLanguageServer): return None @staticmethod - def _get_zls_version(): + def _get_zls_version() -> str | None: """Get the installed ZLS version or None if not found.""" try: result = subprocess.run(["zls", "--version"], capture_output=True, text=True, check=False) @@ -58,12 +57,12 @@ class ZigLanguageServer(SolidLanguageServer): return None @staticmethod - def _check_zls_installed(): + def _check_zls_installed() -> bool: """Check if ZLS is installed in the system.""" return shutil.which("zls") is not None @staticmethod - def _setup_runtime_dependency(): + def _setup_runtime_dependency() -> bool: """ Check if required Zig runtime dependencies are available. Raises RuntimeError with helpful message if dependencies are missing. @@ -189,18 +188,18 @@ class ZigLanguageServer(SolidLanguageServer): "inlay_hints_hide_redundant_param_names_last_token": False, }, } - return initialize_params + return initialize_params # type: ignore[return-value] - def _start_server(self): + def _start_server(self) -> None: """Start ZLS server process""" - def register_capability_handler(params): + def register_capability_handler(params: dict) -> None: return - def window_log_message(msg): + def window_log_message(msg: str) -> None: self.logger.log(f"LSP: window/logMessage: {msg}", logging.INFO) - def do_nothing(params): + def do_nothing(params: dict) -> None: return self.server.on_request("client/registerCapability", register_capability_handler)