@@ -22,6 +22,7 @@ namespace FSharp.VisualStudio.Extension;
22
22
using Microsoft . VisualStudio . Extensibility ;
23
23
using Microsoft . VisualStudio . Extensibility . Editor ;
24
24
using Microsoft . VisualStudio . Extensibility . LanguageServer ;
25
+ using Microsoft . VisualStudio . Extensibility . Settings ;
25
26
using Microsoft . VisualStudio . LanguageServer . Protocol ;
26
27
using Microsoft . VisualStudio . ProjectSystem . Query ;
27
28
using Microsoft . VisualStudio . RpcContracts . LanguageServerProvider ;
@@ -41,14 +42,17 @@ internal static class Extensions
41
42
42
43
internal class VsServerCapabilitiesOverride : IServerCapabilitiesOverride
43
44
{
44
- public ServerCapabilities OverrideServerCapabilities ( ServerCapabilities value )
45
+ public ServerCapabilities OverrideServerCapabilities ( FSharpLanguageServerConfig config , ServerCapabilities value , ClientCapabilities clientCapabilities )
45
46
{
46
47
var capabilities = new VSInternalServerCapabilities
47
48
{
48
49
TextDocumentSync = value . TextDocumentSync ,
49
50
SupportsDiagnosticRequests = true ,
50
51
ProjectContextProvider = true ,
51
- DiagnosticProvider = new ( )
52
+ DiagnosticProvider =
53
+ config . EnabledFeatures . Diagnostics ?
54
+
55
+ new ( )
52
56
{
53
57
SupportsMultipleContextsDiagnostics = true ,
54
58
DiagnosticKinds = [
@@ -67,8 +71,8 @@ public ServerCapabilities OverrideServerCapabilities(ServerCapabilities value)
67
71
//new(PullDiagnosticCategories.DocumentAnalyzerSyntax),
68
72
//new(PullDiagnosticCategories.DocumentAnalyzerSemantic),
69
73
]
70
- } ,
71
- SemanticTokensOptions = new ( )
74
+ } : null ,
75
+ SemanticTokensOptions = config . EnabledFeatures . SemanticHighlighting ? new ( )
72
76
{
73
77
Legend = new ( )
74
78
{
@@ -80,7 +84,7 @@ public ServerCapabilities OverrideServerCapabilities(ServerCapabilities value)
80
84
Delta = false
81
85
} ,
82
86
Range = false
83
- }
87
+ } : null ,
84
88
//,
85
89
//HoverProvider = new HoverOptions()
86
90
//{
@@ -268,6 +272,41 @@ internal class FSharpLanguageServerProvider : LanguageServerProvider
268
272
269
273
FSharp . Compiler . LanguageServer . Activity . listenToSome ( ) ;
270
274
275
+ #pragma warning disable VSEXTPREVIEW_SETTINGS // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.
276
+
277
+ // Write default settings unless they're overridden. Otherwise users can't even find which settings exist.
278
+
279
+ var settingsReadResult = await this . Extensibility . Settings ( ) . ReadEffectiveValuesAsync ( FSharpExtensionSettings . AllStringSettings , cancellationToken ) ;
280
+
281
+ var settingValues = FSharpExtensionSettings . AllStringSettings . Select (
282
+ setting => ( setting , settingsReadResult . ValueOrDefault ( setting , defaultValue : FSharpExtensionSettings . UNSET ) ) ) ;
283
+
284
+ foreach ( var ( setting , value ) in settingValues . Where ( x => x . Item2 == FSharpExtensionSettings . UNSET ) )
285
+ {
286
+ await this . Extensibility . Settings ( ) . WriteAsync ( batch =>
287
+ batch . WriteSetting ( setting , FSharpExtensionSettings . BOTH ) , "write default settings" , cancellationToken ) ;
288
+ }
289
+
290
+ var enabled = new [ ] { FSharpExtensionSettings . LSP , FSharpExtensionSettings . BOTH } ;
291
+
292
+ var serverConfig = new FSharpLanguageServerConfig (
293
+ new FSharpLanguageServerFeatures (
294
+ diagnostics : enabled . Contains ( settingsReadResult . ValueOrDefault ( FSharpExtensionSettings . GetDiagnosticsFrom , defaultValue : FSharpExtensionSettings . BOTH ) ) ,
295
+ semanticHighlighting : enabled . Contains ( settingsReadResult . ValueOrDefault ( FSharpExtensionSettings . GetSemanticHighlightingFrom , defaultValue : FSharpExtensionSettings . BOTH ) )
296
+ ) ) ;
297
+
298
+ var disposeToEndSubscription =
299
+ this . Extensibility . Settings ( ) . SubscribeAsync (
300
+ [ FSharpExtensionSettings . FSharpCategory ] ,
301
+ cancellationToken ,
302
+ changeHandler : result =>
303
+ {
304
+ Trace . TraceInformation ( $ "Settings update", result ) ;
305
+ } ) ;
306
+
307
+ #pragma warning restore VSEXTPREVIEW_SETTINGS // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.
308
+
309
+
271
310
//const string vsMajorVersion = "17.0";
272
311
273
312
//var settings = OpenTelemetryExporterSettingsBuilder
@@ -333,8 +372,7 @@ internal class FSharpLanguageServerProvider : LanguageServerProvider
333
372
// observer.ProcessProject(project);
334
373
}
335
374
336
-
337
- var ( ( inputStream , outputStream ) , _server ) = FSharpLanguageServer . Create ( workspace , ( serviceCollection ) =>
375
+ var ( ( inputStream , outputStream ) , _server ) = FSharpLanguageServer . Create ( workspace , serverConfig , ( serviceCollection ) =>
338
376
{
339
377
serviceCollection . AddSingleton < IServerCapabilitiesOverride , VsServerCapabilitiesOverride > ( ) ;
340
378
serviceCollection . AddSingleton < IMethodHandler , VsDiagnosticsHandler > ( ) ;
@@ -357,7 +395,7 @@ internal class FSharpLanguageServerProvider : LanguageServerProvider
357
395
return new DuplexPipe (
358
396
PipeReader . Create ( inputStream ) ,
359
397
PipeWriter . Create ( outputStream ) ) ;
360
- }
398
+ }
361
399
362
400
/// <inheritdoc/>
363
401
public override Task OnServerInitializationResultAsync ( ServerInitializationResult serverInitializationResult , LanguageServerInitializationFailureInfo ? initializationFailureInfo , CancellationToken cancellationToken )
0 commit comments