From b428feb780730b304815e35fc14f3dff8d7d6e20 Mon Sep 17 00:00:00 2001 From: Erik Kinnunen Date: Thu, 19 Oct 2023 19:53:47 +0300 Subject: [PATCH] feat(language-server): use a config variable to store configuration changes When using for example the neovim language server client, the contextive language server does not acquire the proper settings sent by the client in the `OnStarted` handler. However, the settings are passed correctly using the `OnDidChangeConfiguration` handler. This change introduces a scoped variable in the server start function to hold a mutable field for the Contextive path configuration. The configuration variable is initialized with the default path for Contextive definitions introduced in commit 23f9049. If the language configuration does not have a config value, it will use the value from the configuration variable instead. This works the same way as it did previously, but the source is now a parameter of the function. --- .../Configuration.fs | 7 ++++++- .../Contextive.LanguageServer/Definitions.fs | 4 +--- .../Contextive.LanguageServer/Server.fs | 19 +++++++++++-------- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/language-server/Contextive.LanguageServer/Configuration.fs b/src/language-server/Contextive.LanguageServer/Configuration.fs index edb81bdb..e514c14f 100644 --- a/src/language-server/Contextive.LanguageServer/Configuration.fs +++ b/src/language-server/Contextive.LanguageServer/Configuration.fs @@ -1,6 +1,7 @@ module Contextive.LanguageServer.Configuration open System.Threading.Tasks +open OmniSharp.Extensions.LanguageServer.Protocol.Models let resolvedPathGetter configGetter pathResolver () = async { @@ -8,6 +9,10 @@ let resolvedPathGetter configGetter pathResolver () = return pathResolver path } -let handler (definitionsLoader: Definitions.Reloader) _ = +type Config = { mutable Path: string option } + +let handler (config: Config) (definitionsLoader: Definitions.Reloader) (configParams: DidChangeConfigurationParams) = + let path = configParams.Settings.Item("contextive").Item("path") + config.Path <- Some(path.ToString()) definitionsLoader () Task.CompletedTask diff --git a/src/language-server/Contextive.LanguageServer/Definitions.fs b/src/language-server/Contextive.LanguageServer/Definitions.fs index 39043b2a..1f3d1abc 100644 --- a/src/language-server/Contextive.LanguageServer/Definitions.fs +++ b/src/language-server/Contextive.LanguageServer/Definitions.fs @@ -136,9 +136,7 @@ module private Handle = let matchOpenFileUri = matchGlobs findMsg.OpenFileUri let foundContexts = - state.Definitions.Contexts - |> Seq.filter matchOpenFileUri - |> findMsg.Filter + state.Definitions.Contexts |> Seq.filter matchOpenFileUri |> findMsg.Filter findMsg.ReplyChannel.Reply foundContexts state diff --git a/src/language-server/Contextive.LanguageServer/Server.fs b/src/language-server/Contextive.LanguageServer/Server.fs index d8a1a3ce..d4b0a0ba 100644 --- a/src/language-server/Contextive.LanguageServer/Server.fs +++ b/src/language-server/Contextive.LanguageServer/Server.fs @@ -25,7 +25,7 @@ let version = .GetCustomAttribute() .InformationalVersion -let private getConfig (s: ILanguageServer) section key = +let private getConfig (s: ILanguageServer) (contextiveConfig: Configuration.Config) section key = async { Log.Logger.Information $"Getting {section} {key} config..." @@ -38,7 +38,7 @@ let private getConfig (s: ILanguageServer) section key = let value = if System.String.IsNullOrEmpty configValue then match key with - | key when key = pathKey -> Some defaultContextiveDefinitionsPath + | key when key = pathKey -> contextiveConfig.Path | _ -> None else Some configValue @@ -89,11 +89,13 @@ let private showSurveyPrompt (s: ILanguageServer) = let private onStartupShowSurveyPrompt = OnLanguageServerStartedDelegate(fun (s: ILanguageServer) _cancellationToken -> showSurveyPrompt (s)) -let private onStartupConfigureServer definitions = +let private onStartupConfigureServer definitions config = OnLanguageServerStartedDelegate(fun (s: ILanguageServer) _cancellationToken -> async { s.Window.LogInfo $"Starting {name} v{version}..." - let configGetter () = getConfig s configSection pathKey + + let configGetter () = + getConfig s config configSection pathKey // Not sure if this is needed to ensure configuration is loaded, or allow a task/context switch // Either way, if it's not here, then getWorkspaceFolder returns null let! _ = configGetter () @@ -122,15 +124,16 @@ let private onStartupConfigureServer definitions = |> Async.StartAsTask :> Task) - let private configureServer (input: Stream) (output: Stream) (opts: LanguageServerOptions) = let definitions = Definitions.create () + let contextiveConfig: Configuration.Config = + { Path = Some defaultContextiveDefinitionsPath } + opts .WithInput(input) .WithOutput(output) - - .OnStarted(onStartupConfigureServer definitions) + .OnStarted(onStartupConfigureServer definitions contextiveConfig) .OnStarted(onStartupShowSurveyPrompt) .WithConfigurationSection(configSection) // Add back in when implementing didConfigurationChanged handling .ConfigureLogging(fun z -> @@ -141,7 +144,7 @@ let private configureServer (input: Stream) (output: Stream) (opts: LanguageServ |> ignore) .WithServerInfo(ServerInfo(Name = name, Version = version)) - .OnDidChangeConfiguration(Configuration.handler <| Definitions.loader definitions) + .OnDidChangeConfiguration((Configuration.handler (contextiveConfig)) <| Definitions.loader definitions) .OnCompletion( Completion.handler <| Definitions.find definitions <| TextDocument.findToken, Completion.registrationOptions