diff --git a/src/serena/ls_manager.py b/src/serena/ls_manager.py index dde1f428..1ef862f8 100644 --- a/src/serena/ls_manager.py +++ b/src/serena/ls_manager.py @@ -147,16 +147,20 @@ class LanguageServerManager: ls = self.restart_language_server(ls.language) return ls + def _get_suitable_language_server(self, relative_path: str) -> SolidLanguageServer | None: + """:param relative_path: relative path to a file""" + for candidate in self._language_servers.values(): + if not candidate.is_ignored_path(relative_path, ignore_unsupported_files=True): + return candidate + return None + def get_language_server(self, relative_path: str) -> SolidLanguageServer: """:param relative_path: relative path to a file""" ls: SolidLanguageServer | None = None if len(self._language_servers) > 1: if os.path.isdir(relative_path): raise ValueError(f"Expected a file path, but got a directory: {relative_path}") - for candidate in self._language_servers.values(): - if not candidate.is_ignored_path(relative_path, ignore_unsupported_files=True): - ls = candidate - break + ls = self._get_suitable_language_server(relative_path) if ls is None: ls = self._default_language_server return self._ensure_functional_ls(ls) @@ -241,3 +245,6 @@ class LanguageServerManager: for ls in self.iter_language_servers(): if ls.is_running(): ls.save_cache() + + def has_suitable_ls_for_file(self, relative_file_path: str) -> bool: + return self._get_suitable_language_server(relative_file_path) is not None diff --git a/src/serena/symbol.py b/src/serena/symbol.py index 7d3bed78..ccb9507b 100644 --- a/src/serena/symbol.py +++ b/src/serena/symbol.py @@ -699,6 +699,9 @@ class LanguageServerSymbolRetriever: def get_root_path(self) -> str: return self._ls_manager.get_root_path() + def can_analyze_file(self, relative_file_path: str) -> bool: + return self._ls_manager.has_suitable_ls_for_file(relative_file_path) + def get_language_server(self, relative_path: str) -> SolidLanguageServer: """:param relative_path: relative path to a file""" return self._ls_manager.get_language_server(relative_path) diff --git a/src/serena/tools/symbol_tools.py b/src/serena/tools/symbol_tools.py index 07d6ad8c..148611f5 100644 --- a/src/serena/tools/symbol_tools.py +++ b/src/serena/tools/symbol_tools.py @@ -68,6 +68,10 @@ class GetSymbolsOverviewTool(Tool, ToolMarkerSymbolicRead): raise FileNotFoundError(f"File or directory {relative_path} does not exist in the project.") if os.path.isdir(file_path): raise ValueError(f"Expected a file path, but got a directory path: {relative_path}. ") + if not symbol_retriever.can_analyze_file(relative_path): + raise ValueError( + f"Cannot extract symbols from file {relative_path}. Active languages: {[l.value for l in self.agent.get_active_lsp_languages()]}" + ) symbols = symbol_retriever.get_symbol_overview(relative_path)[relative_path]