mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-26 21:13:37 +00:00
Merge pull request #18409 from Veykril/veykril/push-rkrkpvzvumvx
Only construct a resolver in macro descension when needed
This commit is contained in:
commit
f4466718b8
2 changed files with 20 additions and 14 deletions
|
@ -1043,12 +1043,12 @@ impl HasResolver for ModuleId {
|
|||
fn resolver(self, db: &dyn DefDatabase) -> Resolver {
|
||||
let mut def_map = self.def_map(db);
|
||||
let mut module_id = self.local_id;
|
||||
let mut modules: SmallVec<[_; 1]> = smallvec![];
|
||||
|
||||
if !self.is_block_module() {
|
||||
return Resolver { scopes: vec![], module_scope: ModuleItemMap { def_map, module_id } };
|
||||
}
|
||||
|
||||
let mut modules: SmallVec<[_; 1]> = smallvec![];
|
||||
while let Some(parent) = def_map.parent() {
|
||||
let block_def_map = mem::replace(&mut def_map, parent.def_map(db));
|
||||
modules.push(block_def_map);
|
||||
|
|
|
@ -936,16 +936,7 @@ impl<'db> SemanticsImpl<'db> {
|
|||
}
|
||||
}
|
||||
|
||||
let (file_id, tokens) = stack.first()?;
|
||||
// make sure we pick the token in the expanded include if we encountered an include,
|
||||
// otherwise we'll get the wrong semantics
|
||||
let sa =
|
||||
tokens.first()?.0.parent().and_then(|parent| {
|
||||
self.analyze_impl(InFile::new(*file_id, &parent), None, false)
|
||||
})?;
|
||||
|
||||
let mut m_cache = self.macro_call_cache.borrow_mut();
|
||||
let def_map = sa.resolver.def_map();
|
||||
|
||||
// Filters out all tokens that contain the given range (usually the macro call), any such
|
||||
// token is redundant as the corresponding macro call has already been processed
|
||||
|
@ -1024,8 +1015,16 @@ impl<'db> SemanticsImpl<'db> {
|
|||
) {
|
||||
call.as_macro_file()
|
||||
} else {
|
||||
// FIXME: This is wrong, the SourceAnalyzer might be invalid here
|
||||
sa.expand(self.db, mcall.as_ref())?
|
||||
token
|
||||
.parent()
|
||||
.and_then(|parent| {
|
||||
self.analyze_impl(
|
||||
InFile::new(expansion, &parent),
|
||||
None,
|
||||
false,
|
||||
)
|
||||
})?
|
||||
.expand(self.db, mcall.as_ref())?
|
||||
};
|
||||
m_cache.insert(mcall, it);
|
||||
it
|
||||
|
@ -1095,9 +1094,16 @@ impl<'db> SemanticsImpl<'db> {
|
|||
attr.path().and_then(|it| it.as_single_name_ref())?.as_name();
|
||||
// Not an attribute, nor a derive, so it's either an intert attribute or a derive helper
|
||||
// Try to resolve to a derive helper and downmap
|
||||
let resolver = &token
|
||||
.parent()
|
||||
.and_then(|parent| {
|
||||
self.analyze_impl(InFile::new(expansion, &parent), None, false)
|
||||
})?
|
||||
.resolver;
|
||||
let id = self.db.ast_id_map(expansion).ast_id(&adt);
|
||||
let helpers =
|
||||
def_map.derive_helpers_in_scope(InFile::new(expansion, id))?;
|
||||
let helpers = resolver
|
||||
.def_map()
|
||||
.derive_helpers_in_scope(InFile::new(expansion, id))?;
|
||||
|
||||
if !helpers.is_empty() {
|
||||
let text_range = attr.syntax().text_range();
|
||||
|
|
Loading…
Reference in a new issue