Async Loading outdir and proc-macro
This commit is contained in:
@@ -6,7 +6,9 @@ use anyhow::Result;
|
||||
use crossbeam_channel::{unbounded, Receiver};
|
||||
use ide::{AnalysisHost, Change};
|
||||
use ide_db::base_db::CrateGraph;
|
||||
use project_model::{CargoConfig, ProcMacroClient, ProjectManifest, ProjectWorkspace};
|
||||
use project_model::{
|
||||
BuildDataCollector, CargoConfig, ProcMacroClient, ProjectManifest, ProjectWorkspace,
|
||||
};
|
||||
use vfs::{loader::Handle, AbsPath, AbsPathBuf};
|
||||
|
||||
use crate::reload::{ProjectFolders, SourceRootConfig};
|
||||
@@ -18,11 +20,7 @@ pub fn load_cargo(
|
||||
) -> Result<(AnalysisHost, vfs::Vfs)> {
|
||||
let root = AbsPathBuf::assert(std::env::current_dir()?.join(root));
|
||||
let root = ProjectManifest::discover_single(&root)?;
|
||||
let ws = ProjectWorkspace::load(
|
||||
root,
|
||||
&CargoConfig { load_out_dirs_from_check, ..Default::default() },
|
||||
&|_| {},
|
||||
)?;
|
||||
let ws = ProjectWorkspace::load(root, &CargoConfig::default(), &|_| {})?;
|
||||
|
||||
let (sender, receiver) = unbounded();
|
||||
let mut vfs = vfs::Vfs::default();
|
||||
@@ -39,14 +37,26 @@ pub fn load_cargo(
|
||||
None
|
||||
};
|
||||
|
||||
let crate_graph = ws.to_crate_graph(proc_macro_client.as_ref(), &mut |path: &AbsPath| {
|
||||
let contents = loader.load_sync(path);
|
||||
let path = vfs::VfsPath::from(path.to_path_buf());
|
||||
vfs.set_file_contents(path.clone(), contents);
|
||||
vfs.file_id(&path)
|
||||
});
|
||||
let build_data = if load_out_dirs_from_check {
|
||||
let mut collector = BuildDataCollector::default();
|
||||
ws.collect_build_data_configs(&mut collector);
|
||||
Some(collector.collect(&|_| {})?)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
let project_folders = ProjectFolders::new(&[ws], &[]);
|
||||
let crate_graph = ws.to_crate_graph(
|
||||
build_data.as_ref(),
|
||||
proc_macro_client.as_ref(),
|
||||
&mut |path: &AbsPath| {
|
||||
let contents = loader.load_sync(path);
|
||||
let path = vfs::VfsPath::from(path.to_path_buf());
|
||||
vfs.set_file_contents(path.clone(), contents);
|
||||
vfs.file_id(&path)
|
||||
},
|
||||
);
|
||||
|
||||
let project_folders = ProjectFolders::new(&[ws], &[], build_data.as_ref());
|
||||
loader.set_config(vfs::loader::Config { load: project_folders.load, watch: vec![] });
|
||||
|
||||
log::debug!("crate graph: {:?}", crate_graph);
|
||||
|
||||
Reference in New Issue
Block a user