mirror of
https://github.com/wasp-lang/wasp.git
synced 2024-12-26 10:35:04 +03:00
46 lines
2.1 KiB
Markdown
46 lines
2.1 KiB
Markdown
|
# waspls Architecture
|
||
|
|
||
|
waspls uses the [lsp](https://hackage.haskell.org/package/lsp) library for
|
||
|
interacting with the Language Server Protocol.
|
||
|
|
||
|
The main entry point is `serve` in `Wasp/LSP/Server.hs`. This function sets up
|
||
|
the LSP server, the reactor thread, and starts everything.
|
||
|
|
||
|
The handlers to LSP notifications and requests are defined in `Wasp/LSP/Handlers.hs`
|
||
|
and imported by `Wasp/LSP/Server.hs` so that the `lsp` package can be told about
|
||
|
them. Mostly, these handlers are small functions to call out to the actual
|
||
|
implementation in another source file.
|
||
|
|
||
|
There are two types of handlers in waspls:
|
||
|
|
||
|
1. "Analysis handlers" that extract some syntactic or semantic information from
|
||
|
source code and store it in the server state.
|
||
|
2. "Request handlers" that use the information stored in the server state to
|
||
|
provide LSP features, such as autocompletion and goto definition.
|
||
|
|
||
|
Request handlers have read-only access to the server state, while analysis
|
||
|
handlers can write to the state.
|
||
|
|
||
|
## Multithreading
|
||
|
|
||
|
By default, the `lsp` package is single-threaded. Because waspls sometimes
|
||
|
needs to do time-intensive work, such as getting the list of exported symbols
|
||
|
from TypeScript files, there is a mechanism for running code on a separate
|
||
|
thread. The purpose of this is to avoid blocking the main thread for long periods
|
||
|
of time, which would make the language server feel unresponsive in the editor.
|
||
|
|
||
|
This mechanism is the "reactor thread," which continuously looks for new actions
|
||
|
to run on a separate thread. For details, see the documentation in `Wasp/LSP/Reactor.hs`.
|
||
|
|
||
|
# Testing Development Versions of waspls
|
||
|
|
||
|
Set the wasp executable path in the Wasp VSCode extension to `wasp-cli`. To
|
||
|
build the LSP, run `cabal install`. Then, restart the language server in VSCode
|
||
|
by running the `Wasp: Restart Wasp LSP Server` command. By default, you can
|
||
|
press <kbd>Ctrl+Shift+P</kbd> to open the command palette to search for the
|
||
|
command.
|
||
|
|
||
|
Note that, after changing the executable path in the extension settings, you
|
||
|
have to reload the VSCode window. You can do this either by closing and reopening
|
||
|
the window or by running the command `Developer: Reload Window`.
|