elixir-lsp/elixir-ls

[OTP26][Windows] 0.15.1 crash or hang on start

princemaple opened this issue · 14 comments

Environment

  • Elixir & Erlang versions (elixir --version): elixir 1.15.0-otp-26, erlang otp 26.0.2
  • Elixir Language Server version: 0.15.1
  • Operating system: win11
  • Editor or IDE name (e.g. Emacs/VSCode): Sublime
  • Editor Plugin/LSP Client name and version: LSP, LSP-elixir

Current behavior

Crash after

:: [13:39:35.001] --> lsp-elixir initialize (1): {'rootUri': 'file:///C:/Users/chenp/code/REDACTED', 'workspaceFolders': [{'uri': 'file:///C:/Users/chenp/code/REDACTED', 'name': 'REDACTED'}], 'processId': 44792, 'rootPath': 'C:\\Users\\chenp\\code\\REDACTED', 'clientInfo': {'version': '1.24.0', 'name': 'Sublime Text LSP'}, 'initializationOptions': {}, 'capabilities': {'workspace': {'workspaceEdit': {'failureHandling': 'abort', 'documentChanges': True}, 'didChangeConfiguration': {'dynamicRegistration': True}, 'codeLens': {'refreshSupport': True}, 'semanticTokens': {'refreshSupport': True}, 'inlayHint': {'refreshSupport': True}, 'workspaceFolders': True, 'diagnostics': {'refreshSupport': True}, 'executeCommand': {}, 'applyEdit': True, 'configuration': True, 'symbol': {'symbolKind': {'valueSet': [20, 6, 3, 1, 22, 12, 10, 13, 17, 24, 25, 23, 26, 18, 19, 2, 5, 15, 7, 8, 4, 11, 16, 9, 14, 21]}, 'dynamicRegistration': True, 'tagSupport': {'valueSet': [1]}}}, 'textDocument': {'declaration': {'dynamicRegistration': True, 'linkSupport': True}, 'rangeFormatting': {'dynamicRegistration': True}, 'rename': {'prepareSupport': True, 'dynamicRegistration': True, 'prepareSupportDefaultBehavior': 1}, 'implementation': {'dynamicRegistration': True, 'linkSupport': True}, 'synchronization': {'dynamicRegistration': True, 'willSave': True, 'willSaveWaitUntil': True, 'didSave': True}, 'diagnostic': {'dynamicRegistration': True, 'relatedDocumentSupport': True}, 'colorProvider': {'dynamicRegistration': True}, 'codeLens': {'dynamicRegistration': True}, 'publishDiagnostics': {'dataSupport': True, 'relatedInformation': True, 'versionSupport': True, 'codeDescriptionSupport': True, 'tagSupport': {'valueSet': [1, 2]}}, 'documentHighlight': {'dynamicRegistration': True}, 'selectionRange': {'dynamicRegistration': True}, 'definition': {'dynamicRegistration': True, 'linkSupport': True}, 'codeAction': {'dataSupport': True, 'dynamicRegistration': True, 'isPreferredSupport': True, 'resolveSupport': {'properties': ['edit']}, 'codeActionLiteralSupport': {'codeActionKind': {'valueSet': ['quickfix', 'refactor', 'refactor.extract', 'refactor.inline', 'refactor.rewrite', 'source.fixAll', 'source.organizeImports']}}}, 'documentSymbol': {'symbolKind': {'valueSet': [20, 6, 3, 1, 22, 12, 10, 13, 17, 24, 25, 23, 26, 18, 19, 2, 5, 15, 7, 8, 4, 11, 16, 9, 14, 21]}, 'dynamicRegistration': True, 'hierarchicalDocumentSymbolSupport': True, 'tagSupport': {'valueSet': [1]}}, 'typeDefinition': {'dynamicRegistration': True, 'linkSupport': True}, 'formatting': {'dynamicRegistration': True}, 'inlayHint': {'dynamicRegistration': True, 'resolveSupport': {'properties': ['textEdits', 'label.command']}}, 'signatureHelp': {'dynamicRegistration': True, 'contextSupport': True, 'signatureInformation': {'parameterInformation': {'labelOffsetSupport': True}, 'activeParameterSupport': True, 'documentationFormat': ['markdown', 'plaintext']}}, 'completion': {'dynamicRegistration': True, 'completionItemKind': {'valueSet': [19, 15, 18, 2, 17, 20, 3, 1, 13, 14, 23, 24, 22, 25, 9, 7, 12, 10, 5, 8, 4, 16, 6, 21, 11]}, 'completionList': {'itemDefaults': ['editRange', 'insertTextFormat', 'data']}, 'completionItem': {'snippetSupport': True, 'insertTextModeSupport': {'valueSet': [2]}, 'resolveSupport': {'properties': ['detail', 'documentation', 'additionalTextEdits']}, 'labelDetailsSupport': True, 'documentationFormat': ['markdown', 'plaintext'], 'deprecatedSupport': True, 'insertReplaceSupport': True, 'tagSupport': {'valueSet': [1]}}, 'insertTextMode': 2}, 'typeHierarchy': {'dynamicRegistration': True}, 'documentLink': {'dynamicRegistration': True, 'tooltipSupport': True}, 'semanticTokens': {'formats': ['relative'], 'multilineTokenSupport': True, 'tokenTypes': ['modifier', 'method', 'namespace', 'typeParameter', 'enumMember', 'function', 'enum', 'variable', 'event', 'property', 'decorator', 'operator', 'struct', 'comment', 'type', 'class', 'string', 'macro', 'interface', 'number', 'keyword', 'regexp', 'parameter'], 'dynamicRegistration': True, 'augmentsSyntaxTokens': True, 'overlappingTokenSupport': False, 'tokenModifiers': ['modification', 'declaration', 'async', 'static', 'abstract', 'readonly', 'definition', 'documentation', 'deprecated', 'defaultLibrary'], 'requests': {'range': True, 'full': {'delta': True}}}, 'callHierarchy': {'dynamicRegistration': True}, 'references': {'dynamicRegistration': True}, 'hover': {'dynamicRegistration': True, 'contentFormat': ['markdown', 'plaintext']}}, 'general': {'markdown': {'version': '3.2.2', 'parser': 'Python-Markdown'}, 'regularExpressions': {'engine': 'ECMAScript'}}, 'window': {'workDoneProgress': True, 'showDocument': {'support': True}, 'showMessage': {'messageActionItem': {'additionalPropertiesSupport': True}}}}}
lsp-elixir: Installing ElixirLS release v0.15.1
lsp-elixir: Running in c:/Users/chenp/code/REDACTED
lsp-elixir: Install complete

