rem_extract/startup/
context.rs1use anyhow::Context;
2use ra_ap_paths::Utf8PathBuf;
3use ra_ap_project_model::{
4 ProjectManifest,
5 RustLibSource,
6 ProjectWorkspace,
7 CargoConfig,
8};
9
10use ra_ap_base_db::{
11 ProcMacroPaths,
12 CrateGraph,
13};
14
15use ra_ap_paths::AbsPath;
16use ra_ap_paths::AbsPathBuf;
17use ra_ap_vfs::FileId;
18
19use super::types::{
20 SingleFileStdContext,
21 SysrootFileMap,
22 TempScriptAnchor,
23};
24
25
26pub(crate) fn build_single_file_std_context() -> anyhow::Result<SingleFileStdContext> {
27 let temp_anchor = TempScriptAnchor::new()?;
30
31 let utf8 = Utf8PathBuf::from_path_buf(temp_anchor.path().clone())
33 .map_err(|_| anyhow::anyhow!("Temp path is not valid UTF-8: {:?}", temp_anchor.path()))?;
34 let abs_path = ra_ap_paths::AbsPathBuf::assert(utf8);
35
36 let manifest = ProjectManifest::from_manifest_file(abs_path.clone())
39 .context("Failed to parse temporary Cargo manifest")?;
40
41 let mut cargo_config = CargoConfig::default();
43 cargo_config.sysroot = Some(RustLibSource::Discover);
44
45 let extra_env = cargo_config.clone().extra_env;
46
47 let progress = |msg: String| {
48 eprintln!("ra_ap_project_model: {msg}");
49 };
50
51 let ws = ProjectWorkspace::load(manifest, &cargo_config, &progress)
53 .context("Failed to load ProjectWorkspace for single-file std context")?;
54
55 let mut file_map = SysrootFileMap::new();
57
58 let mut loader = |path: &AbsPath| -> Option<FileId> {
60 let owned: AbsPathBuf = path.to_path_buf();
62 Some(file_map.file_id_for(owned))
63 };
64
65 let (base_graph, proc_macros):
66 (CrateGraph, ProcMacroPaths) =
67 ws.to_crate_graph(&mut loader, &extra_env);
68
69 Ok(SingleFileStdContext {
74 base_graph,
75 proc_macros,
76 sysroot_files: file_map,
77 })
78
79
80
81}