Skip to content

Commit 4652fb5

Browse files
authored
Revert "rust_analyzer: don't build a tree of RustAnalyzerInfos (#3028)" (#3093)
This reverts commit 443b089 (#3028).
1 parent f7be79c commit 4652fb5

File tree

3 files changed

+47
-46
lines changed

3 files changed

+47
-46
lines changed

extensions/prost/private/prost.bzl

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -299,15 +299,12 @@ def _rust_prost_aspect_impl(target, ctx):
299299
# https://github.com/rust-analyzer/rust-analyzer/blob/2021-11-15/crates/project_model/src/workspace.rs#L529-L531
300300
cfgs = ["test", "debug_assertions"]
301301

302-
crate_id = "prost-" + dep_variant_info.crate_info.root.path
303-
304302
rust_analyzer_info = write_rust_analyzer_spec_file(ctx, ctx.rule.attr, ctx.label, RustAnalyzerInfo(
305-
id = crate_id,
306303
aliases = {},
307304
crate = dep_variant_info.crate_info,
308305
cfgs = cfgs,
309306
env = dep_variant_info.crate_info.rustc_env,
310-
deps = depset([dep.id for dep in rust_analyzer_deps]).to_list(),
307+
deps = rust_analyzer_deps,
311308
crate_specs = depset(transitive = [dep.crate_specs for dep in rust_analyzer_deps]),
312309
proc_macro_dylib_path = None,
313310
build_info = dep_variant_info.build_info,
@@ -390,10 +387,7 @@ def _rust_prost_library_impl(ctx):
390387
rust_generated_srcs = rust_generated_srcs,
391388
proto_descriptor_set = proto_descriptor_set,
392389
),
393-
RustAnalyzerGroupInfo(
394-
crate_specs = proto_dep[RustAnalyzerInfo].crate_specs,
395-
deps = proto_dep[RustAnalyzerInfo].deps,
396-
),
390+
RustAnalyzerGroupInfo(deps = [proto_dep[RustAnalyzerInfo]]),
397391
]
398392

399393
rust_prost_library = rule(

rust/private/providers.bzl

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -157,22 +157,20 @@ TestCrateInfo = provider(
157157
RustAnalyzerInfo = provider(
158158
doc = "RustAnalyzerInfo holds rust crate metadata for targets",
159159
fields = {
160-
"aliases": "Dict[String, String]: Maps crate IDs to Replacement names these targets should be known as in Rust code",
160+
"aliases": "Dict[RustAnalyzerInfo, String]: Replacement names these targets should be known as in Rust code",
161161
"build_info": "BuildInfo: build info for this crate if present",
162162
"cfgs": "List[String]: features or other compilation `--cfg` settings",
163163
"crate": "CrateInfo: Crate information.",
164164
"crate_specs": "Depset[File]: transitive closure of OutputGroupInfo files",
165-
"deps": "List[String]: IDs of direct dependency crates",
165+
"deps": "List[RustAnalyzerInfo]: direct dependencies",
166166
"env": "Dict[String: String]: Environment variables, used for the `env!` macro",
167-
"id": "String: Arbitrary unique ID for this crate",
168167
"proc_macro_dylib_path": "File: compiled shared library output of proc-macro rule",
169168
},
170169
)
171170

172171
RustAnalyzerGroupInfo = provider(
173172
doc = "RustAnalyzerGroupInfo holds multiple RustAnalyzerInfos",
174173
fields = {
175-
"crate_specs": "Depset[File]: transitive closure of OutputGroupInfo files",
176-
"deps": "List[String]: crate IDs of direct dependencies",
174+
"deps": "List[RustAnalyzerInfo]: direct dependencies",
177175
},
178176
)

rust/private/rust_analyzer.bzl

Lines changed: 42 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ def write_rust_analyzer_spec_file(ctx, attrs, owner, base_info):
5353
cfgs = base_info.cfgs,
5454
env = base_info.env,
5555
deps = base_info.deps,
56-
id = base_info.id,
5756
crate_specs = depset(direct = [crate_spec], transitive = [base_info.crate_specs]),
5857
proc_macro_dylib_path = base_info.proc_macro_dylib_path,
5958
build_info = base_info.build_info,
@@ -73,6 +72,21 @@ def write_rust_analyzer_spec_file(ctx, attrs, owner, base_info):
7372

7473
return rust_analyzer_info
7574

75+
def _accumulate_rust_analyzer_info(dep_infos_to_accumulate, label_index_to_accumulate, dep):
76+
if dep == None:
77+
return
78+
if RustAnalyzerInfo in dep:
79+
label_index_to_accumulate[dep.label] = dep[RustAnalyzerInfo]
80+
dep_infos_to_accumulate.append(dep[RustAnalyzerInfo])
81+
if RustAnalyzerGroupInfo in dep:
82+
for expanded_dep in dep[RustAnalyzerGroupInfo].deps:
83+
label_index_to_accumulate[expanded_dep.crate.owner] = expanded_dep
84+
dep_infos_to_accumulate.append(expanded_dep)
85+
86+
def _accumulate_rust_analyzer_infos(dep_infos_to_accumulate, label_index_to_accumulate, deps_attr):
87+
for dep in deps_attr:
88+
_accumulate_rust_analyzer_info(dep_infos_to_accumulate, label_index_to_accumulate, dep)
89+
7690
def _rust_analyzer_aspect_impl(target, ctx):
7791
if (rust_common.crate_info not in target and
7892
rust_common.test_crate_info not in target and
@@ -93,55 +107,41 @@ def _rust_analyzer_aspect_impl(target, ctx):
93107
cfgs += [f[6:] for f in ctx.rule.attr.rustc_flags if f.startswith("--cfg ") or f.startswith("--cfg=")]
94108

95109
build_info = None
110+
dep_infos = []
111+
labels_to_rais = {}
112+
96113
for dep in getattr(ctx.rule.attr, "deps", []):
97114
# Save BuildInfo if we find any (for build script output)
98115
if BuildInfo in dep:
99116
build_info = dep[BuildInfo]
100117

101-
# Gather required info from dependencies.
102-
label_to_id = {} # {Label of dependency => crate_id}
103-
crate_specs = [] # [depset of File - transitive crate_spec.json files]
104-
attrs = ctx.rule.attr
105-
all_deps = getattr(attrs, "deps", []) + getattr(attrs, "proc_macro_deps", []) + \
106-
[dep for dep in [getattr(attrs, "crate", None), getattr(attrs, "actual", None)] if dep != None]
107-
for dep in all_deps:
108-
if RustAnalyzerInfo in dep:
109-
label_to_id[dep.label] = dep[RustAnalyzerInfo].id
110-
crate_specs.append(dep[RustAnalyzerInfo].crate_specs)
111-
if RustAnalyzerGroupInfo in dep:
112-
for expanded_dep in dep[RustAnalyzerGroupInfo].deps:
113-
label_to_id[expanded_dep] = expanded_dep
114-
crate_specs.append(dep[RustAnalyzerGroupInfo].crate_specs)
115-
116-
deps = label_to_id.values()
117-
crate_specs = depset(transitive = crate_specs)
118+
_accumulate_rust_analyzer_infos(dep_infos, labels_to_rais, getattr(ctx.rule.attr, "deps", []))
119+
_accumulate_rust_analyzer_infos(dep_infos, labels_to_rais, getattr(ctx.rule.attr, "proc_macro_deps", []))
120+
121+
_accumulate_rust_analyzer_info(dep_infos, labels_to_rais, getattr(ctx.rule.attr, "crate", None))
122+
_accumulate_rust_analyzer_info(dep_infos, labels_to_rais, getattr(ctx.rule.attr, "actual", None))
118123

119124
if rust_common.crate_group_info in target:
120-
return [RustAnalyzerGroupInfo(deps = deps, crate_specs = crate_specs)]
125+
return [RustAnalyzerGroupInfo(deps = dep_infos)]
121126
elif rust_common.crate_info in target:
122127
crate_info = target[rust_common.crate_info]
123128
elif rust_common.test_crate_info in target:
124129
crate_info = target[rust_common.test_crate_info].crate
125130
else:
126131
fail("Unexpected target type: {}".format(target))
127132

128-
aliases = {
129-
label_to_id[target.label]: name
130-
for (target, name) in getattr(attrs, "aliases", {}).items()
131-
if target.label in label_to_id
132-
}
133-
134-
# An arbitrary unique and stable identifier.
135-
crate_id = "ID-" + crate_info.root.path
133+
aliases = {}
134+
for aliased_target, aliased_name in getattr(ctx.rule.attr, "aliases", {}).items():
135+
if aliased_target.label in labels_to_rais:
136+
aliases[labels_to_rais[aliased_target.label]] = aliased_name
136137

137138
rust_analyzer_info = write_rust_analyzer_spec_file(ctx, ctx.rule.attr, ctx.label, RustAnalyzerInfo(
138-
id = crate_id,
139139
aliases = aliases,
140140
crate = crate_info,
141141
cfgs = cfgs,
142142
env = crate_info.rustc_env,
143-
deps = deps,
144-
crate_specs = crate_specs,
143+
deps = dep_infos,
144+
crate_specs = depset(transitive = [dep.crate_specs for dep in dep_infos]),
145145
proc_macro_dylib_path = find_proc_macro_dylib_path(toolchain, target),
146146
build_info = build_info,
147147
))
@@ -193,6 +193,14 @@ _WORKSPACE_TEMPLATE = "__WORKSPACE__/"
193193
_EXEC_ROOT_TEMPLATE = "__EXEC_ROOT__/"
194194
_OUTPUT_BASE_TEMPLATE = "__OUTPUT_BASE__/"
195195

196+
def _crate_id(crate_info):
197+
"""Returns a unique stable identifier for a crate
198+
199+
Returns:
200+
(string): This crate's unique stable id.
201+
"""
202+
return "ID-" + crate_info.root.path
203+
196204
def _create_single_crate(ctx, attrs, info):
197205
"""Creates a crate in the rust-project.json format.
198206
@@ -206,7 +214,8 @@ def _create_single_crate(ctx, attrs, info):
206214
"""
207215
crate_name = info.crate.name
208216
crate = dict()
209-
crate["crate_id"] = info.id
217+
crate_id = _crate_id(info.crate)
218+
crate["crate_id"] = crate_id
210219
crate["display_name"] = crate_name
211220
crate["edition"] = info.crate.edition
212221
crate["env"] = {}
@@ -254,8 +263,8 @@ def _create_single_crate(ctx, attrs, info):
254263
# There's one exception - if the dependency is the same crate name as the
255264
# the crate being processed, we don't add it as a dependency to itself. This is
256265
# common and expected - `rust_test.crate` pointing to the `rust_library`.
257-
crate["deps"] = [id for id in info.deps if id != info.id]
258-
crate["aliases"] = info.aliases
266+
crate["deps"] = [_crate_id(dep.crate) for dep in info.deps if _crate_id(dep.crate) != crate_id]
267+
crate["aliases"] = {_crate_id(alias_target.crate): alias_name for alias_target, alias_name in info.aliases.items()}
259268
crate["cfg"] = info.cfgs
260269
toolchain = find_toolchain(ctx)
261270
crate["target"] = (_EXEC_ROOT_TEMPLATE + toolchain.target_json.path) if toolchain.target_json else toolchain.target_flag_value

0 commit comments

Comments
 (0)