# roc_language_server This is a basic language server for Roc. Support for the following LSP features are provided: - Inline diagnostics - Hover to view type of value - Go-to-definition -
Example https://github.com/ayazhafiz/roc/assets/20735482/23a57d06-5b70-46f2-b0c4-5836eaec669b
- Note that go-to-definition for the builtins does not yet work. - Go-to-definition for abilities resolves to their specialization, if one exists. -
Example https://github.com/ayazhafiz/roc/assets/20735482/1ba98bf9-518b-4c47-b606-a6ce6767566f
- Formatting Roc files on save -
Example https://github.com/ayazhafiz/roc/assets/20735482/fbbe4bc1-64af-4c7d-b633-d7761906df11
[Semantic highlighting](https://github.com/microsoft/vscode/wiki/Semantic-Highlighting-Overview#what-is-the-difference-between-syntax-and-semantic-highlighting) will be added soon. Additional features require changes to the compiler infrastructure that are not yet available. Note that the language server is a bit naïve: - If you make a change in a dependency, you'll also need to make a change in the dependents' files for the changes to be picked up. - The language server will only operate on changes on save, auto-saving is recommended. ## Installing The roc_language_server binary is included with the [nightly releases](https://github.com/roc-lang/roc/releases). We recommend using the same version of roc and roc_language_server. ### Building from source Follow the [building from source](https://github.com/roc-lang/roc/blob/main/BUILDING_FROM_SOURCE.md) instructions for roc. Then run: ```bash # do `nix develop` first if you're using nix! cargo build --bin roc_language_server --release ``` This will give you the language server binary at: ``` target/release/roc_language_server ``` ### Configuring in your editor Please follow your editor's language server implementation's documentation to see how custom language servers should be configured. #### [coc.nvim](https://github.com/neoclide/coc.nvim) Add the following to your coc JSON configuration file: ```json { "languageserver": { "roc": { "command": "/roc_language_server", "filetypes": ["roc"] } } } ``` If you're using coc.nvim and want to use the configuration above, be sure to also instruct your vim that `*.roc` files have roc filetype. #### [nvim-lspconfig](https://github.com/neovim/nvim-lspconfig) Add the following to your lspconfig setup: ```lua local lspconfig = require('lspconfig') lspconfig.roc_ls.setup() ``` Make sure that the roc binary is on your `PATH`. Further instructions on how to setup nvim-lspconfig can be found in their [docs](https://github.com/neovim/nvim-lspconfig?tab=readme-ov-file#quickstart). ## Debug If you want to debug the server, use [debug_server.sh](./debug_server.sh) instead of the direct binary. If you would like to enable debug logging set the `ROCLS_LOG` environment variable to `debug` or `trace` for even more logs. eg: `ROCLS_LOG=debug` ## Testing Tests use expect-test, which is a snapshot/expect testing framework. If a change is made that requires updating the expect tests run `cargo test` confirm that the diff is correct, then run `UPDATE_EXPECT=1 cargo test` to update the contents of the files with the new output. ## Config You can set the environment variables below to control the operation of the language. `ROCLS_DEBOUNCE_MS`: Sets the amount of time to delay starting analysis of the document when a change comes in. This prevents starting pointless analysis while you are typing normally. Default: `100` `ROCLS_LATEST_DOC_TIMEOUT_MS`: Sets the timeout for waiting for an analysis of the latest document to be complete. If a request is sent that needs the latest version of the document to be analyzed, then it will wait up to this duration before just giving up. Default: `5000`