refactoring LSP to its own service
This commit is contained in:
@@ -4,19 +4,30 @@ import { BehaviorSubject, ReplaySubject, Observable } from 'rxjs';
|
||||
import { ServiceMessage } from '../../types/service-message.type';
|
||||
|
||||
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class EditorsService {
|
||||
private dataSubject: ReplaySubject<ServiceMessage> = new ReplaySubject<ServiceMessage>(1);
|
||||
private messageSubject: ReplaySubject<ServiceMessage> = new ReplaySubject<ServiceMessage>(1);
|
||||
private activationSubject: ReplaySubject<string> = new ReplaySubject<string>(1);
|
||||
|
||||
constructor() {}
|
||||
|
||||
setData(data: ServiceMessage): void {
|
||||
this.dataSubject.next(data);
|
||||
this.messageSubject.next(data);
|
||||
}
|
||||
|
||||
getData$(): Observable<ServiceMessage> {
|
||||
return this.dataSubject.asObservable();
|
||||
return this.messageSubject.asObservable();
|
||||
}
|
||||
|
||||
setActiveEditor(data: string): void {
|
||||
this.activationSubject.next(data);
|
||||
}
|
||||
|
||||
newActiveEditor$(): Observable<string> {
|
||||
return this.activationSubject.asObservable();
|
||||
}
|
||||
|
||||
}
|
77
src/app/common/services/lsp.service.ts
Normal file
77
src/app/common/services/lsp.service.ts
Normal file
@@ -0,0 +1,77 @@
|
||||
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!: {};
|
||||
languageProvider!: any;
|
||||
|
||||
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 = {};
|
||||
}
|
||||
}).then(() => {
|
||||
this.loadLanguageProviders();
|
||||
});
|
||||
}
|
||||
|
||||
public registerEditor(editor: any): void {
|
||||
this.languageProvider.registerEditor(editor);
|
||||
}
|
||||
|
||||
private getLspConfigData(): Promise<string> {
|
||||
return window.fs.getLspConfigData();
|
||||
}
|
||||
|
||||
private loadLanguageProviders(): void {
|
||||
this.languageProvider = this.getLanguageProviderWithClientServers();
|
||||
// this.languageProvider = this.getLanguageProviderWithWebWorker();
|
||||
}
|
||||
|
||||
private getLanguageProviderWithClientServers() {
|
||||
let _initializationOptions = {};
|
||||
|
||||
if (Object.keys(this.lspConfigData).length !== 0) {
|
||||
// _initializationOptions = this.lspConfigData[ this.editor.session.getMode() ]["initialization-options"];
|
||||
_initializationOptions = this.lspConfigData[ "python" ]["initialization-options"];
|
||||
}
|
||||
|
||||
let servers: LanguageClientConfig[] = [
|
||||
{
|
||||
module: () => import("ace-linters/build/language-client"),
|
||||
modes: "python",
|
||||
type: "socket",
|
||||
socket: new WebSocket("ws://127.0.0.1:9999/python"),
|
||||
// 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);
|
||||
}
|
||||
}
|
165
src/app/common/services/webworker.ts
Normal file
165
src/app/common/services/webworker.ts
Normal file
@@ -0,0 +1,165 @@
|
||||
import { ServiceManager } from "ace-linters/build/service-manager";
|
||||
|
||||
let manager = new ServiceManager(self);
|
||||
|
||||
manager.registerService("html", {
|
||||
features: {signatureHelp: false},
|
||||
module: () => import("ace-linters/build/html-service"),
|
||||
className: "HtmlService",
|
||||
modes: "html"
|
||||
});
|
||||
|
||||
manager.registerService("css", {
|
||||
features: {signatureHelp: false},
|
||||
module: () => import("ace-linters/build/css-service"),
|
||||
className: "CssService",
|
||||
modes: "css"
|
||||
});
|
||||
|
||||
manager.registerService("less", {
|
||||
features: {signatureHelp: false},
|
||||
module: () => import("ace-linters/build/css-service"),
|
||||
className: "CssService",
|
||||
modes: "less"
|
||||
});
|
||||
|
||||
manager.registerService("scss", {
|
||||
features: {signatureHelp: false},
|
||||
module: () => import("ace-linters/build/css-service"),
|
||||
className: "CssService",
|
||||
modes: "scss"
|
||||
});
|
||||
|
||||
manager.registerService("json", {
|
||||
features: {signatureHelp: false, documentHighlight: false},
|
||||
module: () => import("ace-linters/build/json-service"),
|
||||
className: "JsonService",
|
||||
modes: "json",
|
||||
});
|
||||
|
||||
manager.registerService("json5", {
|
||||
features: {signatureHelp: false, documentHighlight: false},
|
||||
module: () => import("ace-linters/build/json-service"),
|
||||
className: "JsonService",
|
||||
modes: "json5",
|
||||
});
|
||||
|
||||
manager.registerService("typescript", {
|
||||
module: () => import("ace-linters/build/typescript-service"),
|
||||
className: "TypescriptService",
|
||||
modes: "typescript|tsx|javascript|jsx",
|
||||
});
|
||||
|
||||
manager.registerService("yaml", {
|
||||
features: {signatureHelp: false, documentHighlight: false},
|
||||
module: () => import("ace-linters/build/yaml-service"),
|
||||
className: "YamlService",
|
||||
modes: "yaml",
|
||||
});
|
||||
|
||||
manager.registerService("xml", {
|
||||
features: {completion: false, completionResolve: false, diagnostics: true, format: false, hover: false, documentHighlight: false, signatureHelp: false},
|
||||
module: () => import("ace-linters/build/xml-service"),
|
||||
className: "XmlService",
|
||||
modes: "xml",
|
||||
});
|
||||
|
||||
manager.registerService("php", {
|
||||
features: {completion: false, completionResolve: false, diagnostics: true, format: false, hover: false, documentHighlight: false, signatureHelp: false},
|
||||
module: () => import("ace-linters/build/php-service"),
|
||||
className: "PhpService",
|
||||
modes: "php"
|
||||
});
|
||||
|
||||
manager.registerService("javascript", {
|
||||
features: {completion: false, completionResolve: false, diagnostics: true, format: false, hover: false, documentHighlight: false, signatureHelp: false},
|
||||
module: () => import("ace-linters/build/javascript-service"),
|
||||
className: "JavascriptService",
|
||||
modes: "javascript",
|
||||
});
|
||||
|
||||
|
||||
manager.registerServer("pythonls", {
|
||||
module: () => import("ace-linters/build/language-client"),
|
||||
modes: "python",
|
||||
type: "socket",
|
||||
socket: new WebSocket("ws://127.0.0.1:9999/?name=pylsp")
|
||||
});
|
||||
|
||||
|
||||
|
||||
/*
|
||||
|
||||
|
||||
manager.registerService("clang", {
|
||||
module: () => import("ace-clang-linter/build/ace-clang-linter"),
|
||||
className: "AceClangLinter",
|
||||
modes: "c_cpp",
|
||||
});
|
||||
|
||||
manager.registerService("lua", {
|
||||
features: {completion: false, completionResolve: false, diagnostics: true, format: true, hover: false, documentHighlight: false, signatureHelp: false},
|
||||
module: () => import("ace-lua-linter/build/ace-lua-linter"),
|
||||
className: "AceLuaLinter",
|
||||
modes: "lua",
|
||||
});
|
||||
|
||||
manager.registerService("mysql", {
|
||||
module: () => import("ace-sql-linter/build/mysql-service"),
|
||||
className: "MySQLService",
|
||||
modes: "mysql",
|
||||
});
|
||||
|
||||
manager.registerService("zig", {
|
||||
module: () => import("ace-zig-linter/build/ace-zig-linter"),
|
||||
className: "AceZigLinter",
|
||||
modes: "zig",
|
||||
});
|
||||
|
||||
manager.registerService("python", {
|
||||
features: {completion: false, completionResolve: false, diagnostics: true, format: true, hover: false, documentHighlight: false, signatureHelp: false},
|
||||
module: () => import("ace-python-ruff-linter/build/python-service"),
|
||||
className: "PythonService",
|
||||
modes: "python",
|
||||
});
|
||||
|
||||
manager.registerServer("svelte", {
|
||||
module: () => import("ace-linters/build/language-client"),
|
||||
modes: "html",
|
||||
type: "socket",
|
||||
socket: new WebSocket("ws://127.0.0.1:3030/svelte")
|
||||
});
|
||||
|
||||
manager.registerServer("astro", {
|
||||
module: () => import("ace-linters/build/language-client"),
|
||||
modes: "astro",
|
||||
type: "socket",
|
||||
socket: new WebSocket("ws://127.0.0.1:3030/astro"),
|
||||
initializationOptions: {
|
||||
typescript: {
|
||||
tsdk: "node_modules/typescript/lib", //path to typescript server
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
manager.registerServer("go", {
|
||||
module: () => import("ace-linters/build/language-client"),
|
||||
modes: "golang",
|
||||
type: "socket",
|
||||
socket: new WebSocket("ws://127.0.0.1:3030/go")
|
||||
});
|
||||
|
||||
manager.registerService("dart", {
|
||||
module: () => import("ace-dart-linter/build/ace-dart-linter"),
|
||||
className: "AceDartLinter",
|
||||
modes: "dart",
|
||||
});
|
||||
|
||||
manager.registerService("golang", {
|
||||
module: () => import("ace-go-linter/build/ace-go-linter"),
|
||||
className: "AceGoLinter",
|
||||
modes: "go",
|
||||
});
|
||||
|
||||
|
||||
*/
|
Reference in New Issue
Block a user