diff --git a/src/serena/project.py b/src/serena/project.py index bd444b03..e96266cf 100644 --- a/src/serena/project.py +++ b/src/serena/project.py @@ -5,6 +5,7 @@ from pathlib import Path from typing import Any import pathspec +from sensai.util.string import ToStringMixin from serena.config.serena_config import DEFAULT_TOOL_TIMEOUT, ProjectConfig, get_serena_managed_in_project_dir from serena.constants import SERENA_FILE_ENCODING, SERENA_MANAGED_DIR_IN_HOME, SERENA_MANAGED_DIR_NAME @@ -53,7 +54,7 @@ class MemoriesManager: return f"Memory {name} deleted." -class Project: +class Project(ToStringMixin): def __init__(self, project_root: str, project_config: ProjectConfig, is_newly_created: bool = False): self.project_root = project_root self.project_config = project_config @@ -90,6 +91,12 @@ class Project: log.debug(f"Processing {len(processed_patterns)} ignored paths") self._ignore_spec = pathspec.PathSpec.from_lines(pathspec.patterns.GitWildMatchPattern, processed_patterns) + def _tostring_includes(self) -> list[str]: + return [] + + def _tostring_additional_entries(self) -> dict[str, Any]: + return {"root": self.project_root, "name": self.project_name} + @property def project_name(self) -> str: return self.project_config.project_name diff --git a/src/serena/symbol.py b/src/serena/symbol.py index 9d89c5fb..134b217e 100644 --- a/src/serena/symbol.py +++ b/src/serena/symbol.py @@ -4,7 +4,7 @@ import os from abc import ABC, abstractmethod from collections.abc import Iterator, Sequence from dataclasses import asdict, dataclass -from typing import TYPE_CHECKING, Any, Self, Union +from typing import TYPE_CHECKING, Any, NotRequired, Self, TypedDict, Union from sensai.util.string import ToStringMixin @@ -77,7 +77,7 @@ class PositionInFile: return Position(line=self.line, character=self.col) -class Symbol(ABC): +class Symbol(ToStringMixin, ABC): @abstractmethod def get_body_start_position(self) -> PositionInFile | None: pass @@ -599,7 +599,15 @@ class LanguageServerSymbolRetriever: class JetBrainsSymbol(Symbol): - def __init__(self, symbol_dict: dict, project: Project) -> None: + class SymbolDict(TypedDict): + name_path: str + relative_path: str + type: str + text_range: NotRequired[dict] + body: NotRequired[str] + children: NotRequired[list["JetBrainsSymbol.SymbolDict"]] + + def __init__(self, symbol_dict: SymbolDict, project: Project) -> None: """ :param symbol_dict: dictionary as returned by the JetBrains plugin client. """ @@ -609,6 +617,15 @@ class JetBrainsSymbol(Symbol): self._cached_body_start_position: PositionInFile | None = None self._cached_body_end_position: PositionInFile | None = None + def _tostring_includes(self) -> list[str]: + return [] + + def _tostring_additional_entries(self) -> dict[str, Any]: + return dict(name_path=self.get_name_path(), relative_path=self.get_relative_path(), type=self._dict["type"]) + + def get_name_path(self) -> str: + return self._dict["name_path"] + def get_relative_path(self) -> str: return self._dict["relative_path"]