Skip to content

Commit 989faba

Browse files
committed
Generate Route mappings
1 parent 12b5dca commit 989faba

File tree

6 files changed

+296
-133
lines changed

6 files changed

+296
-133
lines changed

src/ClientServer.cg.fs

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,3 +398,156 @@ type ILspClient =
398398
abstract WorkspaceCodeLensRefresh: unit -> AsyncLspResult<unit>
399399
/// A request sent from the server to the client to modified certain resources.
400400
abstract WorkspaceApplyEdit: ApplyWorkspaceEditParams -> AsyncLspResult<ApplyWorkspaceEditResult>
401+
402+
module Mappings =
403+
type ServerRequestHandling<'server when 'server :> ILspServer> = { Run: 'server -> System.Delegate }
404+
405+
let routeMappings () =
406+
let serverRequestHandling run =
407+
{ Run = fun server -> run server |> JsonRpc.Requests.requestHandling }
408+
409+
[ "textDocument/implementation",
410+
serverRequestHandling (fun server request -> server.TextDocumentImplementation(request))
411+
"textDocument/typeDefinition",
412+
serverRequestHandling (fun server request -> server.TextDocumentTypeDefinition(request))
413+
"textDocument/documentColor",
414+
serverRequestHandling (fun server request -> server.TextDocumentDocumentColor(request))
415+
"textDocument/colorPresentation",
416+
serverRequestHandling (fun server request -> server.TextDocumentColorPresentation(request))
417+
"textDocument/foldingRange",
418+
serverRequestHandling (fun server request -> server.TextDocumentFoldingRange(request))
419+
"textDocument/declaration",
420+
serverRequestHandling (fun server request -> server.TextDocumentDeclaration(request))
421+
"textDocument/selectionRange",
422+
serverRequestHandling (fun server request -> server.TextDocumentSelectionRange(request))
423+
"textDocument/prepareCallHierarchy",
424+
serverRequestHandling (fun server request -> server.TextDocumentPrepareCallHierarchy(request))
425+
"callHierarchy/incomingCalls",
426+
serverRequestHandling (fun server request -> server.CallHierarchyIncomingCalls(request))
427+
"callHierarchy/outgoingCalls",
428+
serverRequestHandling (fun server request -> server.CallHierarchyOutgoingCalls(request))
429+
"textDocument/semanticTokens/full",
430+
serverRequestHandling (fun server request -> server.TextDocumentSemanticTokensFull(request))
431+
"textDocument/semanticTokens/full/delta",
432+
serverRequestHandling (fun server request -> server.TextDocumentSemanticTokensFullDelta(request))
433+
"textDocument/semanticTokens/range",
434+
serverRequestHandling (fun server request -> server.TextDocumentSemanticTokensRange(request))
435+
"textDocument/linkedEditingRange",
436+
serverRequestHandling (fun server request -> server.TextDocumentLinkedEditingRange(request))
437+
"workspace/willCreateFiles",
438+
serverRequestHandling (fun server request -> server.WorkspaceWillCreateFiles(request))
439+
"workspace/willRenameFiles",
440+
serverRequestHandling (fun server request -> server.WorkspaceWillRenameFiles(request))
441+
"workspace/willDeleteFiles",
442+
serverRequestHandling (fun server request -> server.WorkspaceWillDeleteFiles(request))
443+
"textDocument/moniker", serverRequestHandling (fun server request -> server.TextDocumentMoniker(request))
444+
"textDocument/prepareTypeHierarchy",
445+
serverRequestHandling (fun server request -> server.TextDocumentPrepareTypeHierarchy(request))
446+
"typeHierarchy/supertypes",
447+
serverRequestHandling (fun server request -> server.TypeHierarchySupertypes(request))
448+
"typeHierarchy/subtypes", serverRequestHandling (fun server request -> server.TypeHierarchySubtypes(request))
449+
"textDocument/inlineValue",
450+
serverRequestHandling (fun server request -> server.TextDocumentInlineValue(request))
451+
"textDocument/inlayHint", serverRequestHandling (fun server request -> server.TextDocumentInlayHint(request))
452+
"inlayHint/resolve", serverRequestHandling (fun server request -> server.InlayHintResolve(request))
453+
"textDocument/diagnostic",
454+
serverRequestHandling (fun server request -> server.TextDocumentDiagnostic(request))
455+
"workspace/diagnostic", serverRequestHandling (fun server request -> server.WorkspaceDiagnostic(request))
456+
"initialize", serverRequestHandling (fun server request -> server.Initialize(request))
457+
"shutdown", serverRequestHandling (fun server request -> server.Shutdown())
458+
"textDocument/willSaveWaitUntil",
459+
serverRequestHandling (fun server request -> server.TextDocumentWillSaveWaitUntil(request))
460+
"textDocument/completion",
461+
serverRequestHandling (fun server request -> server.TextDocumentCompletion(request))
462+
"completionItem/resolve", serverRequestHandling (fun server request -> server.CompletionItemResolve(request))
463+
"textDocument/hover", serverRequestHandling (fun server request -> server.TextDocumentHover(request))
464+
"textDocument/signatureHelp",
465+
serverRequestHandling (fun server request -> server.TextDocumentSignatureHelp(request))
466+
"textDocument/definition",
467+
serverRequestHandling (fun server request -> server.TextDocumentDefinition(request))
468+
"textDocument/references",
469+
serverRequestHandling (fun server request -> server.TextDocumentReferences(request))
470+
"textDocument/documentHighlight",
471+
serverRequestHandling (fun server request -> server.TextDocumentDocumentHighlight(request))
472+
"textDocument/documentSymbol",
473+
serverRequestHandling (fun server request -> server.TextDocumentDocumentSymbol(request))
474+
"textDocument/codeAction",
475+
serverRequestHandling (fun server request -> server.TextDocumentCodeAction(request))
476+
"codeAction/resolve", serverRequestHandling (fun server request -> server.CodeActionResolve(request))
477+
"workspace/symbol", serverRequestHandling (fun server request -> server.WorkspaceSymbol(request))
478+
"workspaceSymbol/resolve",
479+
serverRequestHandling (fun server request -> server.WorkspaceSymbolResolve(request))
480+
"textDocument/codeLens", serverRequestHandling (fun server request -> server.TextDocumentCodeLens(request))
481+
"codeLens/resolve", serverRequestHandling (fun server request -> server.CodeLensResolve(request))
482+
"textDocument/documentLink",
483+
serverRequestHandling (fun server request -> server.TextDocumentDocumentLink(request))
484+
"documentLink/resolve", serverRequestHandling (fun server request -> server.DocumentLinkResolve(request))
485+
"textDocument/formatting",
486+
serverRequestHandling (fun server request -> server.TextDocumentFormatting(request))
487+
"textDocument/rangeFormatting",
488+
serverRequestHandling (fun server request -> server.TextDocumentRangeFormatting(request))
489+
"textDocument/onTypeFormatting",
490+
serverRequestHandling (fun server request -> server.TextDocumentOnTypeFormatting(request))
491+
"textDocument/rename", serverRequestHandling (fun server request -> server.TextDocumentRename(request))
492+
"textDocument/prepareRename",
493+
serverRequestHandling (fun server request -> server.TextDocumentPrepareRename(request))
494+
"workspace/executeCommand",
495+
serverRequestHandling (fun server request -> server.WorkspaceExecuteCommand(request))
496+
"workspace/didChangeWorkspaceFolders",
497+
serverRequestHandling (fun server request ->
498+
server.WorkspaceDidChangeWorkspaceFolders(request)
499+
|> Requests.notificationSuccess)
500+
"window/workDoneProgress/cancel",
501+
serverRequestHandling (fun server request ->
502+
server.WindowWorkDoneProgressCancel(request) |> Requests.notificationSuccess)
503+
"workspace/didCreateFiles",
504+
serverRequestHandling (fun server request ->
505+
server.WorkspaceDidCreateFiles(request) |> Requests.notificationSuccess)
506+
"workspace/didRenameFiles",
507+
serverRequestHandling (fun server request ->
508+
server.WorkspaceDidRenameFiles(request) |> Requests.notificationSuccess)
509+
"workspace/didDeleteFiles",
510+
serverRequestHandling (fun server request ->
511+
server.WorkspaceDidDeleteFiles(request) |> Requests.notificationSuccess)
512+
"notebookDocument/didOpen",
513+
serverRequestHandling (fun server request ->
514+
server.NotebookDocumentDidOpen(request) |> Requests.notificationSuccess)
515+
"notebookDocument/didChange",
516+
serverRequestHandling (fun server request ->
517+
server.NotebookDocumentDidChange(request) |> Requests.notificationSuccess)
518+
"notebookDocument/didSave",
519+
serverRequestHandling (fun server request ->
520+
server.NotebookDocumentDidSave(request) |> Requests.notificationSuccess)
521+
"notebookDocument/didClose",
522+
serverRequestHandling (fun server request ->
523+
server.NotebookDocumentDidClose(request) |> Requests.notificationSuccess)
524+
"initialized",
525+
serverRequestHandling (fun server request -> server.Initialized(request) |> Requests.notificationSuccess)
526+
"exit", serverRequestHandling (fun server request -> server.Exit() |> Requests.notificationSuccess)
527+
"workspace/didChangeConfiguration",
528+
serverRequestHandling (fun server request ->
529+
server.WorkspaceDidChangeConfiguration(request) |> Requests.notificationSuccess)
530+
"textDocument/didOpen",
531+
serverRequestHandling (fun server request ->
532+
server.TextDocumentDidOpen(request) |> Requests.notificationSuccess)
533+
"textDocument/didChange",
534+
serverRequestHandling (fun server request ->
535+
server.TextDocumentDidChange(request) |> Requests.notificationSuccess)
536+
"textDocument/didClose",
537+
serverRequestHandling (fun server request ->
538+
server.TextDocumentDidClose(request) |> Requests.notificationSuccess)
539+
"textDocument/didSave",
540+
serverRequestHandling (fun server request ->
541+
server.TextDocumentDidSave(request) |> Requests.notificationSuccess)
542+
"textDocument/willSave",
543+
serverRequestHandling (fun server request ->
544+
server.TextDocumentWillSave(request) |> Requests.notificationSuccess)
545+
"workspace/didChangeWatchedFiles",
546+
serverRequestHandling (fun server request ->
547+
server.WorkspaceDidChangeWatchedFiles(request) |> Requests.notificationSuccess)
548+
"$/setTrace",
549+
serverRequestHandling (fun server request -> server.SetTrace(request) |> Requests.notificationSuccess)
550+
"$/cancelRequest",
551+
serverRequestHandling (fun server request -> server.CancelRequest(request) |> Requests.notificationSuccess)
552+
"$/progress",
553+
serverRequestHandling (fun server request -> server.Progress(request) |> Requests.notificationSuccess) ]

src/JsonRpc.fs

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,4 +152,47 @@ module AsyncLspResult =
152152

153153
let notImplemented<'a> : AsyncLspResult<'a> = async.Return LspResult.notImplemented
154154

155-
let requestCancelled<'a> : AsyncLspResult<'a> = async.Return LspResult.requestCancelled
155+
let requestCancelled<'a> : AsyncLspResult<'a> = async.Return LspResult.requestCancelled
156+
157+
158+
module Requests =
159+
open StreamJsonRpc
160+
open System
161+
open System.Threading
162+
open System.Threading.Tasks
163+
164+
let requestHandling<'param, 'result> (run: 'param -> AsyncLspResult<'result>) : Delegate =
165+
let runAsTask param ct =
166+
// Execute non-async portion of `run` before forking the async portion into a task.
167+
// This is needed to avoid reordering of messages from a client.
168+
let asyncLspResult = run param
169+
170+
let asyncContinuation =
171+
async {
172+
let! lspResult = asyncLspResult
173+
174+
return
175+
match lspResult with
176+
| Ok result -> result
177+
| Error error ->
178+
let rpcException = LocalRpcException(error.Message)
179+
rpcException.ErrorCode <- error.Code
180+
181+
rpcException.ErrorData <-
182+
error.Data
183+
|> Option.defaultValue null
184+
185+
raise rpcException
186+
}
187+
188+
Async.StartAsTask(asyncContinuation, cancellationToken = ct)
189+
190+
Func<'param, CancellationToken, Task<'result>>(runAsTask) :> Delegate
191+
192+
/// Notifications don't generate a response or error, but to unify things we consider them as always successful.
193+
/// They will still not send any response because their ID is null.
194+
let internal notificationSuccess (response: Async<unit>) =
195+
async {
196+
do! response
197+
return Result.Ok()
198+
}

0 commit comments

Comments
 (0)