]> git.lizzy.rs Git - rust.git/commitdiff
analysis-stats: allow skipping type inference
authorJonas Schievink <jonasschievink@gmail.com>
Sun, 4 Apr 2021 23:42:19 +0000 (01:42 +0200)
committerJonas Schievink <jonasschievink@gmail.com>
Sun, 4 Apr 2021 23:42:19 +0000 (01:42 +0200)
This removes "noise" from memory profiles since it avoids lowering
function bodies and types

crates/rust-analyzer/src/bin/flags.rs
crates/rust-analyzer/src/bin/main.rs
crates/rust-analyzer/src/cli/analysis_stats.rs

index b05fc00b957b047550e617fb261091a16e8e2ed3..63953098a2407819b9f739baf1b813d3f2a4f0a9 100644 (file)
@@ -71,6 +71,8 @@
             optional --load-output-dirs
             /// Use proc-macro-srv for proc-macro expanding.
             optional --with-proc-macro
+            /// Only resolve names, don't run type inference.
+            optional --skip-inference
         }
 
         cmd diagnostics
@@ -158,6 +160,7 @@ pub struct AnalysisStats {
     pub no_sysroot: bool,
     pub load_output_dirs: bool,
     pub with_proc_macro: bool,
+    pub skip_inference: bool,
 }
 
 #[derive(Debug)]
index 3b9b9e8b4ecc5571a0c099f4cc8a730688c20667..873e82c7b2b87b69ec721afebc506a650f4ca830 100644 (file)
@@ -78,6 +78,7 @@ fn try_main() -> Result<()> {
             path: cmd.path,
             load_output_dirs: cmd.load_output_dirs,
             with_proc_macro: cmd.with_proc_macro,
+            skip_inference: cmd.skip_inference,
         }
         .run(verbosity)?,
 
index 9c59e7ee44771e3170c5a4c94d96dbca3f9fa171..18fd7ea749eda6009614d58648fbfe014859c663 100644 (file)
@@ -9,10 +9,11 @@
 
 use hir::{
     db::{AstDatabase, DefDatabase, HirDatabase},
-    AssocItem, Crate, HasSource, HirDisplay, ModuleDef,
+    AssocItem, Crate, Function, HasSource, HirDisplay, ModuleDef,
 };
 use hir_def::FunctionId;
 use hir_ty::TypeWalk;
+use ide::{AnalysisHost, RootDatabase};
 use ide_db::base_db::{
     salsa::{self, ParallelDatabase},
     SourceDatabaseExt,
@@ -24,6 +25,7 @@
 use rustc_hash::FxHashSet;
 use stdx::format_to;
 use syntax::AstNode;
+use vfs::Vfs;
 
 use crate::cli::{
     load_cargo::{load_workspace_at, LoadCargoConfig},
@@ -51,6 +53,7 @@ pub struct AnalysisStatsCmd {
     pub path: PathBuf,
     pub load_output_dirs: bool,
     pub with_proc_macro: bool,
+    pub skip_inference: bool,
 }
 
 impl AnalysisStatsCmd {
@@ -128,6 +131,39 @@ pub fn run(self, verbosity: Verbosity) -> Result<()> {
             shuffle(&mut rng, &mut funcs);
         }
 
+        if !self.skip_inference {
+            self.run_inference(&host, db, &vfs, &funcs, verbosity);
+        }
+
+        let total_span = analysis_sw.elapsed();
+        eprintln!("{:<20} {}", "Total:", total_span);
+        report_metric("total time", total_span.time.as_millis() as u64, "ms");
+        if let Some(instructions) = total_span.instructions {
+            report_metric("total instructions", instructions, "#instr");
+        }
+        if let Some(memory) = total_span.memory {
+            report_metric("total memory", memory.allocated.megabytes() as u64, "MB");
+        }
+
+        if env::var("RA_COUNT").is_ok() {
+            eprintln!("{}", profile::countme::get_all());
+        }
+
+        if self.memory_usage && verbosity.is_verbose() {
+            print_memory_usage(host, vfs);
+        }
+
+        Ok(())
+    }
+
+    fn run_inference(
+        &self,
+        host: &AnalysisHost,
+        db: &RootDatabase,
+        vfs: &Vfs,
+        funcs: &[Function],
+        verbosity: Verbosity,
+    ) {
         let mut bar = match verbosity {
             Verbosity::Quiet | Verbosity::Spammy => ProgressReport::hidden(),
             _ if self.parallel => ProgressReport::hidden(),
@@ -154,7 +190,7 @@ pub fn run(self, verbosity: Verbosity) -> Result<()> {
         let mut num_exprs_unknown = 0;
         let mut num_exprs_partially_unknown = 0;
         let mut num_type_mismatches = 0;
-        for f in funcs {
+        for f in funcs.iter().copied() {
             let name = f.name(db);
             let full_name = f
                 .module(db)
@@ -296,26 +332,6 @@ pub fn run(self, verbosity: Verbosity) -> Result<()> {
         report_metric("type mismatches", num_type_mismatches, "#");
 
         eprintln!("{:<20} {}", "Inference:", inference_sw.elapsed());
-
-        let total_span = analysis_sw.elapsed();
-        eprintln!("{:<20} {}", "Total:", total_span);
-        report_metric("total time", total_span.time.as_millis() as u64, "ms");
-        if let Some(instructions) = total_span.instructions {
-            report_metric("total instructions", instructions, "#instr");
-        }
-        if let Some(memory) = total_span.memory {
-            report_metric("total memory", memory.allocated.megabytes() as u64, "MB");
-        }
-
-        if env::var("RA_COUNT").is_ok() {
-            eprintln!("{}", profile::countme::get_all());
-        }
-
-        if self.memory_usage && verbosity.is_verbose() {
-            print_memory_usage(host, vfs);
-        }
-
-        Ok(())
     }
 
     fn stop_watch(&self) -> StopWatch {