mirror of
https://github.com/massbug/judge4c.git
synced 2025-05-18 07:16:34 +00:00
refactor(language-server): replace EditorLanguageMetadata with EditorLanguageConfig and LanguageServerConfig for better type safety
This commit is contained in:
parent
31c5d86f2c
commit
acfeee5a26
@ -1,24 +1,31 @@
|
|||||||
import normalizeUrl from "normalize-url";
|
import normalizeUrl from "normalize-url";
|
||||||
import type { MessageTransports } from "vscode-languageclient";
|
import type { MessageTransports } from "vscode-languageclient";
|
||||||
import { EditorLanguageMetadata } from "@/types/editor-language";
|
|
||||||
import type { MonacoLanguageClient } from "monaco-languageclient";
|
import type { MonacoLanguageClient } from "monaco-languageclient";
|
||||||
|
import { EditorLanguageConfig, LanguageServerConfig } from "@prisma/client";
|
||||||
import { toSocket, WebSocketMessageReader, WebSocketMessageWriter } from "vscode-ws-jsonrpc";
|
import { toSocket, WebSocketMessageReader, WebSocketMessageWriter } from "vscode-ws-jsonrpc";
|
||||||
|
|
||||||
// Create the WebSocket URL based on the protocol and port
|
// Create the WebSocket URL based on the protocol and port
|
||||||
function createUrl(protocol: string, hostname: string, port: number | null, path: string | null): string {
|
function createUrl(languageServerConfig: LanguageServerConfig): string {
|
||||||
return normalizeUrl(`${protocol}://${hostname}${port ? `:${port}` : ""}${path || ""}`);
|
return normalizeUrl(
|
||||||
|
`${languageServerConfig.protocol}://${languageServerConfig.hostname}${
|
||||||
|
languageServerConfig.port ? `:${languageServerConfig.port}` : ""
|
||||||
|
}${languageServerConfig.path || ""}`
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the language client with the given transports
|
// Create the language client with the given transports
|
||||||
async function createLanguageClient(transports: MessageTransports, lang: EditorLanguageMetadata): Promise<MonacoLanguageClient> {
|
async function createLanguageClient(
|
||||||
|
transports: MessageTransports,
|
||||||
|
editorLanguageConfig: EditorLanguageConfig
|
||||||
|
): Promise<MonacoLanguageClient> {
|
||||||
const { MonacoLanguageClient } = await import("monaco-languageclient");
|
const { MonacoLanguageClient } = await import("monaco-languageclient");
|
||||||
const { CloseAction, ErrorAction } = await import("vscode-languageclient");
|
const { CloseAction, ErrorAction } = await import("vscode-languageclient");
|
||||||
|
|
||||||
return new MonacoLanguageClient({
|
return new MonacoLanguageClient({
|
||||||
name: `${lang.label} Language Client`,
|
name: `${editorLanguageConfig.label} Language Client`,
|
||||||
clientOptions: {
|
clientOptions: {
|
||||||
// use a language id as a document selector
|
// use a language id as a document selector
|
||||||
documentSelector: [lang.id],
|
documentSelector: [editorLanguageConfig.language],
|
||||||
// disable the default error handler
|
// disable the default error handler
|
||||||
errorHandler: {
|
errorHandler: {
|
||||||
error: () => ({ action: ErrorAction.Continue }),
|
error: () => ({ action: ErrorAction.Continue }),
|
||||||
@ -29,14 +36,17 @@ async function createLanguageClient(transports: MessageTransports, lang: EditorL
|
|||||||
connectionProvider: {
|
connectionProvider: {
|
||||||
get: () => {
|
get: () => {
|
||||||
return Promise.resolve(transports);
|
return Promise.resolve(transports);
|
||||||
}
|
},
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Connect to the WebSocket and create the language client
|
// Connect to the WebSocket and create the language client
|
||||||
export function connectToLanguageServer(protocol: string, hostname: string, port: number | null, path: string | null, lang: EditorLanguageMetadata): Promise<MonacoLanguageClient> {
|
export function connectToLanguageServer(
|
||||||
const url = createUrl(protocol, hostname, port, path);
|
editorLanguageConfig: EditorLanguageConfig,
|
||||||
|
languageServerConfig: LanguageServerConfig
|
||||||
|
): Promise<MonacoLanguageClient> {
|
||||||
|
const url = createUrl(languageServerConfig);
|
||||||
const webSocket = new WebSocket(url);
|
const webSocket = new WebSocket(url);
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
@ -47,7 +57,7 @@ export function connectToLanguageServer(protocol: string, hostname: string, port
|
|||||||
const writer = new WebSocketMessageWriter(socket);
|
const writer = new WebSocketMessageWriter(socket);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const languageClient = await createLanguageClient({ reader, writer }, lang);
|
const languageClient = await createLanguageClient({ reader, writer }, editorLanguageConfig);
|
||||||
// Start the language client
|
// Start the language client
|
||||||
languageClient.start();
|
languageClient.start();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user