Skip to content

Commit da8750e

Browse files
committed
Rust: extract each project only once
1 parent 7c43839 commit da8750e

1 file changed

Lines changed: 28 additions & 7 deletions

File tree

rust/extractor/src/main.rs

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
use crate::trap::TrapId;
22
use anyhow::Context;
33
use ra_ap_hir::db::DefDatabase;
4-
use ra_ap_hir::{Crate};
5-
use ra_ap_load_cargo::{load_workspace_at, LoadCargoConfig, ProcMacroServerChoice};
4+
use ra_ap_hir::Crate;
5+
use ra_ap_load_cargo::{load_workspace, LoadCargoConfig, ProcMacroServerChoice};
66
use ra_ap_project_model::CargoConfig;
7+
use ra_ap_project_model::ProjectWorkspace;
78
use ra_ap_project_model::RustLibSource;
8-
use std::path::{PathBuf};
9+
use ra_ap_vfs::AbsPathBuf;
10+
use std::path::PathBuf;
911

1012
mod archive;
1113
mod config;
@@ -14,6 +16,19 @@ pub mod path;
1416
mod translate;
1517
pub mod trap;
1618

19+
pub fn find_project_manifests(
20+
files: &Vec<PathBuf>,
21+
) -> anyhow::Result<Vec<ra_ap_project_model::ProjectManifest>> {
22+
let current = std::env::current_dir()?;
23+
let abs_files: Vec<_> = files
24+
.iter()
25+
.map(|path| AbsPathBuf::assert_utf8(current.join(path)))
26+
.collect();
27+
Ok(ra_ap_project_model::ProjectManifest::discover_all(
28+
&abs_files,
29+
))
30+
}
31+
1732
fn main() -> anyhow::Result<()> {
1833
let cfg = config::Config::extract().context("failed to load configuration")?;
1934
stderrlog::new()
@@ -36,10 +51,16 @@ fn main() -> anyhow::Result<()> {
3651
with_proc_macro_server: ProcMacroServerChoice::Sysroot,
3752
prefill_caches: false,
3853
};
39-
for input in cfg.inputs {
40-
let (db, vfs, _macro_server) = load_workspace_at(&input, &config, &load_config, &progress)
41-
.context("loading inputs")?;
42-
_macro_server.expect("no macro server");
54+
let projects = find_project_manifests(&cfg.inputs).context("loading inputs")?;
55+
for project in projects {
56+
let mut workspace = ProjectWorkspace::load(project, &config, &progress)?;
57+
58+
if load_config.load_out_dirs_from_check {
59+
let build_scripts = workspace.run_build_scripts(&config, &progress)?;
60+
workspace.set_build_scripts(build_scripts)
61+
}
62+
63+
let (db, vfs, _macro_server) = load_workspace(workspace, &config.extra_env, &load_config)?;
4364
let crates = <dyn DefDatabase>::crate_graph(&db);
4465
for crate_id in crates.iter() {
4566
let krate = Crate::from(crate_id);

0 commit comments

Comments
 (0)