Skip to content

Commit

Permalink
Auto merge of #15070 - Veykril:analysis-stat-stuff, r=Veykril
Browse files Browse the repository at this point in the history
internal: Report metric timings for file item trees and crate def map creation
  • Loading branch information
bors committed Jun 19, 2023
2 parents 00b9d9f + a824b73 commit 4398368
Show file tree
Hide file tree
Showing 7 changed files with 67 additions and 16 deletions.
13 changes: 12 additions & 1 deletion crates/hir-def/src/nameres.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ mod tests;
use std::{cmp::Ord, ops::Deref};

use base_db::{CrateId, Edition, FileId, ProcMacroKind};
use hir_expand::{name::Name, InFile, MacroCallId, MacroDefId};
use hir_expand::{name::Name, HirFileId, InFile, MacroCallId, MacroDefId};
use itertools::Itertools;
use la_arena::Arena;
use profile::Count;
Expand Down Expand Up @@ -626,6 +626,17 @@ impl ModuleData {
self.origin.definition_source(db)
}

/// Same as [`definition_source`] but only returns the file id to prevent parsing the ASt.
pub fn definition_source_file_id(&self) -> HirFileId {
match self.origin {
ModuleOrigin::File { definition, .. } | ModuleOrigin::CrateRoot { definition } => {
definition.into()
}
ModuleOrigin::Inline { definition, .. } => definition.file_id,
ModuleOrigin::BlockExpr { block } => block.file_id,
}
}

