1use ide_db::RootDatabase;
2use ide_db::base_db::{BuiltCrateData, ExtraCrateData};
3use itertools::Itertools;
4use span::FileId;
5use stdx::format_to;
6
7pub(crate) fn status(db: &RootDatabase, file_id: Option<FileId>) -> String {
17 let mut buf = String::new();
18
19 if let Some(file_id) = file_id {
32 format_to!(buf, "\nCrates for file {}:\n", file_id.index());
33 let crates = crate::parent_module::crates_for(db, file_id);
34 if crates.is_empty() {
35 format_to!(buf, "Does not belong to any crate");
36 }
37 for crate_id in crates {
38 let BuiltCrateData {
39 root_file_id,
40 edition,
41 dependencies,
42 origin,
43 is_proc_macro,
44 proc_macro_cwd,
45 } = crate_id.data(db);
46 let ExtraCrateData { version, display_name, potential_cfg_options } =
47 crate_id.extra_data(db);
48 let cfg_options = crate_id.cfg_options(db);
49 let env = crate_id.env(db);
50 format_to!(
51 buf,
52 "Crate: {}\n",
53 match display_name {
54 Some(it) => format!("{it}({crate_id:?})"),
55 None => format!("{crate_id:?}"),
56 }
57 );
58 format_to!(buf, " Root module file id: {}\n", root_file_id.index());
59 format_to!(buf, " Edition: {}\n", edition);
60 format_to!(buf, " Version: {}\n", version.as_deref().unwrap_or("n/a"));
61 format_to!(buf, " Enabled cfgs: {:?}\n", cfg_options);
62 format_to!(buf, " Potential cfgs: {:?}\n", potential_cfg_options);
63 format_to!(buf, " Env: {:?}\n", env);
64 format_to!(buf, " Origin: {:?}\n", origin);
65 format_to!(buf, " Is a proc macro crate: {}\n", is_proc_macro);
66 format_to!(buf, " Proc macro cwd: {:?}\n", proc_macro_cwd);
67 let deps = dependencies
68 .iter()
69 .map(|dep| format!("{}={:?}", dep.name, dep.crate_id))
70 .format(", ");
71 format_to!(buf, " Dependencies: {}\n", deps);
72 }
73 }
74
75 buf.trim().to_owned()
76}