Clip ranges returned by `SemanticIndex::search`

Antonio Scandurra created

The files may have changed since the last time they were parsed, so the
ranges returned by `SemanticIndex::search` may be out of bounds.

Change summary

crates/semantic_index/src/semantic_index.rs | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)

Detailed changes

crates/semantic_index/src/semantic_index.rs 🔗

@@ -15,7 +15,7 @@ use embedding::{Embedding, EmbeddingProvider, OpenAIEmbeddings};
 use embedding_queue::{EmbeddingQueue, FileToEmbed};
 use futures::{FutureExt, StreamExt};
 use gpui::{AppContext, AsyncAppContext, Entity, ModelContext, ModelHandle, Task, WeakModelHandle};
-use language::{Anchor, Buffer, Language, LanguageRegistry};
+use language::{Anchor, Bias, Buffer, Language, LanguageRegistry};
 use parking_lot::Mutex;
 use parsing::{CodeContextRetriever, DocumentDigest, PARSEABLE_ENTIRE_FILE_TYPES};
 use postage::watch;
@@ -713,7 +713,9 @@ impl SemanticIndex {
                 .filter_map(|(buffer, range)| {
                     let buffer = buffer.log_err()?;
                     let range = buffer.read_with(&cx, |buffer, _| {
-                        buffer.anchor_before(range.start)..buffer.anchor_after(range.end)
+                        let start = buffer.clip_offset(range.start, Bias::Left);
+                        let end = buffer.clip_offset(range.end, Bias::Right);
+                        buffer.anchor_before(start)..buffer.anchor_after(end)
                     });
                     Some(SearchResult { buffer, range })
                 })