Description
Your environment
Output of haskell-language-server --probe-tools
or haskell-language-server-wrapper --probe-tools
:
$ haskell-language-server-wrapper --probe-tools
haskell-language-server version: 0.7.1.0 (GHC: 8.10.1) (PATH: /home/hogeyama/.ghcup/bin/haskell-language-server-wrapper-0.7.1) (GIT hash: e4f677e1780fe85a02b99a09404a0a3c3ab5ce7c)
Tool versions found on the $PATH
cabal: 3.2.0.0
stack: Not found
ghc: 8.10.2
Which lsp-client do you use: Neovim (coc.nvim) with the following config.
{
"languageserver": {
"haskell": {
"command": "haskell-language-server-wrapper",
"args": [ "--lsp", "-d", "-l", "/tmp/LanguageServer.log"],
"rootPatterns": ["*.cabal", "stack.yaml", "cabal.project", "package.yaml", "hie.yaml"],
"filetypes": ["haskell", "lhaskell"]
}
}
}
Describe your project (alternative: link to the project): https://gist.github.com/Hogeyama/85901d3debd85f623dd156240e1f7905
Contents of hie.yaml
:
cradle:
cabal:
- path: "./Main.hs"
component: "minimal:exe:minimal"
Steps to reproduce
- Open
Main.hs
withnvim
Expected behaviour
Initialization process is successfully completed.
Actual behaviour
window/logMessage
request message with type=error
is sent to coc.nvim
.
$ cat /tmp/LanguageServer.log
...
2021-01-11 16:55:14.600774131 [ThreadId 5] - ---> {"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":493338,"rootPath":"/home/hogeyama/code/Haskell/minimal","rootUri":"file:///home/hogeyama/code/Haskell/minimal","capabilities":{"workspace":{"applyEdit":true,"workspaceEdit":{"documentChanges":true,"resourceOperations":["create","rename","delete"],"failureHandling":"textOnlyTransactional"},"didChangeConfiguration":{"dynamicRegistration":true},"didChangeWatchedFiles":{"dynamicRegistration":true},"symbol":{"dynamicRegistration":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]},"tagSupport":{"valueSet":[1]}},"executeCommand":{"dynamicRegistration":true},"configuration":true,"workspaceFolders":true},"textDocument":{"publishDiagnostics":{"relatedInformation":true,"versionSupport":false,"tagSupport":{"valueSet":[1,2]}},"synchronization":{"dynamicRegistration":true,"willSave":true,"willSaveWaitUntil":true,"didSave":true},"completion":{"dynamicRegistration":true,"contextSupport":true,"completionItem":{"snippetSupport":true,"commitCharactersSupport":true,"documentationFormat":["markdown","plaintext"],"deprecatedSupport":true,"preselectSupport":true,"tagSupport":{"valueSet":[1]}},"completionItemKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]}},"hover":{"dynamicRegistration":true,"contentFormat":["markdown","plaintext"]},"signatureHelp":{"dynamicRegistration":true,"contextSupport":true,"signatureInformation":{"documentationFormat":["markdown","plaintext"],"activeParameterSupport":true,"parameterInformation":{"labelOffsetSupport":true}}},"definition":{"dynamicRegistration":true},"references":{"dynamicRegistration":true},"documentHighlight":{"dynamicRegistration":true},"documentSymbol":{"dynamicRegistration":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]},"hierarchicalDocumentSymbolSupport":true,"tagSupport":{"valueSet":[1]}},"codeAction":{"dynamicRegistration":true,"isPreferredSupport":true,"codeActionLiteralSupport":{"codeActionKind":{"valueSet":["","quickfix","refactor","refactor.extract","refactor.inline","refactor.rewrite","source","source.organizeImports"]}}},"codeLens":{"dynamicRegistration":true},"formatting":{"dynamicRegistration":true},"rangeFormatting":{"dynamicRegistration":true},"onTypeFormatting":{"dynamicRegistration":true},"rename":{"dynamicRegistration":true,"prepareSupport":true},"documentLink":{"dynamicRegistration":true,"tooltipSupport":true},"typeDefinition":{"dynamicRegistration":true},"implementation":{"dynamicRegistration":true},"declaration":{"dynamicRegistration":true},"colorProvider":{"dynamicRegistration":true},"foldingRange":{"dynamicRegistration":true,"rangeLimit":5000,"lineFoldingOnly":true},"selectionRange":{"dynamicRegistration":true}},"window":{"workDoneProgress":true}},"initializationOptions":{},"trace":"verbose","workspaceFolders":[{"uri":"file:///home/hogeyama/code/Haskell/minimal","name":"minimal"}],"clientInfo":{"name":"coc.nvim","version":"0.0.80"},"workDoneToken":"0998c871-0767-412e-a139-9a633a012e77"}}
2021-01-11 16:55:14.602101108 [ThreadId 5] - haskell-lsp:initializeRequestHandler: setting current dir to project root:/home/hogeyama/code/Haskell/minimal
2021-01-11 16:55:14.603376597 [ThreadId 7] - <--2--{"jsonrpc":"2.0","params":{"type":1,"message":"haskell-lsp:configuration parse error. RequestMessage {_jsonrpc = \"2.0\", _id = IdInt 0, _method = Initialize, _params = InitializeParams {_processId = Just 493338, _rootPath = Just \"/home/hogeyama/code/Haskell/minimal\", _rootUri = Just (Uri {getUri = \"file:///home/hogeyama/code/Haskell/minimal\"}), _initializationOptions = Just (Object (fromList [])), _capabilities = ClientCapabilities {_workspace = Just (WorkspaceClientCapabilities {_applyEdit = Just True, _workspaceEdit = Just (WorkspaceEditClientCapabilities {_documentChanges = Just True}), _didChangeConfiguration = Just (DidChangeConfigurationClientCapabilities {_dynamicRegistration = Just True}), _didChangeWatchedFiles = Just (DidChangeWatchedFilesClientCapabilities {_dynamicRegistration = Just True}), _symbol = Just (SymbolClientCapabilities {_dynamicRegistration = Just True, _symbolKind = Just (SymbolKindClientCapabilities {_valueSet = Just (List [SkFile,SkModule,SkNamespace,SkPackage,SkClass,SkMethod,SkProperty,SkField,SkConstructor,SkEnum,SkInterface,SkFunction,SkVariable,SkConstant,SkString,SkNumber,SkBoolean,SkArray,SkObject,SkKey,SkNull,SkEnumMember,SkStruct,SkEvent,SkOperator,SkTypeParameter])})}), _executeCommand = Just (ExecuteClientCapabilities {_dynamicRegistration = Just True}), _workspaceFolders = Just True, _configuration = Just True}), _textDocument = Just (TextDocumentClientCapabilities {_synchronization = Just (SynchronizationTextDocumentClientCapabilities {_dynamicRegistration = Just True, _willSave = Just True, _willSaveWaitUntil = Just True, _didSave = Just True}), _completion = Just (CompletionClientCapabilities {_dynamicRegistration = Just True, _completionItem = Just (CompletionItemClientCapabilities {_snippetSupport = Just True, _commitCharactersSupport = Just True, _documentationFormat = Just (List [MkMarkdown,MkPlainText]), _deprecatedSupport = Just True, _preselectSupport = Just True, _tagSupport = Just (CompletionItemTagsClientCapabilities {_valueSet = List [CtDeprecated]})}), _completionItemKind = Just (CompletionItemKindClientCapabilities {_valueSet = Just (List [CiText,CiMethod,CiFunction,CiConstructor,CiField,CiVariable,CiClass,CiInterface,CiModule,CiProperty,CiUnit,CiValue,CiEnum,CiKeyword,CiSnippet,CiColor,CiFile,CiReference,CiFolder,CiEnumMember,CiConstant,CiStruct,CiEvent,CiOperator,CiTypeParameter])}), _contextSupport = Just True}), _hover = Just (HoverClientCapabilities {_dynamicRegistration = Just True, _contentFormat = Just (List [MkMarkdown,MkPlainText])}), _signatureHelp = Just (SignatureHelpClientCapabilities {_dynamicRegistration = Just True, _signatureInformation = Just (SignatureInformationClientCapabilities {documentationFormat = Nothing})}), _references = Just (ReferencesClientCapabilities {_dynamicRegistration = Just True}), _documentHighlight = Just (DocumentHighlightClientCapabilities {_dynamicRegistration = Just True}), _documentSymbol = Just (DocumentSymbolClientCapabilities {_dynamicRegistration = Just True, _symbolKind = Just (DocumentSymbolKindClientCapabilities {_valueSet = Just (List [SkFile,SkModule,SkNamespace,SkPackage,SkClass,SkMethod,SkProperty,SkField,SkConstructor,SkEnum,SkInterface,SkFunction,SkVariable,SkConstant,SkString,SkNumber,SkBoolean,SkArray,SkObject,SkKey,SkNull,SkEnumMember,SkStruct,SkEvent,SkOperator,SkTypeParameter])}), _hierarchicalDocumentSymbolSupport = Just True}), _formatting = Just (FormattingClientCapabilities {_dynamicRegistration = Just True}), _rangeFormatting = Just (RangeFormattingClientCapabilities {_dynamicRegistration = Just True}), _onTypeFormatting = Just (OnTypeFormattingClientCapabilities {_dynamicRegistration = Just True}), _definition = Just (DefinitionClientCapabilities {_dynamicRegistration = Just True}), _typeDefinition = Just (TypeDefinitionClientCapabilities {_dynamicRegistration = Just True}), _implementation = Just (ImplementationClientCapabilities {_dynamicRegistration = Just True}), _codeAction = Just (CodeActionClientCapabilities {_dynamicRegistration = Just True, _codeActionLiteralSupport = Just (CodeActionLiteralSupport {_codeActionKind = CodeActionKindClientCapabilities {_valueSet = List [CodeActionUnknown \"\",CodeActionQuickFix,CodeActionRefactor,CodeActionRefactorExtract,CodeActionRefactorInline,CodeActionRefactorRewrite,CodeActionSource,CodeActionSourceOrganizeImports]}})}), _codeLens = Just (CodeLensClientCapabilities {_dynamicRegistration = Just True}), _documentLink = Just (DocumentLinkClientCapabilities {_dynamicRegistration = Just True}), _colorProvider = Just (ColorProviderClientCapabilities {_dynamicRegistration = Just True}), _rename = Just (RenameClientCapabilities {_dynamicRegistration = Just True, _prepareSupport = Just True}), _publishDiagnostics = Just (PublishDiagnosticsClientCapabilities {_relatedInformation = Just True, _tagSupport = Just (PublishDiagnosticsTagsClientCapabilities {_valueSet = List [DtUnnecessary,DtDeprecated]})}), _foldingRange = Just (FoldingRangeClientCapabilities {_dynamicRegistration = Just True, _rangeLimit = Just 5000, _lineFoldingOnly = Just True})}), _window = Just (WindowClientCapabilities {_workDoneProgress = Just True}), _experimental = Nothing}, _trace = Just TraceVerbose, _workspaceFolders = Just (List [WorkspaceFolder {_uri = \"file:///home/hogeyama/code/Haskell/minimal\", _name = \"minimal\"}])}} \"key \\\"languageServerHaskell\\\" not found\""},"method":"window/logMessage"}
...
Include debug information
Execute in the root of your project the command haskell-language-server --debug .
and paste the logs here:
Debug output:
$ haskell-language-server-wrapper --debug .
Found "/home/hogeyama/code/Haskell/minimal/hie.yaml" for "/home/hogeyama/code/Haskell/minimal/a"
Module "/home/hogeyama/code/Haskell/minimal/a" is loaded by Cradle: Cradle {cradleRootDir = "/home/hogeyama/code/Haskell/minimal", cradleOptsProg = CradleAction: Cabal}
Run entered for haskell-language-server-wrapper(haskell-language-server-wrapper) Version 0.7.1.0, Git revision e4f677e1780fe85a02b99a09404a0a3c3ab5ce7c (dirty) x86_64 ghc-8.10.1
Current directory: /home/hogeyama/code/Haskell/minimal
Operating system: linux
Arguments: ["--debug","."]
Cradle directory: /home/hogeyama/code/Haskell/minimal
Cradle type: Cabal
Tool versions found on the $PATH
cabal: 3.2.0.0
stack: Not found
ghc: 8.10.2
Consulting the cradle to get project GHC version...
Project GHC version: 8.10.2
haskell-language-server exe candidates: ["haskell-language-server-8.10.2","haskell-language-server-8.10","haskell-language-server"]
Launching haskell-language-server exe at:/home/hogeyama/.nix-profile/bin/haskell-language-server-8.10.2
haskell-language-server version: 0.7.1.0 (GHC: 8.10.2) (PATH: /nix/store/fsfzznrzcbcd30sa1zzczccvx4bx5ac1-haskell-language-server-ghc8102/bin/haskell-language-server)
(haskell-language-server)Ghcide setup tester in /home/hogeyama/code/Haskell/minimal.
Report bugs at https://github.com/haskell/haskell-language-server/issues
Tool versions found on the $PATH
cabal: 3.2.0.0
stack: Not found
ghc: 8.10.2
Step 1/4: Finding files to test in /home/hogeyama/code/Haskell/minimal
Found 1 files
Step 2/4: Looking for hie.yaml files that control setup
Found 1 cradle
Step 3/4: Initializing the IDE
Step 4/4: Type checking the files
[INFO] Consulting the cradle for "Main.hs"
Output from setting up the cradle Cradle {cradleRootDir = "/home/hogeyama/code/Haskell/minimal", cradleOptsProg = CradleAction: Cabal}
> Resolving dependencies...
> Build profile: -w ghc-8.10.2 -O1
> In order, the following will be built (use -v for more details):
> - minimal-0.1.0.0 (exe:minimal) (configuration changed)
> Configuring executable 'minimal' for minimal-0.1.0.0..
> Warning: The 'license-file' field refers to the file 'LICENSE' which does not
> exist.
> Preprocessing executable 'minimal' for minimal-0.1.0.0..
[INFO] Using interface files cache dir: ghcide
[INFO] Making new HscEnv[main]
[INFO] finish: User TypeCheck (took 0.04s)
Completed (1 file worked, 0 files failed)
Paste the logs from the lsp-client, e.g. for VS Code
I don't know how to show log in coc.nvim, sorry.
Cause
When initializationOptions
field is omitted in coc-settings.json
, coc.nvim
includes initializationOptions: {}
in the InitializeParams
. See this line for example.
As a result, hls
receives InitializeParams { _initializationOptions = Just (Object (fromList [])), ..}
and getInitialConfig
fails.
This is not a problem only for coc.nvim
because other lsp clients such as vim-lsp suggest writing initializationOptions: {}
in the configuration file.
A possible solution would be to modify parseJSON @Config
so that it returns def @Config
if the object has neither "haskell"
nor languageServerHaskell
field.
I will make PR if it is OK.