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 crate_attrs,
44 is_proc_macro,
45 proc_macro_cwd,
46 } = crate_id.data(db);
47 let ExtraCrateData { version, display_name, potential_cfg_options } =
48 crate_id.extra_data(db);
49 let cfg_options = crate_id.cfg_options(db);
50 let env = crate_id.env(db);
51 format_to!(
52 buf,
53 "Crate: {}\n",
54 match display_name {
55 Some(it) => format!("{it}({crate_id:?})"),
56 None => format!("{crate_id:?}"),
57 }
58 );
59 format_to!(buf, " Root module file id: {}\n", root_file_id.index());
60 format_to!(buf, " Edition: {}\n", edition);
61 format_to!(buf, " Version: {}\n", version.as_deref().unwrap_or("n/a"));
62 format_to!(buf, " Enabled cfgs: {:?}\n", cfg_options);
63 format_to!(buf, " Potential cfgs: {:?}\n", potential_cfg_options);
64 format_to!(buf, " Env: {:?}\n", env);
65 format_to!(buf, " Origin: {:?}\n", origin);
66 format_to!(buf, " Extra crate-level attrs: {:?}\n", crate_attrs);
67 format_to!(buf, " Is a proc macro crate: {}\n", is_proc_macro);
68 format_to!(buf, " Proc macro cwd: {:?}\n", proc_macro_cwd);
69 let deps = dependencies
70 .iter()
71 .map(|dep| format!("{}={:?}", dep.name, dep.crate_id))
72 .format(", ");
73 format_to!(buf, " Dependencies: {}\n", deps);
74 }
75 }
76
77 buf.trim().to_owned()
78}