-
Hi, I'm trying to get basic csharp language server api working using your GettingStarted. It is a little outdated, but almost working. Here is what I've got so far: import "@codingame/monaco-vscode-csharp-default-extension";
import "@codingame/monaco-vscode-theme-defaults-default-extension";
import * as monaco from 'monaco-editor';
import "vscode/localExtensionHost";
import { initialize } from '@codingame/monaco-vscode-api'
import { initWebSocketAndStartClient } from "./lsp-client";
import getTextMateServiceOverride from "@codingame/monaco-vscode-textmate-service-override";
import getThemeServiceOverride from "@codingame/monaco-vscode-theme-service-override";
import getLanguagesServiceOverride from "@codingame/monaco-vscode-languages-service-override";
import getConfigurationServiceOverride, {
updateUserConfiguration
} from '@codingame/monaco-vscode-configuration-service-override';
// this I had to add or textmate is not loading
import "vscode-textmate";
import "vscode-oniguruma";
export type WorkerLoader = () => Worker;
const workerLoaders: Partial<Record<string, WorkerLoader>> = {
TextEditorWorker: () => new Worker(new URL('monaco-editor/esm/vs/editor/editor.worker.js', import.meta.url), { type: 'module' }),
TextMateWorker: () => new Worker(new URL('@codingame/monaco-vscode-textmate-service-override/worker', import.meta.url), { type: 'module' })
}
window.MonacoEnvironment = {
getWorker: function (_workerId, label) {
console.log(label);
const workerFactory = workerLoaders[label]
if (workerFactory != null) {
return workerFactory()
}
console.log("not found: " + label);
throw new Error(`Worker ${label} not found`)
}
}
updateUserConfiguration(`{ "workbench.colorTheme": "Default Dark Modern" }`);
// adding services
await initialize({
...getTextMateServiceOverride(),
...getThemeServiceOverride(),
...getLanguagesServiceOverride(),
...getConfigurationServiceOverride()
});
const editor = monaco.editor.create(document.getElementById("container")!, {
language: "csharp",
automaticLayout: true,
value: "void Foo() {\n Console.WriteLine(\"Hello World\");\n}\n"
});
initWebSocketAndStartClient("http://127.0.0.1:1234"); And lsp-client: export const initWebSocketAndStartClient = (url: string): WebSocket => {
const webSocket = new WebSocket(url);
webSocket.onopen = () => {
const socket = toSocket(webSocket);
const reader = new WebSocketMessageReader(socket);
const writer = new WebSocketMessageWriter(socket);
const languageClient = createLanguageClient({
reader,
writer
});
languageClient.start();
reader.onClose(() => languageClient.stop());
};
return webSocket;
};
const createLanguageClient = (messageTransports: MessageTransports): MonacoLanguageClient => {
return new MonacoLanguageClient({
name: 'Sample Language Client',
clientOptions: {
// use a language id as a document selector
documentSelector: ['csharp'],
// disable the default error handler
errorHandler: {
error: () => ({ action: ErrorAction.Continue }),
closed: () => ({ action: CloseAction.DoNotRestart })
}
},
// this needs to modified in default sample
messageTransports
});
}; This is correctly loading dark theme and syntax higlighting is working for csharp, but I have issue with lsp. When calling initWebSocketAndStartClient from, I'm getting
This happend whether I import "vscode/localExtensionHost" or not, so my guess is that something changed here in recent versions. To be precise, error appears because vscode_1.workspace is null here: class DidOpenTextDocumentFeature extends features_1.TextDocumentEventFeature {
constructor(client, syncedDocuments) {
super(client, vscode_1.workspace.onDidOpenTextDocument, vscode_languageserver_protocol_1.DidOpenTextDocumentNotification.type, () => client.middleware.didOpen, (textDocument) => client.code2ProtocolConverter.asOpenTextDocumentParams(textDocument), (data) => data, features_1.TextDocumentEventFeature.textDocumentFilter);
this._syncedDocuments = syncedDocuments;
} Is there any chance you could give me hint what to try next? I've tried waiting some time before initializing client to verify if the issue is with some async loading but it does not seem to matter. Do you think I should just move to using wrapper? |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment 4 replies
-
Can you check that you only have a single version of the library by running btw: you should probably use |
Beta Was this translation helpful? Give feedback.
npm tries to unify, but monaco-languageclient is maybe a bit too specific on the version, `~20.2.1 doesn't match the 20.4.0, so npm just duplicated it, which is a problem here
@kaisalmen any reason for using
~
instead of^
?