Refatored lsp controller file layout
This commit is contained in:
3
src/core/controllers/lsp/__init__.py
Normal file
3
src/core/controllers/lsp/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
||||
"""
|
||||
LSP Controller Module
|
||||
"""
|
91
src/core/controllers/lsp/lsp_controller.py
Normal file
91
src/core/controllers/lsp/lsp_controller.py
Normal file
@@ -0,0 +1,91 @@
|
||||
# Python imports
|
||||
import threading
|
||||
|
||||
# Lib imports
|
||||
|
||||
# Application imports
|
||||
from libs.dto.lsp_messages import get_message_str
|
||||
from libs.dto.lsp_message_structs import LSPResponseTypes, ClientRequest, ClientNotification
|
||||
from .lsp_controller_stdin_stdout import LSPControllerSTDInSTDOut
|
||||
|
||||
|
||||
|
||||
def _log_list():
|
||||
def add_log_entry(title: str, message: any):
|
||||
...
|
||||
|
||||
def clear():
|
||||
...
|
||||
|
||||
|
||||
|
||||
class LSPController(LSPControllerSTDInSTDOut):
|
||||
def __init__(self):
|
||||
super(LSPController).__init__()
|
||||
|
||||
self._language = "python3"
|
||||
|
||||
# https://github.com/microsoft/multilspy/tree/main/src/multilspy/language_servers
|
||||
# initialize-params-slim.json was created off of jedi_language_server one
|
||||
self._init_params = settings_manager.get_lsp_init_data()
|
||||
|
||||
self._start_command = None
|
||||
self._lsp_pid = -1
|
||||
self._message_id = 0
|
||||
|
||||
self.read_lock = threading.Lock()
|
||||
self.write_lock = threading.Lock()
|
||||
self.log_list = _log_list
|
||||
self.request_list = {}
|
||||
|
||||
self._subscribe_to_events()
|
||||
|
||||
|
||||
def _subscribe_to_events(self):
|
||||
event_system.subscribe("textDocument/didOpen", self._lsp_did_open)
|
||||
event_system.subscribe("textDocument/didSave", self._lsp_did_save)
|
||||
event_system.subscribe("textDocument/didClose", self._lsp_did_close)
|
||||
event_system.subscribe("textDocument/didChange", self._lsp_did_change)
|
||||
event_system.subscribe("textDocument/definition", self._lsp_definition)
|
||||
event_system.subscribe("textDocument/completion", self._lsp_completion)
|
||||
|
||||
|
||||
def set_language(self, language):
|
||||
self._language = language
|
||||
|
||||
def set_log_list(self, log_list):
|
||||
self.log_list = log_list
|
||||
|
||||
def set_start_command(self, start_command: list):
|
||||
self._start_command = start_command
|
||||
|
||||
def unset_start_command(self):
|
||||
self._start_command = None
|
||||
|
||||
def send_notification(self, method: str, params: {} = {}):
|
||||
self._send_message( ClientNotification(method, params) )
|
||||
|
||||
def send_request(self, method: str, params: {} = {}):
|
||||
self._send_message( ClientRequest(self._message_id, method, params) )
|
||||
|
||||
self.request_list[self._message_id] = {"method": method}
|
||||
self._message_id += 1
|
||||
|
||||
def get_message_id(self) -> int:
|
||||
return self._message_id
|
||||
|
||||
def start_stop_lsp(self):
|
||||
if self._lsp_pid == -1:
|
||||
pid = self.start_lsp()
|
||||
if not pid: return
|
||||
|
||||
self._lsp_pid = pid
|
||||
self._monitor_lsp_response()
|
||||
else:
|
||||
self.stop_lsp()
|
||||
self.log_list.clear()
|
||||
|
||||
def handle_lsp_response(self, lsp_response: LSPResponseTypes):
|
||||
self._monitor_lsp_response()
|
||||
self.log_list.add_log_entry("LSP Response", lsp_response)
|
||||
event_system.emit("respond-to-client", (get_message_str(lsp_response),))
|
19
src/core/controllers/lsp/lsp_controller_base.py
Normal file
19
src/core/controllers/lsp/lsp_controller_base.py
Normal file
@@ -0,0 +1,19 @@
|
||||
# Python imports
|
||||
|
||||
# Lib imports
|
||||
|
||||
# Application imports
|
||||
from .lsp_controller_events import LSPControllerEvents
|
||||
from libs.dto.lsp_message_structs import ClientRequest, ClientNotification
|
||||
|
||||
|
||||
|
||||
class LSPControllerBase(LSPControllerEvents):
|
||||
def _send_message(self, data: ClientRequest or ClientNotification):
|
||||
raise NotImplementedError
|
||||
|
||||
def start_lsp(self):
|
||||
raise NotImplementedError
|
||||
|
||||
def stop_lsp(self):
|
||||
raise NotImplementedError
|
@@ -1,81 +1,19 @@
|
||||
# Python imports
|
||||
import signal
|
||||
import subprocess
|
||||
import threading
|
||||
import json
|
||||
|
||||
# Lib imports
|
||||
from gi.repository import GLib
|
||||
|
||||
# Application imports
|
||||
from libs.dto.lsp_messages import LEN_HEADER, TYPE_HEADER, get_message_str, get_message_obj
|
||||
from .lsp_controller_base import LSPControllerBase
|
||||
from libs.dto.lsp_message_structs import \
|
||||
LSPResponseTypes, ClientRequest, ClientNotification, LSPResponseRequest, LSPResponseNotification
|
||||
from .lsp_controller_events import LSPControllerEvents
|
||||
|
||||
|
||||
|
||||
def _log_list():
|
||||
def add_log_entry(title: str, message: any):
|
||||
...
|
||||
|
||||
def clear():
|
||||
...
|
||||
|
||||
|
||||
|
||||
class LSPController(LSPControllerEvents):
|
||||
def __init__(self):
|
||||
super(LSPController).__init__()
|
||||
|
||||
self._language = "python3"
|
||||
|
||||
# https://github.com/microsoft/multilspy/tree/main/src/multilspy/language_servers
|
||||
# initialize-params-slim.json was created off of jedi_language_server one
|
||||
self._init_params = settings_manager.get_lsp_init_data()
|
||||
|
||||
self._start_command = None
|
||||
self._lsp_pid = -1
|
||||
self._message_id = 0
|
||||
|
||||
self.read_lock = threading.Lock()
|
||||
self.write_lock = threading.Lock()
|
||||
self.log_list = _log_list
|
||||
self.request_list = {}
|
||||
|
||||
self._subscribe_to_events()
|
||||
|
||||
|
||||
def _subscribe_to_events(self):
|
||||
event_system.subscribe("textDocument/didOpen", self._lsp_did_open)
|
||||
event_system.subscribe("textDocument/didSave", self._lsp_did_save)
|
||||
event_system.subscribe("textDocument/didClose", self._lsp_did_close)
|
||||
event_system.subscribe("textDocument/didChange", self._lsp_did_change)
|
||||
event_system.subscribe("textDocument/definition", self._lsp_definition)
|
||||
event_system.subscribe("textDocument/completion", self._lsp_completion)
|
||||
|
||||
|
||||
def set_language(self, language):
|
||||
self._language = language
|
||||
|
||||
def set_log_list(self, log_list):
|
||||
self.log_list = log_list
|
||||
|
||||
def set_start_command(self, start_command: list):
|
||||
self._start_command = start_command
|
||||
|
||||
def unset_start_command(self):
|
||||
self._start_command = None
|
||||
|
||||
def send_notification(self, method: str, params: {} = {}):
|
||||
self._send_message( ClientNotification(method, params) )
|
||||
|
||||
def send_request(self, method: str, params: {} = {}):
|
||||
self._send_message( ClientRequest(self._message_id, method, params) )
|
||||
|
||||
self.request_list[self._message_id] = {"method": method}
|
||||
self._message_id += 1
|
||||
|
||||
class LSPControllerSTDInSTDOut(LSPControllerBase):
|
||||
def _send_message(self, data: ClientRequest or ClientNotification):
|
||||
if not data or not hasattr(self, "lsp_process"): return
|
||||
|
||||
@@ -89,20 +27,6 @@ class LSPController(LSPControllerEvents):
|
||||
self.lsp_process.stdin.write( message.encode("utf-8") )
|
||||
self.lsp_process.stdin.flush()
|
||||
|
||||
def get_message_id(self) -> int:
|
||||
return self._message_id
|
||||
|
||||
def start_stop_lsp(self):
|
||||
if self._lsp_pid == -1:
|
||||
pid = self.start_lsp()
|
||||
if not pid: return
|
||||
|
||||
self._lsp_pid = pid
|
||||
self._monitor_lsp_response()
|
||||
else:
|
||||
self.stop_lsp()
|
||||
self.log_list.clear()
|
||||
|
||||
def start_lsp(self):
|
||||
if not self._start_command: return
|
||||
try:
|
||||
@@ -190,8 +114,3 @@ class LSPController(LSPControllerEvents):
|
||||
|
||||
if not lsp_response: return
|
||||
GLib.idle_add(self.handle_lsp_response, lsp_response)
|
||||
|
||||
def handle_lsp_response(self, lsp_response: LSPResponseTypes):
|
||||
self._monitor_lsp_response()
|
||||
self.log_list.add_log_entry("LSP Response", lsp_response)
|
||||
event_system.emit("respond-to-client", (get_message_str(lsp_response),))
|
Reference in New Issue
Block a user