Skip to content

Commit d13a7e9

Browse files
authored
Refactor Roslyn helpers and conversions (#282)
* Add CSharpLanguageServer.Roslyn.WorkspaceServices * Extract solution functions to CSharpLanguageServer.Roslyn.Solution * Extract CSharpLanguageServer.Roslyn.Symbol functions * CSharpLanguageServer.Conversions: move CompletionContext.toCompletionTrigger inside CSharpLanguageServer.Handlers.Completion.handle * Move CSharpLanguageServer.Conversions -> CSharpLanguageServer.Roslyn.Conversions -> * Move CSharpLanguageServer.FormatUtil -> CSharpLanguageServer.Roslyn.Document * CSharpLanguageServer.Handlers.Hover: rewrite in a more functional approach * CSharpLanguageServer.Handlers.DocumentFormatting: rewrite in a more functional approach * CSharpLanguageServer.Handlers.Implementation: rewrite in a more functional approach * Apply fantomas * Move documentFromMetadata to CSharpLanguageServer.Roslyn.Document * src/CSharpLanguageServer/ProgressReporter.fs -> src/CSharpLanguageServer/Lsp/ProgressReporter.fs
1 parent 45620bd commit d13a7e9

40 files changed

+1166
-1089
lines changed

src/CSharpLanguageServer/CSharpLanguageServer.fsproj

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,13 @@
2323
<ItemGroup>
2424
<Compile Include="Logging.fs" />
2525
<Compile Include="Util.fs" />
26-
<Compile Include="Conversions.fs" />
2726
<Compile Include="Types.fs" />
28-
<Compile Include="FormatUtil.fs" />
29-
<Compile Include="ProgressReporter.fs" />
30-
<Compile Include="RoslynHelpers.fs" />
27+
<Compile Include="Lsp/ProgressReporter.fs" />
28+
<Compile Include="Roslyn/Conversions.fs" />
29+
<Compile Include="Roslyn/WorkspaceServices.fs" />
30+
<Compile Include="Roslyn/Solution.fs" />
31+
<Compile Include="Roslyn/Document.fs" />
32+
<Compile Include="Roslyn/Symbol.fs" />
3133
<Compile Include="DocumentationUtil.fs" />
3234
<Compile Include="Diagnostics.fs" />
3335
<Compile Include="Lsp/Client.fs" />

src/CSharpLanguageServer/Diagnostics.fs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ open Ionide.LanguageServerProtocol.JsonRpc
88

99
open CSharpLanguageServer.Types
1010
open CSharpLanguageServer.Logging
11-
open CSharpLanguageServer.RoslynHelpers
11+
open CSharpLanguageServer.Roslyn.Solution
1212

1313
module Diagnostics =
1414
let private logger = Logging.getLoggerByName "Diagnostics"
@@ -58,13 +58,13 @@ module Diagnostics =
5858
let diagnose (settings: ServerSettings) : Async<int> = async {
5959
logger.LogDebug("diagnose: settings={settings}", settings)
6060

61-
initializeMSBuild logger
61+
initializeMSBuild ()
6262

6363
logger.LogDebug("diagnose: loading solution..")
6464

6565
let lspClient = new LspClientStub()
6666
let cwd = string (Directory.GetCurrentDirectory())
67-
let! _sln = loadSolutionOnSolutionPathOrDir lspClient logger None cwd
67+
let! _sln = solutionLoadSolutionWithPathOrOnCwd lspClient None cwd
6868

6969
logger.LogDebug("diagnose: done")
7070

src/CSharpLanguageServer/DocumentationUtil.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ open System.Xml.Linq
55

66
open Microsoft.CodeAnalysis
77

8-
open CSharpLanguageServer.Conversions
8+
open CSharpLanguageServer.Roslyn.Conversions
99

1010
module DocumentationUtil =
1111
type TripleSlashComment =

src/CSharpLanguageServer/FormatUtil.fs

Lines changed: 0 additions & 104 deletions
This file was deleted.

src/CSharpLanguageServer/Handlers/CallHierarchy.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ open Ionide.LanguageServerProtocol.Types
66
open Ionide.LanguageServerProtocol.JsonRpc
77

88
open CSharpLanguageServer.State
9-
open CSharpLanguageServer.Conversions
9+
open CSharpLanguageServer.Roslyn.Conversions
1010

1111
[<RequireQualifiedAccess>]
1212
module CallHierarchy =

src/CSharpLanguageServer/Handlers/CodeAction.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ open Ionide.LanguageServerProtocol.JsonRpc
1818
open Microsoft.Extensions.Logging
1919

2020
open CSharpLanguageServer.Logging
21-
open CSharpLanguageServer.Conversions
21+
open CSharpLanguageServer.Roslyn.Conversions
2222
open CSharpLanguageServer.State
2323
open CSharpLanguageServer.Util
2424

src/CSharpLanguageServer/Handlers/CodeLens.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ open Ionide.LanguageServerProtocol.Types
99
open Ionide.LanguageServerProtocol.JsonRpc
1010

1111
open CSharpLanguageServer.State
12-
open CSharpLanguageServer.Conversions
12+
open CSharpLanguageServer.Roslyn.Conversions
1313

1414
type private DocumentSymbolCollectorForCodeLens(semanticModel: SemanticModel) =
1515
inherit CSharpSyntaxWalker(SyntaxWalkerDepth.Token)

src/CSharpLanguageServer/Handlers/Completion.fs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ open Ionide.LanguageServerProtocol.JsonRpc
1010

1111
open CSharpLanguageServer.State
1212
open CSharpLanguageServer.Util
13-
open CSharpLanguageServer.Conversions
13+
open CSharpLanguageServer.Roslyn.Conversions
1414
open CSharpLanguageServer.Logging
1515

1616
[<RequireQualifiedAccess>]
@@ -202,7 +202,19 @@ module Completion =
202202
|> _.WithBool("ShowItemsFromUnimportedNamespaces", false)
203203
|> _.WithBool("ShowNameSuggestions", false)
204204

205-
let completionTrigger = CompletionContext.toCompletionTrigger p.Context
205+
let completionTrigger =
206+
p.Context
207+
|> Option.bind (fun ctx ->
208+
match ctx.TriggerKind with
209+
| CompletionTriggerKind.Invoked
210+
| CompletionTriggerKind.TriggerForIncompleteCompletions ->
211+
Some Microsoft.CodeAnalysis.Completion.CompletionTrigger.Invoke
212+
| CompletionTriggerKind.TriggerCharacter ->
213+
ctx.TriggerCharacter
214+
|> Option.map Seq.head
215+
|> Option.map Microsoft.CodeAnalysis.Completion.CompletionTrigger.CreateInsertionTrigger
216+
| _ -> None)
217+
|> Option.defaultValue Microsoft.CodeAnalysis.Completion.CompletionTrigger.Invoke
206218

207219
let shouldTriggerCompletion =
208220
p.Context

src/CSharpLanguageServer/Handlers/Diagnostic.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ open Ionide.LanguageServerProtocol.Server
55
open Ionide.LanguageServerProtocol.Types
66
open Ionide.LanguageServerProtocol.JsonRpc
77

8-
open CSharpLanguageServer.Conversions
8+
open CSharpLanguageServer.Roslyn.Conversions
99
open CSharpLanguageServer.State
1010
open CSharpLanguageServer.Types
1111

src/CSharpLanguageServer/Handlers/DocumentFormatting.fs

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,30 @@ open Microsoft.CodeAnalysis.Formatting
44
open Ionide.LanguageServerProtocol.Types
55
open Ionide.LanguageServerProtocol.JsonRpc
66

7-
open CSharpLanguageServer
87
open CSharpLanguageServer.State
8+
open CSharpLanguageServer.Util
9+
open CSharpLanguageServer.Roslyn.Document
910

1011
[<RequireQualifiedAccess>]
12+
1113
module DocumentFormatting =
12-
let provider (clientCapabilities: ClientCapabilities) : U2<bool, DocumentFormattingOptions> option =
13-
Some(U2.C1 true)
14+
let provider (_cc: ClientCapabilities) : U2<bool, DocumentFormattingOptions> option = Some(U2.C1 true)
1415

15-
let handle (context: ServerRequestContext) (p: DocumentFormattingParams) : AsyncLspResult<TextEdit[] option> = async {
16-
match context.GetUserDocument p.TextDocument.Uri with
17-
| None -> return None |> LspResult.success
18-
| Some doc ->
19-
let! ct = Async.CancellationToken
20-
let! options = FormatUtil.getFormattingOptions context.State.Settings doc p.Options
21-
let! newDoc = Formatter.FormatAsync(doc, options, cancellationToken = ct) |> Async.AwaitTask
22-
let! textEdits = FormatUtil.getChanges newDoc doc
23-
return textEdits |> Some |> LspResult.success
16+
let formatDocument lspFormattingOptions doc : Async<TextEdit array option> = async {
17+
let! ct = Async.CancellationToken
18+
let! options = getDocumentFormattingOptionSet doc lspFormattingOptions
19+
let! newDoc = Formatter.FormatAsync(doc, options, cancellationToken = ct) |> Async.AwaitTask
20+
let! textEdits = getDocumentDiffAsLspTextEdits newDoc doc
21+
return textEdits |> Some
2422
}
23+
24+
let handle (context: ServerRequestContext) (p: DocumentFormattingParams) : AsyncLspResult<TextEdit[] option> =
25+
let formatDocument =
26+
p.Options
27+
|> context.State.Settings.GetEffectiveFormattingOptions
28+
|> formatDocument
29+
30+
context.GetUserDocument p.TextDocument.Uri
31+
|> async.Return
32+
|> Async.bindOption formatDocument
33+
|> Async.map LspResult.success

0 commit comments

Comments
 (0)