From 76cc9b347e61387b570b8f5c5178ae33671f5f3f Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Thu, 24 Feb 2022 15:55:13 +0100 Subject: [PATCH] Extract a `search` module --- crates/project/src/project.rs | 38 +++++++++++++---------------------- 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 02e202110c..74890a2f51 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -1,9 +1,9 @@ pub mod fs; mod ignore; mod lsp_command; +mod search; pub mod worktree; -use aho_corasick::AhoCorasickBuilder; use anyhow::{anyhow, Context, Result}; use client::{proto, Client, PeerId, TypedEnvelope, User, UserStore}; use clock::ReplicaId; @@ -23,6 +23,7 @@ use lsp::{DiagnosticSeverity, DocumentHighlightKind, LanguageServer}; use lsp_command::*; use postage::{broadcast, prelude::Stream, sink::Sink, watch}; use rand::prelude::*; +use search::SearchQuery; use sha2::{Digest, Sha256}; use smol::block_on; use std::{ @@ -152,10 +153,6 @@ pub struct Symbol { pub signature: [u8; 32], } -pub enum SearchQuery { - Plain(String), -} - pub struct BufferRequestHandle(Rc>); #[derive(Default)] @@ -2078,23 +2075,16 @@ impl Project { }) .detach(); - let SearchQuery::Plain(query) = query; - let search = Arc::new( - AhoCorasickBuilder::new() - .auto_configure(&[&query]) - // .ascii_case_insensitive(!case_sensitive) - .build(&[&query]), - ); let (matching_paths_tx, mut matching_paths_rx) = smol::channel::bounded(1024); let workers = cx.background().num_cpus(); cx.background() .spawn({ let fs = self.fs.clone(); let background = cx.background().clone(); - let search = search.clone(); + let query = query.clone(); async move { let fs = &fs; - let search = &search; + let query = &query; let matching_paths_tx = &matching_paths_tx; background .scoped(|scope| { @@ -2118,10 +2108,10 @@ impl Project { let matches = if let Some(file) = fs.open_sync(&path).await.log_err() { - search - .stream_find_iter(file) + query + .search(file) .next() - .map_or(false, |mat| mat.is_ok()) + .map_or(false, |range| range.is_ok()) } else { false }; @@ -2175,7 +2165,7 @@ impl Project { let background = cx.background().clone(); cx.background().spawn(async move { - let search = &search; + let query = &query; let mut matched_buffers = Vec::new(); for _ in 0..workers { matched_buffers.push(HashMap::default()); @@ -2186,12 +2176,12 @@ impl Project { let mut buffers_rx = buffers_rx.clone(); scope.spawn(async move { while let Some((buffer, snapshot)) = buffers_rx.next().await { - for mat in search.stream_find_iter( + for range in query.search( snapshot.as_rope().bytes_in_range(0..snapshot.len()), ) { - let mat = mat.unwrap(); - let range = snapshot.anchor_before(mat.start()) - ..snapshot.anchor_after(mat.end()); + let range = range.unwrap(); + let range = snapshot.anchor_before(range.start) + ..snapshot.anchor_after(range.end); worker_matched_buffers .entry(buffer.clone()) .or_insert(Vec::new()) @@ -4902,7 +4892,7 @@ mod tests { .await; assert_eq!( - search(&project, SearchQuery::Plain("TWO".to_string()), &mut cx).await, + search(&project, SearchQuery::text("TWO"), &mut cx).await, HashMap::from_iter([ ("two.rs".to_string(), vec![6..9]), ("three.rs".to_string(), vec![37..40]) @@ -4920,7 +4910,7 @@ mod tests { }); assert_eq!( - search(&project, SearchQuery::Plain("TWO".to_string()), &mut cx).await, + search(&project, SearchQuery::text("TWO"), &mut cx).await, HashMap::from_iter([ ("two.rs".to_string(), vec![6..9]), ("three.rs".to_string(), vec![37..40]),