From e60d42211afeafa0f5a1ff16e8e577e3ed25929d Mon Sep 17 00:00:00 2001 From: Dominik Jain Date: Mon, 23 Jun 2025 17:01:36 +0200 Subject: [PATCH] Update language server instantiation to always use SolidLanguageServer --- src/serena/agent.py | 24 +++++++----------------- src/serena/constants.py | 6 +----- src/serena/mcp.py | 5 ++--- test/conftest.py | 7 +------ 4 files changed, 11 insertions(+), 31 deletions(-) diff --git a/src/serena/agent.py b/src/serena/agent.py index 1ac3ffb..db96625 100644 --- a/src/serena/agent.py +++ b/src/serena/agent.py @@ -33,7 +33,6 @@ from sensai.util import logging from sensai.util.logging import LOG_DEFAULT_FORMAT, FallbackHandler from sensai.util.string import ToStringMixin, dict_string -from solidlsp import SolidLanguageServer as SyncLanguageServer from serena import serena_version from serena.config import SerenaAgentContext, SerenaAgentMode from serena.constants import ( @@ -42,7 +41,6 @@ from serena.constants import ( REPO_ROOT, SELENA_CONFIG_TEMPLATE_FILE, SERENA_MANAGED_DIR_NAME, - USE_SOLID_LSP, ) from serena.dashboard import MemoryLogHandler, SerenaDashboardAPI from serena.prompt_factory import PromptFactory, SerenaPromptFactory @@ -53,6 +51,7 @@ from serena.util.general import load_yaml, save_yaml from serena.util.inspection import determine_programming_language_composition, iter_subclasses from serena.util.shell import execute_shell_command from serena.util.thread import ExecutionResult, execute_with_timeout +from solidlsp import SolidLanguageServer as SyncLanguageServer from solidlsp.ls import SolidLanguageServer from solidlsp.multilspy_config import Language, MultilspyConfig from solidlsp.multilspy_logger import MultilspyLogger @@ -678,21 +677,12 @@ def create_ls_for_project( ) ls_logger = MultilspyLogger(log_level=log_level) log.info(f"Creating language server instance for {project_instance.project_root}.") - if USE_SOLID_LSP: - ls = SolidLanguageServer.create( - multilspy_config, - ls_logger, - project_instance.project_root, - timeout=ls_timeout, - ) - return cast(SyncLanguageServer, ls) # TODO: Fix type - else: - return SyncLanguageServer.create( - multilspy_config, - ls_logger, - project_instance.project_root, - timeout=ls_timeout, - ) + return SolidLanguageServer.create( + multilspy_config, + ls_logger, + project_instance.project_root, + timeout=ls_timeout, + ) @click.command() diff --git a/src/serena/constants.py b/src/serena/constants.py index 6a27759..30a9518 100644 --- a/src/serena/constants.py +++ b/src/serena/constants.py @@ -19,8 +19,4 @@ DEFAULT_MODES = ("interactive", "editing") PROJECT_TEMPLATE_FILE = str(_serena_pkg_path / "resources" / "project.template.yml") SELENA_CONFIG_TEMPLATE_FILE = str(_serena_pkg_path / "resources" / "serena_config.template.yml") -USE_SOLID_LSP = True -"""Whether to use Solid LSP instead of multilspy for language server operations. -Multilspy uses asyncio, which creates many problems like deadlocks and requires full process -isolation (and even then some issues remain). -""" +USE_PROCESS_ISOLATION = False diff --git a/src/serena/mcp.py b/src/serena/mcp.py index e2a0bc9..83a2cbf 100644 --- a/src/serena/mcp.py +++ b/src/serena/mcp.py @@ -36,7 +36,7 @@ from serena.agent import ( show_fatal_exception_safe, ) from serena.config import RegisteredContext, SerenaAgentContext, SerenaAgentMode -from serena.constants import DEFAULT_CONTEXT, DEFAULT_MODES, USE_SOLID_LSP +from serena.constants import DEFAULT_CONTEXT, DEFAULT_MODES, USE_SOLID_LSP, USE_PROCESS_ISOLATION from serena.process_isolated_agent import ( ProcessIsolatedDashboard, ProcessIsolatedSerenaAgent, @@ -587,10 +587,9 @@ def start_mcp_server( project_file = project_file_arg if project_file_arg is not None else project mcp_factory: SerenaMCPFactory - if USE_SOLID_LSP: + if not USE_PROCESS_ISOLATION: mcp_factory = SerenaMCPFactorySingleProcess(context=context, project=project_file) else: - # using multilspy requires process isolation to prevent asyncio contamination mcp_factory = SerenaMCPFactoryWithProcessIsolation(context=context, project=project_file) # Use process isolation by default to prevent asyncio event loop contamination diff --git a/test/conftest.py b/test/conftest.py index 8e086cf..e41a53d 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -45,12 +45,7 @@ def create_ls( ignored_paths.extend(spec.patterns) config = MultilspyConfig(code_language=language, ignored_paths=ignored_paths, trace_lsp_communication=trace_lsp_communication) logger = MultilspyLogger(log_level=log_level) - - if USE_SOLID_LSP: - ls = SolidLanguageServer.create(config, logger, repo_path) - return cast(SyncLanguageServer, ls) # TODO: Fix type - else: - return SyncLanguageServer.create(config, logger, repo_path) + return SolidLanguageServer.create(config, logger, repo_path) def create_default_ls(language: Language) -> SyncLanguageServer: