bazelbuild / bazelbuild/rules_rust

`rust_analyzer_aspect` emits the wrong crate root for mixed source/generated crates

Open
#4,234 1 comment 0 reactions 1 assignee Claimed by @UebelAndre View on GitHub
needs-triage rust-analyzer
Dominant language
Starlark
Stars
843
Forks
651
Avg merge
2d 18h
Merged PRs (30d)
15

Description

**Description**

For a Rust target whose `srcs` contains both a source crate root and a generated Rust file, `rust_analyzer_aspect` copies the sources into Bazel's output tree but sets `root_module` back to the workspace source file.

Relative `include!` and `mod` paths are resolved from the crate root's directory. The generated sibling exists beside the output-tree copy of the crate root, not beside the workspace source file, so rust-analyzer cannot resolve it. The generated local crate also has no `build` metadata.

**Reproduction steps**

`MODULE.bazel`:

```starlark
module(name = "rust_analyzer_generated_srcs_repro")

bazel_dep(name = "rules_rust", version = "0.73.0")
```

`BUILD.bazel`:

```starlark
load("@rules_rust//rust:defs.bzl", "rust_library")

genrule(
name = "generated",
outs = ["generated.rs"],
cmd = "echo 'pub fn generated() {}' > $@",
)

rust_library(
name = "mixed_sources",
srcs = [
"lib.rs",
":generated",
],
edition = "2021",
)
```

`lib.rs`:

```rust
include!("generated.rs");
```

Generate the rust-analyzer project:

```console
bazel run @rules_rust//tools/rust_analyzer:gen_rust_project -- //:mixed_sources
```

The command succeeds and generates `rust-project.json`. Both files needed by rust-analyzer exist together in the output tree:

```text
bazel-bin/lib.rs
bazel-bin/generated.rs
```

However, the `mixed_sources` entry in `rust-project.json` points the crate root at the workspace copy. Paths below are shortened for clarity:

```json
{
"root_module": "/path/to/repro/lib.rs",
"source": {
"include_dirs": [
"/path/to/repro/.",
"/path/to/execroot/_main/bazel-out/k8-fastbuild/bin"
]
}
}
```

There is no `generated.rs` beside `/path/to/repro/lib.rs`, and the crate entry has no `build` field.

**Impact**

rust-analyzer cannot resolve generated files referenced through relative `include!` or `mod` declarations in mixed source/generated crates. This causes missing or incorrect diagnostics, completion, navigation, and code-lens behavior even though the crate builds successfully with Bazel.

**Bazel and rules_rust version**

- Bazel: 9.2.0
- rules_rust: 0.73.0

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.