Remove custom LSP manager plugins and add new language server clients
- Delete old lsp_manager plugin (custom websocket-based LSP client implementation) - Delete java_lsp_client plugin - Delete python_lsp_client plugin - Remove unused LSP DTO files in src/libs/dto/code/lsp/ - Add new language_server_clients plugin directory - Improve event_factory with register_events method - Add PYTHONDONTWRITEBYTECODE to user config - Update events init.py docstring
This commit is contained in:
@@ -0,0 +1,214 @@
|
|||||||
|
{
|
||||||
|
"info": "https://download.eclipse.org/jdtls/",
|
||||||
|
"info-init-options": "https://github.com/eclipse-jdtls/eclipse.jdt.ls/wiki/Running-the-JAVA-LS-server-from-the-command-line",
|
||||||
|
"info-import-build": "https://www.javahotchocolate.com/tutorials/build-path.html",
|
||||||
|
"info-external-class-paths": "https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3291",
|
||||||
|
"link": "https://download.eclipse.org/jdtls/milestones/?d",
|
||||||
|
"command": "lsp-ws-proxy --listen 4114 -- jdtls",
|
||||||
|
"alt-command": "lsp-ws-proxy -- jdtls",
|
||||||
|
"alt-command2": "java-language-server",
|
||||||
|
"socket": "ws://127.0.0.1:9999/java",
|
||||||
|
"socket-two": "ws://127.0.0.1:9999/?name=jdtls",
|
||||||
|
"alt-socket": "ws://127.0.0.1:9999/?name=java-language-server",
|
||||||
|
"initialization-options": {
|
||||||
|
"bundles": [
|
||||||
|
"intellicode-core.jar"
|
||||||
|
],
|
||||||
|
"workspaceFolders": [
|
||||||
|
"file://{workspace.folder}"
|
||||||
|
],
|
||||||
|
"extendedClientCapabilities": {
|
||||||
|
"classFileContentsSupport": true,
|
||||||
|
"executeClientCommandSupport": false
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"java": {
|
||||||
|
"autobuild": {
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
"jdt": {
|
||||||
|
"ls": {
|
||||||
|
"javac": {
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
"java": {
|
||||||
|
"home": "{user.home}/Portable_Apps/sdks/javasdk/jdk-22.0.2"
|
||||||
|
},
|
||||||
|
"lombokSupport": {
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
"protobufSupport":{
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
"androidSupport": {
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"configuration": {
|
||||||
|
"updateBuildConfiguration": "automatic",
|
||||||
|
"maven": {
|
||||||
|
"userSettings": "{user.home}/.config/jdtls/settings.xml",
|
||||||
|
"globalSettings": "{user.home}/.config/jdtls/settings.xml"
|
||||||
|
},
|
||||||
|
"runtimes": [
|
||||||
|
{
|
||||||
|
"name": "JavaSE-17",
|
||||||
|
"path": "/usr/lib/jvm/java-17-openjdk",
|
||||||
|
"javadoc": "https://docs.oracle.com/en/java/javase/17/docs/api/",
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "JavaSE-22",
|
||||||
|
"path": "{user.home}/Portable_Apps/sdks/javasdk/jdk-22.0.2",
|
||||||
|
"javadoc": "https://docs.oracle.com/en/java/javase/22/docs/api/",
|
||||||
|
"default": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"classPath": [
|
||||||
|
"{user.home}/.config/jdtls/m2/repository/**/*-sources.jar",
|
||||||
|
"lib/**/*-sources.jar"
|
||||||
|
],
|
||||||
|
"docPath": [
|
||||||
|
"{user.home}/.config/jdtls/m2/repository/**/*-javadoc.jar",
|
||||||
|
"lib/**/*-javadoc.jar"
|
||||||
|
],
|
||||||
|
"project": {
|
||||||
|
"encoding": "ignore",
|
||||||
|
"outputPath": "bin",
|
||||||
|
"referencedLibraries": [
|
||||||
|
"{user.home}/.config/jdtls/m2/repository/**/*.jar",
|
||||||
|
"lib/**/*.jar"
|
||||||
|
],
|
||||||
|
"importOnFirstTimeStartup": "automatic",
|
||||||
|
"importHint": true,
|
||||||
|
"resourceFilters": [
|
||||||
|
"node_modules",
|
||||||
|
"\\.git"
|
||||||
|
],
|
||||||
|
"sourcePaths": [
|
||||||
|
"src",
|
||||||
|
"{user.home}/.config/jdtls/m2/repository/**/*.jar"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"sources": {
|
||||||
|
"organizeImports": {
|
||||||
|
"starThreshold": 99,
|
||||||
|
"staticStarThreshold": 99
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"imports": {
|
||||||
|
"gradle": {
|
||||||
|
"wrapper": {
|
||||||
|
"checksums": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"import": {
|
||||||
|
"maven": {
|
||||||
|
"enabled": true,
|
||||||
|
"offline": {
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"disableTestClasspathFlag": false
|
||||||
|
},
|
||||||
|
"gradle": {
|
||||||
|
"enabled": false,
|
||||||
|
"wrapper": {
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
"version": "",
|
||||||
|
"home": "abs(static/gradle-7.3.3)",
|
||||||
|
"java": {
|
||||||
|
"home": "abs(static/launch_jres/17.0.6-linux-x86_64)"
|
||||||
|
},
|
||||||
|
"offline": {
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"arguments": [],
|
||||||
|
"jvmArguments": [],
|
||||||
|
"user": {
|
||||||
|
"home": ""
|
||||||
|
},
|
||||||
|
"annotationProcessing": {
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"exclusions": [
|
||||||
|
"**/node_modules/**",
|
||||||
|
"**/.metadata/**",
|
||||||
|
"**/archetype-resources/**",
|
||||||
|
"**/META-INF/maven/**"
|
||||||
|
],
|
||||||
|
"generatesMetadataFilesAtProjectRoot": false
|
||||||
|
},
|
||||||
|
"maven": {
|
||||||
|
"downloadSources": true,
|
||||||
|
"updateSnapshots": true
|
||||||
|
},
|
||||||
|
"silentNotification": true,
|
||||||
|
"contentProvider": {
|
||||||
|
"preferred": "fernflower"
|
||||||
|
},
|
||||||
|
"signatureHelp": {
|
||||||
|
"enabled": true,
|
||||||
|
"description": {
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"completion": {
|
||||||
|
"enabled": true,
|
||||||
|
"engine": "ecj",
|
||||||
|
"matchCase": "firstletter",
|
||||||
|
"maxResults": 25,
|
||||||
|
"guessMethodArguments": true,
|
||||||
|
"lazyResolveTextEdit": {
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
"postfix": {
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
"favoriteStaticMembers": [
|
||||||
|
"org.junit.Assert.*",
|
||||||
|
"org.junit.Assume.*",
|
||||||
|
"org.junit.jupiter.api.Assertions.*",
|
||||||
|
"org.junit.jupiter.api.Assumptions.*",
|
||||||
|
"org.junit.jupiter.api.DynamicContainer.*",
|
||||||
|
"org.junit.jupiter.api.DynamicTest.*"
|
||||||
|
],
|
||||||
|
"importOrder": [
|
||||||
|
"#",
|
||||||
|
"java",
|
||||||
|
"javax",
|
||||||
|
"org",
|
||||||
|
"com"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"references": {
|
||||||
|
"includeAccessors": true,
|
||||||
|
"includeDecompiledSources": true
|
||||||
|
},
|
||||||
|
"codeGeneration": {
|
||||||
|
"toString": {
|
||||||
|
"template": "${object.className}{${member.name()}=${member.value}, ${otherMembers}}"
|
||||||
|
},
|
||||||
|
"insertionLocation": "afterCursor",
|
||||||
|
"useBlocks": true
|
||||||
|
},
|
||||||
|
"implementationsCodeLens": {
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
"referencesCodeLens": {
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
"progressReports": {
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"saveActions": {
|
||||||
|
"organizeImports": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"name": "Java LSP Client",
|
||||||
|
"author": "ITDominator",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"support": "",
|
||||||
|
"requests": {}
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
# Python imports
|
||||||
|
from os import path
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
import gi
|
||||||
|
|
||||||
|
from gi.repository import GLib
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from libs.event_factory import Event_Factory, Code_Event_Types
|
||||||
|
|
||||||
|
from plugins.plugin_types import PluginCode
|
||||||
|
|
||||||
|
from .response_handler import JavaHandler
|
||||||
|
|
||||||
|
|
||||||
|
class Plugin(PluginCode):
|
||||||
|
def __init__(self):
|
||||||
|
super(Plugin, self).__init__()
|
||||||
|
|
||||||
|
|
||||||
|
def _controller_message(self, event: Code_Event_Types.CodeEvent):
|
||||||
|
...
|
||||||
|
|
||||||
|
def load(self):
|
||||||
|
dirPth = path.dirname( path.realpath(__file__) )
|
||||||
|
with open(f"{dirPth}/config/lsp-server-config.json", "r") as f:
|
||||||
|
config = f.read()
|
||||||
|
event = Event_Factory.create_event("register_lsp_client",
|
||||||
|
lang_id = "java",
|
||||||
|
lang_config = config,
|
||||||
|
handler = JavaHandler
|
||||||
|
)
|
||||||
|
self.emit_to("lsp_manager", event)
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
...
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
from .java import JavaHandler
|
||||||
@@ -9,7 +9,7 @@ from gi.repository import GtkSource
|
|||||||
# Application imports
|
# Application imports
|
||||||
from libs.event_factory import Event_Factory, Code_Event_Types
|
from libs.event_factory import Event_Factory, Code_Event_Types
|
||||||
|
|
||||||
from .default import DefaultHandler
|
from lsp_manager.response_handlers.default import DefaultHandler
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
"""
|
||||||
|
Pligin Module
|
||||||
|
"""
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
"""
|
||||||
|
Pligin Package
|
||||||
|
"""
|
||||||
@@ -8,8 +8,9 @@ import gi
|
|||||||
from gi.repository import GLib
|
from gi.repository import GLib
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
from libs.dto.code.lsp.lsp_messages import get_message_str
|
from ..dto.code.lsp.lsp_messages import get_message_str
|
||||||
from libs.dto.code.lsp.lsp_message_structs import LSPResponseTypes, ClientRequest, ClientNotification
|
from ..dto.code.lsp.lsp_message_structs import \
|
||||||
|
LSPResponseTypes, ClientRequest, ClientNotification
|
||||||
from .lsp_client_websocket import LSPClientWebsocket
|
from .lsp_client_websocket import LSPClientWebsocket
|
||||||
|
|
||||||
|
|
||||||
@@ -3,8 +3,9 @@
|
|||||||
# Lib imports
|
# Lib imports
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
|
from ..dto.code.lsp.lsp_message_structs import ClientRequest, ClientNotification
|
||||||
|
|
||||||
from .lsp_client_events import LSPClientEvents
|
from .lsp_client_events import LSPClientEvents
|
||||||
from libs.dto.code.lsp.lsp_message_structs import ClientRequest, ClientNotification
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -4,15 +4,15 @@ import os
|
|||||||
# Lib imports
|
# Lib imports
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
from libs.dto.code.lsp.lsp_messages import get_message_obj
|
from ..dto.code.lsp.lsp_messages import get_message_obj
|
||||||
from libs.dto.code.lsp.lsp_messages import didopen_notification
|
from ..dto.code.lsp.lsp_messages import didopen_notification
|
||||||
from libs.dto.code.lsp.lsp_messages import didsave_notification
|
from ..dto.code.lsp.lsp_messages import didsave_notification
|
||||||
from libs.dto.code.lsp.lsp_messages import didclose_notification
|
from ..dto.code.lsp.lsp_messages import didclose_notification
|
||||||
from libs.dto.code.lsp.lsp_messages import didchange_notification
|
from ..dto.code.lsp.lsp_messages import didchange_notification
|
||||||
from libs.dto.code.lsp.lsp_messages import completion_request
|
from ..dto.code.lsp.lsp_messages import completion_request
|
||||||
from libs.dto.code.lsp.lsp_messages import definition_request
|
from ..dto.code.lsp.lsp_messages import definition_request
|
||||||
from libs.dto.code.lsp.lsp_messages import references_request
|
from ..dto.code.lsp.lsp_messages import references_request
|
||||||
from libs.dto.code.lsp.lsp_messages import symbols_request
|
from ..dto.code.lsp.lsp_messages import symbols_request
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -5,8 +5,8 @@ from gi.repository import GLib
|
|||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
# from libs import websockets
|
# from libs import websockets
|
||||||
from libs.dto.code.lsp.lsp_messages import get_message_str, get_message_obj
|
from ..dto.code.lsp.lsp_messages import get_message_str, get_message_obj
|
||||||
from libs.dto.code.lsp.lsp_message_structs import \
|
from ..dto.code.lsp.lsp_message_structs import \
|
||||||
LSPResponseTypes, ClientRequest, ClientNotification, \
|
LSPResponseTypes, ClientRequest, ClientNotification, \
|
||||||
LSPResponseRequest, LSPResponseNotification, LSPIDResponseNotification
|
LSPResponseRequest, LSPResponseNotification, LSPIDResponseNotification
|
||||||
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
"""
|
||||||
|
Libs Code DTO(s) Events Package
|
||||||
|
"""
|
||||||
|
|
||||||
|
from .lsp_event import LspEvent
|
||||||
|
|
||||||
|
from .register_lsp_client_event import RegisterLspClientEvent
|
||||||
|
from .unregister_lsp_client_event import UnregisterLspClientEvent
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
# Python imports
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from libs.dto.code.events import CodeEvent
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class LspEvent(CodeEvent):
|
||||||
|
...
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
# Python imports
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from ....response_handlers.base_handler import BaseHandler
|
||||||
|
|
||||||
|
from .lsp_event import LspEvent
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class RegisterLspClientEvent(LspEvent):
|
||||||
|
lang_id: str = ""
|
||||||
|
lang_config: str = "{}"
|
||||||
|
handler: BaseHandler = None
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
# Python imports
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from .lsp_event import LspEvent
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class UnregisterLspClientEvent(LspEvent):
|
||||||
|
lang_id: str = ""
|
||||||
@@ -3,7 +3,13 @@
|
|||||||
# Lib imports
|
# Lib imports
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
from libs.dto.code.lsp.lsp_message_structs import LSPResponseTypes, LSPResponseRequest, LSPResponseNotification
|
from libs.controllers.controller_base import ControllerBase
|
||||||
|
from libs.event_factory import Event_Factory, Code_Event_Types
|
||||||
|
|
||||||
|
from .dto.code.events import \
|
||||||
|
RegisterLspClientEvent, UnregisterLspClientEvent
|
||||||
|
from .dto.code.lsp.lsp_message_structs import \
|
||||||
|
LSPResponseTypes, LSPResponseRequest, LSPResponseNotification
|
||||||
|
|
||||||
from .provider import Provider
|
from .provider import Provider
|
||||||
from .provider_response_cache import ProviderResponseCache
|
from .provider_response_cache import ProviderResponseCache
|
||||||
@@ -13,7 +19,7 @@ from .response_handlers.response_registry import ResponseRegistry
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
class LSPManager:
|
class LSPManager(ControllerBase):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(LSPManager, self).__init__()
|
super(LSPManager, self).__init__()
|
||||||
|
|
||||||
@@ -37,6 +43,20 @@ class LSPManager:
|
|||||||
self.response_cache.set_lsp_client(self.lsp_manager_client)
|
self.response_cache.set_lsp_client(self.lsp_manager_client)
|
||||||
self.provider.response_cache = self.response_cache
|
self.provider.response_cache = self.response_cache
|
||||||
|
|
||||||
|
def _controller_message(self, event: Code_Event_Types.CodeEvent):
|
||||||
|
if isinstance(event, RegisterLspClientEvent):
|
||||||
|
self.response_registry.register_handler(event.lang_id, event.handler)
|
||||||
|
self.lsp_manager_ui.add_client_listing(event.lang_id, event.lang_config)
|
||||||
|
elif isinstance(event, UnregisterLspClientEvent):
|
||||||
|
self.response_registry.unregister_handler(event.lang_id)
|
||||||
|
|
||||||
|
# if isinstance(event, Code_Event_Types.RegisterLspClientEvent):
|
||||||
|
# self.response_registry.register_handler(event.lang_id, event.handler)
|
||||||
|
# self.lsp_manager_ui.add_client_listing(event.lang_id, event.lang_config)
|
||||||
|
# elif isinstance(event, Code_Event_Types.UnregisterLspClientEvent):
|
||||||
|
# self.response_registry.unregister_handler(event.lang_id)
|
||||||
|
|
||||||
|
|
||||||
def _on_create_client(self, ui, lang_id: str, workspace_uri: str) -> bool:
|
def _on_create_client(self, ui, lang_id: str, workspace_uri: str) -> bool:
|
||||||
init_opts = ui.get_init_opts(lang_id)
|
init_opts = ui.get_init_opts(lang_id)
|
||||||
result = self.create_client(lang_id, workspace_uri, init_opts)
|
result = self.create_client(lang_id, workspace_uri, init_opts)
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
# Python imports
|
# Python imports
|
||||||
from os import path
|
|
||||||
import json
|
import json
|
||||||
|
|
||||||
# Lib imports
|
# Lib imports
|
||||||
@@ -25,12 +24,8 @@ class LSPManagerUI(Gtk.Dialog):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(LSPManagerUI, self).__init__()
|
super(LSPManagerUI, self).__init__()
|
||||||
|
|
||||||
self._SCRIPT_PTH: str = path.dirname( path.realpath(__file__) )
|
self.client_configs: dict[str, str] = {}
|
||||||
self._USER_HOME: str = path.expanduser('~')
|
|
||||||
self._LSP_SERVERS_CONFIG: str = ""
|
|
||||||
self.servers_config: dict = {}
|
|
||||||
|
|
||||||
self.parent = None
|
|
||||||
self.source_view = None
|
self.source_view = None
|
||||||
|
|
||||||
self._setup_styling()
|
self._setup_styling()
|
||||||
@@ -69,9 +64,10 @@ class LSPManagerUI(Gtk.Dialog):
|
|||||||
self.path_entry.set_can_focus(False)
|
self.path_entry.set_can_focus(False)
|
||||||
self.path_entry.set_placeholder_text("Workspace Folder...")
|
self.path_entry.set_placeholder_text("Workspace Folder...")
|
||||||
self.path_entry.connect("changed", self._path_changed, bttn_box)
|
self.path_entry.connect("changed", self._path_changed, bttn_box)
|
||||||
|
self.path_bttn.set_halign(Gtk.Align.FILL)
|
||||||
|
|
||||||
self.path_bttn.connect("file-set", self._file_set)
|
self.path_bttn.connect("file-set", self._file_set)
|
||||||
self.path_bttn.set_halign(Gtk.Align.FILL)
|
self.combo_box.connect("changed", self._on_combo_changed)
|
||||||
self.hide_bttn.connect("clicked", lambda widget: self.hide())
|
self.hide_bttn.connect("clicked", lambda widget: self.hide())
|
||||||
self.create_client_bttn.connect("clicked", self._create_client, self.close_client_bttn)
|
self.create_client_bttn.connect("clicked", self._create_client, self.close_client_bttn)
|
||||||
self.close_client_bttn.connect("clicked", self._close_client, self.create_client_bttn)
|
self.close_client_bttn.connect("clicked", self._close_client, self.create_client_bttn)
|
||||||
@@ -115,16 +111,56 @@ class LSPManagerUI(Gtk.Dialog):
|
|||||||
|
|
||||||
def _path_changed(self, widget, buttons_widget):
|
def _path_changed(self, widget, buttons_widget):
|
||||||
if not widget.get_text():
|
if not widget.get_text():
|
||||||
|
self.path_bttn.unselect_all()
|
||||||
|
self.path_bttn.emit("file-set")
|
||||||
buttons_widget.hide()
|
buttons_widget.hide()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
self.set_source_view_text( self.path_entry.get_text() )
|
||||||
buttons_widget.show()
|
buttons_widget.show()
|
||||||
|
|
||||||
def _file_set(self, widget):
|
def _file_set(self, widget):
|
||||||
self.path_entry.set_text(
|
fname = widget.get_filename()
|
||||||
widget.get_filename()
|
fname = "" if not fname else fname
|
||||||
|
self.path_entry.set_text(fname)
|
||||||
|
|
||||||
|
lang_id = self.combo_box.get_active_text()
|
||||||
|
if not lang_id or lang_id not in self.client_configs: return
|
||||||
|
|
||||||
|
self.set_source_view_text(
|
||||||
|
"{workspace.folder}" if not fname else fname
|
||||||
)
|
)
|
||||||
self.load_lsp_servers_config_placeholders()
|
|
||||||
|
def _create_client(self, widget, sibling):
|
||||||
|
if not self.source_view: return
|
||||||
|
|
||||||
|
buffer = self.source_view.get_buffer()
|
||||||
|
lang_id = self.combo_box.get_active_text()
|
||||||
|
|
||||||
|
if not lang_id: return
|
||||||
|
|
||||||
|
workspace_dir = self.path_entry.get_text()
|
||||||
|
self.emit('create-client', lang_id, workspace_dir)
|
||||||
|
|
||||||
|
def _close_client(self, widget, sibling):
|
||||||
|
lang_id = self.combo_box.get_active_text()
|
||||||
|
|
||||||
|
if not lang_id: return
|
||||||
|
self.emit('close-client', lang_id)
|
||||||
|
|
||||||
|
def _on_combo_changed(self, combo: Gtk.ComboBoxText):
|
||||||
|
lang_id = combo.get_active_text()
|
||||||
|
self.set_source_view_text( self.path_entry.get_text() )
|
||||||
|
|
||||||
|
|
||||||
|
def set_source_view_text(self, workspace_dir: str):
|
||||||
|
lang_id = self.combo_box.get_active_text()
|
||||||
|
if not lang_id: return
|
||||||
|
|
||||||
|
json_str = self.client_configs[lang_id].replace("{workspace.folder}", workspace_dir)
|
||||||
|
buffer = self.source_view.get_buffer()
|
||||||
|
|
||||||
|
buffer.set_text(json_str, -1)
|
||||||
|
|
||||||
def map_parent_resize_event(self, parent):
|
def map_parent_resize_event(self, parent):
|
||||||
parent.connect("size-allocate", lambda w, r: self._map_resize(self, parent))
|
parent.connect("size-allocate", lambda w, r: self._map_resize(self, parent))
|
||||||
@@ -147,68 +183,20 @@ class LSPManagerUI(Gtk.Dialog):
|
|||||||
|
|
||||||
scrolled_win.show_all()
|
scrolled_win.show_all()
|
||||||
|
|
||||||
def load_lsp_servers_config(self):
|
def add_client_listing(self, lang_id: str, lang_config: str):
|
||||||
try:
|
|
||||||
with open(f"{self._SCRIPT_PTH}/configs/lsp-servers-config.json") as file:
|
|
||||||
self._LSP_SERVERS_CONFIG = file.read()
|
|
||||||
except FileNotFoundError:
|
|
||||||
logger.error(f"Config file not found: {self._SCRIPT_PTH}/configs/lsp-servers-config.json")
|
|
||||||
|
|
||||||
def load_lsp_servers_config_placeholders(self):
|
|
||||||
if not self._LSP_SERVERS_CONFIG: return
|
|
||||||
if not self.source_view: return
|
|
||||||
|
|
||||||
data = self._LSP_SERVERS_CONFIG \
|
|
||||||
.replace("{user.home}", self._USER_HOME) \
|
|
||||||
.replace("{workspace.folder}", self.path_entry.get_text())
|
|
||||||
|
|
||||||
self.servers_config = json.loads(data)
|
|
||||||
|
|
||||||
buffer = self.source_view.get_buffer()
|
|
||||||
start_itr, \
|
|
||||||
end_itr = buffer.get_bounds()
|
|
||||||
|
|
||||||
buffer.delete(start_itr, end_itr)
|
|
||||||
buffer.insert(start_itr, data, -1)
|
|
||||||
|
|
||||||
self.set_language_combo_box( list(self.servers_config.keys()) )
|
|
||||||
|
|
||||||
def set_language_combo_box(self, lang_ids: list[str]):
|
|
||||||
self.combo_box.remove_all()
|
|
||||||
|
|
||||||
for lang_id in lang_ids:
|
|
||||||
self.combo_box.append_text(lang_id)
|
self.combo_box.append_text(lang_id)
|
||||||
|
self.client_configs[lang_id] = lang_config
|
||||||
|
|
||||||
def get_init_opts(self, lang_id: str) -> dict:
|
def get_init_opts(self, lang_id: str) -> dict:
|
||||||
buffer = self.source_view.get_buffer()
|
if not lang_id or lang_id not in self.client_configs: return {}
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.servers_config = json.loads(
|
lang_config = json.loads(self.client_configs[lang_id])
|
||||||
buffer.get_text( *buffer.get_bounds() )
|
|
||||||
)
|
|
||||||
except json.JSONDecodeError as e:
|
except json.JSONDecodeError as e:
|
||||||
logger.error(f"Invalid JSON: {e}")
|
logger.error(f"Invalid JSON for {lang_id}: {e}")
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
if not lang_id or not lang_id in self.servers_config: return {}
|
return lang_config.get("initialization-options", {})
|
||||||
|
|
||||||
return self.servers_config[lang_id].get("initialization-options", {})
|
|
||||||
|
|
||||||
def _create_client(self, widget, sibling):
|
|
||||||
if not self.source_view: return
|
|
||||||
|
|
||||||
buffer = self.source_view.get_buffer()
|
|
||||||
lang_id = self.combo_box.get_active_text()
|
|
||||||
|
|
||||||
if not lang_id: return
|
|
||||||
|
|
||||||
workspace_dir = self.path_entry.get_text()
|
|
||||||
self.emit('create-client', lang_id, workspace_dir)
|
|
||||||
|
|
||||||
def _close_client(self, widget, sibling):
|
|
||||||
lang_id = self.combo_box.get_active_text()
|
|
||||||
|
|
||||||
if not lang_id: return
|
|
||||||
self.emit('close-client', lang_id)
|
|
||||||
|
|
||||||
def toggle_client_buttons(self, show_close: bool):
|
def toggle_client_buttons(self, show_close: bool):
|
||||||
self.create_client_bttn.set_visible(not show_close)
|
self.create_client_bttn.set_visible(not show_close)
|
||||||
@@ -3,5 +3,6 @@
|
|||||||
"author": "ITDominator",
|
"author": "ITDominator",
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"support": "",
|
"support": "",
|
||||||
|
"pre_launch": true,
|
||||||
"requests": {}
|
"requests": {}
|
||||||
}
|
}
|
||||||
@@ -11,6 +11,7 @@ from libs.dto.states import SourceViewStates
|
|||||||
|
|
||||||
from plugins.plugin_types import PluginCode
|
from plugins.plugin_types import PluginCode
|
||||||
|
|
||||||
|
from .dto.code import events as lsp_events
|
||||||
from .lsp_manager import LSPManager
|
from .lsp_manager import LSPManager
|
||||||
|
|
||||||
|
|
||||||
@@ -28,6 +29,10 @@ class Plugin(PluginCode):
|
|||||||
...
|
...
|
||||||
|
|
||||||
def load(self):
|
def load(self):
|
||||||
|
Event_Factory.register_events( lsp_events.__dict__.items() )
|
||||||
|
|
||||||
|
self.register_controller("lsp_manager", lsp_manager)
|
||||||
|
|
||||||
window = self.request_ui_element("main-window")
|
window = self.request_ui_element("main-window")
|
||||||
|
|
||||||
lsp_manager.lsp_manager_ui.map_parent_resize_event(window)
|
lsp_manager.lsp_manager_ui.map_parent_resize_event(window)
|
||||||
@@ -55,11 +60,11 @@ class Plugin(PluginCode):
|
|||||||
self.emit_to("source_views", event)
|
self.emit_to("source_views", event)
|
||||||
|
|
||||||
source_view = event.response
|
source_view = event.response
|
||||||
lsp_manager.lsp_manager_ui.load_lsp_servers_config()
|
|
||||||
lsp_manager.lsp_manager_ui.set_source_view(source_view)
|
lsp_manager.lsp_manager_ui.set_source_view(source_view)
|
||||||
lsp_manager.lsp_manager_ui.load_lsp_servers_config_placeholders()
|
|
||||||
|
|
||||||
lsp_manager.response_registry.set_event_hub(self.emit, self.emit_to, lsp_manager.provider)
|
lsp_manager.response_registry.set_event_hub(
|
||||||
|
self.emit, self.emit_to, lsp_manager.provider
|
||||||
|
)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
...
|
...
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
from .base_handler import BaseHandler
|
||||||
|
from .default import DefaultHandler
|
||||||
|
from .response_registry import ResponseRegistry
|
||||||
@@ -8,7 +8,7 @@ from gi.repository import GLib
|
|||||||
# Application imports
|
# Application imports
|
||||||
from libs.event_factory import Event_Factory, Code_Event_Types
|
from libs.event_factory import Event_Factory, Code_Event_Types
|
||||||
|
|
||||||
from .base import BaseHandler
|
from .base_handler import BaseHandler
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -3,10 +3,8 @@
|
|||||||
# Lib imports
|
# Lib imports
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
from .base import BaseHandler
|
from .base_handler import BaseHandler
|
||||||
from .default import DefaultHandler
|
from .default import DefaultHandler
|
||||||
from .python import PythonHandler
|
|
||||||
from .java import JavaHandler
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -15,12 +13,11 @@ class ResponseRegistry:
|
|||||||
|
|
||||||
self._instances: dict = {}
|
self._instances: dict = {}
|
||||||
self._lang_handlers: dict = {
|
self._lang_handlers: dict = {
|
||||||
"default": DefaultHandler,
|
"default": DefaultHandler
|
||||||
"python": PythonHandler,
|
|
||||||
"java": JavaHandler,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def set_event_hub(self, emit, emit_to, provider=None):
|
|
||||||
|
def set_event_hub(self, emit, emit_to, provider = None):
|
||||||
self.emit = emit
|
self.emit = emit
|
||||||
self.emit_to = emit_to
|
self.emit_to = emit_to
|
||||||
self._provider = provider
|
self._provider = provider
|
||||||
@@ -36,6 +33,9 @@ class ResponseRegistry:
|
|||||||
def register_handler(self, lang_id: str, handler_cls: type[BaseHandler]):
|
def register_handler(self, lang_id: str, handler_cls: type[BaseHandler]):
|
||||||
self._lang_handlers[lang_id] = handler_cls
|
self._lang_handlers[lang_id] = handler_cls
|
||||||
|
|
||||||
|
def unregister_handler(self, lang_id: str, handler_cls: type[BaseHandler]):
|
||||||
|
del self._lang_handlers[lang_id]
|
||||||
|
|
||||||
def get_handler(self, lang_id: str = "", method: str = ""):
|
def get_handler(self, lang_id: str = "", method: str = ""):
|
||||||
handler_cls = self._lang_handlers.get(
|
handler_cls = self._lang_handlers.get(
|
||||||
lang_id, self._lang_handlers.get("default", DefaultHandler)
|
lang_id, self._lang_handlers.get("default", DefaultHandler)
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
"""
|
||||||
|
Pligin Module
|
||||||
|
"""
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
"""
|
||||||
|
Pligin Package
|
||||||
|
"""
|
||||||
@@ -0,0 +1,100 @@
|
|||||||
|
{
|
||||||
|
"info": "https://github.com/python-lsp/python-lsp-server",
|
||||||
|
"command": "lsp-ws-proxy -- pylsp",
|
||||||
|
"alt-command": "pylsp",
|
||||||
|
"alt-command2": "lsp-ws-proxy --listen 4114 -- pylsp",
|
||||||
|
"alt-command3": "pylsp --ws --port 4114",
|
||||||
|
"socket": "ws://127.0.0.1:9999/python",
|
||||||
|
"socket-two": "ws://127.0.0.1:9999/?name=pylsp",
|
||||||
|
"initialization-options": {
|
||||||
|
"pylsp": {
|
||||||
|
"rope": {
|
||||||
|
"ropeFolder": "{user.home}/.config/newton/lsps/ropeproject"
|
||||||
|
},
|
||||||
|
"plugins": {
|
||||||
|
"ruff": {
|
||||||
|
"enabled": true,
|
||||||
|
"extendSelect": ["I"],
|
||||||
|
"lineLength": 80
|
||||||
|
},
|
||||||
|
"pycodestyle": {
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"pyflakes": {
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"pylint": {
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
"mccabe": {
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"pylsp_rope": {
|
||||||
|
"rename": false
|
||||||
|
},
|
||||||
|
"rope_rename": {
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"rope_autoimport": {
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
"rope_completion": {
|
||||||
|
"enabled": false,
|
||||||
|
"eager": false
|
||||||
|
},
|
||||||
|
"jedi_rename": {
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
"jedi_completion": {
|
||||||
|
"enabled": true,
|
||||||
|
"include_class_objects": true,
|
||||||
|
"include_function_objects": true,
|
||||||
|
"fuzzy": false
|
||||||
|
},
|
||||||
|
"jedi": {
|
||||||
|
"root_dir": "file://{workspace.folder}",
|
||||||
|
"extra_paths": [
|
||||||
|
"{user.home}/Portable_Apps/py-venvs/pylsp-venv/venv/lib/python3.10/site-packages"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"python - jedi-language-server": {
|
||||||
|
"hidden": true,
|
||||||
|
"info": "https://pypi.org/project/jedi-language-server/",
|
||||||
|
"command": "jedi-language-server",
|
||||||
|
"alt-command": "lsp-ws-proxy --listen 3030 -- jedi-language-server",
|
||||||
|
"socket": "ws://127.0.0.1:9999/python",
|
||||||
|
"socket-two": "ws://127.0.0.1:9999/?name=jedi-language-server",
|
||||||
|
"initialization-options": {
|
||||||
|
"jediSettings": {
|
||||||
|
"autoImportModules": [],
|
||||||
|
"caseInsensitiveCompletion": true,
|
||||||
|
"debug": false
|
||||||
|
},
|
||||||
|
"completion": {
|
||||||
|
"disableSnippets": false,
|
||||||
|
"resolveEagerly": false,
|
||||||
|
"ignorePatterns": []
|
||||||
|
},
|
||||||
|
"markupKindPreferred": "markdown",
|
||||||
|
"workspace": {
|
||||||
|
"extraPaths": [
|
||||||
|
"{user.home}/Portable_Apps/py-venvs/pylsp-venv/venv/lib/python3.10/site-packages"
|
||||||
|
],
|
||||||
|
"environmentPath": "{user.home}/Portable_Apps/py-venvs/gtk-apps-venv/venv/bin/python",
|
||||||
|
"symbols": {
|
||||||
|
"ignoreFolders": [
|
||||||
|
".nox",
|
||||||
|
".tox",
|
||||||
|
".venv",
|
||||||
|
"__pycache__",
|
||||||
|
"venv"
|
||||||
|
],
|
||||||
|
"maxSymbols": 20
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"name": "Python LSP Client",
|
||||||
|
"author": "ITDominator",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"support": "",
|
||||||
|
"requests": {}
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
# Python imports
|
||||||
|
from os import path
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
import gi
|
||||||
|
|
||||||
|
from gi.repository import GLib
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from libs.event_factory import Event_Factory, Code_Event_Types
|
||||||
|
|
||||||
|
from plugins.plugin_types import PluginCode
|
||||||
|
|
||||||
|
from .response_handler import PythonHandler
|
||||||
|
|
||||||
|
|
||||||
|
class Plugin(PluginCode):
|
||||||
|
def __init__(self):
|
||||||
|
super(Plugin, self).__init__()
|
||||||
|
|
||||||
|
|
||||||
|
def _controller_message(self, event: Code_Event_Types.CodeEvent):
|
||||||
|
...
|
||||||
|
|
||||||
|
def load(self):
|
||||||
|
dirPth = path.dirname( path.realpath(__file__) )
|
||||||
|
with open(f"{dirPth}/config/lsp-server-config.json", "r") as f:
|
||||||
|
config = f.read()
|
||||||
|
event = Event_Factory.create_event("register_lsp_client",
|
||||||
|
lang_id = "python",
|
||||||
|
lang_config = config,
|
||||||
|
handler = PythonHandler
|
||||||
|
)
|
||||||
|
self.emit_to("lsp_manager", event)
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
...
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
from .python import PythonHandler
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
# Lib imports
|
# Lib imports
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
from .default import DefaultHandler
|
from lsp_manager.response_handlers.default import DefaultHandler
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
from .base import BaseHandler
|
|
||||||
from .default import DefaultHandler
|
|
||||||
from .python import PythonHandler
|
|
||||||
from .java import JavaHandler
|
|
||||||
from .response_registry import ResponseRegistry
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
"""
|
"""
|
||||||
Libs Code DTO(s) Code Package
|
Libs Code DTO(s) Events Package
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,15 @@ class EventFactory(Singleton):
|
|||||||
def register_event(self, event_type: str, event_class: Type[BaseEvent]):
|
def register_event(self, event_type: str, event_class: Type[BaseEvent]):
|
||||||
self._event_classes[event_type] = event_class
|
self._event_classes[event_type] = event_class
|
||||||
|
|
||||||
|
def register_events(self, events: dict):
|
||||||
|
for name, obj in events:
|
||||||
|
if not self._is_valid_event_class(obj): continue
|
||||||
|
|
||||||
|
event_type = self._class_name_to_event_type(name)
|
||||||
|
self.register_event(event_type, obj)
|
||||||
|
|
||||||
|
logger.debug(f"Registered {len(events)} event types:")
|
||||||
|
|
||||||
def create_event(self, event_type: str, **kwargs) -> BaseEvent:
|
def create_event(self, event_type: str, **kwargs) -> BaseEvent:
|
||||||
if event_type not in self._event_classes:
|
if event_type not in self._event_classes:
|
||||||
raise ValueError(f"Unknown event type: {event_type}")
|
raise ValueError(f"Unknown event type: {event_type}")
|
||||||
@@ -38,14 +47,9 @@ class EventFactory(Singleton):
|
|||||||
|
|
||||||
return event
|
return event
|
||||||
|
|
||||||
|
|
||||||
def _auto_register_events(self, events: dict):
|
def _auto_register_events(self, events: dict):
|
||||||
for name, obj in events:
|
self.register_events(events)
|
||||||
if not self._is_valid_event_class(obj): continue
|
|
||||||
|
|
||||||
event_type = self._class_name_to_event_type(name)
|
|
||||||
self.register_event(event_type, obj)
|
|
||||||
|
|
||||||
logger.debug(f"Auto-registered {len(self._event_classes)} event types")
|
|
||||||
|
|
||||||
def _is_valid_event_class(self, obj) -> bool:
|
def _is_valid_event_class(self, obj) -> bool:
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -6,6 +6,8 @@
|
|||||||
# set -o errexit ## To exit on error
|
# set -o errexit ## To exit on error
|
||||||
# set -o errunset ## To exit if a variable is referenced but not set
|
# set -o errunset ## To exit if a variable is referenced but not set
|
||||||
|
|
||||||
|
export PYTHONDONTWRITEBYTECODE=1
|
||||||
|
|
||||||
|
|
||||||
function main() {
|
function main() {
|
||||||
call_path=`pwd`
|
call_path=`pwd`
|
||||||
|
|||||||
Reference in New Issue
Block a user