ansible-language-server
ansible-language-server copied to clipboard
ansible-language-server does not respect DidChangeWatchedFilesClientCapabilities
Summary
I am the author and user of a LSP client for the vis editor. Recently I am writing more and more ansible code and wanted to try integrating ansible-language-server in my workflow.
vis-lspc
is realy simple and does not support workspaces or client/registerCapability
requests.
LSP states that any dynamicRegistration capability is opt-in by the client.
Furthermore, I even explicitly opt-out of DidChangeWatchedFilesClientCapabilities
dynamic registration, however ansible-language-server does not respect the reported client capabilities and send a client/registerCapability
request for workspace/didChangeWatchedFiles
and crashes after the client reports that client/registerCapability
is not implemented.
Is ansible-language-server even theoretically usable with a client lacking workspaces and only supporting the minimum of text document synchronization (textDocument/didOpen
, full content textDocument/didChange
and textDocument/didClose
)?
Extension version
none
VS Code version
none
Ansible Version
$ ansible --version
ansible [core 2.13.2]
config file = /home/muhq/code/vocosma/ansible.vocosma/ansible.cfg
configured module search path = ['/home/muhq/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3.10/site-packages/ansible
ansible collection location = /home/muhq/.ansible/collections:/usr/share/ansible/collections
executable location = /sbin/ansible
python version = 3.10.5 (main, Aug 1 2022, 07:53:20) [GCC 12.1.0]
jinja version = 3.1.2
libyaml = True
OS / Environment
Arch Linux. ansible-lint 6.4.0. ansible-language-server 0.10.
Relevant log output
Initial LSP json-rpc communication
Content-Length: 1148
{"params":{"capabilities":{"workspace":{"workspaceFolders":false,"didChangeWatchedFiles":{"dynamicRegistration":false},"fileOperations":{"dynamicRegistration":false},"configuration":false},"textDocument":{"hover":{"contentFormat":["plaintext"],"dynamicRegistration":false},"references":{"dynamicRegistration":false},"rename":{"dynamicRegistration":false,"prepareSupport":false,"honorsChangeAnnotations":false},"signatureHelp":{"signatureInformation":{"documentationFormat":["plaintext"]},"dynamicRegistration":false},"synchronization":{"didSave":true,"dynamicRegistration":false},"implementation":{"dynamicRegistration":false,"linkSupport":true},"definition":{"dynamicRegistration":false,"linkSupport":true},"typeDefinition":{"dynamicRegistration":false,"linkSupport":true},"completion":{"completionItem":{"documentationFormat":["plaintext"]},"dynamicRegistration":false},"declaration":{"linkSupport":true,"dynamicRegistration":false}},"window":{"showDocument":{"support":false},"workDoneProgress":false}},"locale":"en_US.UTF-8\n","processId":3280223,"clientInfo":{"name":"vis-lspc","version":"0.1.4"}},"method":"initialize","jsonrpc":"2.0","id":0}
Content-Length: 360
{"jsonrpc":"2.0","id":0,"result":{"capabilities":{"textDocumentSync":2,"semanticTokensProvider":{"documentSelector":[{"language":"ansible"}],"full":true,"legend":{"tokenTypes":["method","class","keyword","property"],"tokenModifiers":["definition"]}},"hoverProvider":true,"completionProvider":{"resolveProvider":true},"definitionProvider":true,"workspace":{}}}}
Content-Length: 40
{"jsonrpc":"2.0","method":"initialized"}
Content-Length: 322
{"jsonrpc":"2.0","id":0,"method":"client/registerCapability","params":{"registrations":[{"id":"561e329a-1dfd-463a-a6b1-5bd4566c7334","method":"workspace/didChangeWatchedFiles","registerOptions":{"watchers":[{"globPattern":"**/ansible.cfg"},{"globPattern":"**/.ansible-lint"},{"globPattern":"**/meta/main.{yml,yaml}"}]}}]}}
Content-Length: 102
{"error":{"message":"client/registerCapability not implemented","code":-32601},"jsonrpc":"2.0","id":0}
ansible-language-server stderr:
/usr/lib/node_modules/@ansible/ansible-language-server/node_modules/vscode-jsonrpc/lib/common/connection.js:477
responsePromise.reject(new messages_1.ResponseError(error.code, error.message, error.data));
^
ResponseError: client/registerCapability not implemented
at handleResponse (/usr/lib/node_modules/@ansible/ansible-language-server/node_modules/vscode-jsonrpc/lib/common/connection.js:477:48)
at processMessageQueue (/usr/lib/node_modules/@ansible/ansible-language-server/node_modules/vscode-jsonrpc/lib/common/connection.js:292:17)
at Immediate.<anonymous> (/usr/lib/node_modules/@ansible/ansible-language-server/node_modules/vscode-jsonrpc/lib/common/connection.js:276:13)
at process.processImmediate (node:internal/timers:471:21) {
code: -32601,
data: undefined
}
Node.js v18.7.0
formatted LSP JSON messages
// client->server
{
"params": {
"capabilities": {
"workspace": {
"workspaceFolders": false,
"didChangeWatchedFiles": {
"dynamicRegistration": false
},
"fileOperations": {
"dynamicRegistration": false
},
"configuration": false
},
"textDocument": {
"hover": {
"contentFormat": [
"plaintext"
],
"dynamicRegistration": false
},
"references": {
"dynamicRegistration": false
},
"rename": {
"dynamicRegistration": false,
"prepareSupport": false,
"honorsChangeAnnotations": false
},
"signatureHelp": {
"signatureInformation": {
"documentationFormat": [
"plaintext"
]
},
"dynamicRegistration": false
},
"synchronization": {
"didSave": true,
"dynamicRegistration": false
},
"implementation": {
"dynamicRegistration": false,
"linkSupport": true
},
"definition": {
"dynamicRegistration": false,
"linkSupport": true
},
"typeDefinition": {
"dynamicRegistration": false,
"linkSupport": true
},
"completion": {
"completionItem": {
"documentationFormat": [
"plaintext"
]
},
"dynamicRegistration": false
},
"declaration": {
"linkSupport": true,
"dynamicRegistration": false
}
},
"window": {
"showDocument": {
"support": false
},
"workDoneProgress": false
}
},
"locale": "en_US.UTF-8\n",
"processId": 3280223,
"clientInfo": {
"name": "vis-lspc",
"version": "0.1.4"
}
},
"method": "initialize",
"jsonrpc": "2.0",
"id": 0
}
// client<-server
{
"jsonrpc": "2.0",
"id": 0,
"result": {
"capabilities": {
"textDocumentSync": 2,
"semanticTokensProvider": {
"documentSelector": [
{
"language": "ansible"
}
],
"full": true,
"legend": {
"tokenTypes": [
"method",
"class",
"keyword",
"property"
],
"tokenModifiers": [
"definition"
]
}
},
"hoverProvider": true,
"completionProvider": {
"resolveProvider": true
},
"definitionProvider": true,
"workspace": {}
}
}
}
// client->server
{
"jsonrpc": "2.0",
"method": "initialized"
}
// client<-server
{
"jsonrpc": "2.0",
"id": 0,
"method": "client/registerCapability",
"params": {
"registrations": [
{
"id": "561e329a-1dfd-463a-a6b1-5bd4566c7334",
"method": "workspace/didChangeWatchedFiles",
"registerOptions": {
"watchers": [
{
"globPattern": "**/ansible.cfg"
},
{
"globPattern": "**/.ansible-lint"
},
{
"globPattern": "**/meta/main.{yml,yaml}"
}
]
}
}
]
}
}
// client->server
{
"error": {
"message": "client/registerCapability not implemented",
"code": -32601
},
"jsonrpc": "2.0",
"id": 0
}