2025-05-30 05:30:54 +00:00
|
|
|
import { Injectable } from '@angular/core';
|
|
|
|
import { BehaviorSubject, ReplaySubject, Observable } from 'rxjs';
|
|
|
|
|
|
|
|
import { AceLanguageClient, LanguageClientConfig } from 'ace-linters/build/ace-language-client';
|
|
|
|
import { LanguageProvider } from "ace-linters";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Injectable({
|
|
|
|
providedIn: 'root'
|
|
|
|
})
|
|
|
|
export class LSPService {
|
|
|
|
lspConfigData!: {};
|
2025-05-30 06:45:26 +00:00
|
|
|
languageProviders: {} = {};
|
2025-05-30 05:30:54 +00:00
|
|
|
|
|
|
|
constructor() {
|
|
|
|
this.loadLSPService();
|
|
|
|
}
|
|
|
|
|
|
|
|
private loadLSPService() {
|
|
|
|
this.getLspConfigData().then((lspConfigData: string) => {
|
|
|
|
this.lspConfigData = JSON.parse(lspConfigData);
|
|
|
|
|
|
|
|
if (this.lspConfigData["message"]) {
|
|
|
|
console.log(
|
|
|
|
"Warning: LSP this.lspConfigData is a 'message'",
|
|
|
|
this.lspConfigData
|
|
|
|
);
|
|
|
|
|
|
|
|
this.lspConfigData = {};
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
public registerEditor(editor: any): void {
|
2025-05-30 06:45:26 +00:00
|
|
|
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);
|
2025-05-30 05:30:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
private getLspConfigData(): Promise<string> {
|
|
|
|
return window.fs.getLspConfigData();
|
|
|
|
}
|
|
|
|
|
2025-05-30 06:45:26 +00:00
|
|
|
private getLanguageProviderWithClientServer(mode: string) {
|
2025-05-30 05:30:54 +00:00
|
|
|
let _initializationOptions = {};
|
|
|
|
|
2025-06-01 05:49:30 +00:00
|
|
|
if ( Object.keys(this.lspConfigData).length !== 0 && this.lspConfigData[mode] ) {
|
2025-05-30 06:45:26 +00:00
|
|
|
_initializationOptions = this.lspConfigData[mode]["initialization-options"];
|
2025-05-30 05:30:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
let servers: LanguageClientConfig[] = [
|
|
|
|
{
|
|
|
|
module: () => import("ace-linters/build/language-client"),
|
2025-05-30 06:45:26 +00:00
|
|
|
modes: mode,
|
2025-05-30 05:30:54 +00:00
|
|
|
type: "socket",
|
2025-05-30 06:45:26 +00:00
|
|
|
socket: new WebSocket(`ws://127.0.0.1:9999/${mode}`),
|
|
|
|
// socket: new WebSocket("ws://127.0.0.1:9999/?name=pylsp"),
|
2025-05-30 05:30:54 +00:00
|
|
|
initializationOptions: _initializationOptions
|
|
|
|
}
|
|
|
|
];
|
|
|
|
|
|
|
|
return AceLanguageClient.for(servers);
|
|
|
|
}
|
2025-05-30 06:45:26 +00:00
|
|
|
|
2025-05-30 05:30:54 +00:00
|
|
|
private getLanguageProviderWithWebWorker() {
|
|
|
|
let worker = new Worker(new URL('./webworker.js', import.meta.url));
|
|
|
|
return LanguageProvider.create(worker);
|
|
|
|
}
|
|
|
|
}
|