Use multiple loops instead of Iterator::chain in FindUsages

This commit is contained in:
unexge 2021-04-21 16:42:47 +03:00
parent 6630266ce1
commit 322cd1fa7f

View File

@ -4,10 +4,9 @@
//! get a super-set of matches. Then, we we confirm each match using precise //! get a super-set of matches. Then, we we confirm each match using precise
//! name resolution. //! name resolution.
use std::{convert::TryInto, iter, mem}; use std::{convert::TryInto, mem};
use base_db::{FileId, FileRange, SourceDatabase, SourceDatabaseExt}; use base_db::{FileId, FileRange, SourceDatabase, SourceDatabaseExt};
use either::Either;
use hir::{ use hir::{
DefWithBody, HasAttrs, HasSource, InFile, ModuleDef, ModuleSource, Semantics, Visibility, DefWithBody, HasAttrs, HasSource, InFile, ModuleDef, ModuleSource, Semantics, Visibility,
}; };
@ -370,37 +369,47 @@ impl<'a> FindUsages<'a> {
let tree = Lazy::new(|| sema.parse(file_id).syntax().clone()); let tree = Lazy::new(|| sema.parse(file_id).syntax().clone());
let matches = text.match_indices(pat).chain(if search_for_self { let mut handle_match = |idx: usize| -> bool {
Either::Left(text.match_indices("Self"))
} else {
Either::Right(iter::empty())
});
for (idx, _) in matches {
let offset: TextSize = idx.try_into().unwrap(); let offset: TextSize = idx.try_into().unwrap();
if !search_range.contains_inclusive(offset) { if !search_range.contains_inclusive(offset) {
continue; return false;
} }
if let Some(name) = sema.find_node_at_offset_with_descend(&tree, offset) { if let Some(name) = sema.find_node_at_offset_with_descend(&tree, offset) {
match name { match name {
ast::NameLike::NameRef(name_ref) => { ast::NameLike::NameRef(name_ref) => {
if self.found_name_ref(&name_ref, sink) { if self.found_name_ref(&name_ref, sink) {
return; return true;
} }
} }
ast::NameLike::Name(name) => { ast::NameLike::Name(name) => {
if self.found_name(&name, sink) { if self.found_name(&name, sink) {
return; return true;
} }
} }
ast::NameLike::Lifetime(lifetime) => { ast::NameLike::Lifetime(lifetime) => {
if self.found_lifetime(&lifetime, sink) { if self.found_lifetime(&lifetime, sink) {
return; return true;
} }
} }
} }
} }
return false;
};
for (idx, _) in text.match_indices(pat) {
if handle_match(idx) {
return;
}
}
if search_for_self {
for (idx, _) in text.match_indices("Self") {
if handle_match(idx) {
return;
}
}
} }
} }
} }