Overview
For non-Cargo projects,
rust-analyzer 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, ensure rules_rust
is setup in your workspace. By default, rust_register_toolchains
will
ensure a rust_analyzer_toolchain is registered within the WORKSPACE.
Next, load the dependencies for the rust-project.json
generator tool:
load("@rules_rust//tools/rust_analyzer:deps.bzl", "rust_analyzer_dependencies")
rust_analyzer_dependencies()
Finally, 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.
For users who do not use rust_register_toolchains
to register toolchains, the following can be added
to their WORKSPACE to register a rust_analyzer_toolchain
. Please make sure the Rust version used in
this toolchain matches the version used by the currently registered toolchain or the sources/documentation
will not match what's being compiled with and can lead to confusing results.
load("@rules_rust//rust:repositories.bzl", "rust_analyzer_toolchain_repository")
register_toolchains(rust_analyzer_toolchain_repository(
name = "rust_analyzer_toolchain",
# This should match the currently registered toolchain.
version = "1.63.0",
))
VSCode
To set this up using VSCode, users should first install the
rust_analyzer plugin.
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.
{
"version": "2.0.0",
"tasks": [
{
"label": "Generate rust-project.json",
"command": "bazel",
"args": [
"run",
"//tools/rust_analyzer:gen_rust_project"
],
"options": {
"cwd": "${workspaceFolder}"
},
"group": "build",
"problemMatcher": [],
"presentation": {
"reveal": "never",
"panel": "dedicated",
},
"runOptions": {
"runOn": "folderOpen"
}
},
]
}
Alternative vscode option (prototype)
Add the following to your bazelrc:
build --@rules_rust//rust/settings:rustc_output_diagnostics=true --output_groups=+rust_lib_rustc_output,+rust_metadata_rustc_output
Then you can use a prototype rust-analyzer plugin that automatically collects the outputs whenever you recompile.
Aspects
rust_analyzer_aspect
load("@rules_rust//rust:defs.bzl", "rust_analyzer_aspect") rust_analyzer_aspect(name)
Annotates rust rules with RustAnalyzerInfo later used to build a rust-project.json
ASPECT ATTRIBUTES
Name | Type |
---|---|
deps | String |
proc_macro_deps | String |
crate | String |
actual | String |
proto | String |
ATTRIBUTES
Name | Description | Type | Mandatory | Default |
---|---|---|---|---|
name | A unique name for this target. | Name | required |