diff --git a/src/common.ts b/src/common.ts index d87973e3..15433792 100644 --- a/src/common.ts +++ b/src/common.ts @@ -16,9 +16,9 @@ import { } from "./providers/diagnostics/elmAnalyseJsonService"; import { ILanguageServer } from "./server"; import { DocumentEvents } from "./util/documentEvents"; -import { IClientSettings, Settings } from "./util/settings"; +import { Settings } from "./util/settings"; import { TextDocumentEvents } from "./util/textDocumentEvents"; -import { IFileSystemHost } from "./types"; +import { IFileSystemHost, InitializationOptions } from "./types"; import { URI, Utils } from "vscode-uri"; export function startCommonServer( @@ -45,7 +45,18 @@ export function startCommonServer( connection.onInitialize( async (params: InitializeParams): Promise => { - await Parser.init(); + const initializationOptions = + params.initializationOptions ?? {}; + + const options: object | undefined = + initializationOptions.treeSitterWasmUri + ? { + locateFile(): string | undefined { + return initializationOptions.treeSitterWasmUri; + }, + } + : undefined; + await Parser.init(options); const absolute = Path.join(__dirname, "tree-sitter-elm.wasm"); const pathToWasm = Path.relative(process.cwd(), absolute); connection.console.info( @@ -69,16 +80,13 @@ export function startCommonServer( useValue: new CapabilityCalculator(params.capabilities), }); - const initializationOptions: IClientSettings = - params.initializationOptions ?? {}; - container.register("Settings", { useValue: new Settings(initializationOptions, params.capabilities), }); const { Server } = await import("./server"); - server = new Server(params, fileSystemHost); + server = new Server(params, fileSystemHost, initializationOptions); initSuccessfull = server.initSuccessfull.valueOf(); diff --git a/src/server.ts b/src/server.ts index d5fc982e..d7198b34 100644 --- a/src/server.ts +++ b/src/server.ts @@ -33,7 +33,7 @@ import { FindTestsProvider } from "./providers/findTestsProvider"; import { ElmReviewDiagnostics } from "./providers/diagnostics/elmReviewDiagnostics"; import { findElmJsonFiles } from "./node"; import { VirtualFileProvider } from "./providers/virtualFileProvider"; -import { IFileSystemHost } from "./types"; +import { IFileSystemHost, InitializationOptions } from "./types"; export interface ILanguageServer { readonly capabilities: InitializeResult; @@ -50,11 +50,9 @@ export class Server implements ILanguageServer { constructor( private params: InitializeParams, private fileSystemHost: IFileSystemHost, + initializationOptions: InitializationOptions, ) { this.connection = container.resolve("Connection"); - const initializationOptions = params.initializationOptions as { - elmJsonFiles?: string[]; - }; const uri = this.getWorkspaceUri(this.params); diff --git a/src/types.ts b/src/types.ts index baa1165c..79316313 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,7 +1,15 @@ import { URI } from "vscode-uri"; +import { IClientSettings } from "./util/settings"; export interface IFileSystemHost { readFile(uri: URI): Promise; readDirectory(uri: URI, include?: string, depth?: number): Promise; watchFile(uri: URI, callback: () => void): void; } + +export type InitializationOptions = IClientSettings & { + treeSitterWasmUri?: string; + + // Needed to support virtual workspaces + elmJsonFiles?: string[]; +};