Skip to content

Commit 21faec1

Browse files
authored
Merge pull request #18867 from Veykril/push-ntmxlropxkrr
internal: target-triple -> target-tuple + version fetching cleanup
2 parents c360bf5 + 380439c commit 21faec1

File tree

11 files changed

+191
-102
lines changed

11 files changed

+191
-102
lines changed

src/tools/rust-analyzer/crates/project-model/src/lib.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ pub mod project_json;
1919
pub mod toolchain_info {
2020
pub mod rustc_cfg;
2121
pub mod target_data_layout;
22-
pub mod target_triple;
22+
pub mod target_tuple;
23+
pub mod version;
2324

2425
use std::path::Path;
2526

src/tools/rust-analyzer/crates/project-model/src/toolchain_info/rustc_cfg.rs

+28-3
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,11 @@ fn rustc_print_cfg(
6666
QueryConfig::Cargo(sysroot, cargo_toml) => {
6767
let mut cmd = sysroot.tool(Tool::Cargo, cargo_toml.parent());
6868
cmd.envs(extra_env);
69-
cmd.env("RUSTC_BOOTSTRAP", "1");
70-
cmd.args(["rustc", "-Z", "unstable-options"]).args(RUSTC_ARGS);
71-
cmd.args(["--", "-O"]);
69+
cmd.args(["rustc"]).args(RUSTC_ARGS);
7270
if let Some(target) = target {
7371
cmd.args(["--target", target]);
7472
}
73+
cmd.args(["--", "-O"]);
7574

7675
match utf8_stdout(&mut cmd) {
7776
Ok(it) => return Ok(it),
@@ -97,3 +96,29 @@ fn rustc_print_cfg(
9796

9897
utf8_stdout(&mut cmd).with_context(|| format!("unable to fetch cfgs via `{cmd:?}`"))
9998
}
99+
100+
#[cfg(test)]
101+
mod tests {
102+
use paths::{AbsPathBuf, Utf8PathBuf};
103+
104+
use crate::{ManifestPath, Sysroot};
105+
106+
use super::*;
107+
108+
#[test]
109+
fn cargo() {
110+
let manifest_path = concat!(env!("CARGO_MANIFEST_DIR"), "/Cargo.toml");
111+
let sysroot = Sysroot::empty();
112+
let manifest_path =
113+
ManifestPath::try_from(AbsPathBuf::assert(Utf8PathBuf::from(manifest_path))).unwrap();
114+
let cfg = QueryConfig::Cargo(&sysroot, &manifest_path);
115+
assert_ne!(get(cfg, None, &FxHashMap::default()), vec![]);
116+
}
117+
118+
#[test]
119+
fn rustc() {
120+
let sysroot = Sysroot::empty();
121+
let cfg = QueryConfig::Rustc(&sysroot, env!("CARGO_MANIFEST_DIR").as_ref());
122+
assert_ne!(get(cfg, None, &FxHashMap::default()), vec![]);
123+
}
124+
}

src/tools/rust-analyzer/crates/project-model/src/toolchain_info/target_data_layout.rs

+26
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,29 @@ pub fn get(
5555
.with_context(|| format!("unable to fetch target-data-layout via `{cmd:?}`"))
5656
.and_then(process)
5757
}
58+
59+
#[cfg(test)]
60+
mod tests {
61+
use paths::{AbsPathBuf, Utf8PathBuf};
62+
63+
use crate::{ManifestPath, Sysroot};
64+
65+
use super::*;
66+
67+
#[test]
68+
fn cargo() {
69+
let manifest_path = concat!(env!("CARGO_MANIFEST_DIR"), "/Cargo.toml");
70+
let sysroot = Sysroot::empty();
71+
let manifest_path =
72+
ManifestPath::try_from(AbsPathBuf::assert(Utf8PathBuf::from(manifest_path))).unwrap();
73+
let cfg = QueryConfig::Cargo(&sysroot, &manifest_path);
74+
assert!(get(cfg, None, &FxHashMap::default()).is_ok());
75+
}
76+
77+
#[test]
78+
fn rustc() {
79+
let sysroot = Sysroot::empty();
80+
let cfg = QueryConfig::Rustc(&sysroot, env!("CARGO_MANIFEST_DIR").as_ref());
81+
assert!(get(cfg, None, &FxHashMap::default()).is_ok());
82+
}
83+
}

src/tools/rust-analyzer/crates/project-model/src/toolchain_info/target_triple.rs renamed to src/tools/rust-analyzer/crates/project-model/src/toolchain_info/target_tuple.rs

+31-5
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ pub fn get(
1414
target: Option<&str>,
1515
extra_env: &FxHashMap<String, String>,
1616
) -> anyhow::Result<Vec<String>> {
17-
let _p = tracing::info_span!("target_triple::get").entered();
17+
let _p = tracing::info_span!("target_tuple::get").entered();
1818
if let Some(target) = target {
1919
return Ok(vec![target.to_owned()]);
2020
}
@@ -28,10 +28,10 @@ pub fn get(
2828
}
2929
QueryConfig::Rustc(sysroot, current_dir) => (sysroot, current_dir),
3030
};
31-
rustc_discover_host_triple(extra_env, sysroot, current_dir).map(|it| vec![it])
31+
rustc_discover_host_tuple(extra_env, sysroot, current_dir).map(|it| vec![it])
3232
}
3333

34-
fn rustc_discover_host_triple(
34+
fn rustc_discover_host_tuple(
3535
extra_env: &FxHashMap<String, String>,
3636
sysroot: &Sysroot,
3737
current_dir: &Path,
@@ -60,14 +60,14 @@ fn cargo_config_build_target(
6060
cmd.envs(extra_env);
6161
cmd.current_dir(cargo_toml.parent()).env("RUSTC_BOOTSTRAP", "1");
6262
cmd.args(["-Z", "unstable-options", "config", "get", "build.target"]);
63-
// if successful we receive `build.target = "target-triple"`
63+
// if successful we receive `build.target = "target-tuple"`
6464
// or `build.target = ["<target 1>", ..]`
6565
// this might be `error: config value `build.target` is not set` in which case we
6666
// don't wanna log the error
6767
utf8_stdout(&mut cmd).and_then(parse_output_cargo_config_build_target).ok()
6868
}
6969

70-
// Parses `"build.target = [target-triple, target-triple, ...]"` or `"build.target = "target-triple"`
70+
// Parses `"build.target = [target-tuple, target-tuple, ...]"` or `"build.target = "target-tuple"`
7171
fn parse_output_cargo_config_build_target(stdout: String) -> anyhow::Result<Vec<String>> {
7272
let trimmed = stdout.trim_start_matches("build.target = ").trim_matches('"');
7373

@@ -77,3 +77,29 @@ fn parse_output_cargo_config_build_target(stdout: String) -> anyhow::Result<Vec<
7777

7878
serde_json::from_str(trimmed).context("Failed to parse `build.target` as an array of target")
7979
}
80+
81+
#[cfg(test)]
82+
mod tests {
83+
use paths::{AbsPathBuf, Utf8PathBuf};
84+
85+
use crate::{ManifestPath, Sysroot};
86+
87+
use super::*;
88+
89+
#[test]
90+
fn cargo() {
91+
let manifest_path = concat!(env!("CARGO_MANIFEST_DIR"), "/Cargo.toml");
92+
let sysroot = Sysroot::empty();
93+
let manifest_path =
94+
ManifestPath::try_from(AbsPathBuf::assert(Utf8PathBuf::from(manifest_path))).unwrap();
95+
let cfg = QueryConfig::Cargo(&sysroot, &manifest_path);
96+
assert!(get(cfg, None, &FxHashMap::default()).is_ok());
97+
}
98+
99+
#[test]
100+
fn rustc() {
101+
let sysroot = Sysroot::empty();
102+
let cfg = QueryConfig::Rustc(&sysroot, env!("CARGO_MANIFEST_DIR").as_ref());
103+
assert!(get(cfg, None, &FxHashMap::default()).is_ok());
104+
}
105+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
//! Get the version string of the toolchain.
2+
3+
use anyhow::Context;
4+
use rustc_hash::FxHashMap;
5+
use semver::Version;
6+
use toolchain::Tool;
7+
8+
use crate::{toolchain_info::QueryConfig, utf8_stdout};
9+
10+
pub(crate) fn get(
11+
config: QueryConfig<'_>,
12+
extra_env: &FxHashMap<String, String>,
13+
) -> Result<Option<Version>, anyhow::Error> {
14+
let (mut cmd, prefix) = match config {
15+
QueryConfig::Cargo(sysroot, cargo_toml) => {
16+
(sysroot.tool(Tool::Cargo, cargo_toml.parent()), "cargo ")
17+
}
18+
QueryConfig::Rustc(sysroot, current_dir) => {
19+
(sysroot.tool(Tool::Rustc, current_dir), "rustc ")
20+
}
21+
};
22+
cmd.envs(extra_env);
23+
cmd.arg("--version");
24+
let out = utf8_stdout(&mut cmd).with_context(|| format!("Failed to query rust toolchain version via `{cmd:?}`, is your toolchain setup correctly?"))?;
25+
26+
let version =
27+
out.strip_prefix(prefix).and_then(|it| Version::parse(it.split_whitespace().next()?).ok());
28+
if version.is_none() {
29+
tracing::warn!("Failed to parse `{cmd:?}` output `{out}` as a semver version");
30+
}
31+
anyhow::Ok(version)
32+
}
33+
34+
#[cfg(test)]
35+
mod tests {
36+
use paths::{AbsPathBuf, Utf8PathBuf};
37+
38+
use crate::{ManifestPath, Sysroot};
39+
40+
use super::*;
41+
42+
#[test]
43+
fn cargo() {
44+
let manifest_path = concat!(env!("CARGO_MANIFEST_DIR"), "/Cargo.toml");
45+
let sysroot = Sysroot::empty();
46+
let manifest_path =
47+
ManifestPath::try_from(AbsPathBuf::assert(Utf8PathBuf::from(manifest_path))).unwrap();
48+
let cfg = QueryConfig::Cargo(&sysroot, &manifest_path);
49+
assert!(get(cfg, &FxHashMap::default()).is_ok());
50+
}
51+
52+
#[test]
53+
fn rustc() {
54+
let sysroot = Sysroot::empty();
55+
let cfg = QueryConfig::Rustc(&sysroot, env!("CARGO_MANIFEST_DIR").as_ref());
56+
assert!(get(cfg, &FxHashMap::default()).is_ok());
57+
}
58+
}

src/tools/rust-analyzer/crates/project-model/src/workspace.rs

+38-85
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ use paths::{AbsPath, AbsPathBuf};
1616
use rustc_hash::FxHashMap;
1717
use semver::Version;
1818
use span::{Edition, FileId};
19-
use toolchain::Tool;
2019
use tracing::instrument;
2120
use triomphe::Arc;
2221

@@ -26,10 +25,10 @@ use crate::{
2625
env::{cargo_config_env, inject_cargo_env, inject_cargo_package_env, inject_rustc_tool_env},
2726
project_json::{Crate, CrateArrayIdx},
2827
sysroot::{SysrootCrate, SysrootWorkspace},
29-
toolchain_info::{rustc_cfg, target_data_layout, target_triple, QueryConfig},
30-
utf8_stdout, CargoConfig, CargoWorkspace, CfgOverrides, InvocationStrategy, ManifestPath,
31-
Package, ProjectJson, ProjectManifest, Sysroot, SysrootSourceWorkspaceConfig, TargetData,
32-
TargetKind, WorkspaceBuildScripts,
28+
toolchain_info::{rustc_cfg, target_data_layout, target_tuple, version, QueryConfig},
29+
CargoConfig, CargoWorkspace, CfgOverrides, InvocationStrategy, ManifestPath, Package,
30+
ProjectJson, ProjectManifest, Sysroot, SysrootSourceWorkspaceConfig, TargetData, TargetKind,
31+
WorkspaceBuildScripts,
3332
};
3433
use tracing::{debug, error, info};
3534

@@ -151,27 +150,6 @@ impl fmt::Debug for ProjectWorkspace {
151150
}
152151
}
153152

154-
fn get_toolchain_version(
155-
current_dir: &AbsPath,
156-
sysroot: &Sysroot,
157-
tool: Tool,
158-
extra_env: &FxHashMap<String, String>,
159-
prefix: &str,
160-
) -> Result<Option<Version>, anyhow::Error> {
161-
let cargo_version = utf8_stdout(&mut {
162-
let mut cmd = Sysroot::tool(sysroot, tool, current_dir);
163-
cmd.envs(extra_env);
164-
cmd.arg("--version");
165-
cmd
166-
})
167-
.with_context(|| format!("Failed to query rust toolchain version at {current_dir}, is your toolchain setup correctly?"))?;
168-
anyhow::Ok(
169-
cargo_version
170-
.get(prefix.len()..)
171-
.and_then(|it| Version::parse(it.split_whitespace().next()?).ok()),
172-
)
173-
}
174-
175153
impl ProjectWorkspace {
176154
pub fn load(
177155
manifest: ProjectManifest,
@@ -242,16 +220,35 @@ impl ProjectWorkspace {
242220
.ok_or_else(|| Some("Failed to discover rustc source for sysroot.".to_owned())),
243221
None => Err(None),
244222
};
245-
let targets = target_triple::get(
246-
QueryConfig::Cargo(&sysroot, cargo_toml),
247-
config.target.as_deref(),
223+
224+
tracing::info!(workspace = %cargo_toml, src_root = ?sysroot.src_root(), root = ?sysroot.root(), "Using sysroot");
225+
let toolchain_config = QueryConfig::Cargo(&sysroot, cargo_toml);
226+
let targets =
227+
target_tuple::get(toolchain_config, config.target.as_deref(), &config.extra_env)
228+
.unwrap_or_default();
229+
let toolchain = version::get(toolchain_config, &config.extra_env)
230+
.inspect_err(|e| {
231+
tracing::error!(%e,
232+
"failed fetching toolchain version for {cargo_toml:?} workspace"
233+
)
234+
})
235+
.ok()
236+
.flatten();
237+
let rustc_cfg =
238+
rustc_cfg::get(toolchain_config, targets.first().map(Deref::deref), &config.extra_env);
239+
let cfg_overrides = config.cfg_overrides.clone();
240+
let data_layout = target_data_layout::get(
241+
toolchain_config,
242+
targets.first().map(Deref::deref),
248243
&config.extra_env,
249-
)
250-
.unwrap_or_default();
244+
);
245+
if let Err(e) = &data_layout {
246+
tracing::error!(%e, "failed fetching data layout for {cargo_toml:?} workspace");
247+
}
251248
sysroot.load_workspace(&SysrootSourceWorkspaceConfig::CargoMetadata(
252249
sysroot_metadata_config(&config.extra_env, &targets),
253250
));
254-
tracing::info!(workspace = %cargo_toml, src_root = ?sysroot.src_root(), root = ?sysroot.root(), "Using sysroot");
251+
255252
let rustc = rustc_dir.and_then(|rustc_dir| {
256253
info!(workspace = %cargo_toml, rustc_dir = %rustc_dir, "Using rustc source");
257254
match CargoWorkspace::fetch_metadata(
@@ -288,27 +285,7 @@ impl ProjectWorkspace {
288285
}
289286
}
290287
});
291-
let toolchain = get_toolchain_version(
292-
cargo_toml.parent(),
293-
&sysroot,
294-
Tool::Cargo,
295-
&config.extra_env,
296-
"cargo ",
297-
)?;
298-
let rustc_cfg = rustc_cfg::get(
299-
QueryConfig::Cargo(&sysroot, cargo_toml),
300-
targets.first().map(Deref::deref),
301-
&config.extra_env,
302-
);
303-
let cfg_overrides = config.cfg_overrides.clone();
304-
let data_layout = target_data_layout::get(
305-
QueryConfig::Cargo(&sysroot, cargo_toml),
306-
targets.first().map(Deref::deref),
307-
&config.extra_env,
308-
);
309-
if let Err(e) = &data_layout {
310-
tracing::error!(%e, "failed fetching data layout for {cargo_toml:?} workspace");
311-
}
288+
312289
let (meta, error) = CargoWorkspace::fetch_metadata(
313290
cargo_toml,
314291
cargo_toml.parent(),
@@ -329,6 +306,7 @@ impl ProjectWorkspace {
329306
})?;
330307
let cargo_config_extra_env = cargo_config_env(cargo_toml, &config.extra_env, &sysroot);
331308
let cargo = CargoWorkspace::new(meta, cargo_toml.clone(), cargo_config_extra_env);
309+
332310
Ok(ProjectWorkspace {
333311
kind: ProjectWorkspaceKind::Cargo {
334312
cargo,
@@ -350,19 +328,7 @@ impl ProjectWorkspace {
350328
Sysroot::new(project_json.sysroot.clone(), project_json.sysroot_src.clone());
351329
sysroot.load_workspace(&SysrootSourceWorkspaceConfig::Stitched);
352330
let query_config = QueryConfig::Rustc(&sysroot, project_json.path().as_ref());
353-
let toolchain = match get_toolchain_version(
354-
project_json.path(),
355-
&sysroot,
356-
Tool::Rustc,
357-
&config.extra_env,
358-
"rustc ",
359-
) {
360-
Ok(it) => it,
361-
Err(e) => {
362-
tracing::error!("{e}");
363-
None
364-
}
365-
};
331+
let toolchain = version::get(query_config, &config.extra_env).ok().flatten();
366332

367333
let target = config.target.as_deref();
368334
let rustc_cfg = rustc_cfg::get(query_config, target, &config.extra_env);
@@ -388,28 +354,15 @@ impl ProjectWorkspace {
388354
None => Sysroot::empty(),
389355
};
390356

391-
let toolchain =
392-
match get_toolchain_version(dir, &sysroot, Tool::Rustc, &config.extra_env, "rustc ") {
393-
Ok(it) => it,
394-
Err(e) => {
395-
tracing::error!("{e}");
396-
None
397-
}
398-
};
399-
400-
let targets = target_triple::get(
401-
QueryConfig::Cargo(&sysroot, detached_file),
402-
config.target.as_deref(),
403-
&config.extra_env,
404-
)
405-
.unwrap_or_default();
406-
357+
let query_config = QueryConfig::Cargo(&sysroot, detached_file);
358+
let toolchain = version::get(query_config, &config.extra_env).ok().flatten();
359+
let targets = target_tuple::get(query_config, config.target.as_deref(), &config.extra_env)
360+
.unwrap_or_default();
361+
let rustc_cfg = rustc_cfg::get(query_config, None, &config.extra_env);
362+
let data_layout = target_data_layout::get(query_config, None, &config.extra_env);
407363
sysroot.load_workspace(&SysrootSourceWorkspaceConfig::CargoMetadata(
408364
sysroot_metadata_config(&config.extra_env, &targets),
409365
));
410-
let query_config = QueryConfig::Rustc(&sysroot, dir.as_ref());
411-
let rustc_cfg = rustc_cfg::get(query_config, None, &config.extra_env);
412-
let data_layout = target_data_layout::get(query_config, None, &config.extra_env);
413366

414367
let cargo_script = CargoWorkspace::fetch_metadata(
415368
detached_file,

0 commit comments

Comments
 (0)