vscode-ansible icon indicating copy to clipboard operation
vscode-ansible copied to clipboard

ansible-language-server does not respect DidChangeWatchedFilesClientCapabilities

Open fischerling opened this issue 2 years ago • 0 comments

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
}

fischerling avatar Aug 12 '22 11:08 fischerling