From e9ccd3360f2b4a41ac9bf51cf28c0a1a391390dc Mon Sep 17 00:00:00 2001 From: Michael Panchenko Date: Mon, 23 Feb 2026 13:45:19 +0100 Subject: [PATCH] Minor renaming, removed usage of private attrs in tests --- src/serena/agent.py | 28 ++++++++++++++++-------- test/serena/config/test_serena_config.py | 6 ++--- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/serena/agent.py b/src/serena/agent.py index 2876b751..7f0bd652 100644 --- a/src/serena/agent.py +++ b/src/serena/agent.py @@ -318,16 +318,23 @@ class SerenaAgent: tool_inclusion_definitions.append(self._context) if self._context.single_project: tool_inclusion_definitions.extend(self._single_project_context_tool_inclusion_definitions(project)) + # Determine the effective language backend for this session. # If a startup project is provided and has a per-project override, use it; otherwise use the global config. - self._effective_language_backend = self.serena_config.language_backend + # Since we don't want to change the toolset after startup, the language backend cannot be changed within a running serena session + self._language_backend = self.serena_config.language_backend + _backend_from_project_config = False if project is not None: startup_project_config = self._find_project_config(project) if startup_project_config is not None and startup_project_config.language_backend is not None: - self._effective_language_backend = startup_project_config.language_backend - log.info(f"Using per-project language backend override: {self._effective_language_backend.name}") - log.info(f"Effective language backend for this session: {self._effective_language_backend.name}") - if self._effective_language_backend == LanguageBackend.JETBRAINS: + self._language_backend = startup_project_config.language_backend + _backend_from_project_config = True + if _backend_from_project_config: + log.info(f"Using language backend as configured in project.yml: {self._language_backend.name}") + else: + log.info(f"Using language backend from global serena config: {self._language_backend.name}") + + if self._language_backend == LanguageBackend.JETBRAINS: tool_inclusion_definitions.append(SerenaAgentMode.from_name_internal("jetbrains")) self._base_tool_set = ToolSet.default().apply(*tool_inclusion_definitions) self._exposed_tools = AvailableTools([t for t in self._all_tools.values() if self._base_tool_set.includes_name(t.get_name())]) @@ -374,6 +381,9 @@ class SerenaAgent: if self._gui_log_viewer is not None: self._gui_log_viewer.set_dashboard_url(dashboard_url) + def get_language_backend(self) -> LanguageBackend: + return self._language_backend + def get_current_tasks(self) -> list[TaskExecutor.TaskInfo]: """ Gets the list of tasks currently running or queued for execution. @@ -624,7 +634,7 @@ class SerenaAgent: """ :return: whether this agent uses language server-based code analysis """ - return self._effective_language_backend == LanguageBackend.LSP + return self._language_backend == LanguageBackend.LSP def _find_project_config(self, project_path_or_name: str) -> ProjectConfig | None: """Find the ProjectConfig for the given project path or name, or None if not found.""" @@ -638,10 +648,10 @@ class SerenaAgent: # Check if the project requires a different language backend than the one initialized at startup project_backend = project.project_config.language_backend - if project_backend is not None and project_backend != self._effective_language_backend: + if project_backend is not None and project_backend != self._language_backend: raise ValueError( f"Cannot activate project '{project.project_name}': it requires the {project_backend.value} backend, " - f"but this session was initialized with {self._effective_language_backend.value}. " + f"but this session was initialized with {self._language_backend.value}. " f"Workarounds: (1) Use project activation at startup via the --project flag, " f"(2) Configure one MCP server per backend in your client." ) @@ -723,7 +733,7 @@ class SerenaAgent: result_str += f"Active project: {self._active_project.project_name}\n" else: result_str += "No active project\n" - result_str += f"Language backend: {self._effective_language_backend.value}" + result_str += f"Language backend: {self._language_backend.value}" if self._active_project and self._active_project.project_config.language_backend is not None: result_str += " (project override)" result_str += f" (global default: {self.serena_config.language_backend.value})\n" diff --git a/test/serena/config/test_serena_config.py b/test/serena/config/test_serena_config.py index ea228815..e4515a0d 100644 --- a/test/serena/config/test_serena_config.py +++ b/test/serena/config/test_serena_config.py @@ -217,7 +217,7 @@ class TestEffectiveLanguageBackend: config, name = _make_config_with_project("test_proj", language_backend=None, global_backend=LanguageBackend.LSP) agent = SerenaAgent(project=name, serena_config=config) try: - assert agent._effective_language_backend == LanguageBackend.LSP + assert agent.get_language_backend() == LanguageBackend.LSP assert agent.is_using_language_server() is True finally: agent.shutdown(timeout=5) @@ -229,7 +229,7 @@ class TestEffectiveLanguageBackend: ) agent = SerenaAgent(project=name, serena_config=config) try: - assert agent._effective_language_backend == LanguageBackend.JETBRAINS + assert agent.get_language_backend() == LanguageBackend.JETBRAINS assert agent.is_using_language_server() is False finally: agent.shutdown(timeout=5) @@ -244,7 +244,7 @@ class TestEffectiveLanguageBackend: ) agent = SerenaAgent(project=None, serena_config=config) try: - assert agent._effective_language_backend == LanguageBackend.LSP + assert agent.get_language_backend() == LanguageBackend.LSP finally: agent.shutdown(timeout=5)