language server protocol
Find a file
2025-08-29 16:01:52 +01:00
bundles [fix] linewrap 2025-08-29 16:01:52 +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] format progress 2025-08-28 21:58:40 +01:00
webapp [fix] linewrap 2025-08-29 16:01:52 +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 [fix] linewrap 2025-08-29 16:01:52 +01:00
README.md [add] format keymap 2025-08-29 15:27:18 +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

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

CodeMirror6 https://codemirror.net/

  • webapp/static/codemirror A test html page using the CodeMirror6 editor that connects to the BaseX LSP instance

uses

alternative LSP interfaces

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 editor

@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

XQuery 4.0 parser

The ebnf is taken from Gunther Rademacher's rex-parser-generator XQuery-40.ebnf

The script scripts/rex.xq can generate XQuery or Java parser code from this. The npm package.json script javac can create a jar file from the Java source.

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