aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/rust-analyzer/src/bin/flags.rs3
-rw-r--r--crates/rust-analyzer/src/bin/main.rs1
-rw-r--r--crates/rust-analyzer/src/cli/analysis_stats.rs60
3 files changed, 42 insertions, 22 deletions
diff --git a/crates/rust-analyzer/src/bin/flags.rs b/crates/rust-analyzer/src/bin/flags.rs
index b05fc00b9..63953098a 100644
--- a/crates/rust-analyzer/src/bin/flags.rs
+++ b/crates/rust-analyzer/src/bin/flags.rs
@@ -71,6 +71,8 @@ xflags::xflags! {
71 optional --load-output-dirs 71 optional --load-output-dirs
72 /// Use proc-macro-srv for proc-macro expanding. 72 /// Use proc-macro-srv for proc-macro expanding.
73 optional --with-proc-macro 73 optional --with-proc-macro
74 /// Only resolve names, don't run type inference.
75 optional --skip-inference
74 } 76 }
75 77
76 cmd diagnostics 78 cmd diagnostics
@@ -158,6 +160,7 @@ pub struct AnalysisStats {
158 pub no_sysroot: bool, 160 pub no_sysroot: bool,
159 pub load_output_dirs: bool, 161 pub load_output_dirs: bool,
160 pub with_proc_macro: bool, 162 pub with_proc_macro: bool,
163 pub skip_inference: bool,
161} 164}
162 165
163#[derive(Debug)] 166#[derive(Debug)]
diff --git a/crates/rust-analyzer/src/bin/main.rs b/crates/rust-analyzer/src/bin/main.rs
index 3b9b9e8b4..873e82c7b 100644
--- a/crates/rust-analyzer/src/bin/main.rs
+++ b/crates/rust-analyzer/src/bin/main.rs
@@ -78,6 +78,7 @@ fn try_main() -> Result<()> {
78 path: cmd.path, 78 path: cmd.path,
79 load_output_dirs: cmd.load_output_dirs, 79 load_output_dirs: cmd.load_output_dirs,
80 with_proc_macro: cmd.with_proc_macro, 80 with_proc_macro: cmd.with_proc_macro,
81 skip_inference: cmd.skip_inference,
81 } 82 }
82 .run(verbosity)?, 83 .run(verbosity)?,
83 84
diff --git a/crates/rust-analyzer/src/cli/analysis_stats.rs b/crates/rust-analyzer/src/cli/analysis_stats.rs
index 9c59e7ee4..18fd7ea74 100644
--- a/crates/rust-analyzer/src/cli/analysis_stats.rs
+++ b/crates/rust-analyzer/src/cli/analysis_stats.rs
@@ -9,10 +9,11 @@ use std::{
9 9
10use hir::{ 10use hir::{
11 db::{AstDatabase, DefDatabase, HirDatabase}, 11 db::{AstDatabase, DefDatabase, HirDatabase},
12 AssocItem, Crate, HasSource, HirDisplay, ModuleDef, 12 AssocItem, Crate, Function, HasSource, HirDisplay, ModuleDef,
13}; 13};
14use hir_def::FunctionId; 14use hir_def::FunctionId;
15use hir_ty::TypeWalk; 15use hir_ty::TypeWalk;
16use ide::{AnalysisHost, RootDatabase};
16use ide_db::base_db::{ 17use ide_db::base_db::{
17 salsa::{self, ParallelDatabase}, 18 salsa::{self, ParallelDatabase},
18 SourceDatabaseExt, 19 SourceDatabaseExt,
@@ -24,6 +25,7 @@ use rayon::prelude::*;
24use rustc_hash::FxHashSet; 25use rustc_hash::FxHashSet;
25use stdx::format_to; 26use stdx::format_to;
26use syntax::AstNode; 27use syntax::AstNode;
28use vfs::Vfs;
27 29
28use crate::cli::{ 30use crate::cli::{
29 load_cargo::{load_workspace_at, LoadCargoConfig}, 31 load_cargo::{load_workspace_at, LoadCargoConfig},
@@ -51,6 +53,7 @@ pub struct AnalysisStatsCmd {
51 pub path: PathBuf, 53 pub path: PathBuf,
52 pub load_output_dirs: bool, 54 pub load_output_dirs: bool,
53 pub with_proc_macro: bool, 55 pub with_proc_macro: bool,
56 pub skip_inference: bool,
54} 57}
55 58
56impl AnalysisStatsCmd { 59impl AnalysisStatsCmd {
@@ -128,6 +131,39 @@ impl AnalysisStatsCmd {
128 shuffle(&mut rng, &mut funcs); 131 shuffle(&mut rng, &mut funcs);
129 } 132 }
130 133
134 if !self.skip_inference {
135 self.run_inference(&host, db, &vfs, &funcs, verbosity);
136 }
137
138 let total_span = analysis_sw.elapsed();
139 eprintln!("{:<20} {}", "Total:", total_span);
140 report_metric("total time", total_span.time.as_millis() as u64, "ms");
141 if let Some(instructions) = total_span.instructions {
142 report_metric("total instructions", instructions, "#instr");
143 }
144 if let Some(memory) = total_span.memory {
145 report_metric("total memory", memory.allocated.megabytes() as u64, "MB");
146 }
147
148 if env::var("RA_COUNT").is_ok() {
149 eprintln!("{}", profile::countme::get_all());
150 }
151
152 if self.memory_usage && verbosity.is_verbose() {
153 print_memory_usage(host, vfs);
154 }
155
156 Ok(())
157 }
158
159 fn run_inference(
160 &self,
161 host: &AnalysisHost,
162 db: &RootDatabase,
163 vfs: &Vfs,
164 funcs: &[Function],
165 verbosity: Verbosity,
166 ) {
131 let mut bar = match verbosity { 167 let mut bar = match verbosity {
132 Verbosity::Quiet | Verbosity::Spammy => ProgressReport::hidden(), 168 Verbosity::Quiet | Verbosity::Spammy => ProgressReport::hidden(),
133 _ if self.parallel => ProgressReport::hidden(), 169 _ if self.parallel => ProgressReport::hidden(),
@@ -154,7 +190,7 @@ impl AnalysisStatsCmd {
154 let mut num_exprs_unknown = 0; 190 let mut num_exprs_unknown = 0;
155 let mut num_exprs_partially_unknown = 0; 191 let mut num_exprs_partially_unknown = 0;
156 let mut num_type_mismatches = 0; 192 let mut num_type_mismatches = 0;
157 for f in funcs { 193 for f in funcs.iter().copied() {
158 let name = f.name(db); 194 let name = f.name(db);
159 let full_name = f 195 let full_name = f
160 .module(db) 196 .module(db)
@@ -296,26 +332,6 @@ impl AnalysisStatsCmd {
296 report_metric("type mismatches", num_type_mismatches, "#"); 332 report_metric("type mismatches", num_type_mismatches, "#");
297 333
298 eprintln!("{:<20} {}", "Inference:", inference_sw.elapsed()); 334 eprintln!("{:<20} {}", "Inference:", inference_sw.elapsed());
299
300 let total_span = analysis_sw.elapsed();
301 eprintln!("{:<20} {}", "Total:", total_span);
302 report_metric("total time", total_span.time.as_millis() as u64, "ms");
303 if let Some(instructions) = total_span.instructions {
304 report_metric("total instructions", instructions, "#instr");
305 }
306 if let Some(memory) = total_span.memory {
307 report_metric("total memory", memory.allocated.megabytes() as u64, "MB");
308 }
309
310 if env::var("RA_COUNT").is_ok() {
311 eprintln!("{}", profile::countme::get_all());
312 }
313
314 if self.memory_usage && verbosity.is_verbose() {
315 print_memory_usage(host, vfs);
316 }
317
318 Ok(())
319 } 335 }
320 336
321 fn stop_watch(&self) -> StopWatch { 337 fn stop_watch(&self) -> StopWatch {