From 7e0f30feffe76feb91231582b09b852945ee48dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Saulius=20Menkevi=C4=8Dius?= Date: Sat, 26 Apr 2025 10:31:49 +0300 Subject: [PATCH 1/3] Update to Ionide.LanguageServerProtocol 0.7.0 --- Directory.Packages.props | 2 +- .../Handlers/CSharpMetadata.fs | 1 + .../Handlers/CallHierarchy.fs | 12 +- .../Handlers/CodeAction.fs | 20 +- src/CSharpLanguageServer/Handlers/CodeLens.fs | 15 +- src/CSharpLanguageServer/Handlers/Color.fs | 1 + .../Handlers/Completion.fs | 20 +- .../Handlers/Declaration.fs | 5 +- .../Handlers/Definition.fs | 12 +- .../Handlers/Diagnostic.fs | 1 + .../Handlers/DocumentFormatting.fs | 6 +- .../Handlers/DocumentHighlight.fs | 10 +- .../Handlers/DocumentLink.fs | 1 + .../Handlers/DocumentOnTypeFormatting.fs | 12 +- .../Handlers/DocumentRangeFormatting.fs | 7 +- .../Handlers/DocumentSymbol.fs | 6 +- .../Handlers/ExecuteCommand.fs | 6 +- .../Handlers/FoldingRange.fs | 6 +- src/CSharpLanguageServer/Handlers/Hover.fs | 9 +- .../Handlers/Implementation.fs | 9 +- .../Handlers/Initialization.fs | 6 +- .../Handlers/InlayHint.fs | 6 +- .../Handlers/InlineValue.fs | 1 + .../Handlers/LinkedEditingRange.fs | 3 +- src/CSharpLanguageServer/Handlers/Moniker.fs | 6 +- .../Handlers/References.fs | 6 +- src/CSharpLanguageServer/Handlers/Rename.fs | 12 +- .../Handlers/SelectionRange.fs | 5 +- .../Handlers/SemanticTokens.fs | 7 +- .../Handlers/SignatureHelp.fs | 8 +- .../Handlers/TextDocumentSync.fs | 21 +- .../Handlers/TypeDefinition.fs | 10 +- .../Handlers/TypeHierarchy.fs | 16 +- .../Handlers/Workspace.fs | 1 + .../Handlers/WorkspaceSymbol.fs | 4 +- src/CSharpLanguageServer/Lsp/Client.fs | 19 +- src/CSharpLanguageServer/Lsp/Server.fs | 262 +++++------------- src/CSharpLanguageServer/ProgressReporter.fs | 11 +- src/CSharpLanguageServer/Types.fs | 1 + 39 files changed, 239 insertions(+), 327 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index d9b0d833..488084bf 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -18,7 +18,7 @@ - + diff --git a/src/CSharpLanguageServer/Handlers/CSharpMetadata.fs b/src/CSharpLanguageServer/Handlers/CSharpMetadata.fs index b9e3dbc8..46cdbbda 100644 --- a/src/CSharpLanguageServer/Handlers/CSharpMetadata.fs +++ b/src/CSharpLanguageServer/Handlers/CSharpMetadata.fs @@ -1,6 +1,7 @@ namespace CSharpLanguageServer.Handlers open Ionide.LanguageServerProtocol.Types +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer.Types open CSharpLanguageServer.State diff --git a/src/CSharpLanguageServer/Handlers/CallHierarchy.fs b/src/CSharpLanguageServer/Handlers/CallHierarchy.fs index 3d6119e5..f762899a 100644 --- a/src/CSharpLanguageServer/Handlers/CallHierarchy.fs +++ b/src/CSharpLanguageServer/Handlers/CallHierarchy.fs @@ -6,7 +6,7 @@ open Microsoft.CodeAnalysis open Microsoft.CodeAnalysis.FindSymbols open Ionide.LanguageServerProtocol.Server open Ionide.LanguageServerProtocol.Types -open Ionide.LanguageServerProtocol.Types.LspResult +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer.Types open CSharpLanguageServer.State @@ -58,8 +58,8 @@ module CallHierarchy = itemList |> List.toArray |> Some - |> success - | _ -> return None |> success + |> LspResult.success + | _ -> return None |> LspResult.success } let incomingCalls @@ -81,7 +81,7 @@ module CallHierarchy = FromRanges = fromRanges }) match! context.FindSymbol p.Item.Uri p.Item.Range.Start with - | None -> return None |> success + | None -> return None |> LspResult.success | Some symbol -> let! callers = context.FindCallers symbol // TODO: If we remove info.IsDirect, then we will get lots of false positive. But if we keep it, @@ -93,7 +93,7 @@ module CallHierarchy = |> Seq.distinct |> Seq.toArray |> Some - |> success + |> LspResult.success } let outgoingCalls @@ -102,5 +102,5 @@ module CallHierarchy = : AsyncLspResult = async { // TODO: There is no memthod of SymbolFinder which can find all outgoing calls of a specific symbol. // Then how can we implement it? Parsing AST manually? - return None |> success + return None |> LspResult.success } diff --git a/src/CSharpLanguageServer/Handlers/CodeAction.fs b/src/CSharpLanguageServer/Handlers/CodeAction.fs index ad5e813f..4433ea77 100644 --- a/src/CSharpLanguageServer/Handlers/CodeAction.fs +++ b/src/CSharpLanguageServer/Handlers/CodeAction.fs @@ -14,7 +14,7 @@ open Microsoft.CodeAnalysis.CodeFixes open Microsoft.CodeAnalysis.Text open Ionide.LanguageServerProtocol.Server open Ionide.LanguageServerProtocol.Types -open Ionide.LanguageServerProtocol.Types.LspResult +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer.Logging open CSharpLanguageServer.Conversions @@ -324,7 +324,7 @@ module CodeAction = (p: CodeActionParams) : AsyncLspResult = async { match context.GetDocument p.TextDocument.Uri with - | None -> return None |> success + | None -> return None |> LspResult.success | Some doc -> let! ct = Async.CancellationToken let! docText = doc.GetTextAsync(ct) |> Async.AwaitTask @@ -384,16 +384,17 @@ module CodeAction = |> Seq.map U2.C2 |> Array.ofSeq |> Some - |> success + |> LspResult.success } - let resolve (context: ServerRequestContext) (p: CodeAction) : AsyncLspResult = async { + let resolve (context: ServerRequestContext) (p: CodeAction) : AsyncLspResult = async { let resolutionData = p.Data |> Option.map deserialize match context.GetDocument resolutionData.Value.TextDocumentUri with - | None -> return None |> success + | None -> + return raise (Exception(sprintf "no document for uri %s" resolutionData.Value.TextDocumentUri)) | Some doc -> let! ct = Async.CancellationToken let! docText = doc.GetTextAsync(ct) |> Async.AwaitTask @@ -412,7 +413,7 @@ module CodeAction = doc ct - let! maybeLspCodeAction = + let! lspCodeAction = match selectedCodeAction with | Some ca -> async { let! resolvedCA = toResolvedLspCodeAction ca @@ -423,9 +424,10 @@ module CodeAction = >> Log.addContext "action" (string ca) ) - return resolvedCA + return resolvedCA.Value } - | None -> async { return None } + | None -> + raise (Exception("no CodeAction resolved")) - return maybeLspCodeAction |> success + return lspCodeAction |> LspResult.success } diff --git a/src/CSharpLanguageServer/Handlers/CodeLens.fs b/src/CSharpLanguageServer/Handlers/CodeLens.fs index da10e522..c029155a 100644 --- a/src/CSharpLanguageServer/Handlers/CodeLens.fs +++ b/src/CSharpLanguageServer/Handlers/CodeLens.fs @@ -8,8 +8,7 @@ open Microsoft.CodeAnalysis.CSharp.Syntax open Microsoft.CodeAnalysis.Text open Ionide.LanguageServerProtocol.Server open Ionide.LanguageServerProtocol.Types -open Ionide.LanguageServerProtocol.Types.LspResult -open Newtonsoft.Json.Linq +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer.State open CSharpLanguageServer.Conversions @@ -124,7 +123,8 @@ module CodeLens = let handle (context: ServerRequestContext) (p: CodeLensParams): AsyncLspResult = async { let docMaybe = context.GetDocument p.TextDocument.Uri match docMaybe with - | None -> return None |> success + | None -> + return None |> LspResult.success | Some doc -> let! ct = Async.CancellationToken let! semanticModel = doc.GetSemanticModelAsync(ct) |> Async.AwaitTask @@ -144,11 +144,11 @@ module CodeLens = { Range = nameSpan |> Range.fromTextSpan docText.Lines Command = None - Data = lensData |> JToken.FromObject |> Some } + Data = lensData |> serialize |> Some } let codeLens = collector.GetSymbols() |> Seq.map makeCodeLens - return codeLens |> Array.ofSeq |> Some |> success + return codeLens |> Array.ofSeq |> Some |> LspResult.success } let resolve (context: ServerRequestContext) @@ -160,7 +160,8 @@ module CodeLens = |> Option.defaultValue CodeLensData.Default match! context.FindSymbol lensData.DocumentUri lensData.Position with - | None -> return p |> success + | None -> + return p |> LspResult.success | Some symbol -> let! locations = context.FindReferences symbol false // FIXME: refNum is wrong. There are lots of false positive even if we distinct locations by @@ -183,5 +184,5 @@ module CodeLens = Command = "textDocument/references" Arguments = Some [| arg |> serialize |] } - return { p with Command = Some command } |> success + return { p with Command = Some command } |> LspResult.success } diff --git a/src/CSharpLanguageServer/Handlers/Color.fs b/src/CSharpLanguageServer/Handlers/Color.fs index c2f13c22..fef66b65 100644 --- a/src/CSharpLanguageServer/Handlers/Color.fs +++ b/src/CSharpLanguageServer/Handlers/Color.fs @@ -1,6 +1,7 @@ namespace CSharpLanguageServer.Handlers open Ionide.LanguageServerProtocol.Types +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer.State diff --git a/src/CSharpLanguageServer/Handlers/Completion.fs b/src/CSharpLanguageServer/Handlers/Completion.fs index f19179fa..7de2fe9d 100644 --- a/src/CSharpLanguageServer/Handlers/Completion.fs +++ b/src/CSharpLanguageServer/Handlers/Completion.fs @@ -5,7 +5,7 @@ open System.Reflection open Ionide.LanguageServerProtocol.Server open Ionide.LanguageServerProtocol.Types -open Ionide.LanguageServerProtocol.Types.LspResult +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer open CSharpLanguageServer.State @@ -16,7 +16,7 @@ open CSharpLanguageServer.Logging [] module Completion = - let private logger = LogProvider.getLoggerByName "Completion" + let private _logger = LogProvider.getLoggerByName "Completion" let emptyRoslynOptionSet: Microsoft.CodeAnalysis.Options.OptionSet = let osType = typeof @@ -134,9 +134,10 @@ module Completion = let private cache = new LruCache<(Microsoft.CodeAnalysis.Document * Microsoft.CodeAnalysis.Completion.CompletionList)>(5) - let handle (context: ServerRequestContext) (p: CompletionParams) : AsyncLspResult = async { + let handle (context: ServerRequestContext) (p: CompletionParams) : Async option>> = async { match context.GetDocument p.TextDocument.Uri with - | None -> return None |> success + | None -> + return None |> LspResult.success | Some doc -> let! ct = Async.CancellationToken let! sourceText = doc.GetTextAsync(ct) |> Async.AwaitTask @@ -162,7 +163,7 @@ module Completion = completionService.GetCompletionsAsync(doc, position, completionOptions, completionTrigger, ct) |> Async.map Option.ofObj else - async.Return Option.None + async.Return None return completions @@ -175,7 +176,8 @@ module Completion = { IsIncomplete = true Items = items ItemDefaults = None }) - |> success + |> Option.map U2.C2 + |> LspResult.success } let resolve (_context: ServerRequestContext) (item: CompletionItem) : AsyncLspResult = async { @@ -188,7 +190,6 @@ module Completion = |> Seq.tryFind (fun x -> x.DisplayText = item.Label && (item.SortText.IsNone || x.SortText = item.SortText.Value)) |> Option.map (fun x -> (doc, x))) with - | None -> return item |> success | Some (doc, cachedItem) -> let completionService = Microsoft.CodeAnalysis.Completion.CompletionService.GetService(doc) let! ct = Async.CancellationToken @@ -198,5 +199,8 @@ module Completion = |> Async.map Option.ofObj // TODO: make the doc as a markdown string instead of a plain text let itemDocumentation = description |> Option.map Documentation.fromCompletionDescription - return { item with Documentation = itemDocumentation |> Option.map U2.C2 } |> success + return { item with Documentation = itemDocumentation |> Option.map U2.C2 } + |> LspResult.success + | None -> + return item |> LspResult.success } diff --git a/src/CSharpLanguageServer/Handlers/Declaration.fs b/src/CSharpLanguageServer/Handlers/Declaration.fs index fb5cec38..a10103e7 100644 --- a/src/CSharpLanguageServer/Handlers/Declaration.fs +++ b/src/CSharpLanguageServer/Handlers/Declaration.fs @@ -1,6 +1,7 @@ namespace CSharpLanguageServer.Handlers open Ionide.LanguageServerProtocol.Types +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer.State @@ -10,5 +11,5 @@ module Declaration = let registration (_cc: ClientCapabilities) : Registration option = None - let handle (_context: ServerRequestContext) (_p: TextDocumentPositionParams) : AsyncLspResult = - LspResult.notImplemented |> async.Return + let handle (_context: ServerRequestContext) (_p: DeclarationParams) : AsyncLspResult option> = + LspResult.notImplemented option> |> async.Return diff --git a/src/CSharpLanguageServer/Handlers/Definition.fs b/src/CSharpLanguageServer/Handlers/Definition.fs index c2950617..ba1ca9fa 100644 --- a/src/CSharpLanguageServer/Handlers/Definition.fs +++ b/src/CSharpLanguageServer/Handlers/Definition.fs @@ -4,7 +4,7 @@ open System open Ionide.LanguageServerProtocol.Server open Ionide.LanguageServerProtocol.Types -open Ionide.LanguageServerProtocol.Types.LspResult +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer.State open CSharpLanguageServer.Types @@ -34,15 +34,17 @@ module Definition = Method = "textDocument/definition" RegisterOptions = registerOptions |> serialize |> Some } - let handle (context: ServerRequestContext) (p: TextDocumentPositionParams) : AsyncLspResult = async { + let handle (context: ServerRequestContext) (p: DefinitionParams) : Async option>> = async { match! context.FindSymbol' p.TextDocument.Uri p.Position with - | None -> return None |> success + | None -> + return None |> LspResult.success | Some (symbol, doc) -> let! locations = context.ResolveSymbolLocations symbol (Some doc.Project) return locations |> Array.ofList - |> Declaration.C2 + |> Definition.C2 + |> U2.C1 |> Some - |> success + |> LspResult.success } diff --git a/src/CSharpLanguageServer/Handlers/Diagnostic.fs b/src/CSharpLanguageServer/Handlers/Diagnostic.fs index 13581c2c..25c1c392 100644 --- a/src/CSharpLanguageServer/Handlers/Diagnostic.fs +++ b/src/CSharpLanguageServer/Handlers/Diagnostic.fs @@ -4,6 +4,7 @@ open System open Ionide.LanguageServerProtocol.Server open Ionide.LanguageServerProtocol.Types +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer.Conversions open CSharpLanguageServer.State diff --git a/src/CSharpLanguageServer/Handlers/DocumentFormatting.fs b/src/CSharpLanguageServer/Handlers/DocumentFormatting.fs index 3e437ae3..ecb9fcb9 100644 --- a/src/CSharpLanguageServer/Handlers/DocumentFormatting.fs +++ b/src/CSharpLanguageServer/Handlers/DocumentFormatting.fs @@ -5,7 +5,7 @@ open System open Microsoft.CodeAnalysis.Formatting open Ionide.LanguageServerProtocol.Server open Ionide.LanguageServerProtocol.Types -open Ionide.LanguageServerProtocol.Types.LspResult +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer open CSharpLanguageServer.State @@ -38,11 +38,11 @@ module DocumentFormatting = let handle (context: ServerRequestContext) (p: DocumentFormattingParams) : AsyncLspResult = async { match context.GetUserDocument p.TextDocument.Uri with - | None -> return None |> success + | None -> return None |> LspResult.success | Some doc -> let! ct = Async.CancellationToken let! options = FormatUtil.getFormattingOptions context.State.Settings doc p.Options let! newDoc = Formatter.FormatAsync(doc, options, cancellationToken=ct) |> Async.AwaitTask let! textEdits = FormatUtil.getChanges newDoc doc - return textEdits |> Some |> success + return textEdits |> Some |> LspResult.success } diff --git a/src/CSharpLanguageServer/Handlers/DocumentHighlight.fs b/src/CSharpLanguageServer/Handlers/DocumentHighlight.fs index 02459960..9e1d944d 100644 --- a/src/CSharpLanguageServer/Handlers/DocumentHighlight.fs +++ b/src/CSharpLanguageServer/Handlers/DocumentHighlight.fs @@ -7,7 +7,7 @@ open Microsoft.CodeAnalysis open Microsoft.CodeAnalysis.FindSymbols open Ionide.LanguageServerProtocol.Server open Ionide.LanguageServerProtocol.Types -open Ionide.LanguageServerProtocol.Types.LspResult +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer.Types open CSharpLanguageServer.State @@ -45,7 +45,7 @@ module DocumentHighlight = | :? INamespaceSymbol -> false | _ -> true - let handle (context: ServerRequestContext) (p: TextDocumentPositionParams) : AsyncLspResult = async { + let handle (context: ServerRequestContext) (p: DocumentHighlightParams) : AsyncLspResult = async { let! ct = Async.CancellationToken let filePath = Uri.toPath p.TextDocument.Uri @@ -74,11 +74,11 @@ module DocumentHighlight = } match! context.FindSymbol' p.TextDocument.Uri p.Position with - | None -> return None |> success + | None -> return None |> LspResult.success | Some (symbol, doc) -> match Option.ofObj symbol with | Some symbol when shouldHighlight symbol -> let! highlights = getHighlights symbol doc - return highlights |> Seq.toArray |> Some |> success - | _ -> return None |> success + return highlights |> Seq.toArray |> Some |> LspResult.success + | _ -> return None |> LspResult.success } diff --git a/src/CSharpLanguageServer/Handlers/DocumentLink.fs b/src/CSharpLanguageServer/Handlers/DocumentLink.fs index 961378b6..87c4609b 100644 --- a/src/CSharpLanguageServer/Handlers/DocumentLink.fs +++ b/src/CSharpLanguageServer/Handlers/DocumentLink.fs @@ -1,6 +1,7 @@ namespace CSharpLanguageServer.Handlers open Ionide.LanguageServerProtocol.Types +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer.State diff --git a/src/CSharpLanguageServer/Handlers/DocumentOnTypeFormatting.fs b/src/CSharpLanguageServer/Handlers/DocumentOnTypeFormatting.fs index 6505bfa2..8caf88fb 100644 --- a/src/CSharpLanguageServer/Handlers/DocumentOnTypeFormatting.fs +++ b/src/CSharpLanguageServer/Handlers/DocumentOnTypeFormatting.fs @@ -6,7 +6,7 @@ open Microsoft.CodeAnalysis.Text open Microsoft.CodeAnalysis.Formatting open Ionide.LanguageServerProtocol.Server open Ionide.LanguageServerProtocol.Types -open Ionide.LanguageServerProtocol.Types.LspResult +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer open CSharpLanguageServer.State @@ -45,7 +45,8 @@ module DocumentOnTypeFormatting = let handle (context: ServerRequestContext) (p: DocumentOnTypeFormattingParams) : AsyncLspResult = async { match context.GetUserDocument p.TextDocument.Uri with - | None -> return None |> success + | None -> + return None |> LspResult.success | Some doc -> let! options = FormatUtil.getFormattingOptions context.State.Settings doc p.Options let! ct = Async.CancellationToken @@ -58,12 +59,13 @@ module DocumentOnTypeFormatting = | ")" -> let! root = doc.GetSyntaxRootAsync(ct) |> Async.AwaitTask match FormatUtil.findFormatTarget root pos with - | None -> return None |> success + | None -> return None |> LspResult.success | Some node -> let! newDoc = Formatter.FormatAsync(doc, TextSpan.FromBounds(node.FullSpan.Start, node.FullSpan.End), options, cancellationToken=ct) |> Async.AwaitTask let! textEdits = FormatUtil.getChanges newDoc doc - return textEdits |> Some |> success - | _ -> return None |> success + return textEdits |> Some |> LspResult.success + | _ -> + return None |> LspResult.success } diff --git a/src/CSharpLanguageServer/Handlers/DocumentRangeFormatting.fs b/src/CSharpLanguageServer/Handlers/DocumentRangeFormatting.fs index 0b8c6de8..16d58ec4 100644 --- a/src/CSharpLanguageServer/Handlers/DocumentRangeFormatting.fs +++ b/src/CSharpLanguageServer/Handlers/DocumentRangeFormatting.fs @@ -6,7 +6,7 @@ open Microsoft.CodeAnalysis.Formatting open Microsoft.CodeAnalysis.Text open Ionide.LanguageServerProtocol.Server open Ionide.LanguageServerProtocol.Types -open Ionide.LanguageServerProtocol.Types.LspResult +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer open CSharpLanguageServer.State @@ -42,7 +42,8 @@ module DocumentRangeFormatting = let handle (context: ServerRequestContext) (p: DocumentRangeFormattingParams) : AsyncLspResult = async { match context.GetUserDocument p.TextDocument.Uri with - | None -> return None |> success + | None -> + return None |> LspResult.success | Some doc -> let! ct = Async.CancellationToken let! options = FormatUtil.getFormattingOptions context.State.Settings doc p.Options @@ -55,5 +56,5 @@ module DocumentRangeFormatting = Formatter.FormatAsync(doc, TextSpan.FromBounds(tokenStart, endPos), options, cancellationToken=ct) |> Async.AwaitTask let! textEdits = FormatUtil.getChanges newDoc doc - return textEdits |> Some |> success + return textEdits |> Some |> LspResult.success } diff --git a/src/CSharpLanguageServer/Handlers/DocumentSymbol.fs b/src/CSharpLanguageServer/Handlers/DocumentSymbol.fs index 47cf9bbf..217b9fbc 100644 --- a/src/CSharpLanguageServer/Handlers/DocumentSymbol.fs +++ b/src/CSharpLanguageServer/Handlers/DocumentSymbol.fs @@ -8,7 +8,7 @@ open Microsoft.CodeAnalysis.CSharp open Microsoft.CodeAnalysis.CSharp.Syntax open Ionide.LanguageServerProtocol.Server open Ionide.LanguageServerProtocol.Types -open Ionide.LanguageServerProtocol.Types.LspResult +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer.State open CSharpLanguageServer.Conversions @@ -317,7 +317,7 @@ module DocumentSymbol = |> Option.defaultValue false match context.GetDocument p.TextDocument.Uri with - | None -> return None |> success + | None -> return None |> LspResult.success | Some doc -> let! ct = Async.CancellationToken let! semanticModel = doc.GetSemanticModelAsync(ct) |> Async.AwaitTask @@ -333,5 +333,5 @@ module DocumentSymbol = return collector.GetDocumentSymbols(canEmitDocSymbolHierarchy) |> U2.C2 |> Some - |> success + |> LspResult.success } diff --git a/src/CSharpLanguageServer/Handlers/ExecuteCommand.fs b/src/CSharpLanguageServer/Handlers/ExecuteCommand.fs index 9f70ff5a..6cee619b 100644 --- a/src/CSharpLanguageServer/Handlers/ExecuteCommand.fs +++ b/src/CSharpLanguageServer/Handlers/ExecuteCommand.fs @@ -1,7 +1,7 @@ namespace CSharpLanguageServer.Handlers open Ionide.LanguageServerProtocol.Types -open Ionide.LanguageServerProtocol.Types.LspResult +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer.State @@ -11,5 +11,5 @@ module ExecuteCommand = let registration (_cc: ClientCapabilities) : Registration option = None - let handle (_context: ServerRequestContext) (_p: ExecuteCommandParams) : AsyncLspResult = - notImplemented |> async.Return + let handle (_context: ServerRequestContext) (_p: ExecuteCommandParams) : AsyncLspResult = + LspResult.notImplemented |> async.Return diff --git a/src/CSharpLanguageServer/Handlers/FoldingRange.fs b/src/CSharpLanguageServer/Handlers/FoldingRange.fs index d3bdd137..2eb6c595 100644 --- a/src/CSharpLanguageServer/Handlers/FoldingRange.fs +++ b/src/CSharpLanguageServer/Handlers/FoldingRange.fs @@ -1,7 +1,7 @@ namespace CSharpLanguageServer.Handlers open Ionide.LanguageServerProtocol.Types -open Ionide.LanguageServerProtocol.Types.LspResult +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer.State @@ -11,5 +11,5 @@ module FoldingRange = let registration (_c: ClientCapabilities) : Registration option = None - let handle (_c: ServerRequestContext) (_p: FoldingRangeParams) : AsyncLspResult = - notImplemented |> async.Return + let handle (_c: ServerRequestContext) (_p: FoldingRangeParams) : AsyncLspResult = + LspResult.notImplemented |> async.Return diff --git a/src/CSharpLanguageServer/Handlers/Hover.fs b/src/CSharpLanguageServer/Handlers/Hover.fs index 76aeec89..b3606356 100644 --- a/src/CSharpLanguageServer/Handlers/Hover.fs +++ b/src/CSharpLanguageServer/Handlers/Hover.fs @@ -4,7 +4,7 @@ open System open Ionide.LanguageServerProtocol.Server open Ionide.LanguageServerProtocol.Types -open Ionide.LanguageServerProtocol.Types.LspResult +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer open CSharpLanguageServer.Types @@ -36,9 +36,10 @@ module Hover = Method = "textDocument/hover" RegisterOptions = registerOptions |> serialize |> Some } - let handle (context: ServerRequestContext) (p: TextDocumentPositionParams) : AsyncLspResult = async { + let handle (context: ServerRequestContext) (p: HoverParams) : AsyncLspResult = async { match! context.FindSymbol' p.TextDocument.Uri p.Position with - | None -> return None |> success + | None -> + return None |> LspResult.success | Some (symbol, doc) -> let! ct = Async.CancellationToken let! semanticModel = doc.GetSemanticModelAsync(ct) |> Async.AwaitTask @@ -47,5 +48,5 @@ module Hover = { Contents = { Kind = MarkupKind.Markdown; Value = content } |> U3.C1 // TODO: Support range Range = None } - return hover |> Some |> success + return hover |> Some |> LspResult.success } diff --git a/src/CSharpLanguageServer/Handlers/Implementation.fs b/src/CSharpLanguageServer/Handlers/Implementation.fs index 4132d021..dd21043b 100644 --- a/src/CSharpLanguageServer/Handlers/Implementation.fs +++ b/src/CSharpLanguageServer/Handlers/Implementation.fs @@ -4,7 +4,7 @@ open System open Ionide.LanguageServerProtocol.Server open Ionide.LanguageServerProtocol.Types -open Ionide.LanguageServerProtocol.Types.LspResult +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer.Types open CSharpLanguageServer.State @@ -37,9 +37,9 @@ module Implementation = Method = "textDocument/implementation" RegisterOptions = registerOptions |> serialize |> Some } - let handle (context: ServerRequestContext) (p: TextDocumentPositionParams) : AsyncLspResult = async { + let handle (context: ServerRequestContext) (p: ImplementationParams) : Async option>> = async { match! context.FindSymbol p.TextDocument.Uri p.Position with - | None -> return None |> success + | None -> return None |> LspResult.success | Some symbol -> let! impls = context.FindImplementations symbol let! locations = impls |> Seq.map (flip context.ResolveSymbolLocations None) |> Async.Parallel @@ -48,6 +48,7 @@ module Implementation = locations |> Array.collect List.toArray |> Declaration.C2 + |> U2.C1 |> Some - |> success + |> LspResult.success } diff --git a/src/CSharpLanguageServer/Handlers/Initialization.fs b/src/CSharpLanguageServer/Handlers/Initialization.fs index 52ad83f3..5e6e07e7 100644 --- a/src/CSharpLanguageServer/Handlers/Initialization.fs +++ b/src/CSharpLanguageServer/Handlers/Initialization.fs @@ -3,12 +3,12 @@ namespace CSharpLanguageServer.Handlers open System open System.IO open System.Reflection -open System.Diagnostics open Microsoft.Build.Locator open Ionide.LanguageServerProtocol open Ionide.LanguageServerProtocol.Types open Ionide.LanguageServerProtocol.Server +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer.State open CSharpLanguageServer.State.ServerState @@ -177,11 +177,11 @@ module Initialization = logger.trace( Log.setMessage "handleInitialized: OK") - return LspResult.Ok() + return Ok() } let handleShutdown (context: ServerRequestContext) (_: unit) : Async> = async { context.Emit(ClientCapabilityChange emptyClientCapabilities) context.Emit(ClientChange None) - return LspResult.Ok() + return Ok() } diff --git a/src/CSharpLanguageServer/Handlers/InlayHint.fs b/src/CSharpLanguageServer/Handlers/InlayHint.fs index 3d53b716..dd3034ca 100644 --- a/src/CSharpLanguageServer/Handlers/InlayHint.fs +++ b/src/CSharpLanguageServer/Handlers/InlayHint.fs @@ -9,7 +9,7 @@ open Microsoft.CodeAnalysis.CSharp.Syntax open Microsoft.CodeAnalysis.Text open Ionide.LanguageServerProtocol.Server open Ionide.LanguageServerProtocol.Types -open Ionide.LanguageServerProtocol.Types.LspResult +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer.State open CSharpLanguageServer.Conversions @@ -227,7 +227,7 @@ module InlayHint = let handle (context: ServerRequestContext) (p: InlayHintParams): AsyncLspResult = async { match context.GetUserDocument p.TextDocument.Uri with - | None -> return None |> success + | None -> return None |> LspResult.success | Some doc -> let! ct = Async.CancellationToken let! semanticModel = doc.GetSemanticModelAsync(ct) |> Async.AwaitTask @@ -240,7 +240,7 @@ module InlayHint = |> Seq.map (toInlayHint semanticModel sourceText.Lines) |> Seq.filter Option.isSome |> Seq.map Option.get - return inlayHints |> Seq.toArray |> Some |> success + return inlayHints |> Seq.toArray |> Some |> LspResult.success } let resolve (_context: ServerRequestContext) (_p: InlayHint) : AsyncLspResult = diff --git a/src/CSharpLanguageServer/Handlers/InlineValue.fs b/src/CSharpLanguageServer/Handlers/InlineValue.fs index 1161e999..81484e37 100644 --- a/src/CSharpLanguageServer/Handlers/InlineValue.fs +++ b/src/CSharpLanguageServer/Handlers/InlineValue.fs @@ -1,6 +1,7 @@ namespace CSharpLanguageServer.Handlers open Ionide.LanguageServerProtocol.Types +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer.State diff --git a/src/CSharpLanguageServer/Handlers/LinkedEditingRange.fs b/src/CSharpLanguageServer/Handlers/LinkedEditingRange.fs index 89ed90f7..067a0eba 100644 --- a/src/CSharpLanguageServer/Handlers/LinkedEditingRange.fs +++ b/src/CSharpLanguageServer/Handlers/LinkedEditingRange.fs @@ -1,6 +1,7 @@ namespace CSharpLanguageServer.Handlers open Ionide.LanguageServerProtocol.Types +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer.State @@ -10,5 +11,5 @@ module LinkedEditingRange = let registration (clientCapabilities: ClientCapabilities) : Registration option = None - let handle (context: ServerRequestContext) (def: TextDocumentPositionParams) : AsyncLspResult = + let handle (context: ServerRequestContext) (def: LinkedEditingRangeParams) : AsyncLspResult = LspResult.notImplemented |> async.Return diff --git a/src/CSharpLanguageServer/Handlers/Moniker.fs b/src/CSharpLanguageServer/Handlers/Moniker.fs index f3e5a6be..7b9d8d24 100644 --- a/src/CSharpLanguageServer/Handlers/Moniker.fs +++ b/src/CSharpLanguageServer/Handlers/Moniker.fs @@ -1,7 +1,7 @@ namespace CSharpLanguageServer.Handlers open Ionide.LanguageServerProtocol.Types -open Ionide.LanguageServerProtocol.Types.LspResult +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer.State @@ -11,5 +11,5 @@ module Moniker = let registration (_cc: ClientCapabilities) : Registration option = None - let handle (_context: ServerRequestContext) (_p: TextDocumentPositionParams) : AsyncLspResult = - notImplemented |> async.Return + let handle (_context: ServerRequestContext) (_p: MonikerParams) : AsyncLspResult = + LspResult.notImplemented |> async.Return diff --git a/src/CSharpLanguageServer/Handlers/References.fs b/src/CSharpLanguageServer/Handlers/References.fs index 5ae031e6..292d62ec 100644 --- a/src/CSharpLanguageServer/Handlers/References.fs +++ b/src/CSharpLanguageServer/Handlers/References.fs @@ -4,7 +4,7 @@ open System open Ionide.LanguageServerProtocol.Server open Ionide.LanguageServerProtocol.Types -open Ionide.LanguageServerProtocol.Types.LspResult +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer.State open CSharpLanguageServer.Conversions @@ -40,7 +40,7 @@ module References = let handle (context: ServerRequestContext) (p: ReferenceParams) : AsyncLspResult = async { match! context.FindSymbol p.TextDocument.Uri p.Position with - | None -> return None |> success + | None -> return None |> LspResult.success | Some symbol -> let! locations = context.FindReferences symbol p.Context.IncludeDeclaration @@ -52,5 +52,5 @@ module References = |> Seq.distinct |> Seq.toArray |> Some - |> success + |> LspResult.success } diff --git a/src/CSharpLanguageServer/Handlers/Rename.fs b/src/CSharpLanguageServer/Handlers/Rename.fs index 28057da9..84eb7191 100644 --- a/src/CSharpLanguageServer/Handlers/Rename.fs +++ b/src/CSharpLanguageServer/Handlers/Rename.fs @@ -9,7 +9,7 @@ open Microsoft.CodeAnalysis.FindSymbols open Microsoft.CodeAnalysis.Rename open Ionide.LanguageServerProtocol.Server open Ionide.LanguageServerProtocol.Types -open Ionide.LanguageServerProtocol.Types.LspResult +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer.State open CSharpLanguageServer.Logging @@ -96,7 +96,8 @@ module Rename = (p: PrepareRenameParams) : AsyncLspResult = async { match context.GetUserDocument p.TextDocument.Uri with - | None -> return None |> success + | None -> + return None |> LspResult.success | Some doc -> let! ct = Async.CancellationToken let! docSyntaxTree = doc.GetSyntaxTreeAsync(ct) |> Async.AwaitTask @@ -148,7 +149,7 @@ module Rename = { Range = range; Placeholder = text } |> U3.C2 |> Some | _, _ -> None - return rangeWithPlaceholderMaybe |> success + return rangeWithPlaceholderMaybe |> LspResult.success } let handle @@ -156,7 +157,8 @@ module Rename = (p: RenameParams) : AsyncLspResult = async { match! context.FindSymbol' p.TextDocument.Uri p.Position with - | None -> return None |> success + | None -> + return None |> LspResult.success | Some (symbol, doc) -> let! ct = Async.CancellationToken let originalSolution = doc.Project.Solution @@ -178,5 +180,5 @@ module Rename = updatedSolution (fun uri -> context.OpenDocs.TryFind uri |> Option.map _.Version) - return WorkspaceEdit.Create(docTextEdit, context.ClientCapabilities) |> Some |> success + return WorkspaceEdit.Create(docTextEdit, context.ClientCapabilities) |> Some |> LspResult.success } diff --git a/src/CSharpLanguageServer/Handlers/SelectionRange.fs b/src/CSharpLanguageServer/Handlers/SelectionRange.fs index ff8e1a69..fcf3d93a 100644 --- a/src/CSharpLanguageServer/Handlers/SelectionRange.fs +++ b/src/CSharpLanguageServer/Handlers/SelectionRange.fs @@ -1,6 +1,7 @@ namespace CSharpLanguageServer.Handlers open Ionide.LanguageServerProtocol.Types +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer.State @@ -10,5 +11,5 @@ module SelectionRange = let registration (_cc: ClientCapabilities) : Registration option = None - let handle (_ctx: ServerRequestContext) (_p: SelectionRangeParams) : AsyncLspResult = - LspResult.notImplemented |> async.Return + let handle (_ctx: ServerRequestContext) (_p: SelectionRangeParams) : AsyncLspResult = + LspResult.notImplemented |> async.Return diff --git a/src/CSharpLanguageServer/Handlers/SemanticTokens.fs b/src/CSharpLanguageServer/Handlers/SemanticTokens.fs index 39401a5a..1e88f256 100644 --- a/src/CSharpLanguageServer/Handlers/SemanticTokens.fs +++ b/src/CSharpLanguageServer/Handlers/SemanticTokens.fs @@ -5,7 +5,7 @@ open System.Collections.Generic open Ionide.LanguageServerProtocol.Server open Ionide.LanguageServerProtocol.Types -open Ionide.LanguageServerProtocol.Types.LspResult +open Ionide.LanguageServerProtocol.JsonRpc open Microsoft.CodeAnalysis.Classification open Microsoft.CodeAnalysis.Text @@ -113,7 +113,8 @@ module SemanticTokens = let private getSemanticTokensRange (context: ServerRequestContext) (uri: string) (range: Range option): AsyncLspResult = async { let docMaybe = context.GetUserDocument uri match docMaybe with - | None -> return None |> success + | None -> + return None |> LspResult.success | Some doc -> let! ct = Async.CancellationToken let! sourceText = doc.GetTextAsync(ct) |> Async.AwaitTask @@ -137,7 +138,7 @@ module SemanticTokens = |> Seq.concat |> Seq.toArray ResultId = None } // TODO: add a result id after we support delta semantic tokens - return Some response |> success + return Some response |> LspResult.success } let private dynamicRegistration (clientCapabilities: ClientCapabilities) = diff --git a/src/CSharpLanguageServer/Handlers/SignatureHelp.fs b/src/CSharpLanguageServer/Handlers/SignatureHelp.fs index 031dce9e..976eb2a1 100644 --- a/src/CSharpLanguageServer/Handlers/SignatureHelp.fs +++ b/src/CSharpLanguageServer/Handlers/SignatureHelp.fs @@ -7,7 +7,7 @@ open Microsoft.CodeAnalysis.CSharp open Microsoft.CodeAnalysis.CSharp.Syntax open Ionide.LanguageServerProtocol.Server open Ionide.LanguageServerProtocol.Types -open Ionide.LanguageServerProtocol.Types.LspResult +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer open CSharpLanguageServer.State @@ -88,7 +88,7 @@ module SignatureHelp = let handle (context: ServerRequestContext) (p: SignatureHelpParams): AsyncLspResult = async { let docMaybe = context.GetUserDocument p.TextDocument.Uri match docMaybe with - | None -> return None |> success + | None -> return None |> LspResult.success | Some doc -> let! ct = Async.CancellationToken let! sourceText = doc.GetTextAsync(ct) |> Async.AwaitTask @@ -132,7 +132,7 @@ module SignatureHelp = |> Option.bind (fun node -> findInvocationContext node.Parent) match root.FindToken(position).Parent |> findInvocationContext with - | None -> return None |> success + | None -> return None |> LspResult.success | Some invocation -> let methodGroup = semanticModel.GetMemberGroup(invocation.Receiver).OfType() @@ -154,5 +154,5 @@ module SignatureHelp = ActiveSignature = matchingMethodMaybe |> Option.map (fun m -> List.findIndex ((=) m) methodGroup |> uint32) ActiveParameter = activeParameterMaybe } - return Some signatureHelpResult |> success + return Some signatureHelpResult |> LspResult.success } diff --git a/src/CSharpLanguageServer/Handlers/TextDocumentSync.fs b/src/CSharpLanguageServer/Handlers/TextDocumentSync.fs index d9c9d8df..16d327a5 100644 --- a/src/CSharpLanguageServer/Handlers/TextDocumentSync.fs +++ b/src/CSharpLanguageServer/Handlers/TextDocumentSync.fs @@ -2,9 +2,10 @@ namespace CSharpLanguageServer.Handlers open System +open Microsoft.CodeAnalysis.Text open Ionide.LanguageServerProtocol.Server open Ionide.LanguageServerProtocol.Types -open Microsoft.CodeAnalysis.Text +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer open CSharpLanguageServer.Conversions @@ -121,10 +122,10 @@ module TextDocumentSync = context.Emit(OpenDocAdd (openParams.TextDocument.Uri, openParams.TextDocument.Version, DateTime.Now)) context.Emit(SolutionChange updatedDoc.Project.Solution) - LspResult.Ok() |> async.Return + Ok() |> async.Return | _ -> - LspResult.Ok() |> async.Return + Ok() |> async.Return | None -> let docFilePathMaybe = Util.tryParseFileUri openParams.TextDocument.Uri @@ -146,11 +147,11 @@ module TextDocumentSync = | None -> () - return LspResult.Ok() + return Ok() } | None -> - LspResult.Ok() |> async.Return + Ok() |> async.Return let didChange (context: ServerRequestContext) (changeParams: DidChangeTextDocumentParams) @@ -175,17 +176,17 @@ module TextDocumentSync = context.Emit(SolutionChange updatedSolution) context.Emit(OpenDocAdd (changeParams.TextDocument.Uri, changeParams.TextDocument.Version, DateTime.Now)) - return Result.Ok() + return Ok() } let didClose (context: ServerRequestContext) (closeParams: DidCloseTextDocumentParams) : Async> = context.Emit(OpenDocRemove closeParams.TextDocument.Uri) - LspResult.Ok() |> async.Return + Ok() |> async.Return let willSave (_context: ServerRequestContext) (_p: WillSaveTextDocumentParams): Async> = async { - return Result.Ok () + return Ok () } let willSaveWaitUntil (_context: ServerRequestContext) (_p: WillSaveTextDocumentParams): AsyncLspResult = async { @@ -200,7 +201,7 @@ module TextDocumentSync = match doc with | Some _ -> - LspResult.Ok() |> async.Return + Ok() |> async.Return | None -> async { let docFilePath = Util.parseFileUri saveParams.TextDocument.Uri @@ -218,5 +219,5 @@ module TextDocumentSync = | None -> () - return LspResult.Ok() + return Ok() } diff --git a/src/CSharpLanguageServer/Handlers/TypeDefinition.fs b/src/CSharpLanguageServer/Handlers/TypeDefinition.fs index 9ca7c158..94ec2ff8 100644 --- a/src/CSharpLanguageServer/Handlers/TypeDefinition.fs +++ b/src/CSharpLanguageServer/Handlers/TypeDefinition.fs @@ -5,7 +5,7 @@ open System open Microsoft.CodeAnalysis open Ionide.LanguageServerProtocol.Server open Ionide.LanguageServerProtocol.Types -open Ionide.LanguageServerProtocol.Types.LspResult +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer.Types open CSharpLanguageServer.State @@ -37,9 +37,10 @@ module TypeDefinition = Method = "textDocument/typeDefinition" RegisterOptions = registerOptions |> serialize |> Some } - let handle (context: ServerRequestContext) (p: TextDocumentPositionParams) : AsyncLspResult = async { + let handle (context: ServerRequestContext) (p: TypeDefinitionParams) : Async option>> = async { match! context.FindSymbol' p.TextDocument.Uri p.Position with - | None -> return None |> success + | None -> + return None |> LspResult.success | Some (symbol, doc) -> let typeSymbol = match symbol with @@ -56,6 +57,7 @@ module TypeDefinition = return locations |> Declaration.C2 + |> U2.C1 |> Some - |> success + |> LspResult.success } diff --git a/src/CSharpLanguageServer/Handlers/TypeHierarchy.fs b/src/CSharpLanguageServer/Handlers/TypeHierarchy.fs index 12e7c396..cd2bcdf8 100644 --- a/src/CSharpLanguageServer/Handlers/TypeHierarchy.fs +++ b/src/CSharpLanguageServer/Handlers/TypeHierarchy.fs @@ -5,7 +5,7 @@ open System open Microsoft.CodeAnalysis open Ionide.LanguageServerProtocol.Server open Ionide.LanguageServerProtocol.Types -open Ionide.LanguageServerProtocol.Types.LspResult +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer.Types open CSharpLanguageServer.State @@ -47,8 +47,9 @@ module TypeHierarchy = match! context.FindSymbol p.TextDocument.Uri p.Position with | Some symbol when isTypeSymbol symbol -> let! itemList = TypeHierarchyItem.fromSymbol context.ResolveSymbolLocations symbol - return itemList |> List.toArray |> Some |> success - | _ -> return None |> success + return itemList |> List.toArray |> Some |> LspResult.success + | _ -> + return None |> LspResult.success } let supertypes @@ -66,8 +67,8 @@ module TypeHierarchy = let interfaces = Seq.toList typeSymbol.Interfaces let supertypes = baseType @ interfaces let! items = supertypes |> Seq.map (TypeHierarchyItem.fromSymbol context.ResolveSymbolLocations) |> Async.Parallel - return items |> Seq.collect id |> Seq.toArray |> Some |> success - | _ -> return None |> success + return items |> Seq.collect id |> Seq.toArray |> Some |> LspResult.success + | _ -> return None |> LspResult.success } let subtypes (context: ServerRequestContext) (p: TypeHierarchySubtypesParams) : AsyncLspResult = async { @@ -83,6 +84,7 @@ module TypeHierarchy = |> Async.Parallel |> Async.map (Seq.collect id >> Seq.toList) let! items = subtypes |> Seq.map (TypeHierarchyItem.fromSymbol context.ResolveSymbolLocations) |> Async.Parallel - return items |> Seq.collect id |> Seq.toArray |> Some |> success - | _ -> return None |> success + return items |> Seq.collect id |> Seq.toArray |> Some |> LspResult.success + | _ -> + return None |> LspResult.success } diff --git a/src/CSharpLanguageServer/Handlers/Workspace.fs b/src/CSharpLanguageServer/Handlers/Workspace.fs index 90c84c34..3c057141 100644 --- a/src/CSharpLanguageServer/Handlers/Workspace.fs +++ b/src/CSharpLanguageServer/Handlers/Workspace.fs @@ -4,6 +4,7 @@ open System open System.IO open Ionide.LanguageServerProtocol.Types +open Ionide.LanguageServerProtocol.JsonRpc open Ionide.LanguageServerProtocol.Server open Microsoft.CodeAnalysis.Text diff --git a/src/CSharpLanguageServer/Handlers/WorkspaceSymbol.fs b/src/CSharpLanguageServer/Handlers/WorkspaceSymbol.fs index 833925bc..771347ad 100644 --- a/src/CSharpLanguageServer/Handlers/WorkspaceSymbol.fs +++ b/src/CSharpLanguageServer/Handlers/WorkspaceSymbol.fs @@ -5,7 +5,7 @@ open System open Microsoft.CodeAnalysis open Ionide.LanguageServerProtocol.Server open Ionide.LanguageServerProtocol.Types -open Ionide.LanguageServerProtocol.Types.LspResult +open Ionide.LanguageServerProtocol.JsonRpc open CSharpLanguageServer.State open CSharpLanguageServer.Conversions @@ -53,7 +53,7 @@ module WorkspaceSymbol = |> Seq.toArray |> U2.C1 |> Some - |> success + |> LspResult.success } let resolve (_context: ServerRequestContext) (_p: WorkspaceSymbol) : AsyncLspResult = diff --git a/src/CSharpLanguageServer/Lsp/Client.fs b/src/CSharpLanguageServer/Lsp/Client.fs index 3a6d08a3..2b307937 100644 --- a/src/CSharpLanguageServer/Lsp/Client.fs +++ b/src/CSharpLanguageServer/Lsp/Client.fs @@ -2,7 +2,6 @@ namespace CSharpLanguageServer.Lsp open Ionide.LanguageServerProtocol open Ionide.LanguageServerProtocol.Server -open Ionide.LanguageServerProtocol.Types type CSharpLspClient(sendServerNotification: ClientNotificationSender, sendServerRequest: ClientRequestSender) = inherit LspClient() @@ -37,21 +36,13 @@ type CSharpLspClient(sendServerNotification: ClientNotificationSender, sendServe sendServerRequest.Send "workspace/applyEdit" (box p) override __.WorkspaceSemanticTokensRefresh() = - sendServerNotification "workspace/semanticTokens/refresh" () |> Async.Ignore + sendServerNotification "workspace/semanticTokens/refresh" () override __.TextDocumentPublishDiagnostics(p) = sendServerNotification "textDocument/publishDiagnostics" (box p) |> Async.Ignore - override __.WorkDoneProgressCreate(token) = - let param: WorkDoneProgressCreateParams = { Token = token } - sendServerRequest.Send "window/workDoneProgress/create" (box param) + override __.WindowWorkDoneProgressCreate(createParams) = + sendServerRequest.Send "window/workDoneProgress/create" (box createParams) - override __.Progress(token, data) = - let jtokenFromObject (obj: 'a) = - Newtonsoft.Json.Linq.JToken.FromObject(obj, Ionide.LanguageServerProtocol.Server.jsonRpcFormatter.JsonSerializer) - - let progress: ProgressParams = - { Token = token - Value = jtokenFromObject data } - - sendServerNotification "$/progress" (box progress) |> Async.Ignore + override __.Progress(progressParams) = + sendServerNotification "$/progress" (box progressParams) |> Async.Ignore diff --git a/src/CSharpLanguageServer/Lsp/Server.fs b/src/CSharpLanguageServer/Lsp/Server.fs index 0e71876d..9df5b842 100644 --- a/src/CSharpLanguageServer/Lsp/Server.fs +++ b/src/CSharpLanguageServer/Lsp/Server.fs @@ -4,8 +4,10 @@ open System open System.Diagnostics open System.Threading.Tasks +open Ionide.LanguageServerProtocol.Mappings open Ionide.LanguageServerProtocol.Server open Ionide.LanguageServerProtocol.Types +open Ionide.LanguageServerProtocol.JsonRpc open StreamJsonRpc open CSharpLanguageServer.Types @@ -30,7 +32,7 @@ type CSharpLspServer( settings: ServerSettings ) = - let logger = LogProvider.getLoggerByName "Server" + let _logger = LogProvider.getLoggerByName "Server" let stateActor = MailboxProcessor.Start( serverEventLoop @@ -47,7 +49,7 @@ type CSharpLspServer( fun _ -> do stateActor.Post(PeriodicTimerTick)), null, dueTime=100, period=250)) - let mutable workspaceFolders: WorkspaceFolder list = [] + let mutable _workspaceFolders: WorkspaceFolder list = [] let withContext requestType @@ -185,197 +187,81 @@ type CSharpLspServer( let serverCapabilities = getServerCapabilities p p |> withReadWriteContext (Initialization.handleInitialize lspClient setupTimer serverCapabilities) - override __.Initialized() = + override __.Initialized(_) = () |> withReadWriteContext (Initialization.handleInitialized lspClient stateActor getRegistrations) |> ignoreResult - override __.Shutdown() = - () |> withReadWriteContext Initialization.handleShutdown |> ignoreResult - + override __.Shutdown() = () |> withReadWriteContext Initialization.handleShutdown override __.Exit() = ignoreNotification - - override this.TextDocumentHover(p) = - p |> withReadOnlyContext Hover.handle - - override this.TextDocumentDidOpen(p) = - p |> withReadOnlyContext (TextDocumentSync.didOpen) - |> ignoreResult - - override this.TextDocumentDidChange(p) = - p |> withReadWriteContext (TextDocumentSync.didChange) - |> ignoreResult - - override this.TextDocumentDidClose(p) = - p |> withReadWriteContext (TextDocumentSync.didClose) - |> ignoreResult - - override this.TextDocumentWillSave(p) = - p |> withReadWriteContext TextDocumentSync.willSave - |> ignoreResult - - override this.TextDocumentWillSaveWaitUntil(p) = - p |> withReadWriteContext TextDocumentSync.willSaveWaitUntil - - override this.TextDocumentDidSave(p) = - p |> withReadWriteContext (TextDocumentSync.didSave) - |> ignoreResult - - override this.TextDocumentCompletion(p) = - p |> withReadOnlyContext Completion.handle - - override this.CompletionItemResolve(p) = - p |> withReadOnlyContext Completion.resolve - - override this.TextDocumentPrepareRename(p) = - p |> withReadOnlyContext Rename.prepare - - override this.TextDocumentRename(p) = - p |> withReadOnlyContext Rename.handle - - override this.TextDocumentDefinition(p) = - p |> withReadOnlyContext Definition.handle - - override this.TextDocumentReferences(p) = - p |> withReadOnlyContext References.handle - - override this.TextDocumentDocumentHighlight(p) = - p |> withReadOnlyContext DocumentHighlight.handle - - override this.TextDocumentDocumentLink(p) = - p |> withReadOnlyContext DocumentLink.handle - - override this.DocumentLinkResolve(p) = - p |> withReadOnlyContext DocumentLink.resolve - - override this.TextDocumentTypeDefinition(p) = - p |> withReadOnlyContext TypeDefinition.handle - - override this.TextDocumentImplementation(p) = - p |> withReadOnlyContext Implementation.handle - - override this.TextDocumentCodeAction(p) = - p |> withReadOnlyContext CodeAction.handle - - override this.CodeActionResolve(p) = - p |> withReadOnlyContext CodeAction.resolve - - override this.TextDocumentCodeLens(p) = - p |> withReadOnlyContext CodeLens.handle - - override this.CodeLensResolve(p) = - p |> withReadOnlyContext CodeLens.resolve - - override this.TextDocumentSignatureHelp(p) = - p |> withReadOnlyContext SignatureHelp.handle - - override this.TextDocumentDocumentColor(p) = - p |> withReadOnlyContext Color.handle - - override this.TextDocumentColorPresentation(p) = - p |> withReadOnlyContext Color.present - - override this.TextDocumentFormatting(p) = - p |> withReadOnlyContext DocumentFormatting.handle - - override this.TextDocumentRangeFormatting(p) = - p |> withReadOnlyContext DocumentRangeFormatting.handle - - override this.TextDocumentOnTypeFormatting(p) = - p |> withReadOnlyContext DocumentOnTypeFormatting.handle - - override this.TextDocumentDocumentSymbol(p) = - p |> withReadOnlyContext DocumentSymbol.handle - - override __.WorkspaceDidChangeWatchedFiles(p) = - p |> withReadWriteContext Workspace.didChangeWatchedFiles - |> ignoreResult - + override __.TextDocumentHover(p) = p |> withReadOnlyContext Hover.handle + override __.TextDocumentDidOpen(p) = p |> withReadOnlyContext (TextDocumentSync.didOpen) |> ignoreResult + override __.TextDocumentDidChange(p) = p |> withReadWriteContext (TextDocumentSync.didChange) |> ignoreResult + override __.TextDocumentDidClose(p) = p |> withReadWriteContext (TextDocumentSync.didClose) |> ignoreResult + override __.TextDocumentWillSave(p) = p |> withReadWriteContext TextDocumentSync.willSave |> ignoreResult + override __.TextDocumentWillSaveWaitUntil(p) = p |> withReadWriteContext TextDocumentSync.willSaveWaitUntil + override __.TextDocumentDidSave(p) = p |> withReadWriteContext (TextDocumentSync.didSave) |> ignoreResult + override __.TextDocumentCompletion(p) = p |> withReadOnlyContext Completion.handle + override __.CompletionItemResolve(p) = p |> withReadOnlyContext Completion.resolve + override __.TextDocumentPrepareRename(p) = p |> withReadOnlyContext Rename.prepare + override __.TextDocumentRename(p) = p |> withReadOnlyContext Rename.handle + override __.TextDocumentDefinition(p) = p |> withReadOnlyContext Definition.handle + override __.TextDocumentReferences(p) = p |> withReadOnlyContext References.handle + override __.TextDocumentDocumentHighlight(p) = p |> withReadOnlyContext DocumentHighlight.handle + override __.TextDocumentDocumentLink(p) = p |> withReadOnlyContext DocumentLink.handle + override __.DocumentLinkResolve(p) = p |> withReadOnlyContext DocumentLink.resolve + override __.TextDocumentTypeDefinition(p) = p |> withReadOnlyContext TypeDefinition.handle + override __.TextDocumentImplementation(p) = p |> withReadOnlyContext Implementation.handle + override __.TextDocumentCodeAction(p) = p |> withReadOnlyContext CodeAction.handle + override __.CodeActionResolve(p) = p |> withReadOnlyContext CodeAction.resolve + override __.TextDocumentCodeLens(p) = p |> withReadOnlyContext CodeLens.handle + override __.CodeLensResolve(p) = p |> withReadOnlyContext CodeLens.resolve + override __.TextDocumentSignatureHelp(p) = p |> withReadOnlyContext SignatureHelp.handle + override __.TextDocumentDocumentColor(p) = p |> withReadOnlyContext Color.handle + override __.TextDocumentColorPresentation(p) = p |> withReadOnlyContext Color.present + override __.TextDocumentFormatting(p) = p |> withReadOnlyContext DocumentFormatting.handle + override __.TextDocumentRangeFormatting(p) = p |> withReadOnlyContext DocumentRangeFormatting.handle + override __.TextDocumentOnTypeFormatting(p) = p |> withReadOnlyContext DocumentOnTypeFormatting.handle + override __.TextDocumentDocumentSymbol(p) = p |> withReadOnlyContext DocumentSymbol.handle + override __.WorkspaceDidChangeWatchedFiles(p) = p |> withReadWriteContext Workspace.didChangeWatchedFiles |> ignoreResult override __.WorkspaceDidChangeWorkspaceFolders(_p) = ignoreNotification - - override __.WorkspaceDidChangeConfiguration(p) = - p |> withReadWriteContext Workspace.didChangeConfiguration - |> ignoreResult - - override __.WorkspaceWillCreateFiles(p) = notImplemented - - override __.WorkspaceDidCreateFiles(p) = ignoreNotification - - override __.WorkspaceWillRenameFiles(p) = notImplemented - - override __.WorkspaceDidRenameFiles(p) = ignoreNotification - - override __.WorkspaceWillDeleteFiles(p) = notImplemented - - override __.WorkspaceDidDeleteFiles(p) = ignoreNotification - - override this.WorkspaceSymbol(p) = - p |> withReadOnlyContext WorkspaceSymbol.handle - - override this.WorkspaceExecuteCommand(p) = - p |> withReadOnlyContext ExecuteCommand.handle - - override this.TextDocumentFoldingRange(p) = - p |> withReadOnlyContext FoldingRange.handle - - override this.TextDocumentSelectionRange(p) = - p |> withReadOnlyContext SelectionRange.handle - - override this.TextDocumentSemanticTokensFull(p) = - p |> withReadOnlyContext SemanticTokens.handleFull - - override this.TextDocumentSemanticTokensFullDelta(p) = - p |> withReadOnlyContext SemanticTokens.handleFullDelta - - override this.TextDocumentSemanticTokensRange(p) = - p |> withReadOnlyContext SemanticTokens.handleRange - - override this.TextDocumentInlayHint(p) = - p |> withReadOnlyContext InlayHint.handle - - override this.InlayHintResolve(p) = - p |> withReadOnlyContext InlayHint.resolve - - override __.WorkDoneProgressCancel(p) = ignoreNotification - - override this.TextDocumentInlineValue(p) = notImplemented - - override this.TextDocumentPrepareCallHierarchy(p) = - p |> withReadOnlyContext CallHierarchy.prepare - - override this.CallHierarchyIncomingCalls(p) = - p |> withReadOnlyContext CallHierarchy.incomingCalls - - override this.CallHierarchyOutgoingCalls(p) = - p |> withReadOnlyContext CallHierarchy.outgoingCalls - - override this.TextDocumentPrepareTypeHierarchy(p) = - p |> withReadOnlyContext TypeHierarchy.prepare - - override this.TypeHierarchySupertypes(p) = - p |> withReadOnlyContext TypeHierarchy.supertypes - - override this.TypeHierarchySubtypes(p) = - p |> withReadOnlyContext TypeHierarchy.subtypes - - override this.TextDocumentDeclaration(p) = - p |> withReadOnlyContext Declaration.handle - - override this.WorkspaceDiagnostic(p) = notImplemented - - override this.WorkspaceSymbolResolve(p) = - p |> withReadOnlyContext WorkspaceSymbol.resolve - - override this.TextDocumentDiagnostic(p) = - p |> withReadOnlyContext Diagnostic.handle - - override this.TextDocumentLinkedEditingRange(p) = - p |> withReadOnlyContext LinkedEditingRange.handle - - override this.TextDocumentMoniker(p) = - p |> withReadOnlyContext Moniker.handle - - override this.CSharpMetadata(p) = - p |> withReadOnlyContext CSharpMetadata.handle + override __.WorkspaceDidChangeConfiguration(p) = p |> withReadWriteContext Workspace.didChangeConfiguration |> ignoreResult + override __.WorkspaceWillCreateFiles(_) = notImplemented + override __.WorkspaceDidCreateFiles(_) = ignoreNotification + override __.WorkspaceWillRenameFiles(_) = notImplemented + override __.WorkspaceDidRenameFiles(_) = ignoreNotification + override __.WorkspaceWillDeleteFiles(_) = notImplemented + override __.WorkspaceDidDeleteFiles(_) = ignoreNotification + override __.WorkspaceSymbol(p) = p |> withReadOnlyContext WorkspaceSymbol.handle + override __.WorkspaceExecuteCommand(p) = p |> withReadOnlyContext ExecuteCommand.handle + override __.TextDocumentFoldingRange(p) = p |> withReadOnlyContext FoldingRange.handle + override __.TextDocumentSelectionRange(p) = p |> withReadOnlyContext SelectionRange.handle + override __.TextDocumentSemanticTokensFull(p) = p |> withReadOnlyContext SemanticTokens.handleFull + override __.TextDocumentSemanticTokensFullDelta(p) = p |> withReadOnlyContext SemanticTokens.handleFullDelta + override __.TextDocumentSemanticTokensRange(p) = p |> withReadOnlyContext SemanticTokens.handleRange + override __.TextDocumentInlayHint(p) = p |> withReadOnlyContext InlayHint.handle + override __.InlayHintResolve(p) = p |> withReadOnlyContext InlayHint.resolve + override __.WindowWorkDoneProgressCancel (_) = raise (System.NotImplementedException()) + override __.TextDocumentInlineValue(_) = notImplemented + override __.TextDocumentPrepareCallHierarchy(p) = p |> withReadOnlyContext CallHierarchy.prepare + override __.CallHierarchyIncomingCalls(p) = p |> withReadOnlyContext CallHierarchy.incomingCalls + override __.CallHierarchyOutgoingCalls(p) = p |> withReadOnlyContext CallHierarchy.outgoingCalls + override __.TextDocumentPrepareTypeHierarchy(p) = p |> withReadOnlyContext TypeHierarchy.prepare + override __.TypeHierarchySupertypes(p) = p |> withReadOnlyContext TypeHierarchy.supertypes + override __.TypeHierarchySubtypes(p) = p |> withReadOnlyContext TypeHierarchy.subtypes + override __.TextDocumentDeclaration(p) = p |> withReadOnlyContext Declaration.handle + override __.WorkspaceDiagnostic(_) = notImplemented + override __.CancelRequest(_) = ignoreNotification + override __.NotebookDocumentDidChange(_) = ignoreNotification + override __.NotebookDocumentDidClose(_) = ignoreNotification + override __.NotebookDocumentDidOpen(_) = ignoreNotification + override __.NotebookDocumentDidSave(_) = ignoreNotification + override __.WorkspaceSymbolResolve(p) = p |> withReadOnlyContext WorkspaceSymbol.resolve + override __.TextDocumentDiagnostic(p) = p |> withReadOnlyContext Diagnostic.handle + override __.TextDocumentLinkedEditingRange(p) = p |> withReadOnlyContext LinkedEditingRange.handle + override __.TextDocumentMoniker(p) = p |> withReadOnlyContext Moniker.handle + override __.Progress(_) = ignoreNotification + override __.SetTrace(_) = ignoreNotification + override __.CSharpMetadata(p) = p |> withReadOnlyContext CSharpMetadata.handle module Server = let logger = LogProvider.getLoggerByName "LSP" diff --git a/src/CSharpLanguageServer/ProgressReporter.fs b/src/CSharpLanguageServer/ProgressReporter.fs index c79f2163..4c55edad 100644 --- a/src/CSharpLanguageServer/ProgressReporter.fs +++ b/src/CSharpLanguageServer/ProgressReporter.fs @@ -2,6 +2,7 @@ namespace CSharpLanguageServer open System open Ionide.LanguageServerProtocol +open Ionide.LanguageServerProtocol.Server open Ionide.LanguageServerProtocol.Types type ProgressReporter(client: ILspClient) = @@ -12,7 +13,9 @@ type ProgressReporter(client: ILspClient) = member val Token = ProgressToken.C2 (Guid.NewGuid().ToString()) member this.Begin(title, ?cancellable, ?message, ?percentage) = async { - match! client.WorkDoneProgressCreate this.Token with + let! progressCreateResult = client.WindowWorkDoneProgressCreate({ Token = this.Token }) + + match progressCreateResult with | Error _ -> canReport <- false | Ok() -> @@ -23,7 +26,7 @@ type ProgressReporter(client: ILspClient) = ?message = message, ?percentage = percentage ) - do! client.Progress(this.Token, param) + do! client.Progress({ Token = this.Token; Value = serialize param }) } member this.Report(?cancellable, ?message, ?percentage) = async { @@ -33,7 +36,7 @@ type ProgressReporter(client: ILspClient) = ?message = message, ?percentage = percentage ) - do! client.Progress(this.Token, param) + do! client.Progress({ Token = this.Token; Value = serialize param }) } member this.End(?message) = async { @@ -42,5 +45,5 @@ type ProgressReporter(client: ILspClient) = let param = WorkDoneProgressEnd.Create( ?message = message ) - do! client.Progress(this.Token, param) + do! client.Progress({ Token = this.Token; Value = serialize param }) } diff --git a/src/CSharpLanguageServer/Types.fs b/src/CSharpLanguageServer/Types.fs index 54d7727c..99c7ba44 100644 --- a/src/CSharpLanguageServer/Types.fs +++ b/src/CSharpLanguageServer/Types.fs @@ -2,6 +2,7 @@ module CSharpLanguageServer.Types open Ionide.LanguageServerProtocol open Ionide.LanguageServerProtocol.Types +open Ionide.LanguageServerProtocol.JsonRpc type ServerSettings = { SolutionPath: string option From be7db3b971b5fff75f3b788256e33ac396179b50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Saulius=20Menkevi=C4=8Dius?= Date: Sun, 27 Apr 2025 13:47:28 +0300 Subject: [PATCH 2/3] tests/CSharpLanguageServer.Tests/ReferenceTests.fs: ignore testReferenceWorksToAspNetRazorPageReferencedValue temporarily --- tests/CSharpLanguageServer.Tests/ReferenceTests.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CSharpLanguageServer.Tests/ReferenceTests.fs b/tests/CSharpLanguageServer.Tests/ReferenceTests.fs index dd212baf..7fdb6fb3 100644 --- a/tests/CSharpLanguageServer.Tests/ReferenceTests.fs +++ b/tests/CSharpLanguageServer.Tests/ReferenceTests.fs @@ -89,8 +89,8 @@ let testReferenceWorks() = Assert.AreEqual(expectedLocations2, locations2.Value) - [] +[] let testReferenceWorksToAspNetRazorPageReferencedValue() = use client = setupServerClient defaultClientProfile "TestData/testReferenceWorksToAspNetRazorPageReferencedValue" From ad646f2e35d48bd0cd3088c24d264aaf540ffb9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Saulius=20Menkevi=C4=8Dius?= Date: Sun, 27 Apr 2025 13:53:03 +0300 Subject: [PATCH 3/3] CHANGELOG.md: update --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 65e90f0b..75e36831 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] +* Upgrade Ionide.LanguageServerProtocol to 0.7.0: + - https://github.com/razzmatazz/csharp-language-server/pull/221 * Reduce startup notifications by using "window/logMessage" - By @nikolightsaber in https://github.com/razzmatazz/csharp-language-server/pull/217 * Make sure `.editorconfig` settings are respected, add `csharp.applyFormattingOptions` override (defaults to false):