From cd5208f7c55690b30471458204a683d1ca034024 Mon Sep 17 00:00:00 2001 From: Steven de Oliveira Date: Mon, 30 Oct 2023 16:26:51 +0100 Subject: [PATCH] Allowing remote LSP for superbol --- .../superbol_instance.ml | 31 ++++++++++++--- .../vscode_languageclient.ml | 39 +++++++++++++++++++ .../vscode_languageclient.mli | 28 +++++++++++++ .../vscode_languageclient_stub.js | 1 + 4 files changed, 94 insertions(+), 5 deletions(-) diff --git a/src/vscode/superbol-vscode-platform/superbol_instance.ml b/src/vscode/superbol-vscode-platform/superbol_instance.ml index 1bcbc0ac5..1bdefe804 100644 --- a/src/vscode/superbol-vscode-platform/superbol_instance.ml +++ b/src/vscode/superbol-vscode-platform/superbol_instance.ml @@ -41,10 +41,31 @@ let start_language_server t = Superbol_languageclient.serverOptions ~bundled_superbol:t.bundled_superbol in - let clientOptions = Superbol_languageclient.clientOptions () in - let client = LanguageClient.make - ~id:"cobolServer" - ~name:"Cobol Server" - ~serverOptions ~clientOptions () in + let client = + let cmd = Executable.command serverOptions in + if String.starts_with ~prefix:"ws://" cmd then + LanguageClient.make_ + ~id:"cobolServer" + ~name:"Cobol Server" + (fun () -> + let njs_stream = + Vscode_languageclient.StreamInfo.njs_stream_of_string cmd + in + Promise.return ( + Vscode_languageclient.StreamInfo.create + ~writer:njs_stream + ~reader:njs_stream + () + ) + ) + else + let clientOptions = Superbol_languageclient.clientOptions () in + LanguageClient.make + ~id:"cobolServer" + ~name:"Cobol Server" + ~serverOptions:serverOptions + ~clientOptions:clientOptions + () + in let+ () = LanguageClient.start client in t.language_client <- Some client diff --git a/src/vscode/vscode-languageclient-js-stubs/vscode_languageclient.ml b/src/vscode/vscode-languageclient-js-stubs/vscode_languageclient.ml index 61d74b2b2..12f2e5d61 100644 --- a/src/vscode/vscode-languageclient-js-stubs/vscode_languageclient.ml +++ b/src/vscode/vscode-languageclient-js-stubs/vscode_languageclient.ml @@ -189,6 +189,38 @@ module StaticFeature = struct [@@js.builder]] end +module StreamInfo = struct + include Interface.Make () + + type njs_stream + + let njs_stream_of_string str : njs_stream = + Format.ksprintf + Js_of_ocaml.Js.Unsafe.eval_string + "new joo_global_object.webSocket (`%s`);" + str + + let njs_stream_of_js = Obj.magic + + let njs_stream_to_js = Obj.magic + + include + [%js: + val writer : t -> njs_stream [@@js.get] + + val reader : t -> njs_stream [@@js.get] + + val detached : t -> bool option [@@js.get] + + val create : + writer:njs_stream + -> reader:njs_stream + -> ?detached:bool + -> unit + -> t + [@@js.builder]] +end + module LanguageClient = struct include Class.Make () @@ -204,6 +236,13 @@ module LanguageClient = struct -> t [@@js.new "vscode_languageclient.LanguageClient"] + val make_ : + id:string + -> name:string + -> (unit -> StreamInfo.t Promise.t) + -> t + [@@js.new "vscode_languageclient.LanguageClient"] + val start : t -> unit Promise.t [@@js.call] val isRunning : t -> bool [@@js.call] diff --git a/src/vscode/vscode-languageclient-js-stubs/vscode_languageclient.mli b/src/vscode/vscode-languageclient-js-stubs/vscode_languageclient.mli index b6fe9ffda..502e4681d 100644 --- a/src/vscode/vscode-languageclient-js-stubs/vscode_languageclient.mli +++ b/src/vscode/vscode-languageclient-js-stubs/vscode_languageclient.mli @@ -160,6 +160,28 @@ module StaticFeature : sig -> t end +module StreamInfo : sig + include Js.T + + type njs_stream + + val njs_stream_of_string : string -> njs_stream + + val writer : t -> njs_stream [@@js.get] + + val reader : t -> njs_stream [@@js.get] + + val detached : t -> bool option [@@js.get] + + val create : + writer:njs_stream + -> reader:njs_stream + -> ?detached:bool + -> unit + -> t + [@@js.builder] +end + module LanguageClient : sig include Js.T @@ -172,6 +194,12 @@ module LanguageClient : sig -> unit -> t + val make_ : + id:string + -> name:string + -> (unit -> StreamInfo.t Promise.t) + -> t + val start : t -> unit Promise.t val isRunning : t -> bool diff --git a/src/vscode/vscode-languageclient-js-stubs/vscode_languageclient_stub.js b/src/vscode/vscode-languageclient-js-stubs/vscode_languageclient_stub.js index 875f885b0..c8af13b07 100644 --- a/src/vscode/vscode-languageclient-js-stubs/vscode_languageclient_stub.js +++ b/src/vscode/vscode-languageclient-js-stubs/vscode_languageclient_stub.js @@ -1 +1,2 @@ joo_global_object.vscode_languageclient = require("vscode-languageclient"); +joo_global_object.webSocket = require("ws");