Merge pull request #2338 from zed-industries/more-copilot-bugs

Mikayla Maki created

More copilot bugs

Change summary

crates/copilot/src/copilot.rs               | 42 ++++++++++++++++------
crates/copilot_button/src/copilot_button.rs |  2 
2 files changed, 31 insertions(+), 13 deletions(-)

Detailed changes

crates/copilot/src/copilot.rs 🔗

@@ -1,7 +1,7 @@
 mod request;
 mod sign_in;
 
-use anyhow::{anyhow, Context, Result};
+use anyhow::{anyhow, bail, Context, Result};
 use async_compression::futures::bufread::GzipDecoder;
 use async_tar::Archive;
 use client::Client;
@@ -424,9 +424,16 @@ impl Copilot {
             Err(error) => return Task::ready(Err(error)),
         };
 
-        let buffer = buffer.read(cx).snapshot();
-        let request = server
-            .request::<request::GetCompletions>(build_completion_params(&buffer, position, cx));
+        let buffer = buffer.read(cx);
+
+        if !buffer.file().map(|file| file.is_local()).unwrap_or(true) {
+            return Task::ready(Err(anyhow!("Copilot only works locally")));
+        }
+
+        let buffer = buffer.snapshot();
+        let request = server.request::<request::GetCompletions>(
+            build_completion_params(&buffer, position, cx).unwrap(),
+        );
         cx.background().spawn(async move {
             let result = request.await?;
             let completion = result
@@ -452,10 +459,16 @@ impl Copilot {
             Err(error) => return Task::ready(Err(error)),
         };
 
-        let buffer = buffer.read(cx).snapshot();
-        let request = server.request::<request::GetCompletionsCycling>(build_completion_params(
-            &buffer, position, cx,
-        ));
+        let buffer = buffer.read(cx);
+
+        if !buffer.file().map(|file| file.is_local()).unwrap_or(true) {
+            return Task::ready(Err(anyhow!("Copilot only works locally")));
+        }
+
+        let buffer = buffer.snapshot();
+        let request = server.request::<request::GetCompletionsCycling>(
+            build_completion_params(&buffer, position, cx).unwrap(),
+        );
         cx.background().spawn(async move {
             let result = request.await?;
             let completions = result
@@ -527,7 +540,7 @@ fn build_completion_params<T>(
     buffer: &BufferSnapshot,
     position: T,
     cx: &AppContext,
-) -> request::GetCompletionsParams
+) -> anyhow::Result<request::GetCompletionsParams>
 where
     T: ToPointUtf16,
 {
@@ -555,20 +568,25 @@ where
         Some(language_name) => language_name.to_lowercase(),
         None => "plaintext".to_string(),
     };
-    request::GetCompletionsParams {
+
+    let Ok(uri) = lsp::Url::from_file_path(&path) else {
+        bail!("Failed convert file path")
+    };
+
+    Ok(request::GetCompletionsParams {
         doc: request::GetCompletionsDocument {
             source: buffer.text(),
             tab_size: settings.tab_size(language_name).into(),
             indent_size: 1,
             insert_spaces: !settings.hard_tabs(language_name),
-            uri: lsp::Url::from_file_path(&path).unwrap(),
+            uri,
             path: path.to_string_lossy().into(),
             relative_path: relative_path.to_string_lossy().into(),
             language_id,
             position: point_to_lsp(position),
             version: 0,
         },
-    }
+    })
 }
 
 fn completion_from_lsp(completion: request::Completion, buffer: &BufferSnapshot) -> Completion {