]> git.lizzy.rs Git - rust.git/commitdiff
Use multiple loops instead of `Iterator::chain` in `FindUsages`
authorunexge <unexge@gmail.com>
Wed, 21 Apr 2021 13:42:47 +0000 (16:42 +0300)
committerunexge <unexge@gmail.com>
Wed, 21 Apr 2021 13:42:47 +0000 (16:42 +0300)
crates/ide_db/src/search.rs

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