Add a fast path for when the search query is empty

Antonio Scandurra created

Change summary

crates/project/src/search.rs | 15 +++++++++++++++
1 file changed, 15 insertions(+)

Detailed changes

crates/project/src/search.rs 🔗

@@ -55,6 +55,10 @@ impl SearchQuery {
     }
 
     pub fn detect<T: Read>(&self, stream: T) -> Result<bool> {
+        if self.as_str().is_empty() {
+            return Ok(false);
+        }
+
         match self {
             SearchQuery::Text { search, .. } => {
                 let mat = search.stream_find_iter(stream).next();
@@ -89,6 +93,10 @@ impl SearchQuery {
     pub async fn search(&self, rope: &Rope) -> Vec<Range<usize>> {
         const YIELD_INTERVAL: usize = 20000;
 
+        if self.as_str().is_empty() {
+            return Default::default();
+        }
+
         let mut matches = Vec::new();
         match self {
             SearchQuery::Text {
@@ -152,4 +160,11 @@ impl SearchQuery {
         }
         matches
     }
+
+    fn as_str(&self) -> &str {
+        match self {
+            SearchQuery::Text { query, .. } => query.as_str(),
+            SearchQuery::Regex { regex, .. } => regex.as_str(),
+        }
+    }
 }