Crash dump is uploaded

Expected behavior

After resetting back to otp 25.3 and elixir 1.15.0-otp-25, it runs without problems

:: [13:46:41.563] --> lsp-elixir initialize (1): {'capabilities': {'window': {'showMessage': {'messageActionItem': {'additionalPropertiesSupport': True}}, 'showDocument': {'support': True}, 'workDoneProgress': True}, 'general': {'markdown': {'parser': 'Python-Markdown', 'version': '3.2.2'}, 'regularExpressions': {'engine': 'ECMAScript'}}, 'textDocument': {'codeLens': {'dynamicRegistration': True}, 'formatting': {'dynamicRegistration': True}, 'hover': {'contentFormat': ['markdown', 'plaintext'], 'dynamicRegistration': True}, 'rename': {'prepareSupportDefaultBehavior': 1, 'dynamicRegistration': True, 'prepareSupport': True}, 'diagnostic': {'relatedDocumentSupport': True, 'dynamicRegistration': True}, 'inlayHint': {'resolveSupport': {'properties': ['textEdits', 'label.command']}, 'dynamicRegistration': True}, 'semanticTokens': {'requests': {'full': {'delta': True}, 'range': True}, 'tokenModifiers': ['deprecated', 'abstract', 'modification', 'documentation', 'declaration', 'defaultLibrary', 'definition', 'async', 'static', 'readonly'], 'augmentsSyntaxTokens': True, 'formats': ['relative'], 'multilineTokenSupport': True, 'overlappingTokenSupport': False, 'dynamicRegistration': True, 'tokenTypes': ['enumMember', 'modifier', 'namespace', 'parameter', 'enum', 'macro', 'regexp', 'decorator', 'number', 'comment', 'event', 'string', 'class', 'typeParameter', 'operator', 'property', 'method', 'variable', 'struct', 'function', 'interface', 'keyword', 'type']}, 'signatureHelp': {'contextSupport': True, 'signatureInformation': {'activeParameterSupport': True, 'parameterInformation': {'labelOffsetSupport': True}, 'documentationFormat': ['markdown', 'plaintext']}, 'dynamicRegistration': True}, 'rangeFormatting': {'dynamicRegistration': True}, 'codeAction': {'codeActionLiteralSupport': {'codeActionKind': {'valueSet': ['quickfix', 'refactor', 'refactor.extract', 'refactor.inline', 'refactor.rewrite', 'source.fixAll', 'source.organizeImports']}}, 'resolveSupport': {'properties': ['edit']}, 'isPreferredSupport': True, 'dynamicRegistration': True, 'dataSupport': True}, 'documentLink': {'tooltipSupport': True, 'dynamicRegistration': True}, 'synchronization': {'willSave': True, 'willSaveWaitUntil': True, 'didSave': True, 'dynamicRegistration': True}, 'completion': {'completionItem': {'resolveSupport': {'properties': ['detail', 'documentation', 'additionalTextEdits']}, 'insertTextModeSupport': {'valueSet': [2]}, 'documentationFormat': ['markdown', 'plaintext'], 'labelDetailsSupport': True, 'tagSupport': {'valueSet': [1]}, 'deprecatedSupport': True, 'snippetSupport': True, 'insertReplaceSupport': True}, 'completionList': {'itemDefaults': ['editRange', 'insertTextFormat', 'data']}, 'completionItemKind': {'valueSet': [20, 1, 16, 18, 13, 11, 12, 5, 17, 4, 21, 19, 23, 7, 25, 24, 10, 2, 15, 6, 9, 22, 3, 8, 14]}, 'insertTextMode': 2, 'dynamicRegistration': True}, 'selectionRange': {'dynamicRegistration': True}, 'documentHighlight': {'dynamicRegistration': True}, 'typeDefinition': {'linkSupport': True, 'dynamicRegistration': True}, 'declaration': {'linkSupport': True, 'dynamicRegistration': True}, 'references': {'dynamicRegistration': True}, 'callHierarchy': {'dynamicRegistration': True}, 'publishDiagnostics': {'tagSupport': {'valueSet': [2, 1]}, 'versionSupport': True, 'dataSupport': True, 'relatedInformation': True, 'codeDescriptionSupport': True}, 'definition': {'linkSupport': True, 'dynamicRegistration': True}, 'typeHierarchy': {'dynamicRegistration': True}, 'implementation': {'linkSupport': True, 'dynamicRegistration': True}, 'documentSymbol': {'tagSupport': {'valueSet': [1]}, 'hierarchicalDocumentSymbolSupport': True, 'dynamicRegistration': True, 'symbolKind': {'valueSet': [22, 6, 3, 10, 17, 8, 1, 9, 21, 4, 14, 24, 15, 18, 5, 26, 25, 7, 16, 13, 2, 23, 12, 19, 11, 20]}}, 'colorProvider': {'dynamicRegistration': True}}, 'workspace': {'symbol': {'tagSupport': {'valueSet': [1]}, 'dynamicRegistration': True, 'symbolKind': {'valueSet': [22, 6, 3, 10, 17, 8, 1, 9, 21, 4, 14, 24, 15, 18, 5, 26, 25, 7, 16, 13, 2, 23, 12, 19, 11, 20]}}, 'configuration': True, 'semanticTokens': {'refreshSupport': True}, 'applyEdit': True, 'executeCommand': {}, 'didChangeConfiguration': {'dynamicRegistration': True}, 'workspaceEdit': {'documentChanges': True, 'failureHandling': 'abort'}, 'workspaceFolders': True, 'diagnostics': {'refreshSupport': True}, 'inlayHint': {'refreshSupport': True}, 'codeLens': {'refreshSupport': True}}}, 'initializationOptions': {}, 'rootUri': 'file:///C:/Users/chenp/code/REDACTED', 'workspaceFolders': [{'name': 'REDACTED', 'uri': 'file:///C:/Users/chenp/code/REDACTED'}], 'processId': 46016, 'clientInfo': {'name': 'Sublime Text LSP', 'version': '1.24.0'}, 'rootPath': 'C:\\Users\\chenp\\code\\REDACTED'}
lsp-elixir: Installing ElixirLS release v0.15.1
lsp-elixir: Running in c:/Users/chenp/code/REDACTED
lsp-elixir: Install complete
lsp-elixir: Started ElixirLS v0.15.1
:: [13:46:44.099] <-  lsp-elixir window/logMessage: {'type': 3, 'message': 'Started ElixirLS v0.15.1'}
lsp-elixir: Running in c:/Users/chenp/code/REDACTED
:: [13:46:44.099] <-  lsp-elixir window/logMessage: {'type': 3, 'message': 'Running in c:/Users/chenp/code/REDACTED'}
lsp-elixir: ElixirLS built with elixir "1.15.0" on OTP "25"
:: [13:46:44.102] <-  lsp-elixir window/logMessage: {'type': 3, 'message': 'ElixirLS built with elixir "1.15.0" on OTP "25"'}
lsp-elixir: Running on elixir "1.15.0 (compiled with Erlang/OTP 25)" on OTP "25"
:: [13:46:44.102] <-  lsp-elixir window/logMessage: {'type': 3, 'message': 'Running on elixir "1.15.0 (compiled with Erlang/OTP 25)" on OTP "25"'}
lsp-elixir: Protocols are not consolidated
:: [13:46:44.104] <-  lsp-elixir window/logMessage: {'type': 3, 'message': 'Protocols are not consolidated'}
lsp-elixir: Elixir sources not found (checking in c:/home/runner/work/elixir/elixir). Code navigation to Elixir modules disabled.
:: [13:46:44.112] <-  lsp-elixir window/logMessage: {'type': 3, 'message': 'Elixir sources not found (checking in c:/home/runner/work/elixir/elixir). Code navigation to Elixir modules disabled.'}
:: [13:46:44.172] <<< lsp-elixir (1) (duration: 2608ms): {'serverInfo': {'name': 'ElixirLS', 'version': '0.15.1'}, 'capabilities': {'implementationProvider': True, 'signatureHelpProvider': {'triggerCharacters': ['(', ',']}, 'codeActionProvider': False, 'executeCommandProvider': {'commands': ['expandMacro:k_kYDJBDbk5UHF6ssTZhf8Rxs2qQ3AKv', 'getExUnitTestsInFile:k_kYDJBDbk5UHF6ssTZhf8Rxs2qQ3AKv', 'manipulatePipes:k_kYDJBDbk5UHF6ssTZhf8Rxs2qQ3AKv', 'mixClean:k_kYDJBDbk5UHF6ssTZhf8Rxs2qQ3AKv', 'restart:k_kYDJBDbk5UHF6ssTZhf8Rxs2qQ3AKv', 'spec:k_kYDJBDbk5UHF6ssTZhf8Rxs2qQ3AKv']}, 'definitionProvider': True, 'documentOnTypeFormattingProvider': {'firstTriggerCharacter': '\n'}, 'completionProvider': {'triggerCharacters': ['.', '@', '&', '%', '^', ':', '!', '-', '~']}, 'documentSymbolProvider': True, 'workspaceSymbolProvider': True, 'referencesProvider': True, 'foldingRangeProvider': True, 'textDocumentSync': {'save': {'includeText': True}, 'didOpen': {}, 'didClose': {}, 'change': {'syncKind': 2}}, 'documentFormattingProvider': True, 'macroExpansion': True, 'workspace': {'workspaceFolders': {'supported': False, 'changeNotifications': False}}, 'hoverProvider': True, 'codeLensProvider': {'resolveProvider': False}}}
:: [13:46:44.172]  -> lsp-elixir initialized: {}
:: [13:46:44.173]  -> lsp-elixir workspace/didChangeConfiguration: {'settings': {'elixirLS': {'projectDir': None, 'fetchDeps': True, 'mixTarget': None, 'dialyzerEnabled': True, 'mixEnv': 'dev', 'dialyzerFormat': 'dialyxir_long', 'dialyzerWarnOpts': ['error_handling', 'no_behaviours', 'no_contracts', 'no_fail_call', 'no_fun_app', 'no_improper_lists', 'no_match', 'no_missing_calls', 'no_opaque', 'no_return', 'no_undefined_callbacks', 'no_unused', 'unknown']}}}
:: [13:46:44.173] <-- lsp-elixir client/registerCapability (1): {'registrations': [{'registerOptions': {'watchers': [{'globPattern': '**/*.ex'}, {'globPattern': '**/*.exs'}, {'globPattern': '**/*.erl'}, {'globPattern': '**/*.hrl'}, {'globPattern': '**/*.yrl'}, {'globPattern': '**/*.xrl'}, {'globPattern': '**/*.eex'}, {'globPattern': '**/*.leex'}, {'globPattern': '**/*.heex'}, {'globPattern': '**/*.sface'}]}, 'method': 'workspace/didChangeWatchedFiles', 'id': 'B63DDB275E15ED256156A5090CE35EB12FC8CC8C'}]}
:: [13:46:44.173] >>> lsp-elixir (1) (duration: 0ms): None
...
...
Truncated
...
...

