From 7b08922d2012a2bc002eb19b36f5ab602cff0ea5 Mon Sep 17 00:00:00 2001 From: itdominator <1itdominator@gmail.com> Date: Fri, 30 May 2025 01:45:26 -0500 Subject: [PATCH] updating LSP service to load language servers dynamically --- src/app/common/services/lsp.service.ts | 32 ++++++++++++---------- src/app/editor/ace/ace-editor.component.ts | 8 +++++- src/app/editor/editors.component.ts | 2 +- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/app/common/services/lsp.service.ts b/src/app/common/services/lsp.service.ts index 6e159c7..8e3fe27 100644 --- a/src/app/common/services/lsp.service.ts +++ b/src/app/common/services/lsp.service.ts @@ -11,7 +11,7 @@ import { LanguageProvider } from "ace-linters"; }) export class LSPService { lspConfigData!: {}; - languageProvider!: any; + languageProviders: {} = {}; constructor() { this.loadLSPService(); @@ -29,47 +29,49 @@ export class LSPService { this.lspConfigData = {}; } - }).then(() => { - this.loadLanguageProviders(); }); } public registerEditor(editor: any): void { - this.languageProvider.registerEditor(editor); + let modeParts = editor.getSession()["$modeId"].split("/"); + let mode = modeParts[ modeParts.length - 1]; + + if ( !this.languageProviders[mode] ) { + this.languageProviders[mode] = this.getLanguageProviderWithClientServer(mode); + } + + this.languageProviders[mode].registerEditor(editor); } private getLspConfigData(): Promise { return window.fs.getLspConfigData(); } - private loadLanguageProviders(): void { - this.languageProvider = this.getLanguageProviderWithClientServers(); -// this.languageProvider = this.getLanguageProviderWithWebWorker(); + private getLanguageProviderWithClientServers() { + this.getLanguageProviderWithClientServer("python"); } - private getLanguageProviderWithClientServers() { + private getLanguageProviderWithClientServer(mode: string) { let _initializationOptions = {}; if (Object.keys(this.lspConfigData).length !== 0) { -// _initializationOptions = this.lspConfigData[ this.editor.session.getMode() ]["initialization-options"]; - _initializationOptions = this.lspConfigData[ "python" ]["initialization-options"]; + _initializationOptions = this.lspConfigData[ mode ]["initialization-options"]; } let servers: LanguageClientConfig[] = [ { module: () => import("ace-linters/build/language-client"), - modes: "python", + modes: mode, type: "socket", - socket: new WebSocket("ws://127.0.0.1:9999/python"), -// socket: new WebSocket("ws://127.0.0.1:9999/?name=pylsp"), + socket: new WebSocket(`ws://127.0.0.1:9999/${mode}`), + // socket: new WebSocket("ws://127.0.0.1:9999/?name=pylsp"), initializationOptions: _initializationOptions } ]; return AceLanguageClient.for(servers); } - - + private getLanguageProviderWithWebWorker() { let worker = new Worker(new URL('./webworker.js', import.meta.url)); return LanguageProvider.create(worker); diff --git a/src/app/editor/ace/ace-editor.component.ts b/src/app/editor/ace/ace-editor.component.ts index 9cb7630..515c01a 100644 --- a/src/app/editor/ace/ace-editor.component.ts +++ b/src/app/editor/ace/ace-editor.component.ts @@ -49,13 +49,19 @@ export class AceEditorComponent { this.editor.setOptions( this.editorSettings.CONFIG ); // this.editor.commands.addCommands( this.editorSettings.KEYBINDINGS ); + // Note: https://github.com/mkslanc/ace-linters/blob/c286d85c558530aa1b0597d02108bc782abd4736/packages/ace-linters/src/language-provider.ts#L277 + // found on focus ^ might have other signals we can watch like session being set, etc. this.editor.on("focus", () => { this.editorsService.setActiveEditor(this.uuid); }); +// this.editor.on("changeSession", (session) => { +// console.log(session); +// console.log(session.session["$modeId"]); +// }); } - public registerEditorToLSP() { + public registerEditorToLSPMode() { this.lspService.registerEditor(this.editor); } diff --git a/src/app/editor/editors.component.ts b/src/app/editor/editors.component.ts index f3b56db..21ba6c7 100644 --- a/src/app/editor/editors.component.ts +++ b/src/app/editor/editors.component.ts @@ -86,7 +86,7 @@ export class EditorsComponent { let editorComponent = this.editors.get(this.activeEditor)?.instance; let editor = editorComponent.editor; editor?.setSession(session); - // editorComponent.registerEditorToLSP(); + editorComponent.registerEditorToLSPMode(); }); }