mirror of
https://github.com/tiennm99/serena.git
synced 2026-10-13 20:15:20 +00:00
Removed LinesRead and mark_file_modified (#666)
This commit is contained in:
1 parent
9b622bcfd5
commit
21af8bf451
10 files changed
+19
-54
No files matched your search
@@ -8,7 +8,6 @@ import platform
|
||||
import sys
|
||||
import threading
|
||||
import webbrowser
|
||||
from collections import defaultdict
|
||||
from collections.abc import Callable
|
||||
from concurrent.futures import Future, ThreadPoolExecutor
|
||||
from logging import Logger
|
||||
@@ -44,22 +43,6 @@ class ProjectNotFoundError(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class LinesRead:
|
||||
def __init__(self) -> None:
|
||||
self.files: dict[str, set[tuple[int, int]]] = defaultdict(lambda: set())
|
||||
|
||||
def add_lines_read(self, relative_path: str, lines: tuple[int, int]) -> None:
|
||||
self.files[relative_path].add(lines)
|
||||
|
||||
def were_lines_read(self, relative_path: str, lines: tuple[int, int]) -> bool:
|
||||
lines_read_in_file = self.files[relative_path]
|
||||
return lines in lines_read_in_file
|
||||
|
||||
def invalidate_lines_read(self, relative_path: str) -> None:
|
||||
if relative_path in self.files:
|
||||
del self.files[relative_path]
|
||||
|
||||
|
||||
class MemoriesManager:
|
||||
def __init__(self, project_root: str):
|
||||
self._memory_dir = Path(get_serena_managed_in_project_dir(project_root)) / "memories"
|
||||
@@ -139,7 +122,6 @@ class SerenaAgent:
|
||||
self._active_project: Project | None = None
|
||||
self.language_server: SolidLanguageServer | None = None
|
||||
self.memories_manager: MemoriesManager | None = None
|
||||
self.lines_read: LinesRead | None = None
|
||||
|
||||
# adjust log level
|
||||
serena_log_level = self.serena_config.log_level
|
||||
@@ -444,7 +426,6 @@ class SerenaAgent:
|
||||
|
||||
# initialize project-specific instances which do not depend on the language server
|
||||
self.memories_manager = MemoriesManager(project.project_root)
|
||||
self.lines_read = LinesRead()
|
||||
|
||||
def init_language_server() -> None:
|
||||
# start the language server
|
||||
@@ -604,10 +585,6 @@ class SerenaAgent:
|
||||
def print_tool_overview(self) -> None:
|
||||
ToolRegistry().print_tool_overview(self._active_tools.values())
|
||||
|
||||
def mark_file_modified(self, relative_path: str) -> None:
|
||||
assert self.lines_read is not None
|
||||
self.lines_read.invalidate_lines_read(relative_path)
|
||||
|
||||
def __del__(self) -> None:
|
||||
"""
|
||||
Destructor to clean up the language server instance and GUI logger
|
||||
|
||||
@@ -60,9 +60,6 @@ class CodeEditor(Generic[TSymbol], ABC):
|
||||
abs_path = os.path.join(self.project_root, relative_path)
|
||||
with open(abs_path, "w", encoding="utf-8") as f:
|
||||
f.write(edited_file.get_contents())
|
||||
# notify agent (if provided)
|
||||
if self.agent is not None:
|
||||
self.agent.mark_file_modified(relative_path)
|
||||
|
||||
@abstractmethod
|
||||
def _find_unique_symbol(self, name_path: str, relative_file_path: str) -> TSymbol:
|
||||
|
||||
@@ -43,7 +43,6 @@ class ReadFileTool(Tool):
|
||||
if end_line is None:
|
||||
result_lines = result_lines[start_line:]
|
||||
else:
|
||||
self.lines_read.add_lines_read(relative_path, (start_line, end_line))
|
||||
result_lines = result_lines[start_line : end_line + 1]
|
||||
result = "\n".join(result_lines)
|
||||
|
||||
@@ -228,9 +227,6 @@ class DeleteLinesTool(Tool, ToolMarkerCanEdit, ToolMarkerOptional):
|
||||
:param start_line: the 0-based index of the first line to be deleted
|
||||
:param end_line: the 0-based index of the last line to be deleted
|
||||
"""
|
||||
if not self.lines_read.were_lines_read(relative_path, (start_line, end_line)):
|
||||
read_lines_tool = self.agent.get_tool(ReadFileTool)
|
||||
return f"Error: Must call `{read_lines_tool.get_name_from_cls()}` first to read exactly the affected lines."
|
||||
code_editor = self.create_code_editor()
|
||||
code_editor.delete_lines(relative_path, start_line, end_line)
|
||||
return SUCCESS_RESULT
|
||||
|
||||
@@ -18,7 +18,7 @@ from serena.util.inspection import iter_subclasses
|
||||
from solidlsp.ls_exceptions import SolidLSPException
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from serena.agent import LinesRead, MemoriesManager, SerenaAgent
|
||||
from serena.agent import MemoriesManager, SerenaAgent
|
||||
from serena.code_editor import CodeEditor
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
@@ -64,11 +64,6 @@ class Component(ABC):
|
||||
else:
|
||||
return JetBrainsCodeEditor(project=self.project, agent=self.agent)
|
||||
|
||||
@property
|
||||
def lines_read(self) -> "LinesRead":
|
||||
assert self.agent.lines_read is not None
|
||||
return self.agent.lines_read
|
||||
|
||||
|
||||
class ToolMarker:
|
||||
"""
|
||||
|
||||
@@ -458,7 +458,7 @@ def main() -> None:
|
||||
processor.process(task.name)
|
||||
|
||||
# Use advanced search
|
||||
results, total = advanced_search(query="test", filters={"status": Status.PENDING}, sort_by="priority", page=1, include_metadata=True)
|
||||
_results, _total = advanced_search(query="test", filters={"status": Status.PENDING}, sort_by="priority", page=1, include_metadata=True)
|
||||
|
||||
# Create a tree
|
||||
root = TreeNode("root")
|
||||
|
||||
@@ -47,7 +47,7 @@ class TestALLanguageServer:
|
||||
|
||||
# AL tables should have their fields as child symbols
|
||||
customer_table = None
|
||||
all_symbols, root_symbols = symbols
|
||||
_all_symbols, root_symbols = symbols
|
||||
for sym in root_symbols:
|
||||
if "TEST Customer" in sym.get("name", ""):
|
||||
customer_table = sym
|
||||
@@ -80,7 +80,7 @@ class TestALLanguageServer:
|
||||
|
||||
# Find the codeunit symbol - AL returns 'Codeunit 50000 CustomerMgt'
|
||||
codeunit_symbol = None
|
||||
all_symbols, root_symbols = symbols
|
||||
_all_symbols, root_symbols = symbols
|
||||
for sym in root_symbols:
|
||||
if "CustomerMgt" in sym.get("name", ""):
|
||||
codeunit_symbol = sym
|
||||
@@ -104,7 +104,7 @@ class TestALLanguageServer:
|
||||
|
||||
# Find the Customer table symbol
|
||||
customer_symbol = None
|
||||
all_symbols, root_symbols = symbols
|
||||
_all_symbols, root_symbols = symbols
|
||||
for sym in root_symbols:
|
||||
if "TEST Customer" in sym.get("name", ""):
|
||||
customer_symbol = sym
|
||||
|
||||
@@ -25,7 +25,7 @@ class TestBashLanguageServerBasics:
|
||||
def test_bash_request_document_symbols(self, language_server: SolidLanguageServer) -> None:
|
||||
"""Test request_document_symbols for bash files."""
|
||||
# Test getting symbols from main.sh
|
||||
all_symbols, root_symbols = language_server.request_document_symbols("main.sh", include_body=False)
|
||||
all_symbols, _root_symbols = language_server.request_document_symbols("main.sh", include_body=False)
|
||||
|
||||
# Extract function symbols (LSP Symbol Kind 12)
|
||||
function_symbols = [symbol for symbol in all_symbols if symbol.get("kind") == 12]
|
||||
@@ -41,7 +41,7 @@ class TestBashLanguageServerBasics:
|
||||
def test_bash_request_document_symbols_with_body(self, language_server: SolidLanguageServer) -> None:
|
||||
"""Test request_document_symbols with body extraction."""
|
||||
# Test with include_body=True
|
||||
all_symbols, root_symbols = language_server.request_document_symbols("main.sh", include_body=True)
|
||||
all_symbols, _root_symbols = language_server.request_document_symbols("main.sh", include_body=True)
|
||||
|
||||
function_symbols = [symbol for symbol in all_symbols if symbol.get("kind") == 12]
|
||||
|
||||
@@ -58,7 +58,7 @@ class TestBashLanguageServerBasics:
|
||||
def test_bash_utils_functions(self, language_server: SolidLanguageServer) -> None:
|
||||
"""Test function detection in utils.sh file."""
|
||||
# Test with utils.sh as well
|
||||
utils_all_symbols, utils_root_symbols = language_server.request_document_symbols("utils.sh", include_body=False)
|
||||
utils_all_symbols, _utils_root_symbols = language_server.request_document_symbols("utils.sh", include_body=False)
|
||||
|
||||
utils_function_symbols = [symbol for symbol in utils_all_symbols if symbol.get("kind") == 12]
|
||||
utils_function_names = [symbol["name"] for symbol in utils_function_symbols]
|
||||
@@ -84,12 +84,12 @@ class TestBashLanguageServerBasics:
|
||||
def test_bash_function_syntax_patterns(self, language_server: SolidLanguageServer) -> None:
|
||||
"""Test that LSP detects different bash function syntax patterns correctly."""
|
||||
# Test main.sh (has both 'function' keyword and traditional syntax)
|
||||
main_all_symbols, main_root_symbols = language_server.request_document_symbols("main.sh", include_body=False)
|
||||
main_all_symbols, _main_root_symbols = language_server.request_document_symbols("main.sh", include_body=False)
|
||||
main_functions = [symbol for symbol in main_all_symbols if symbol.get("kind") == 12]
|
||||
main_function_names = [func["name"] for func in main_functions]
|
||||
|
||||
# Test utils.sh (all use 'function' keyword)
|
||||
utils_all_symbols, utils_root_symbols = language_server.request_document_symbols("utils.sh", include_body=False)
|
||||
utils_all_symbols, _utils_root_symbols = language_server.request_document_symbols("utils.sh", include_body=False)
|
||||
utils_functions = [symbol for symbol in utils_all_symbols if symbol.get("kind") == 12]
|
||||
utils_function_names = [func["name"] for func in utils_functions]
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ class TestMarkdownLanguageServerBasics:
|
||||
def test_markdown_request_document_symbols(self, language_server: SolidLanguageServer) -> None:
|
||||
"""Test request_document_symbols for markdown files."""
|
||||
# Test getting symbols from README.md
|
||||
all_symbols, root_symbols = language_server.request_document_symbols("README.md", include_body=False)
|
||||
all_symbols, _root_symbols = language_server.request_document_symbols("README.md", include_body=False)
|
||||
|
||||
# Extract heading symbols (LSP Symbol Kind 15 is String, but marksman uses kind 15 for headings)
|
||||
# Note: Different markdown LSPs may use different symbol kinds for headings
|
||||
@@ -38,7 +38,7 @@ class TestMarkdownLanguageServerBasics:
|
||||
@pytest.mark.parametrize("language_server", [Language.MARKDOWN], indirect=True)
|
||||
def test_markdown_request_symbols_from_guide(self, language_server: SolidLanguageServer) -> None:
|
||||
"""Test symbol detection in guide.md file."""
|
||||
all_symbols, root_symbols = language_server.request_document_symbols("guide.md", include_body=False)
|
||||
all_symbols, _root_symbols = language_server.request_document_symbols("guide.md", include_body=False)
|
||||
|
||||
# At least some headings should be found
|
||||
assert len(all_symbols) > 0, f"Should find headings in guide.md, found {len(all_symbols)}"
|
||||
@@ -46,7 +46,7 @@ class TestMarkdownLanguageServerBasics:
|
||||
@pytest.mark.parametrize("language_server", [Language.MARKDOWN], indirect=True)
|
||||
def test_markdown_request_symbols_from_api(self, language_server: SolidLanguageServer) -> None:
|
||||
"""Test symbol detection in api.md file."""
|
||||
all_symbols, root_symbols = language_server.request_document_symbols("api.md", include_body=False)
|
||||
all_symbols, _root_symbols = language_server.request_document_symbols("api.md", include_body=False)
|
||||
|
||||
# Should detect headings from api.md
|
||||
assert len(all_symbols) > 0, f"Should find headings in api.md, found {len(all_symbols)}"
|
||||
@@ -55,7 +55,7 @@ class TestMarkdownLanguageServerBasics:
|
||||
def test_markdown_request_document_symbols_with_body(self, language_server: SolidLanguageServer) -> None:
|
||||
"""Test request_document_symbols with body extraction."""
|
||||
# Test with include_body=True
|
||||
all_symbols, root_symbols = language_server.request_document_symbols("README.md", include_body=True)
|
||||
all_symbols, _root_symbols = language_server.request_document_symbols("README.md", include_body=True)
|
||||
|
||||
# Should have found some symbols
|
||||
assert len(all_symbols) > 0, "Should find symbols in README.md"
|
||||
|
||||
@@ -27,7 +27,7 @@ class TestRLanguageServer:
|
||||
@pytest.mark.parametrize("language_server", [Language.R], indirect=True)
|
||||
def test_symbol_retrieval(self, language_server: SolidLanguageServer):
|
||||
"""Test R document symbol extraction."""
|
||||
all_symbols, root_symbols = language_server.request_document_symbols(os.path.join("R", "utils.R"))
|
||||
all_symbols, _root_symbols = language_server.request_document_symbols(os.path.join("R", "utils.R"))
|
||||
|
||||
# Should find the three exported functions
|
||||
function_symbols = [s for s in all_symbols if s.get("kind") == 12] # Function kind
|
||||
|
||||
@@ -89,7 +89,7 @@ class TestRubyLanguageServerSymbols:
|
||||
"""Test request_containing_symbol for a module context."""
|
||||
# Test that we can find the Services module in document symbols
|
||||
file_path = os.path.join("services.rb")
|
||||
symbols, roots = language_server.request_document_symbols(file_path)
|
||||
symbols, _roots = language_server.request_document_symbols(file_path)
|
||||
|
||||
# Verify Services module appears in document symbols
|
||||
services_module = None
|
||||
@@ -141,7 +141,7 @@ class TestRubyLanguageServerSymbols:
|
||||
# Test referencing symbols for create_user method
|
||||
file_path = os.path.join("services.rb")
|
||||
# Line containing the create_user method definition
|
||||
symbols, roots = language_server.request_document_symbols(file_path)
|
||||
symbols, _roots = language_server.request_document_symbols(file_path)
|
||||
create_user_symbol = None
|
||||
|
||||
# Find create_user method in the document symbols (Ruby returns flat list)
|
||||
@@ -169,7 +169,7 @@ class TestRubyLanguageServerSymbols:
|
||||
# Test referencing symbols for User class
|
||||
file_path = os.path.join("models.rb")
|
||||
# Find User class in document symbols
|
||||
symbols, roots = language_server.request_document_symbols(file_path)
|
||||
symbols, _roots = language_server.request_document_symbols(file_path)
|
||||
user_symbol = None
|
||||
|
||||
for symbol in symbols:
|
||||
@@ -363,7 +363,7 @@ class TestRubyLanguageServerSymbols:
|
||||
# Test referencing symbols for a method parameter in get_user method
|
||||
file_path = os.path.join("services.rb")
|
||||
# Find get_user method and test parameter references
|
||||
symbols, roots = language_server.request_document_symbols(file_path)
|
||||
symbols, _roots = language_server.request_document_symbols(file_path)
|
||||
get_user_symbol = None
|
||||
|
||||
for symbol in symbols:
|
||||
|
||||
Reference in new issue
Block a user