Skip to content

Commit 2d486de

Browse files
committed
Fixes paths generated for rust-analyzer discovery
1 parent b0daae0 commit 2d486de

File tree

3 files changed

+68
-8
lines changed

3 files changed

+68
-8
lines changed

rust/private/rust_analyzer.bzl

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,12 @@ def _rust_analyzer_aspect_impl(target, ctx):
141141
proc_macro_dylibs = [proc_macro_dylib] if proc_macro_dylib else None
142142
build_info_out_dirs = [build_info.out_dir] if build_info != None and build_info.out_dir != None else None
143143

144+
rust_generated_srcs = []
145+
for attr in ["srcs", "deps", "proc_macro_deps"]:
146+
for dep in getattr(ctx.rule.attr, attr, []):
147+
if OutputGroupInfo in dep and hasattr(dep[OutputGroupInfo], "rust_generated_srcs"):
148+
rust_generated_srcs.append(dep[OutputGroupInfo].rust_generated_srcs)
149+
144150
rust_analyzer_info = write_rust_analyzer_spec_file(ctx, ctx.rule.attr, ctx.label, RustAnalyzerInfo(
145151
aliases = aliases,
146152
crate = crate_info,
@@ -160,6 +166,7 @@ def _rust_analyzer_aspect_impl(target, ctx):
160166
rust_analyzer_crate_spec = rust_analyzer_info.crate_specs,
161167
rust_analyzer_proc_macro_dylib = rust_analyzer_info.proc_macro_dylibs,
162168
rust_analyzer_src = rust_analyzer_info.build_info_out_dirs,
169+
rust_generated_srcs = depset(transitive = rust_generated_srcs),
163170
),
164171
]
165172

@@ -193,7 +200,7 @@ def find_proc_macro_dylib(toolchain, target):
193200
return None
194201

195202
rust_analyzer_aspect = aspect(
196-
attr_aspects = ["deps", "proc_macro_deps", "crate", "actual", "proto"],
203+
attr_aspects = ["srcs", "deps", "proc_macro_deps", "crate", "actual", "proto"],
197204
implementation = _rust_analyzer_aspect_impl,
198205
toolchains = [str(Label("//rust:toolchain_type"))],
199206
doc = "Annotates rust rules with RustAnalyzerInfo later used to build a rust-project.json",

test/rust_analyzer/generated_srcs_test/BUILD.bazel

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,17 @@
1-
load("@bazel_skylib//rules:write_file.bzl", "write_file")
21
load("@rules_rust//rust:defs.bzl", "rust_library", "rust_test")
2+
load(":generated_srcs_test.bzl", "generated_srcs_analysis_test_suite", "rust_generated_src")
33

4-
write_file(
4+
rust_generated_src(
55
name = "generated_rs",
66
out = "generated.rs",
7-
content = [
8-
"pub fn forty_two() -> i32 { 42 }",
9-
"",
10-
],
7+
content = "pub fn forty_two() -> i32 { 42 }\n",
118
)
129

1310
rust_library(
1411
name = "generated_srcs",
1512
srcs = [
1613
"lib.rs",
17-
":generated.rs",
14+
":generated_rs",
1815
],
1916
edition = "2021",
2017
)
@@ -39,3 +36,6 @@ rust_test(
3936
"//test/rust_analyzer/3rdparty/crates:serde_json",
4037
],
4138
)
39+
40+
############################ UNIT TESTS #############################
41+
generated_srcs_analysis_test_suite(name = "generated_srcs_analysis_test_suite")
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
"""Analysis test for rust_analyzer_aspect rust_generated_srcs propagation."""
2+
3+
load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts")
4+
load("//rust:defs.bzl", "rust_analyzer_aspect")
5+
6+
def _rust_generated_src_impl(ctx):
7+
out = ctx.actions.declare_file(ctx.attr.out)
8+
ctx.actions.write(output = out, content = ctx.attr.content)
9+
return [
10+
DefaultInfo(files = depset([out])),
11+
OutputGroupInfo(rust_generated_srcs = depset([out])),
12+
]
13+
14+
rust_generated_src = rule(
15+
implementation = _rust_generated_src_impl,
16+
attrs = {
17+
"out": attr.string(mandatory = True),
18+
"content": attr.string(mandatory = True),
19+
},
20+
doc = "Test helper that generates a .rs file and provides rust_generated_srcs output group.",
21+
)
22+
23+
def _rust_generated_srcs_test_impl(ctx):
24+
env = analysistest.begin(ctx)
25+
target = analysistest.target_under_test(env)
26+
27+
rust_generated_srcs = target[OutputGroupInfo].rust_generated_srcs.to_list()
28+
asserts.equals(env, ["generated.rs"], [f.basename for f in rust_generated_srcs])
29+
30+
return analysistest.end(env)
31+
32+
rust_generated_srcs_test = analysistest.make(
33+
_rust_generated_srcs_test_impl,
34+
extra_target_under_test_aspects = [rust_analyzer_aspect],
35+
)
36+
37+
def generated_srcs_analysis_test_suite(name):
38+
"""Test suite for rust_analyzer_aspect rust_generated_srcs propagation.
39+
40+
Args:
41+
name: Name of the test suite.
42+
"""
43+
rust_generated_srcs_test(
44+
name = "rust_generated_srcs_propagation_test",
45+
target_under_test = ":generated_srcs",
46+
)
47+
48+
native.test_suite(
49+
name = name,
50+
tests = [
51+
":rust_generated_srcs_propagation_test",
52+
],
53+
)

0 commit comments

Comments
 (0)