mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-29 06:23:25 +00:00
Less eager parsing for module sources
This commit is contained in:
parent
b5e0452c71
commit
58ac823864
7 changed files with 37 additions and 12 deletions
|
@ -60,7 +60,7 @@ mod tests;
|
||||||
use std::{cmp::Ord, ops::Deref};
|
use std::{cmp::Ord, ops::Deref};
|
||||||
|
|
||||||
use base_db::{CrateId, Edition, FileId, ProcMacroKind};
|
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 itertools::Itertools;
|
||||||
use la_arena::Arena;
|
use la_arena::Arena;
|
||||||
use profile::Count;
|
use profile::Count;
|
||||||
|
@ -626,6 +626,17 @@ impl ModuleData {
|
||||||
self.origin.definition_source(db)
|
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 {}`.
|
/// Returns a node which declares this module, either a `mod foo;` or a `mod foo {}`.
|
||||||
/// `None` for the crate root or block.
|
/// `None` for the crate root or block.
|
||||||
pub fn declaration_source(&self, db: &dyn DefDatabase) -> Option<InFile<ast::Module>> {
|
pub fn declaration_source(&self, db: &dyn DefDatabase) -> Option<InFile<ast::Module>> {
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
//! Provides set of implementation for hir's objects that allows get back location in file.
|
//! Provides set of implementation for hir's objects that allows get back location in file.
|
||||||
|
|
||||||
|
use base_db::FileId;
|
||||||
use either::Either;
|
use either::Either;
|
||||||
use hir_def::{
|
use hir_def::{
|
||||||
nameres::{ModuleOrigin, ModuleSource},
|
nameres::{ModuleOrigin, ModuleSource},
|
||||||
src::{HasChildSource, HasSource as _},
|
src::{HasChildSource, HasSource as _},
|
||||||
Lookup, MacroId, VariantId,
|
Lookup, MacroId, VariantId,
|
||||||
};
|
};
|
||||||
use hir_expand::InFile;
|
use hir_expand::{HirFileId, InFile};
|
||||||
use syntax::ast;
|
use syntax::ast;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
|
@ -32,6 +33,11 @@ impl Module {
|
||||||
def_map[self.id.local_id].definition_source(db.upcast())
|
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 {
|
pub fn is_mod_rs(self, db: &dyn HirDatabase) -> bool {
|
||||||
let def_map = self.id.def_map(db.upcast());
|
let def_map = self.id.def_map(db.upcast());
|
||||||
match def_map[self.id.local_id].origin {
|
match def_map[self.id.local_id].origin {
|
||||||
|
@ -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 {
|
pub fn is_inline(self, db: &dyn HirDatabase) -> bool {
|
||||||
let def_map = self.id.def_map(db.upcast());
|
let def_map = self.id.def_map(db.upcast());
|
||||||
def_map[self.id.local_id].origin.is_inline()
|
def_map[self.id.local_id].origin.is_inline()
|
||||||
|
|
|
@ -42,7 +42,7 @@ pub(crate) fn complete_mod(
|
||||||
}
|
}
|
||||||
|
|
||||||
let module_definition_file =
|
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 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(
|
let directory_to_look_for_submodules = directory_to_look_for_submodules(
|
||||||
current_module,
|
current_module,
|
||||||
|
|
|
@ -149,10 +149,8 @@ impl SearchScope {
|
||||||
|
|
||||||
let mut to_visit: Vec<_> = module.children(db).collect();
|
let mut to_visit: Vec<_> = module.children(db).collect();
|
||||||
while let Some(module) = to_visit.pop() {
|
while let Some(module) = to_visit.pop() {
|
||||||
if let InFile { file_id, value: ModuleSource::SourceFile(_) } =
|
if let Some(file_id) = module.as_source_file_id(db) {
|
||||||
module.definition_source(db)
|
entries.insert(file_id, None);
|
||||||
{
|
|
||||||
entries.insert(file_id.original_file(db), None);
|
|
||||||
}
|
}
|
||||||
to_visit.extend(module.children(db));
|
to_visit.extend(module.children(db));
|
||||||
}
|
}
|
||||||
|
|
|
@ -187,7 +187,7 @@ impl StaticIndex<'_> {
|
||||||
pub fn compute(analysis: &Analysis) -> StaticIndex<'_> {
|
pub fn compute(analysis: &Analysis) -> StaticIndex<'_> {
|
||||||
let db = &*analysis.db;
|
let db = &*analysis.db;
|
||||||
let work = all_modules(db).into_iter().filter(|module| {
|
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.file_source_root(file_id);
|
||||||
let source_root = db.source_root(source_root);
|
let source_root = db.source_root(source_root);
|
||||||
!source_root.is_library
|
!source_root.is_library
|
||||||
|
@ -201,7 +201,7 @@ impl StaticIndex<'_> {
|
||||||
};
|
};
|
||||||
let mut visited_files = FxHashSet::default();
|
let mut visited_files = FxHashSet::default();
|
||||||
for module in work {
|
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) {
|
if visited_files.contains(&file_id) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,7 +105,7 @@ impl flags::AnalysisStats {
|
||||||
}
|
}
|
||||||
for krate in krates {
|
for krate in krates {
|
||||||
let module = krate.root_module(db);
|
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 file_id = file_id.original_file(db);
|
||||||
let source_root = db.file_source_root(file_id);
|
let source_root = db.file_source_root(file_id);
|
||||||
let source_root = db.source_root(source_root);
|
let source_root = db.source_root(source_root);
|
||||||
|
|
|
@ -37,14 +37,14 @@ impl flags::Diagnostics {
|
||||||
let mut visited_files = FxHashSet::default();
|
let mut visited_files = FxHashSet::default();
|
||||||
|
|
||||||
let work = all_modules(db).into_iter().filter(|module| {
|
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.file_source_root(file_id);
|
||||||
let source_root = db.source_root(source_root);
|
let source_root = db.source_root(source_root);
|
||||||
!source_root.is_library
|
!source_root.is_library
|
||||||
});
|
});
|
||||||
|
|
||||||
for module in work {
|
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) {
|
if !visited_files.contains(&file_id) {
|
||||||
let crate_name =
|
let crate_name =
|
||||||
module.krate().display_name(db).as_deref().unwrap_or("unknown").to_string();
|
module.krate().display_name(db).as_deref().unwrap_or("unknown").to_string();
|
||||||
|
|
Loading…
Reference in a new issue