Starting the .bat file directly seems OK:

LSP-elixir\server\0.15.1
❯ .\language_server.bat
Installing ElixirLS release v0.15.1
Running in c:/Users/chenp/AppData/Local/Sublime Text/Package Storage/LSP-elixir/server/0.15.1
Install complete
Content-Length: 103

{"jsonrpc":"2.0","method":"window/logMessage","params":{"message":"Started ElixirLS v0.15.1","type":3}}Content-Length: 172

{"jsonrpc":"2.0","method":"window/logMessage","params":{"message":"Running in c:/Users/chenp/AppData/Local/Sublime Text/Package Storage/LSP-elixir/server/0.15.1","type":3}}Content-Length: 130

{"jsonrpc":"2.0","method":"window/logMessage","params":{"message":"ElixirLS built with elixir \"1.15.0\" on OTP \"26\"","type":3}}Content-Length: 151

{"jsonrpc":"2.0","method":"window/logMessage","params":{"message":"Running on elixir \"1.15.0 (compiled with Erlang/OTP 26)\" on OTP \"26\"","type":3}}Content-Length: 109

{"jsonrpc":"2.0","method":"window/logMessage","params":{"message":"Protocols are not consolidated","type":3}}Content-Length: 196

{"jsonrpc":"2.0","method":"window/logMessage","params":{"message":"Elixir sources not found (checking in c:/home/runner/work/elixir/elixir). Code navigation to Elixir modules disabled.","type":3}}Content-Length: 111

