ide/
status.rs

1use ide_db::RootDatabase;
2use ide_db::base_db::{BuiltCrateData, ExtraCrateData};
3use itertools::Itertools;
4use span::FileId;
5use stdx::format_to;
6
7// Feature: Status
8//
9// Shows internal statistic about memory usage of rust-analyzer.
10//
11// | Editor  | Action Name |
12// |---------|-------------|
13// | VS Code | **rust-analyzer: Status** |
14//
15// ![Status](https://user-images.githubusercontent.com/48062697/113065584-05f34500-91b1-11eb-98cc-5c196f76be7f.gif)
16pub(crate) fn status(db: &RootDatabase, file_id: Option<FileId>) -> String {
17    let mut buf = String::new();
18
19    // format_to!(buf, "{}\n", collect_query(CompressedFileTextQuery.in_db(db)));
20    // format_to!(buf, "{}\n", collect_query(ParseQuery.in_db(db)));
21    // format_to!(buf, "{}\n", collect_query(ParseMacroExpansionQuery.in_db(db)));
22    // format_to!(buf, "{}\n", collect_query(LibrarySymbolsQuery.in_db(db)));
23    // format_to!(buf, "{}\n", collect_query(ModuleSymbolsQuery.in_db(db)));
24    // format_to!(buf, "{} in total\n", memory_usage());
25
26    // format_to!(buf, "\nDebug info:\n");
27    // format_to!(buf, "{}\n", collect_query(AttrsQuery.in_db(db)));
28    // format_to!(buf, "{} ast id maps\n", collect_query_count(AstIdMapQuery.in_db(db)));
29    // format_to!(buf, "{} block def maps\n", collect_query_count(BlockDefMapQuery.in_db(db)));
30
31    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}