wave-agape is the shared Language Server Protocol implementation for the
Wave programming language. It runs over
stdio and is designed to be consumed by both the Wave IntelliJ plugin and the
Wave Visual Studio Code extension.
- Wave lexer and parser diagnostics
- UTF-16-correct source positions
- Workspace-wide
.wavefile indexing - Completion for keywords, types, symbols, and document identifiers
- Hover and go to definition
- Clickable local imports with import target diagnostics and navigation
- Document and workspace symbols
- Find references and document highlights
- Prepare rename and workspace rename
- Signature help
- Full document synchronization and open/change/close lifecycle handling
v0.2.0 treats local import("module"); paths as first-class document links.
Hover and go to definition work on the quoted path, and a missing local module
is reported without incorrectly applying file-local semantic validation to
symbols supplied by imports.
The module resolver mirrors wavec:
import("local/path");resolves relative to the importing file.import("std::io::format");resolves below~/.wave/lib/wave/std.import("package::module");resolves from dependency roots using bothpackage/module.waveandpackage/src/module.wavelayouts.
WAVE_STDLIB_PATH overrides the standard-library directory and
WAVE_DEP_ROOTS supplies platform-separated dependency roots. LSP clients can
also pass imports.standardLibraryPath, imports.dependencyRoots, and an
imports.dependencies package-to-directory map in initialization options.
Relative configured paths use the first workspace folder as their base, and a
workspace .vex/dep directory is discovered automatically.
The server intentionally leaves syntax highlighting to the editor clients.
The Wave frontend revision is pinned in Cargo.toml and Cargo.lock for
reproducible builds.
cargo build --releaseThe resulting executable is target/release/wave-agape (wave-agape.exe on
Windows). The executable takes LSP messages from stdin and writes LSP messages
to stdout. Logs are written only to stderr.
wave-agape --version
RUST_LOG=wave_agape=debug wave-agapecargo fmt --all -- --check
cargo clippy --all-targets --all-features -- -D warnings
cargo test --all-targets --all-featuresThe fallback-only build, which omits the upstream Wave frontend, can be checked with:
cargo check --no-default-features --features fallbackClients should launch wave-agape without arguments using stdio, select files
with the wave language ID or .wave extension, and pass workspace folders in
the initialize request.
During development, put the release executable on PATH. The companion editor
plugins also support an explicit server path:
- VS Code:
wave.languageServer.path - IntelliJ:
WAVE_AGAPE_PATHenvironment variable
For released editor packages, a platform-specific wave-agape executable can
be bundled and selected by the client instead of requiring a global install.
The CI workflow builds x64 Linux and Windows executables plus x64 and Apple Silicon macOS executables, retaining them as GitHub Actions artifacts. Public distribution is handled by the editor marketplaces rather than a separate GitHub Release.
MPL-2.0, matching the Wave language frontend.