blob: e8c1d131183d59eddb5a76351dffc6a8c85a66e8 [file] [log] [blame]
#[[
## Overview
For [non-Cargo projects](https://rust-analyzer.github.io/manual.html#non-cargo-based-projects),
[rust-analyzer](https://rust-analyzer.github.io/) depends on a `rust-project.json` file at the
root of the project that describes its structure. The `rust_analyzer` rule facilitates generating
such a file.
### Setup
First, add the following to the `WORKSPACE` file:
```python
load("@rules_rust//tools/rust_analyzer:deps.bzl", "rust_analyzer_deps")
rust_analyzer_deps()
```
You'll also need to ensure any `rust_repository` or `rust_repositories` calls in your `WORKSPACE` file set the arg `include_rustc_src` to `True`.
Then, add a rule to the root `BUILD` file like the following.
```python
load("@rules_rust//rust:defs.bzl", "rust_analyzer")
rust_analyzer(
name = "rust_analyzer",
targets = [
# all the binary/library targets you want in the rust-project.json
],
)
```
A list of `rust_analyzer` compatible targets can be found by usign the following query:
```bash
bazel query 'kind("rust_*library|rust_binary", //...:all)'
```
Note that visibility rules apply.
Run `bazel run @rules_rust//tools/rust_analyzer:gen_rust_project` whenever
dependencies change to regenerate the `rust-project.json` file. It should be
added to `.gitignore` because it is effectively a build artifact. Once the
`rust-project.json` has been generated in the project root, rust-analyzer can
pick it up upon restart.
#### VSCode
To set this up using [VSCode](https://code.visualstudio.com/), users should first install the
[rust_analyzer plugin](https://marketplace.visualstudio.com/items?itemName=matklad.rust-analyzer).
With that in place, the following task can be added to the `.vscode/tasks.json` file of the workspace
to ensure a `rust-project.json` file is created and up to date when the editor is opened.
```json
{
"version": "2.0.0",
"tasks": [
{
"label": "Generate rust-project.json",
"command": "bazel",
"args": ["run", "@rules_rust//tools/rust_analyzer:gen_rust_project"],
"options": {
"cwd": "${workspaceFolder}"
},
"group": "build",
"problemMatcher": [],
"presentation": {
"reveal": "never",
"panel": "dedicated",
},
"runOptions": {
"runOn": "folderOpen"
}
},
]
}
```
]]#