|
2 | 2 |
|
3 | 3 | namespace FSharp.Compiler.LanguageServer |
4 | 4 |
|
| 5 | +open System |
| 6 | +open System.Runtime.InteropServices |
| 7 | +open System.Threading |
| 8 | +open Newtonsoft.Json.Linq |
5 | 9 | open StreamJsonRpc |
6 | 10 |
|
7 | 11 | // https://microsoft.github.io/language-server-protocol/specification |
8 | 12 | type Methods(state: State) = |
9 | 13 |
|
| 14 | + /// Helper to run Async<'T> with a CancellationToken. |
| 15 | + let runAsync (cancellationToken: CancellationToken) (computation: Async<'T>) = Async.StartAsTask(computation, cancellationToken=cancellationToken) |
| 16 | + |
| 17 | + member __.State = state |
| 18 | + |
| 19 | + //-------------------------------------------------------------------------- |
| 20 | + // official LSP methods |
| 21 | + //-------------------------------------------------------------------------- |
| 22 | + |
10 | 23 | [<JsonRpcMethod("initialize")>] |
11 | | - member __.Initialize (args: InitializeParams) = |
12 | | - async { |
13 | | - // note, it's important that this method is `async` because unit tests can then properly verify that the |
14 | | - // JSON RPC handling of async methods is correct |
15 | | - return ServerCapabilities.DefaultCapabilities() |
16 | | - } |> Async.StartAsTask |
| 24 | + member __.Initialize |
| 25 | + ( |
| 26 | + processId: Nullable<int>, |
| 27 | + [<Optional; DefaultParameterValue(null: string)>] rootPath: string, |
| 28 | + [<Optional; DefaultParameterValue(null: string)>] rootUri: DocumentUri, |
| 29 | + [<Optional; DefaultParameterValue(null: JToken)>] initializationOptions: JToken, |
| 30 | + capabilities: ClientCapabilities, |
| 31 | + [<Optional; DefaultParameterValue(null: string)>] trace: string, |
| 32 | + [<Optional; DefaultParameterValue(null: WorkspaceFolder[])>] workspaceFolders: WorkspaceFolder[] |
| 33 | + ) = |
| 34 | + { InitializeResult.capabilities = ServerCapabilities.DefaultCapabilities() } |
| 35 | + |
| 36 | + [<JsonRpcMethod("initialized")>] |
| 37 | + member __.Initialized () = () |
17 | 38 |
|
18 | 39 | [<JsonRpcMethod("shutdown")>] |
19 | | - member __.Shutdown() = state.DoShutdown() |
| 40 | + member __.Shutdown(): obj = state.DoShutdown(); null |
| 41 | + |
| 42 | + [<JsonRpcMethod("exit")>] |
| 43 | + member __.Exit() = state.DoExit() |
| 44 | + |
| 45 | + [<JsonRpcMethod("$/cancelRequest")>] |
| 46 | + member __.cancelRequest (id: JToken) = state.DoCancel() |
20 | 47 |
|
21 | 48 | [<JsonRpcMethod("textDocument/hover")>] |
22 | | - member __.TextDocumentHover (args: TextDocumentPositionParams) = TextDocument.Hover(state, args) |> Async.StartAsTask |
| 49 | + member __.TextDocumentHover |
| 50 | + ( |
| 51 | + textDocument: TextDocumentIdentifier, |
| 52 | + position: Position, |
| 53 | + [<Optional; DefaultParameterValue(CancellationToken())>] cancellationToken: CancellationToken |
| 54 | + ) = |
| 55 | + TextDocument.Hover state textDocument position |> runAsync cancellationToken |
| 56 | + |
| 57 | + //-------------------------------------------------------------------------- |
| 58 | + // unofficial LSP methods that we implement separately |
| 59 | + //-------------------------------------------------------------------------- |
| 60 | + |
| 61 | + [<JsonRpcMethod(OptionsSet)>] |
| 62 | + member __.OptionsSet |
| 63 | + ( |
| 64 | + options: Options |
| 65 | + ) = |
| 66 | + sprintf "got options %A" options |> Console.Error.WriteLine |
| 67 | + state.Options <- options |
0 commit comments