Refactor LSP manager architecture and event + completion pipeline
- Replace legacy LSPManagerClient + LSPManagerUI with ClientManager and UIManager - Remove WebsocketClient in favor of unified Websocket implementation - Move LSP initialization config loading into centralized config module - Update LSPClient to support dynamic socket, improved init params, and doc version tracking - Introduce range-based didChange notifications and add implementation + references requests - Expand LSPClientEvents to support implementation/references and structured range edits - Simplify websocket response handling and normalize LSP response parsing flow - Decouple UI from LSP manager core; UI now emits address/port for client creation - Refactor completion provider pipeline: - Split TextChangedEvent into TextInsertedEvent and DeleteRangeEvent - Update ProviderResponseCacheBase and controller dispatch paths accordingly - Improve SourceBuffer and SourceFile event tracking with delete-range support - Update plugin system: - Centralize command/provider registration via helper methods - Add LSP commands: definition, references, implementation, toggle UI - Enhance response handlers to support references and implementation hooks - Improve Python LSP config (jedi completion, signatures, references enabled) - Fix minor GTK lifecycle and buffer signal handling issues - Clean up unused imports, dead code, and outdated JSON server configs
This commit is contained in:
@@ -36,8 +36,11 @@ class ProviderResponseCacheBase:
|
||||
def process_file_save(self, event: Code_Event_Types.SavedFileEvent):
|
||||
raise ProviderResponseCacheException("ProviderResponseCacheBase 'process_file_save' not implemented...")
|
||||
|
||||
def process_file_change(self, event: Code_Event_Types.TextChangedEvent):
|
||||
raise ProviderResponseCacheException("ProviderResponseCacheBase 'process_change' not implemented...")
|
||||
def process_file_text_inserted(self, event: Code_Event_Types.TextInsertedEvent):
|
||||
raise ProviderResponseCacheException("ProviderResponseCacheBase 'process_file_text_inserted' not implemented...")
|
||||
|
||||
def process_file_delete_range(self, event: Code_Event_Types.DeleteRangeEvent):
|
||||
raise ProviderResponseCacheException("ProviderResponseCacheBase 'process_file_delete_range' not implemented...")
|
||||
|
||||
def filter(self, word: str) -> list[dict]:
|
||||
raise ProviderResponseCacheException("ProviderResponseCacheBase 'filter' not implemented...")
|
||||
|
||||
@@ -41,8 +41,10 @@ class CompletionController(ControllerBase):
|
||||
self.provider_process_file_close(event)
|
||||
elif isinstance(event, Code_Event_Types.SavedFileEvent):
|
||||
self.provider_process_file_save(event)
|
||||
elif isinstance(event, Code_Event_Types.TextChangedEvent):
|
||||
self.provider_process_file_change(event)
|
||||
elif isinstance(event, Code_Event_Types.TextInsertedEvent):
|
||||
self.provider_process_file_text_inserted(event)
|
||||
elif isinstance(event, Code_Event_Types.DeleteRangeEvent):
|
||||
self.provider_process_file_delete_range(event)
|
||||
elif isinstance(event, Code_Event_Types.RequestCompletionEvent):
|
||||
self.request_unbound_completion(event)
|
||||
|
||||
@@ -88,9 +90,13 @@ class CompletionController(ControllerBase):
|
||||
for provider in self._providers.values():
|
||||
provider.response_cache.process_file_save(event)
|
||||
|
||||
def provider_process_file_change(self, event: Code_Event_Types.TextChangedEvent):
|
||||
def provider_process_file_text_inserted(self, event: Code_Event_Types.TextInsertedEvent):
|
||||
for provider in self._providers.values():
|
||||
provider.response_cache.process_file_change(event)
|
||||
provider.response_cache.process_file_text_inserted(event)
|
||||
|
||||
def provider_process_file_delete_range(self, event: Code_Event_Types.DeleteRangeEvent):
|
||||
for provider in self._providers.values():
|
||||
provider.response_cache.process_file_delete_range(event)
|
||||
|
||||
def request_unbound_completion(self, event: Code_Event_Types.RequestCompletionEvent):
|
||||
completer = event.view.get_completion()
|
||||
|
||||
@@ -128,6 +128,7 @@ class SourceViewsController(ControllerBase, list):
|
||||
|
||||
self.append(source_view)
|
||||
scrolled_win.add(source_view)
|
||||
scrolled_win.show_all()
|
||||
|
||||
event = Event_Factory.create_event(
|
||||
"created_source_view", view = source_view
|
||||
|
||||
@@ -31,6 +31,7 @@ class SourceBuffer(GtkSource.Buffer):
|
||||
_insert_text,
|
||||
_after_insert_text,
|
||||
_modified_changed,
|
||||
_delete_range,
|
||||
):
|
||||
|
||||
self._handler_ids = [
|
||||
@@ -39,7 +40,8 @@ class SourceBuffer(GtkSource.Buffer):
|
||||
self.connect("mark-set", _mark_set),
|
||||
self.connect("insert-text", _insert_text),
|
||||
self.connect_after("insert-text", _after_insert_text),
|
||||
self.connect("modified-changed", _modified_changed)
|
||||
self.connect("modified-changed", _modified_changed),
|
||||
self.connect("delete-range", _delete_range)
|
||||
]
|
||||
|
||||
def block_changed_signal(self):
|
||||
@@ -54,6 +56,9 @@ class SourceBuffer(GtkSource.Buffer):
|
||||
def block_modified_changed_signal(self):
|
||||
self.handler_block(self._handler_ids[5])
|
||||
|
||||
def block_delete_range(self):
|
||||
self.handler_block(self._handler_ids[6])
|
||||
|
||||
def unblock_changed_signal(self):
|
||||
self.handler_unblock(self._handler_ids[0])
|
||||
|
||||
@@ -66,6 +71,9 @@ class SourceBuffer(GtkSource.Buffer):
|
||||
def unblock_modified_changed_signal(self):
|
||||
self.handler_unblock(self._handler_ids[5])
|
||||
|
||||
def unblock_delete_range(self):
|
||||
self.handler_block(self._handler_ids[6])
|
||||
|
||||
def clear_signals(self):
|
||||
for handle_id in self._handler_ids:
|
||||
self.disconnect(handle_id)
|
||||
|
||||
@@ -40,7 +40,8 @@ class SourceFile(GtkSource.File):
|
||||
self._mark_set,
|
||||
self._insert_text,
|
||||
self._after_insert_text,
|
||||
self._modified_changed
|
||||
self._modified_changed,
|
||||
self._delete_range
|
||||
)
|
||||
|
||||
def _changed(self, buffer: SourceBuffer):
|
||||
@@ -99,7 +100,19 @@ class SourceFile(GtkSource.File):
|
||||
def _modified_changed(self, buffer: SourceBuffer):
|
||||
event = Event_Factory.create_event(
|
||||
"modified_changed",
|
||||
file = self, buffer = buffer
|
||||
file = self,
|
||||
buffer = buffer
|
||||
)
|
||||
|
||||
self.emit(event)
|
||||
|
||||
def _delete_range(self, buffer: SourceBuffer, start: Gtk.TextIter, end: Gtk.TextIter):
|
||||
event = Event_Factory.create_event(
|
||||
"delete_range",
|
||||
file = self,
|
||||
buffer = buffer,
|
||||
start = start,
|
||||
end = end,
|
||||
)
|
||||
|
||||
self.emit(event)
|
||||
|
||||
@@ -26,6 +26,7 @@ from .get_source_views_event import GetSourceViewsEvent
|
||||
from .create_command_system_event import CreateCommandSystemEvent
|
||||
from .request_completion_event import RequestCompletionEvent
|
||||
from .cursor_moved_event import CursorMovedEvent
|
||||
from .delete_range_event import DeleteRangeEvent
|
||||
from .modified_changed_event import ModifiedChangedEvent
|
||||
from .text_changed_event import TextChangedEvent
|
||||
from .text_inserted_event import TextInsertedEvent
|
||||
|
||||
19
src/libs/dto/code/events/delete_range_event.py
Normal file
19
src/libs/dto/code/events/delete_range_event.py
Normal file
@@ -0,0 +1,19 @@
|
||||
# Python imports
|
||||
from dataclasses import dataclass, field
|
||||
|
||||
# Lib imports
|
||||
import gi
|
||||
|
||||
gi.require_version('Gtk', '3.0')
|
||||
|
||||
from gi.repository import Gtk
|
||||
|
||||
# Application imports
|
||||
from .code_event import CodeEvent
|
||||
|
||||
|
||||
|
||||
@dataclass
|
||||
class DeleteRangeEvent(CodeEvent):
|
||||
start: Gtk.TextIter = None
|
||||
end: Gtk.TextIter = None
|
||||
@@ -1,7 +1,11 @@
|
||||
# Python imports
|
||||
from dataclasses import dataclass
|
||||
from dataclasses import dataclass, field
|
||||
|
||||
# Lib imports
|
||||
import gi
|
||||
gi.require_version('GtkSource', '4')
|
||||
|
||||
from gi.repository import GtkSource
|
||||
|
||||
# Application imports
|
||||
from .code_event import CodeEvent
|
||||
@@ -10,4 +14,6 @@ from .code_event import CodeEvent
|
||||
|
||||
@dataclass
|
||||
class UnregisterProviderEvent(CodeEvent):
|
||||
provider_name: str = ""
|
||||
provider_name: str = ""
|
||||
provider: GtkSource.CompletionProvider = None
|
||||
language_ids: list = field(default_factory=lambda: [])
|
||||
|
||||
Reference in New Issue
Block a user