language server protocol
Find a file
2025-08-28 16:44:48 +01:00
bundles [fix] use lsp-client 6.1 2025-08-27 22:37:26 +01:00
data [fix] size linewrap 2025-08-05 23:02:56 +01:00
docs [mod] ui 2025-08-24 22:54:14 +01:00
scripts [mod] lib/custom 2025-08-25 10:09:56 +01:00
test [mod] lib/custom 2025-08-25 10:09:56 +01:00
webapp [fix] server diags 2025-08-28 16:44:48 +01:00
.dockerignore [mod] merge lsp-web-poc 2025-07-11 15:16:28 +01:00
.gitignore [add] rex build jar 2025-08-16 18:01:03 +01:00
compose.yaml [mod] lib/custom 2025-08-25 10:09:56 +01:00
LICENSE [mod] samples 2025-08-01 23:14:52 +01:00
package-lock.json [mod] latest deps 2025-08-26 10:53:45 +01:00
package.json [mod] latest deps 2025-08-26 10:53:45 +01:00
README.md [mod] ui 2025-08-24 22:54:14 +01:00
rollup.config.js [mod] additions 2025-07-31 15:02:27 +01:00

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

  1. Requires Docker or Podman on the local machine.
  2. Clone this repo
  3. Run docker compose up -d The LSP server shall now running on port 3000 (edit compose.yaml to change port)
  4. 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

java -cp org.eclipse.lemminx-uber.jar org.eclipse.lemminx.XMLServerSocketLauncher`