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.
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", ))
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" } }, ] }
Add the following to your bazelrc:
build --@rules_rust//: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.
A toolchain for rust-analyzer.
ATTRIBUTES
Name | Description | Type | Mandatory | Default |
---|---|---|---|---|
name | A unique name for this target. | Name | required | |
proc_macro_srv | The path to a rust_analyzer_proc_macro_srv binary. | Label | optional | None |
rustc | The path to a rustc binary. | Label | required | |
rustc_srcs | The source code of rustc. | Label | required |
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 |