{"jsonrpc":"2.0","method":"window/logMessage","params":{"message":"Experimental server is disabled.","type":3}}

Somewhere during initialize with a proper project failed.

There is definitively a problem on windows. I tried on elixir 1.15 and otp 26.0.2 and didn't get a crash but it hangs. I wonder if this is related to this patch that did not make it into 1.15 elixir elixir-lang/elixir@0dd933b

It seems the initialize message makes it missbehave

I tried patching the elixir.bat file like this commit did. It didn't seem to make a difference. Not sure my "try" was conclusive though.

I wanted to start the language server myself, then curl the initialize command with the payload above against the language server directly to see what happens. However I don't understand language server enough to do it. 🫠

You need to write to stdin a message like

Content-Length: 123\r\n\r\n{...}

if you need any non ascii chars remember it needs to be encoded to latin1
https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification/#contentPart

Finally I got something useful

GenServer ElixirLS.LanguageServer.JsonRpc terminating
** (FunctionClauseError) no function clause matching in ElixirLS.LanguageServer.JsonRpc.handle_call/3
    (language_server 0.15.1) lib/language_server/json_rpc.ex:147: ElixirLS.LanguageServer.JsonRpc.handle_call({:packet, %{"capabilities" => %{"general" => %{"markdown" => %{"parser" => "Python-Markdown", "version" => "3.2.2"}, "regularExpressions" => %{"engine" => "ECMAScript"}}, "textDocument" => %{"callHierarchy" => %{"dynamicRegistration" => true}, "codeAction" => %{"codeActionLiteralSupport" => %{"codeActionKind" => %{"valueSet" => ["quickfix", "refactor", "refactor.extract", "refactor.inline", "refactor.rewrite", "source.fixAll", "source.organizeImports"]}}, "dataSupport" => true, "dynamicRegistration" => true, "isPreferredSupport" => true, "resolveSupport" => %{"properties" => ["edit"]}}, "codeLens" => %{"dynamicRegistration" => true}, "colorProvider" => %{"dynamicRegistration" => true}, "completion" => %{"completionItem" => %{"deprecatedSupport" => true, "documentationFormat" => ["markdown", "plaintext"], "insertReplaceSupport" => true, "insertTextModeSupport" => %{"valueSet" => [2]}, "labelDetailsSupport" => true, "resolveSupport" => %{"properties" => ["detail", "documentation", "additionalTextEdits"]}, "snippetSupport" => true, "tagSupport" => %{"valueSet" => [1]}}, "completionItemKind" => %{"valueSet" => [20, 1, 16, 18, 13, 11, 12, 5, 17, 4, 21, 19, 23, 7, 25, 24, 10, 2, 15, 6, 9, 22, 3, 8, 14]}, "completionList" => %{"itemDefaults" => ["editRange", "insertTextFormat", "data"]}, "dynamicRegistration" => true, "insertTextMode" => 2}, "declaration" => %{"dynamicRegistration" => true, "linkSupport" => true}, "definition" => %{"dynamicRegistration" => true, "linkSupport" => true}, "diagnostic" => %{"dynamicRegistration" => true, "relatedDocumentSupport" => true}, "documentHighlight" => %{"dynamicRegistration" => true}, "documentLink" => %{"dynamicRegistration" => true, "tooltipSupport" => true}, "documentSymbol" => %{"dynamicRegistration" => true, "hierarchicalDocumentSymbolSupport" => true, "symbolKind" => %{"valueSet" => [22, 6, 3, 10, 17, 8, 1, 9, 21, 4, 14, 24, 15, 18, 5, 26, 25, 7, 16, 13, 2, 23, 12, 19, 11, 20]}, "tagSupport" => %{"valueSet" => [1]}}, "formatting" => %{"dynamicRegistration" => true}, "hover" => %{"contentFormat" => ["markdown", "plaintext"], "dynamicRegistration" => true}, "implementation" => %{"dynamicRegistration" => true, "linkSupport" => true}, "inlayHint" => %{"dynamicRegistration" => true, "resolveSupport" => %{"properties" => ["textEdits", "label.command"]}}, "publishDiagnostics" => %{"codeDescriptionSupport" => true, "dataSupport" => true, "relatedInformation" => true, "tagSupport" => %{"valueSet" => [2, 1]}, "versionSupport" => true}, "rangeFormatting" => %{"dynamicRegistration" => true}, "references" => %{"dynamicRegistration" => true}, "rename" => %{"dynamicRegistration" => true, "prepareSupport" => true, "prepareSupportDefaultBehavior" => 1}, "selectionRange" => %{"dynamicRegistration" => true}, "semanticTokens" => %{"augmentsSyntaxTokens" => true, "dynamicRegistration" => true, "formats" => ["relative"], "multilineTokenSupport" => true, "overlappingTokenSupport" => false, "requests" => %{"full" => %{"delta" => true}, "range" => true}, "tokenModifiers" => ["deprecated", "abstract", "modification", "documentation", "declaration", "defaultLibrary", "definition", "async", "static", "readonly"], "tokenTypes" => ["enumMember", "modifier", "namespace", "parameter", "enum", "macro", "regexp", "decorator", "number", "comment", "event", "string", "class", "typeParameter", "operator", "property", ...]}, "signatureHelp" => %{"contextSupport" => true, "dynamicRegistration" => true, "signatureInformation" => %{"activeParameterSupport" => true, "documentationFormat" => ["markdown", "plaintext"], "parameterInformation" => %{"labelOffsetSupport" => true}}}, "synchronization" => %{"didSave" => true, "dynamicRegistration" => true, "willSave" => true, "willSaveWaitUntil" => true}, "typeDefinition" => %{"dynamicRegistration" => true, "linkSupport" => true}, "typeHierarchy" => %{"dynamicRegistration" => true}}, "window" => %{"showDocument" => %{"support" => true}, "showMessage" => %{"messageActionItem" => %{"additionalPropertiesSupport" => true}}, "workDoneProgress" => true}, "workspace" => %{"applyEdit" => true, "codeLens" => %{"refreshSupport" => true}, "configuration" => true, "diagnostics" => %{"refreshSupport" => true}, "didChangeConfiguration" => %{"dynamicRegistration" => true}, "executeCommand" => %{}, "inlayHint" => %{"refreshSupport" => true}, "semanticTokens" => %{"refreshSupport" => true}, "symbol" => %{"dynamicRegistration" => true, "symbolKind" => %{"valueSet" => [22, 6, 3, 10, 17, 8, 1, 9, 21, 4, 14, 24, 15, 18, 5, 26, 25, 7, 16, 13, 2, 23, 12, 19, 11, 20]}, "tagSupport" => %{"valueSet" => [1]}}, "workspaceEdit" => %{"documentChanges" => true, "failureHandling" => "abort"}, "workspaceFolders" => true}}, "clientInfo" => %{"name" => "Sublime Text LSP", "version" => "1.24.0"}, "initializationOptions" => %{}, "processId" => 46016, "rootPath" => "C:Userschenpcodeswoosh", "rootUri" => "file: ///C:/Users/chenp/code/swoosh", "workspaceFolders" => [%{"name" => "swoosh", "uri" => "file:///C:/Users/chenp/code/swoosh"}]}}, {#PID<0.98.0>, [:alias | #Reference<0.0.12547.1577818942.1308688393.189788>]}, %ElixirLS.LanguageServer.JsonRpc{language_server: ElixirLS.LanguageServer.Server, next_id: 1, outgoing_requests: %{}})
    (stdlib 5.0.2) gen_server.erl:1113: :gen_server.try_handle_call/4
    (stdlib 5.0.2) gen_server.erl:1142: :gen_server.handle_msg/6
    (stdlib 5.0.2) proc_lib.erl:241: :proc_lib.init_p_do_apply/3
    Last message (from #PID<0.98.0>): {:packet, %{"capabilities" => %{"general" => %{"markdown" => %{"parser" => "Python-Markdown", "version" => "3.2.2"}, "regularExpressions" => %{"engine" => "ECMAScript"}}, "textDocument" => %{"callHierarchy" => %{"dynamicRegistration" => true}, "codeAction" => %{"codeActionLiteralSupport" => %{"codeActionKind" => %{"valueSet" => ["quickfix", "refactor", "refactor.extract", "refactor.inline", "refactor.rewrite", "source.fixAll", "source.organizeImports"]}}, "dataSupport" => true, "dynamicRegistration" => true, "isPreferredSupport" => true, "resolveSupport" => %{"properties" => ["edit"]}}, "codeLens" => %{"dynamicRegistration" => true}, "colorProvider" => %{"dynamicRegistration" => true}, "completion" => %{"completionItem" => %{"deprecatedSupport" => true, "documentationFormat" => ["markdown", "plaintext"], "insertReplaceSupport" => true, "insertTextModeSupport" => %{"valueSet" => [2]}, "labelDetailsSupport" => true, "resolveSupport" => %{"properties" => ["detail", "documentation", "additionalTextEdits"]}, "snippetSupport" => true, "tagSupport" => %{"valueSet" => [1]}}, "completionItemKind" => %{"valueSet" => [20, 1, 16, 18, 13, 11, 12, 5, 17, 4, 21, 19, 23, 7, 25, 24, 10, 2, 15, 6, 9, 22, 3, 8, 14]}, "completionList" => %{"itemDefaults" => ["editRange", "insertTextFormat", "data"]}, "dynamicRegistration" => true, "insertTextMode" => 2}, "declaration" => %{"dynamicRegistration" => true, "linkSupport" => true}, "definition" => %{"dynamicRegistration" => true, "linkSupport" => true}, "diagnostic" => %{"dynamicRegistration" => true, "relatedDocumentSupport" => true}, "documentHighlight" => %{"dynamicRegistration" => true}, "documentLink" => %{"dynamicRegistration" => true, "tooltipSupport" => true}, "documentSymbol" => %{"dynamicRegistration" => true, "hierarchicalDocumentSymbolSupport" => true, "symbolKind" => %{"valueSet" => [22, 6, 3, 10, 17, 8, 1, 9, 21, 4, 14, 24, 15, 18, 5, 26, 25, 7, 16, 13, 2, 23, 12, 19, 11, 20]}, "tagSupport" => %{"valueSet" => [1]}}, "formatting" => %{"dynamicRegistration" => true}, "hover" => %{"contentFormat" => ["markdown", "plaintext"], "dynamicRegistration" => true}, "implementation" => %{"dynamicRegistration" => true, "linkSupport" => true}, "inlayHint" => %{"dynamicRegistration" => true, "resolveSupport" => %{"properties" => ["textEdits", "label.command"]}}, "publishDiagnostics" => %{"code (truncated)","type":1}}

That doesn't look like something that SHOULD crash the LS.

@princemaple Your request is invalid. It has to be a proper JsonRPC message like the one here ce88f3c#diff-021acf15c1baa0e6d10e0b9ff09a8903779b5188bad2748accf2238d2e4ac783

Also rootUri and rootPath look broken

Also rootUri and rootPath look broken

The message is extracted from the rpc response and replaced some of the characters for readability. I accidentally removed more than necessary :)

Your request is invalid.

I used this - it is in python format, I turned it into json, maybe I did something wrong in the process. I'll try again next week. Cheers.

{'rootUri': 'file:///C:/Users/chenp/code/REDACTED', 'workspaceFolders': [{'uri': 'file:///C:/Users/chenp/code/REDACTED', 'name': 'REDACTED'}], 'processId': 44792, 'rootPath': 'C:\\Users\\chenp\\code\\REDACTED', 'clientInfo': {'version': '1.24.0', 'name': 'Sublime Text LSP'}, 'initializationOptions': {}, 'capabilities': {'workspace': {'workspaceEdit': {'failureHandling': 'abort', 'documentChanges': True}, 'didChangeConfiguration': {'dynamicRegistration': True}, 'codeLens': {'refreshSupport': True}, 'semanticTokens': {'refreshSupport': True}, 'inlayHint': {'refreshSupport': True}, 'workspaceFolders': True, 'diagnostics': {'refreshSupport': True}, 'executeCommand': {}, 'applyEdit': True, 'configuration': True, 'symbol': {'symbolKind': {'valueSet': [20, 6, 3, 1, 22, 12, 10, 13, 17, 24, 25, 23, 26, 18, 19, 2, 5, 15, 7, 8, 4, 11, 16, 9, 14, 21]}, 'dynamicRegistration': True, 'tagSupport': {'valueSet': [1]}}}, 'textDocument': {'declaration': {'dynamicRegistration': True, 'linkSupport': True}, 'rangeFormatting': {'dynamicRegistration': True}, 'rename': {'prepareSupport': True, 'dynamicRegistration': True, 'prepareSupportDefaultBehavior': 1}, 'implementation': {'dynamicRegistration': True, 'linkSupport': True}, 'synchronization': {'dynamicRegistration': True, 'willSave': True, 'willSaveWaitUntil': True, 'didSave': True}, 'diagnostic': {'dynamicRegistration': True, 'relatedDocumentSupport': True}, 'colorProvider': {'dynamicRegistration': True}, 'codeLens': {'dynamicRegistration': True}, 'publishDiagnostics': {'dataSupport': True, 'relatedInformation': True, 'versionSupport': True, 'codeDescriptionSupport': True, 'tagSupport': {'valueSet': [1, 2]}}, 'documentHighlight': {'dynamicRegistration': True}, 'selectionRange': {'dynamicRegistration': True}, 'definition': {'dynamicRegistration': True, 'linkSupport': True}, 'codeAction': {'dataSupport': True, 'dynamicRegistration': True, 'isPreferredSupport': True, 'resolveSupport': {'properties': ['edit']}, 'codeActionLiteralSupport': {'codeActionKind': {'valueSet': ['quickfix', 'refactor', 'refactor.extract', 'refactor.inline', 'refactor.rewrite', 'source.fixAll', 'source.organizeImports']}}}, 'documentSymbol': {'symbolKind': {'valueSet': [20, 6, 3, 1, 22, 12, 10, 13, 17, 24, 25, 23, 26, 18, 19, 2, 5, 15, 7, 8, 4, 11, 16, 9, 14, 21]}, 'dynamicRegistration': True, 'hierarchicalDocumentSymbolSupport': True, 'tagSupport': {'valueSet': [1]}}, 'typeDefinition': {'dynamicRegistration': True, 'linkSupport': True}, 'formatting': {'dynamicRegistration': True}, 'inlayHint': {'dynamicRegistration': True, 'resolveSupport': {'properties': ['textEdits', 'label.command']}}, 'signatureHelp': {'dynamicRegistration': True, 'contextSupport': True, 'signatureInformation': {'parameterInformation': {'labelOffsetSupport': True}, 'activeParameterSupport': True, 'documentationFormat': ['markdown', 'plaintext']}}, 'completion': {'dynamicRegistration': True, 'completionItemKind': {'valueSet': [19, 15, 18, 2, 17, 20, 3, 1, 13, 14, 23, 24, 22, 25, 9, 7, 12, 10, 5, 8, 4, 16, 6, 21, 11]}, 'completionList': {'itemDefaults': ['editRange', 'insertTextFormat', 'data']}, 'completionItem': {'snippetSupport': True, 'insertTextModeSupport': {'valueSet': [2]}, 'resolveSupport': {'properties': ['detail', 'documentation', 'additionalTextEdits']}, 'labelDetailsSupport': True, 'documentationFormat': ['markdown', 'plaintext'], 'deprecatedSupport': True, 'insertReplaceSupport': True, 'tagSupport': {'valueSet': [1]}}, 'insertTextMode': 2}, 'typeHierarchy': {'dynamicRegistration': True}, 'documentLink': {'dynamicRegistration': True, 'tooltipSupport': True}, 'semanticTokens': {'formats': ['relative'], 'multilineTokenSupport': True, 'tokenTypes': ['modifier', 'method', 'namespace', 'typeParameter', 'enumMember', 'function', 'enum', 'variable', 'event', 'property', 'decorator', 'operator', 'struct', 'comment', 'type', 'class', 'string', 'macro', 'interface', 'number', 'keyword', 'regexp', 'parameter'], 'dynamicRegistration': True, 'augmentsSyntaxTokens': True, 'overlappingTokenSupport': False, 'tokenModifiers': ['modification', 'declaration', 'async', 'static', 'abstract', 'readonly', 'definition', 'documentation', 'deprecated', 'defaultLibrary'], 'requests': {'range': True, 'full': {'delta': True}}}, 'callHierarchy': {'dynamicRegistration': True}, 'references': {'dynamicRegistration': True}, 'hover': {'dynamicRegistration': True, 'contentFormat': ['markdown', 'plaintext']}}, 'general': {'markdown': {'version': '3.2.2', 'parser': 'Python-Markdown'}, 'regularExpressions': {'engine': 'ECMAScript'}}, 'window': {'workDoneProgress': True, 'showDocument': {'support': True}, 'showMessage': {'messageActionItem': {'additionalPropertiesSupport': True}}}}}

It's missing the JsonRPC wrapper {"jsonrpc":"2.0","id":0,"method":"initialize","params": <your initialize request here>}

This was a tricky bug to track. On my windows machine IO.binwrite to stdout hangs when :standard_out is set to :latin1 encoding. But to reproduce it I have to spawn a process via port.

erl -noshell -eval "Path = os:find_executable('erl'), Port1 = erlang:open_port({spawn_executable, Path}, [binary, {args, ['-noshell', '-kernel', 'standard_io_encoding', 'latin1', '-eval', \"io:setopts(standard_io, [{encoding, latin1}]), io:format('duπa~n', []), erlang:halt()\"]}, exit_status]), receive {Port1, {data, A}} -> io:fwrite(A, []) after 2000 -> io:fwrite('nothing~n') end, erlang:halt()"

On OTP 25 windows and OTP 25 or OTP 26.0.2 macOS this prints

du\x{3C0}a

On OTP 26.0.2 windows

nothing

However if I run it directly from the cmd terminal

erl -noshell -kernel standard_io_encoding latin1 -eval "io:setopts(standard_io, [{encoding, latin1}]), io:format('duπa~n', []), erlang:halt()"

It prints to stdout correctly

du\x{3C0}a

That explains why the launcher bat works from terminal and hangs when run spawned from vscode.

Note that we need to set stdout to latin1. Otherwise the client closes connection on first non ASCII range character printed to output.

OTP 26.1 is out with the fix for erlang/otp#7459, I'll test it out later

I can confirm that elixir-ls 0.16 with OTP 26.1 is working on windows