SysML v2 Language Server

April 20, 2026 · View on GitHub

npm

SysML v2.0 Language Support VS Code Marketplace

A Language Server Protocol (LSP) implementation for SysML v2.

Features

FeatureStatusDescription
DiagnosticsSyntax error reporting with red squiggles
Document SymbolsOutline panel with SysML model structure
HoverElement kind, type, and documentation on hover
Go to DefinitionCtrl+Click navigation to declarations
Find ReferencesFind all usages of a symbol
Code CompletionKeywords, snippets, and symbol suggestions
Semantic TokensRich, context-aware syntax highlighting
Folding RangesCollapsible { } blocks and comments
RenameRename symbol and all references
Semantic ValidationUnresolved types, invalid multiplicity, duplicates
Code ActionsQuick-fixes: naming, doc stubs, empty enums, unused defs
Complexity AnalysisStructural metrics, composite index, hotspot detection
Mermaid Preview6 diagram types with auto-detect, focus, and diff modes
MCP ServerAI-assisted modelling via sysml-mcp CLI

Quick Start

Install from Marketplace

Install via the VS Code extension from the VS Code Marketplace.

Open in GitHub Codespaces or VS Code Dev Containers — everything is pre-installed, including Python 3.13, Jupyter, and Node.js 22.

Manual Setup

npm install && npm run build && npm test

Development

npm run watch        # recompiles on file changes
# Then press F5 in VS Code to launch the extension + server

Use the "Client + Server" compound debug configuration to debug both sides simultaneously.

Client Examples

The LSP server is language-agnostic. Three client implementations are included to demonstrate different integration patterns:

VS Code Extension (clients/vscode/)

The primary client — a full VS Code extension using vscode-languageclient, communicating over IPC. Provides diagnostics, completions, hover, go-to-definition, semantic tokens, and all other LSP features directly in the editor.

Web Client (clients/web/)

A browser-based SysML explorer with a Node.js HTTP bridge to the LSP server. Features a live editor with auto-analyse, diagnostics panel, symbol outline, and Mermaid diagram generation with zoom/pan.

make web             # build + start on http://localhost:3000

Python Client (clients/python/)

A zero-dependency Python script and Jupyter notebook that drives the LSP over stdio — the same JSON-RPC protocol VS Code uses, with no framework overhead.

python3 clients/python/sysml_lsp_client.py                    # analyse all examples
python3 clients/python/sysml_lsp_client.py examples/bike.sysml # analyse a specific file

The Jupyter notebook (sysml_lsp_demo.ipynb) provides an interactive walkthrough of every LSP feature.

Architecture

                         ┌───────────────────────────┐
                         │    Language Server        │
                         │    (Node.js process)      │
                         ├───────────────────────────┤
                         │ • ANTLR4 parser           │
                         │ • Diagnostics             │
                         │ • Symbols / hover         │
                         │ • Completions / rename    │
                         │ • Semantic tokens         │
                         │ • Go-to-def / references  │
                         └────────┬──────────────────┘
                                  │  LSP (JSON-RPC)
              ┌───────────────────┼────────────────────┐
              │                   │                    │
     ┌────────┴───────┐  ┌────────┴───────┐  ┌─────────┴──────┐
     │  VS Code (IPC) │  │  Web (HTTP)    │  │  Python (stdio)│
     │  Extension     │  │  Browser SPA   │  │  Script/Jupyter│
     └────────────────┘  └────────────────┘  └────────────────┘

Project Structure

sysml-v2-lsp/
├── clients/
│   ├── vscode/             # VS Code extension (TypeScript)
│   ├── web/                # Browser SPA + Node.js HTTP bridge
│   └── python/             # Zero-dep Python client + Jupyter notebook
├── server/src/             # Language Server
│   ├── server.ts           # LSP connection, capability registration
│   ├── documentManager.ts  # Parse cache, document lifecycle
│   ├── parser/             # Parse pipeline
│   ├── symbols/            # Symbol table, scopes, element types
│   ├── providers/          # LSP feature implementations
│   ├── analysis/           # Complexity analyzer
│   └── mcp/                # Mermaid diagram generator
├── grammar/                # ANTLR4 grammar files (.g4)
├── sysml.library/          # SysML v2 standard library
├── benchmarks/             # Performance benchmark suite
│   ├── src/                # Runner, suites, reporters, utilities
│   ├── baselines/          # Saved baseline for regression detection
│   ├── results/            # JSON + Markdown output per run
│   └── fixtures/           # Synthetic .sysml files for benchmarking
├── examples/               # Example .sysml models
├── test/                   # Unit tests (vitest)
└── package.json            # Extension manifest + monorepo scripts

Available Commands

make help             # Show all targets
make install          # Install all dependencies
make build            # Generate parser + compile + bundle
make watch            # Watch mode
make test             # Run unit tests
make lint             # ESLint
make package          # Build .vsix
make package-server   # Build server tarball for npm
make web              # Launch web client (http://localhost:3000)
make update-grammar   # Pull latest grammar, rebuild parser + DFA snapshot
make update-library   # Pull latest SysML v2 standard library
make dfa              # Regenerate DFA snapshot (after any grammar change)
make ci               # Full CI pipeline (lint + build + test)
npm run bench         # Run all benchmark suites
npm run bench:baseline # Save benchmark baseline
npm run bench:regression # Compare against baseline

Benchmarks

A built-in benchmark suite measures parser, symbol table, LSP provider, memory, throughput, and folder-load performance. Results are written as both JSON and Markdown to benchmarks/results/.

Running Benchmarks

npm run bench                    # run all suites
npm run bench:parse              # parse suite only
npm run bench:providers          # LSP providers suite only

Or use the runner directly for full control:

npx tsx benchmarks/src/runner.ts --suite parse --suite symbolTable
npx tsx benchmarks/src/runner.ts --runs 10 --warmup 3
npx tsx benchmarks/src/runner.ts --output ./my-results

Suites

SuiteWhat it measures
parseANTLR4 parse time — cold (no DFA) vs warm (DFA snapshot pre-loaded)
symbolTableSymbol table build and lookup latency
providersLSP features: diagnostics, hover, completion, references, rename, etc.
memoryHeap allocation per file and scaling behaviour
throughputEnd-to-end lines/sec and tokens/sec across all example files
folderLoadFull folder parse + symbol build (examples, standard library, all)

Regression Detection

Save a baseline, then compare future runs against it:

npm run bench:baseline           # save current results as baseline
npm run bench:regression         # compare against baseline, exit 1 on regression

The default regression threshold is 20%. Override with --threshold <n>.

Viewing Results

Each run produces a JSON file and a Markdown report in benchmarks/results/. To convert an existing JSON result to Markdown:

npx tsx benchmarks/src/reporters/markdownReporter.ts benchmarks/results/<file>.json

Grammar Updates

The grammar files in grammar/ are sourced from daltskin/sysml-v2-grammar. To pull the latest version, rebuild the parser, and regenerate the DFA snapshot:

make update-grammar

This fetches the .g4 files, runs npm run build, and regenerates the DFA snapshot that eliminates the ANTLR4 cold-start penalty. If you edit grammar files manually, run make dfa afterwards.

Technology Stack

ComponentTechnology
LanguageTypeScript (strict mode)
RuntimeNode.js ≥ 18
Parserantlr4ng
Generatorantlr-ng
LSPvscode-languageserver
Bundleresbuild
Testsvitest

License

MIT