/// Returns a node which declares this module, either a `mod foo;` or a `mod foo {}`.
/// `None` for the crate root or block.
pub fn declaration_source(&self, db: &dyn DefDatabase) -> Option<InFile<ast::Module>> {
Expand Down
18 changes: 17 additions & 1 deletion crates/hir/src/has_source.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
//! Provides set of implementation for hir's objects that allows get back location in file.

use base_db::FileId;
use either::Either;
use hir_def::{
nameres::{ModuleOrigin, ModuleSource},
src::{HasChildSource, HasSource as _},
Lookup, MacroId, VariantId,
};
use hir_expand::InFile;
use hir_expand::{HirFileId, InFile};
use syntax::ast;

use crate::{
Expand All @@ -32,6 +33,11 @@ impl Module {
def_map[self.id.local_id].definition_source(db.upcast())
}

pub fn definition_source_file_id(self, db: &dyn HirDatabase) -> HirFileId {
let def_map = self.id.def_map(db.upcast());
def_map[self.id.local_id].definition_source_file_id()
}

pub fn is_mod_rs(self, db: &dyn HirDatabase) -> bool {
let def_map = self.id.def_map(db.upcast());
match def_map[self.id.local_id].origin {
Expand All @@ -40,6 +46,16 @@ impl Module {
}
}

pub fn as_source_file_id(self, db: &dyn HirDatabase) -> Option<FileId> {
let def_map = self.id.def_map(db.upcast());
match def_map[self.id.local_id].origin {
ModuleOrigin::File { definition, .. } | ModuleOrigin::CrateRoot { definition, .. } => {
Some(definition)
}
_ => None,
}
}

pub fn is_inline(self, db: &dyn HirDatabase) -> bool {
let def_map = self.id.def_map(db.upcast());
def_map[self.id.local_id].origin.is_inline()
Expand Down
2 changes: 1 addition & 1 deletion crates/ide-completion/src/completions/mod_.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ pub(crate) fn complete_mod(
}

let module_definition_file =
current_module.definition_source(ctx.db).file_id.original_file(ctx.db);
current_module.definition_source_file_id(ctx.db).original_file(ctx.db);
let source_root = ctx.db.source_root(ctx.db.file_source_root(module_definition_file));
let directory_to_look_for_submodules = directory_to_look_for_submodules(
current_module,
Expand Down
6 changes: 2 additions & 4 deletions crates/ide-db/src/search.rs
Original file line number Diff line number Diff line change
Expand Up @@ -149,10 +149,8 @@ impl SearchScope {

let mut to_visit: Vec<_> = module.children(db).collect();
while let Some(module) = to_visit.pop() {
if let InFile { file_id, value: ModuleSource::SourceFile(_) } =
module.definition_source(db)
{
entries.insert(file_id.original_file(db), None);
if let Some(file_id) = module.as_source_file_id(db) {
entries.insert(file_id, None);
}
to_visit.extend(module.children(db));
}
Expand Down
4 changes: 2 additions & 2 deletions crates/ide/src/static_index.rs
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ impl StaticIndex<'_> {
pub fn compute(analysis: &Analysis) -> StaticIndex<'_> {
let db = &*analysis.db;
let work = all_modules(db).into_iter().filter(|module| {
let file_id = module.definition_source(db).file_id.original_file(db);
let file_id = module.definition_source_file_id(db).original_file(db);
let source_root = db.file_source_root(file_id);
let source_root = db.source_root(source_root);
!source_root.is_library
Expand All @@ -201,7 +201,7 @@ impl StaticIndex<'_> {
};
let mut visited_files = FxHashSet::default();
for module in work {
let file_id = module.definition_source(db).file_id.original_file(db);
let file_id = module.definition_source_file_id(db).original_file(db);
if visited_files.contains(&file_id) {
continue;
}
Expand Down
36 changes: 31 additions & 5 deletions crates/rust-analyzer/src/cli/analysis_stats.rs
Original file line number Diff line number Diff line change
Expand Up @@ -95,17 +95,41 @@ impl flags::AnalysisStats {
eprintln!(")");

let mut analysis_sw = self.stop_watch();
let mut num_crates = 0;
let mut visited_modules = FxHashSet::default();
let mut visit_queue = Vec::new();

let mut krates = Crate::all(db);
if self.randomize {
shuffle(&mut rng, &mut krates);
}

let mut item_tree_sw = self.stop_watch();
let mut num_item_trees = 0;
let source_roots =
krates.iter().cloned().map(|krate| db.file_source_root(krate.root_file(db))).unique();
for source_root_id in source_roots {
let source_root = db.source_root(source_root_id);
if !source_root.is_library || self.with_deps {
for file_id in source_root.iter() {
if let Some(p) = source_root.path_for_file(&file_id) {
if let Some((_, Some("rs"))) = p.name_and_extension() {
db.file_item_tree(file_id.into());
num_item_trees += 1;
}
}
}
}
}
eprintln!(" item trees: {num_item_trees}");
let item_tree_time = item_tree_sw.elapsed();
eprintln!("{:<20} {}", "Item Tree Collection:", item_tree_time);
report_metric("item tree time", item_tree_time.time.as_millis() as u64, "ms");

let mut crate_def_map_sw = self.stop_watch();
let mut num_crates = 0;
let mut visited_modules = FxHashSet::default();
let mut visit_queue = Vec::new();
for krate in krates {
let module = krate.root_module(db);
let file_id = module.definition_source(db).file_id;
let file_id = module.definition_source_file_id(db);
let file_id = file_id.original_file(db);
let source_root = db.file_source_root(file_id);
let source_root = db.source_root(source_root);
Expand Down Expand Up @@ -171,7 +195,9 @@ impl flags::AnalysisStats {
adts.len(),
consts.len(),
);
eprintln!("{:<20} {}", "Item Collection:", analysis_sw.elapsed());
let crate_def_map_time = crate_def_map_sw.elapsed();
eprintln!("{:<20} {}", "Item Collection:", crate_def_map_time);
report_metric("crate def map time", crate_def_map_time.time.as_millis() as u64, "ms");

if self.randomize {
shuffle(&mut rng, &mut bodies);
Expand Down
4 changes: 2 additions & 2 deletions crates/rust-analyzer/src/cli/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,14 +37,14 @@ impl flags::Diagnostics {
let mut visited_files = FxHashSet::default();

let work = all_modules(db).into_iter().filter(|module| {
let file_id = module.definition_source(db).file_id.original_file(db);
let file_id = module.definition_source_file_id(db).original_file(db);
let source_root = db.file_source_root(file_id);
let source_root = db.source_root(source_root);
!source_root.is_library
});

for module in work {
let file_id = module.definition_source(db).file_id.original_file(db);
let file_id = module.definition_source_file_id(db).original_file(db);
if !visited_files.contains(&file_id) {
let crate_name =
module.krate().display_name(db).as_deref().unwrap_or("unknown").to_string();
Expand Down

0 comments on commit 4398368

Please sign in to comment.