Skip to content

Commit 25411ee

Browse files
[prost] includes prost crate infos in rust_analyzer_aspect (#2232)
The change is fairly straightforward, but I did need to move prost providers up to `prost/providers.bzl` and out of `private/prost.bzl` to avoid a cyclic dependency. What we do is: * change `rust_prost_library` to return the `rust_proto_info` provider * in the `rust-analyzer` aspect we iterate over transitive dep infos and generate the appropriate `RustAnalyzerInfo` * lastly, we use the `crate_info` from `ProstProtoInfo` if we're processing a prost target as the "root" `crate_info` There are a couple of things I'm not sure are correct: 1. For every prost dep I set `deps` to `[]` - I think that's correct but I'm not sure-sure. 2. Similarly I set `proc_macro_dylib_path` to always `None` - again I think that's correct, but not sure-sure. Fixes #2121. --------- Co-authored-by: UebelAndre <[email protected]>
1 parent 4aafa0a commit 25411ee

File tree

5 files changed

+42
-16
lines changed

5 files changed

+42
-16
lines changed

docs/flatten.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2147,6 +2147,7 @@ Annotates rust rules with RustAnalyzerInfo later used to build a rust-project.js
21472147
| proc_macro_deps| String |
21482148
| crate| String |
21492149
| actual| String |
2150+
| proto| String |
21502151

21512152

21522153
**ATTRIBUTES**

docs/rust_analyzer.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ Annotates rust rules with RustAnalyzerInfo later used to build a rust-project.js
119119
| proc_macro_deps| String |
120120
| crate| String |
121121
| actual| String |
122+
| proto| String |
122123

123124

124125
**ATTRIBUTES**

proto/prost/private/prost.bzl

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Rules for building protos in Rust with Prost and Tonic."""
22

33
load("@rules_proto//proto:defs.bzl", "ProtoInfo", "proto_common")
4+
load("//proto/prost:providers.bzl", "ProstProtoInfo")
45
load("//rust:defs.bzl", "rust_common")
56

67
# buildifier: disable=bzl-visibility
@@ -13,16 +14,6 @@ RUST_EDITION = "2021"
1314

1415
TOOLCHAIN_TYPE = "@rules_rust//proto/prost:toolchain_type"
1516

16-
ProstProtoInfo = provider(
17-
doc = "Rust Prost provider info",
18-
fields = {
19-
"dep_variant_info": "DepVariantInfo: For the compiled Rust gencode (also covers its " +
20-
"transitive dependencies)",
21-
"package_info": "File: A newline delimited file of `--extern_path` values for protoc.",
22-
"transitive_dep_infos": "depset[DepVariantInfo]: Transitive dependencies of the compiled crate.",
23-
},
24-
)
25-
2617
def _create_proto_lang_toolchain(ctx, prost_toolchain):
2718
proto_lang_toolchain = proto_common.ProtoLangToolchainInfo(
2819
out_replacement_format_flag = "--prost_out=%s",
@@ -328,6 +319,7 @@ def _rust_prost_library_impl(ctx):
328319

329320
return [
330321
DefaultInfo(files = depset([dep_variant_info.crate_info.output])),
322+
rust_proto_info,
331323
rust_common.crate_group_info(
332324
dep_variant_infos = depset(
333325
[dep_variant_info],

proto/prost/providers.bzl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
"""Module containing definitions of all Prost providers."""
2+
3+
ProstProtoInfo = provider(
4+
doc = "Rust Prost provider info",
5+
fields = {
6+
"dep_variant_info": "DepVariantInfo: For the compiled Rust gencode (also covers its " +
7+
"transitive dependencies)",
8+
"package_info": "File: A newline delimited file of `--extern_path` values for protoc.",
9+
"transitive_dep_infos": "depset[DepVariantInfo]: Transitive dependencies of the compiled crate.",
10+
},
11+
)

rust/private/rust_analyzer.bzl

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ given targets. This file can be consumed by rust-analyzer as an alternative
2020
to Cargo.toml files.
2121
"""
2222

23+
load("//proto/prost:providers.bzl", "ProstProtoInfo")
2324
load("//rust/platform:triple_mappings.bzl", "system_to_dylib_ext", "triple_to_system")
2425
load("//rust/private:common.bzl", "rust_common")
2526
load("//rust/private:rustc.bzl", "BuildInfo")
@@ -99,12 +100,32 @@ def _rust_analyzer_aspect_impl(target, ctx):
99100
dep_infos.append(ctx.rule.attr.actual[RustAnalyzerInfo])
100101

101102
if RustAnalyzerGroupInfo in ctx.rule.attr.actual:
102-
dep_infos.extend(ctx.rule.attr.actul[RustAnalyzerGroupInfo])
103-
104-
if rust_common.crate_group_info in target:
103+
dep_infos.extend(ctx.rule.attr.actual[RustAnalyzerGroupInfo])
104+
105+
if ProstProtoInfo in target:
106+
for info in target[ProstProtoInfo].transitive_dep_infos.to_list():
107+
crate_info = info.crate_info
108+
crate_spec = ctx.actions.declare_file(crate_info.owner.name + ".rust_analyzer_crate_spec")
109+
rust_analyzer_info = RustAnalyzerInfo(
110+
crate = crate_info,
111+
cfgs = cfgs,
112+
env = crate_info.rustc_env,
113+
deps = [],
114+
crate_specs = depset(direct = [crate_spec]),
115+
proc_macro_dylib_path = None,
116+
build_info = info.build_info,
117+
)
118+
ctx.actions.write(
119+
output = crate_spec,
120+
content = json.encode(_create_single_crate(ctx, rust_analyzer_info)),
121+
)
122+
dep_infos.append(rust_analyzer_info)
123+
124+
if ProstProtoInfo in target:
125+
crate_info = target[ProstProtoInfo].dep_variant_info.crate_info
126+
elif rust_common.crate_group_info in target:
105127
return [RustAnalyzerGroupInfo(deps = dep_infos)]
106-
107-
if rust_common.crate_info in target:
128+
elif rust_common.crate_info in target:
108129
crate_info = target[rust_common.crate_info]
109130
elif rust_common.test_crate_info in target:
110131
crate_info = target[rust_common.test_crate_info].crate
@@ -163,7 +184,7 @@ def find_proc_macro_dylib_path(toolchain, target):
163184
return None
164185

165186
rust_analyzer_aspect = aspect(
166-
attr_aspects = ["deps", "proc_macro_deps", "crate", "actual"],
187+
attr_aspects = ["deps", "proc_macro_deps", "crate", "actual", "proto"],
167188
implementation = _rust_analyzer_aspect_impl,
168189
toolchains = [str(Label("//rust:toolchain_type"))],
169190
incompatible_use_toolchain_transition = True,

0 commit comments

Comments
 (0)