2.8 KiB
Work in progress.
An attempt to write a Language Server Protocol server for and in XQuery 4.0. It uses the BaseX websocket feature.
Demo
- Requires
Docker
orPodman
on the local machine. - Clone this repo
- Run
docker compose up -d
The LSP server shall now running on port 3000 (editcompose.yaml
to change port) - In a browser navigate to
http://localhost:3000/static/clients/codemirror/
to see the CodeMirror 6 demo.
In principle, the LSP can be used in any environment that can make use of a LSP server accessed via a websocket.
LSP Server
webapp/lsp
The LSP implementation in XQuery using WebSockets for transport and the JSON-RPC 2.0 API for data format.
Sample html clients
A couple of samples using common browser based code editors are available. The CodeMirror 6
sample is the most functional.
These examples are self contained (no internet access required). Some make use of recent html features, for instance popovertarget
Using CodeMirror6
https://codemirror.net/
webapp/static/codemirror
A test html page using the CodeMirror6 editor that connects to the BaseX LSP instance
uses
alternatives
Using Ace Editor
webapp/static/ace
A test html page using the Ace editor that connects to the BaseX LSP instance @TODO fix
Uses
Make a websocket server for lsp on port 3000 https://mkslanc.github.io/ace-linters/websocket.html
http://localhost:3000/exampleServer
c1b317e012/packages/demo/websockets-lsp/server/server.ts
I needed set NODE_OPTIONS=--max_old_space_size=8192
for build to complete
Or node --max-old-space-size=8192 node_modules/webpack-dev-serve r/bin/webpack-dev-server.js
Monaco
@TODO create https://socket.dev/npm/package/monaco-editor
Server dev notes
State is held in websocket attributes.
Name | Use |
---|---|
initialized | set true after client sends initialized message |
files | A map whose keys are open uris, values are maps (doctype-> attribute name where doctype is stored |
file-{uuid} | name of websocket attribute with textDocument |
parse-{uuid} | name of websocket attribute with parse tree XML |
Related links
java -cp org.eclipse.lemminx-uber.jar org.eclipse.lemminx.XMLServerSocketLauncher`