Skip to content

Commit 4f2c86e

Browse files
committed
Auto merge of rust-lang#13260 - Veykril:simplify, r=Veykril
Simplify
2 parents bc6d574 + a6c067c commit 4f2c86e

File tree

14 files changed

+89
-88
lines changed

14 files changed

+89
-88
lines changed

crates/project-model/src/cargo_workspace.rs

+23-45
Original file line numberDiff line numberDiff line change
@@ -272,8 +272,8 @@ impl CargoWorkspace {
272272
let target = config
273273
.target
274274
.clone()
275-
.or_else(|| cargo_config_build_target(cargo_toml, config))
276-
.or_else(|| rustc_discover_host_triple(cargo_toml, config));
275+
.or_else(|| cargo_config_build_target(cargo_toml, &config.extra_env))
276+
.or_else(|| rustc_discover_host_triple(cargo_toml, &config.extra_env));
277277

278278
let mut meta = MetadataCommand::new();
279279
meta.cargo_path(toolchain::cargo());
@@ -304,12 +304,9 @@ impl CargoWorkspace {
304304
// unclear whether cargo itself supports it.
305305
progress("metadata".to_string());
306306

307-
fn exec_with_env(
308-
command: &cargo_metadata::MetadataCommand,
309-
extra_env: &FxHashMap<String, String>,
310-
) -> Result<cargo_metadata::Metadata, cargo_metadata::Error> {
311-
let mut command = command.cargo_command();
312-
command.envs(extra_env);
307+
(|| -> Result<cargo_metadata::Metadata, cargo_metadata::Error> {
308+
let mut command = meta.cargo_command();
309+
command.envs(&config.extra_env);
313310
let output = command.output()?;
314311
if !output.status.success() {
315312
return Err(cargo_metadata::Error::CargoMetadata {
@@ -321,12 +318,8 @@ impl CargoWorkspace {
321318
.find(|line| line.starts_with('{'))
322319
.ok_or(cargo_metadata::Error::NoJson)?;
323320
cargo_metadata::MetadataCommand::parse(stdout)
324-
}
325-
326-
let meta = exec_with_env(&meta, &config.extra_env)
327-
.with_context(|| format!("Failed to run `{:?}`", meta.cargo_command()))?;
328-
329-
Ok(meta)
321+
})()
322+
.with_context(|| format!("Failed to run `{:?}`", meta.cargo_command()))
330323
}
331324

332325
pub fn new(mut meta: cargo_metadata::Metadata) -> CargoWorkspace {
@@ -395,32 +388,14 @@ impl CargoWorkspace {
395388
}
396389
let resolve = meta.resolve.expect("metadata executed with deps");
397390
for mut node in resolve.nodes {
398-
let source = match pkg_by_id.get(&node.id) {
399-
Some(&src) => src,
400-
// FIXME: replace this and a similar branch below with `.unwrap`, once
401-
// https://github.com/rust-lang/cargo/issues/7841
402-
// is fixed and hits stable (around 1.43-is probably?).
403-
None => {
404-
tracing::error!("Node id do not match in cargo metadata, ignoring {}", node.id);
405-
continue;
406-
}
407-
};
391+
let &source = pkg_by_id.get(&node.id).unwrap();
408392
node.deps.sort_by(|a, b| a.pkg.cmp(&b.pkg));
409-
for (dep_node, kind) in node
393+
let dependencies = node
410394
.deps
411395
.iter()
412-
.flat_map(|dep| DepKind::iter(&dep.dep_kinds).map(move |kind| (dep, kind)))
413-
{
414-
let pkg = match pkg_by_id.get(&dep_node.pkg) {
415-
Some(&pkg) => pkg,
416-
None => {
417-
tracing::error!(
418-
"Dep node id do not match in cargo metadata, ignoring {}",
419-
dep_node.pkg
420-
);
421-
continue;
422-
}
423-
};
396+
.flat_map(|dep| DepKind::iter(&dep.dep_kinds).map(move |kind| (dep, kind)));
397+
for (dep_node, kind) in dependencies {
398+
let &pkg = pkg_by_id.get(&dep_node.pkg).unwrap();
424399
let dep = PackageDependency { name: dep_node.name.clone(), pkg, kind };
425400
packages[source].dependencies.push(dep);
426401
}
@@ -465,10 +440,7 @@ impl CargoWorkspace {
465440
found = true
466441
}
467442
self[pkg].dependencies.iter().find_map(|dep| {
468-
if &self[dep.pkg].manifest == manifest_path {
469-
return Some(self[pkg].manifest.clone());
470-
}
471-
None
443+
(&self[dep.pkg].manifest == manifest_path).then(|| self[pkg].manifest.clone())
472444
})
473445
})
474446
.collect::<Vec<ManifestPath>>();
@@ -494,9 +466,12 @@ impl CargoWorkspace {
494466
}
495467
}
496468

497-
fn rustc_discover_host_triple(cargo_toml: &ManifestPath, config: &CargoConfig) -> Option<String> {
469+
fn rustc_discover_host_triple(
470+
cargo_toml: &ManifestPath,
471+
extra_env: &FxHashMap<String, String>,
472+
) -> Option<String> {
498473
let mut rustc = Command::new(toolchain::rustc());
499-
rustc.envs(&config.extra_env);
474+
rustc.envs(extra_env);
500475
rustc.current_dir(cargo_toml.parent()).arg("-vV");
501476
tracing::debug!("Discovering host platform by {:?}", rustc);
502477
match utf8_stdout(rustc) {
@@ -518,9 +493,12 @@ fn rustc_discover_host_triple(cargo_toml: &ManifestPath, config: &CargoConfig) -
518493
}
519494
}
520495

521-
fn cargo_config_build_target(cargo_toml: &ManifestPath, config: &CargoConfig) -> Option<String> {
496+
fn cargo_config_build_target(
497+
cargo_toml: &ManifestPath,
498+
extra_env: &FxHashMap<String, String>,
499+
) -> Option<String> {
522500
let mut cargo_config = Command::new(toolchain::cargo());
523-
cargo_config.envs(&config.extra_env);
501+
cargo_config.envs(extra_env);
524502
cargo_config
525503
.current_dir(cargo_toml.parent())
526504
.args(&["-Z", "unstable-options", "config", "get", "build.target"])

crates/project-model/src/project_json.rs

+3
Original file line numberDiff line numberDiff line change
@@ -110,14 +110,17 @@ impl ProjectJson {
110110
.collect::<Vec<_>>(),
111111
}
112112
}
113+
113114
/// Returns the number of crates in the project.
114115
pub fn n_crates(&self) -> usize {
115116
self.crates.len()
116117
}
118+
117119
/// Returns an iterator over the crates in the project.
118120
pub fn crates(&self) -> impl Iterator<Item = (CrateId, &Crate)> + '_ {
119121
self.crates.iter().enumerate().map(|(idx, krate)| (CrateId(idx as u32), krate))
120122
}
123+
121124
/// Returns the path to the project's root folder.
122125
pub fn path(&self) -> &AbsPath {
123126
&self.project_root

crates/project-model/src/rustc_cfg.rs

+7-6
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@
33
use std::process::Command;
44

55
use anyhow::Result;
6+
use rustc_hash::FxHashMap;
67

7-
use crate::{cfg_flag::CfgFlag, utf8_stdout, CargoConfig, ManifestPath};
8+
use crate::{cfg_flag::CfgFlag, utf8_stdout, ManifestPath};
89

910
pub(crate) fn get(
1011
cargo_toml: Option<&ManifestPath>,
1112
target: Option<&str>,
12-
config: &CargoConfig,
13+
extra_env: &FxHashMap<String, String>,
1314
) -> Vec<CfgFlag> {
1415
let _p = profile::span("rustc_cfg::get");
1516
let mut res = Vec::with_capacity(6 * 2 + 1);
@@ -22,7 +23,7 @@ pub(crate) fn get(
2223
}
2324
}
2425

25-
match get_rust_cfgs(cargo_toml, target, config) {
26+
match get_rust_cfgs(cargo_toml, target, extra_env) {
2627
Ok(rustc_cfgs) => {
2728
tracing::debug!(
2829
"rustc cfgs found: {:?}",
@@ -42,11 +43,11 @@ pub(crate) fn get(
4243
fn get_rust_cfgs(
4344
cargo_toml: Option<&ManifestPath>,
4445
target: Option<&str>,
45-
config: &CargoConfig,
46+
extra_env: &FxHashMap<String, String>,
4647
) -> Result<String> {
4748
if let Some(cargo_toml) = cargo_toml {
4849
let mut cargo_config = Command::new(toolchain::cargo());
49-
cargo_config.envs(&config.extra_env);
50+
cargo_config.envs(extra_env);
5051
cargo_config
5152
.current_dir(cargo_toml.parent())
5253
.args(&["-Z", "unstable-options", "rustc", "--print", "cfg"])
@@ -61,7 +62,7 @@ fn get_rust_cfgs(
6162
}
6263
// using unstable cargo features failed, fall back to using plain rustc
6364
let mut cmd = Command::new(toolchain::rustc());
64-
cmd.envs(&config.extra_env);
65+
cmd.envs(extra_env);
6566
cmd.args(&["--print", "cfg", "-O"]);
6667
if let Some(target) = target {
6768
cmd.args(&["--target", target]);

crates/project-model/src/sysroot.rs

+17-10
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ use std::{env, fs, iter, ops, path::PathBuf, process::Command};
99
use anyhow::{format_err, Result};
1010
use la_arena::{Arena, Idx};
1111
use paths::{AbsPath, AbsPathBuf};
12+
use rustc_hash::FxHashMap;
1213

13-
use crate::{utf8_stdout, CargoConfig, ManifestPath};
14+
use crate::{utf8_stdout, ManifestPath};
1415

1516
#[derive(Debug, Clone, Eq, PartialEq)]
1617
pub struct Sysroot {
@@ -67,18 +68,21 @@ impl Sysroot {
6768
self.crates.iter().map(|(id, _data)| id)
6869
}
6970

70-
pub fn discover(dir: &AbsPath, config: &CargoConfig) -> Result<Sysroot> {
71+
pub fn discover(dir: &AbsPath, extra_env: &FxHashMap<String, String>) -> Result<Sysroot> {
7172
tracing::debug!("Discovering sysroot for {}", dir.display());
72-
let sysroot_dir = discover_sysroot_dir(dir, config)?;
73-
let sysroot_src_dir = discover_sysroot_src_dir(&sysroot_dir, dir, config)?;
73+
let sysroot_dir = discover_sysroot_dir(dir, extra_env)?;
74+
let sysroot_src_dir = discover_sysroot_src_dir(&sysroot_dir, dir, extra_env)?;
7475
let res = Sysroot::load(sysroot_dir, sysroot_src_dir)?;
7576
Ok(res)
7677
}
7778

78-
pub fn discover_rustc(cargo_toml: &ManifestPath, config: &CargoConfig) -> Option<ManifestPath> {
79+
pub fn discover_rustc(
80+
cargo_toml: &ManifestPath,
81+
extra_env: &FxHashMap<String, String>,
82+
) -> Option<ManifestPath> {
7983
tracing::debug!("Discovering rustc source for {}", cargo_toml.display());
8084
let current_dir = cargo_toml.parent();
81-
discover_sysroot_dir(current_dir, config)
85+
discover_sysroot_dir(current_dir, extra_env)
8286
.ok()
8387
.and_then(|sysroot_dir| get_rustc_src(&sysroot_dir))
8488
}
@@ -146,9 +150,12 @@ impl Sysroot {
146150
}
147151
}
148152

149-
fn discover_sysroot_dir(current_dir: &AbsPath, config: &CargoConfig) -> Result<AbsPathBuf> {
153+
fn discover_sysroot_dir(
154+
current_dir: &AbsPath,
155+
extra_env: &FxHashMap<String, String>,
156+
) -> Result<AbsPathBuf> {
150157
let mut rustc = Command::new(toolchain::rustc());
151-
rustc.envs(&config.extra_env);
158+
rustc.envs(extra_env);
152159
rustc.current_dir(current_dir).args(&["--print", "sysroot"]);
153160
tracing::debug!("Discovering sysroot by {:?}", rustc);
154161
let stdout = utf8_stdout(rustc)?;
@@ -158,7 +165,7 @@ fn discover_sysroot_dir(current_dir: &AbsPath, config: &CargoConfig) -> Result<A
158165
fn discover_sysroot_src_dir(
159166
sysroot_path: &AbsPathBuf,
160167
current_dir: &AbsPath,
161-
config: &CargoConfig,
168+
extra_env: &FxHashMap<String, String>,
162169
) -> Result<AbsPathBuf> {
163170
if let Ok(path) = env::var("RUST_SRC_PATH") {
164171
let path = AbsPathBuf::try_from(path.as_str())
@@ -174,7 +181,7 @@ fn discover_sysroot_src_dir(
174181
get_rust_src(sysroot_path)
175182
.or_else(|| {
176183
let mut rustup = Command::new(toolchain::rustup());
177-
rustup.envs(&config.extra_env);
184+
rustup.envs(extra_env);
178185
rustup.current_dir(current_dir).args(&["component", "add", "rust-src"]);
179186
utf8_stdout(rustup).ok()?;
180187
get_rust_src(sysroot_path)

crates/project-model/src/tests.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ use paths::{AbsPath, AbsPathBuf};
1010
use serde::de::DeserializeOwned;
1111

1212
use crate::{
13-
CargoConfig, CargoWorkspace, CfgOverrides, ProjectJson, ProjectJsonData, ProjectWorkspace,
14-
Sysroot, WorkspaceBuildScripts,
13+
CargoWorkspace, CfgOverrides, ProjectJson, ProjectJsonData, ProjectWorkspace, Sysroot,
14+
WorkspaceBuildScripts,
1515
};
1616

1717
fn load_cargo(file: &str) -> CrateGraph {
@@ -101,7 +101,7 @@ fn to_crate_graph(project_workspace: ProjectWorkspace) -> CrateGraph {
101101
Some(FileId(counter))
102102
}
103103
},
104-
&CargoConfig::default(),
104+
&Default::default(),
105105
)
106106
}
107107

crates/project-model/src/workspace.rs

+23-14
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,11 @@ impl ProjectWorkspace {
156156
})?;
157157
let project_location = project_json.parent().to_path_buf();
158158
let project_json = ProjectJson::new(&project_location, data);
159-
ProjectWorkspace::load_inline(project_json, config.target.as_deref(), config)?
159+
ProjectWorkspace::load_inline(
160+
project_json,
161+
config.target.as_deref(),
162+
&config.extra_env,
163+
)?
160164
}
161165
ProjectManifest::CargoToml(cargo_toml) => {
162166
let cargo_version = utf8_stdout({
@@ -187,17 +191,21 @@ impl ProjectWorkspace {
187191
let sysroot = if config.no_sysroot {
188192
None
189193
} else {
190-
Some(Sysroot::discover(cargo_toml.parent(), config).with_context(|| {
191-
format!(
194+
Some(Sysroot::discover(cargo_toml.parent(), &config.extra_env).with_context(
195+
|| {
196+
format!(
192197
"Failed to find sysroot for Cargo.toml file {}. Is rust-src installed?",
193198
cargo_toml.display()
194199
)
195-
})?)
200+
},
201+
)?)
196202
};
197203

198204
let rustc_dir = match &config.rustc_source {
199205
Some(RustcSource::Path(path)) => ManifestPath::try_from(path.clone()).ok(),
200-
Some(RustcSource::Discover) => Sysroot::discover_rustc(&cargo_toml, config),
206+
Some(RustcSource::Discover) => {
207+
Sysroot::discover_rustc(&cargo_toml, &config.extra_env)
208+
}
201209
None => None,
202210
};
203211

@@ -217,7 +225,8 @@ impl ProjectWorkspace {
217225
None => None,
218226
};
219227

220-
let rustc_cfg = rustc_cfg::get(Some(&cargo_toml), config.target.as_deref(), config);
228+
let rustc_cfg =
229+
rustc_cfg::get(Some(&cargo_toml), config.target.as_deref(), &config.extra_env);
221230

222231
let cfg_overrides = config.cfg_overrides();
223232
ProjectWorkspace::Cargo {
@@ -238,7 +247,7 @@ impl ProjectWorkspace {
238247
pub fn load_inline(
239248
project_json: ProjectJson,
240249
target: Option<&str>,
241-
config: &CargoConfig,
250+
extra_env: &FxHashMap<String, String>,
242251
) -> Result<ProjectWorkspace> {
243252
let sysroot = match (project_json.sysroot.clone(), project_json.sysroot_src.clone()) {
244253
(Some(sysroot), Some(sysroot_src)) => Some(Sysroot::load(sysroot, sysroot_src)?),
@@ -260,7 +269,7 @@ impl ProjectWorkspace {
260269
(None, None) => None,
261270
};
262271

263-
let rustc_cfg = rustc_cfg::get(None, target, config);
272+
let rustc_cfg = rustc_cfg::get(None, target, extra_env);
264273
Ok(ProjectWorkspace::Json { project: project_json, sysroot, rustc_cfg })
265274
}
266275

@@ -270,9 +279,9 @@ impl ProjectWorkspace {
270279
.first()
271280
.and_then(|it| it.parent())
272281
.ok_or_else(|| format_err!("No detached files to load"))?,
273-
&CargoConfig::default(),
282+
&Default::default(),
274283
)?;
275-
let rustc_cfg = rustc_cfg::get(None, None, &CargoConfig::default());
284+
let rustc_cfg = rustc_cfg::get(None, None, &Default::default());
276285
Ok(ProjectWorkspace::DetachedFiles { files: detached_files, sysroot, rustc_cfg })
277286
}
278287

@@ -419,7 +428,7 @@ impl ProjectWorkspace {
419428
&self,
420429
load_proc_macro: &mut dyn FnMut(&str, &AbsPath) -> ProcMacroLoadResult,
421430
load: &mut dyn FnMut(&AbsPath) -> Option<FileId>,
422-
config: &CargoConfig,
431+
extra_env: &FxHashMap<String, String>,
423432
) -> CrateGraph {
424433
let _p = profile::span("ProjectWorkspace::to_crate_graph");
425434

@@ -430,7 +439,7 @@ impl ProjectWorkspace {
430439
load,
431440
project,
432441
sysroot,
433-
config,
442+
extra_env,
434443
),
435444
ProjectWorkspace::Cargo {
436445
cargo,
@@ -469,7 +478,7 @@ fn project_json_to_crate_graph(
469478
load: &mut dyn FnMut(&AbsPath) -> Option<FileId>,
470479
project: &ProjectJson,
471480
sysroot: &Option<Sysroot>,
472-
config: &CargoConfig,
481+
extra_env: &FxHashMap<String, String>,
473482
) -> CrateGraph {
474483
let mut crate_graph = CrateGraph::default();
475484
let sysroot_deps = sysroot
@@ -497,7 +506,7 @@ fn project_json_to_crate_graph(
497506
let target_cfgs = match krate.target.as_deref() {
498507
Some(target) => cfg_cache
499508
.entry(target)
500-
.or_insert_with(|| rustc_cfg::get(None, Some(target), config)),
509+
.or_insert_with(|| rustc_cfg::get(None, Some(target), extra_env)),
501510
None => &rustc_cfg,
502511
};
503512

0 commit comments

Comments
 (0)