Skip to content

Commit 7988729

Browse files
author
Paolo Tranquilli
committed
Rust: run sysroot discovery once
1 parent ca28087 commit 7988729

File tree

2 files changed

+22
-5
lines changed

2 files changed

+22
-5
lines changed

rust/extractor/src/config.rs

+11-4
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@ use figment::{
1212
use itertools::Itertools;
1313
use num_traits::Zero;
1414
use ra_ap_cfg::{CfgAtom, CfgDiff};
15+
use ra_ap_ide_db::FxHashMap;
1516
use ra_ap_intern::Symbol;
16-
use ra_ap_paths::Utf8PathBuf;
17-
use ra_ap_project_model::{CargoConfig, CargoFeatures, CfgOverrides, RustLibSource};
17+
use ra_ap_paths::{AbsPath, Utf8PathBuf};
18+
use ra_ap_project_model::{CargoConfig, CargoFeatures, CfgOverrides, RustLibSource, Sysroot};
1819
use rust_extractor_macros::extractor_cli_config;
1920
use serde::{Deserialize, Serialize};
2021
use std::collections::HashSet;
@@ -85,8 +86,13 @@ impl Config {
8586
figment.extract().context("loading configuration")
8687
}
8788

88-
pub fn to_cargo_config(&self) -> CargoConfig {
89-
let sysroot = Some(RustLibSource::Discover);
89+
pub fn to_cargo_config(&self, dir: &AbsPath) -> CargoConfig {
90+
let sysroot = Sysroot::discover(dir, &FxHashMap::default());
91+
let sysroot_src = sysroot.src_root().map(ToOwned::to_owned);
92+
let sysroot = sysroot
93+
.root()
94+
.map(ToOwned::to_owned)
95+
.map(RustLibSource::Path);
9096

9197
let target_dir = self
9298
.cargo_target_dir
@@ -111,6 +117,7 @@ impl Config {
111117

112118
CargoConfig {
113119
sysroot,
120+
sysroot_src,
114121
target_dir,
115122
features,
116123
target,

rust/extractor/src/main.rs

+11-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use log::{info, warn};
77
use ra_ap_hir::Semantics;
88
use ra_ap_ide_db::line_index::{LineCol, LineIndex};
99
use ra_ap_ide_db::RootDatabase;
10+
use ra_ap_paths::{AbsPathBuf, Utf8PathBuf};
1011
use ra_ap_project_model::{CargoConfig, ProjectManifest};
1112
use ra_ap_vfs::Vfs;
1213
use rust_analyzer::{ParseResult, RustAnalyzer};
@@ -161,6 +162,15 @@ impl<'a> Extractor<'a> {
161162
}
162163
}
163164

165+
fn cwd() -> anyhow::Result<AbsPathBuf> {
166+
let path = std::env::current_dir().context("current directory")?;
167+
let utf8_path = Utf8PathBuf::from_path_buf(path)
168+
.map_err(|p| anyhow::anyhow!("{} is not a valid UTF-8 path", p.display()))?;
169+
let abs_path = AbsPathBuf::try_from(utf8_path)
170+
.map_err(|p| anyhow::anyhow!("{} is not absolute", p.as_str()))?;
171+
Ok(abs_path)
172+
}
173+
164174
fn main() -> anyhow::Result<()> {
165175
let start = Instant::now();
166176
let mut cfg = config::Config::extract().context("failed to load configuration")?;
@@ -204,7 +214,7 @@ fn main() -> anyhow::Result<()> {
204214
}
205215
extractor.extract_without_semantics(file, "no manifest found");
206216
}
207-
let cargo_config = cfg.to_cargo_config();
217+
let cargo_config = cfg.to_cargo_config(&cwd()?);
208218
for (manifest, files) in map.values().filter(|(_, files)| !files.is_empty()) {
209219
if let Some((ref db, ref vfs)) = extractor.load_manifest(manifest, &cargo_config) {
210220
let semantics = Semantics::new(db);

0 commit comments

Comments
 (0)