Add events for copilot suggestion accepting and discarding
This commit is contained in:
parent
790223f23a
commit
606d5e36e1
2 changed files with 49 additions and 3 deletions
|
@ -47,6 +47,10 @@ pub fn init(http: Arc<dyn HttpClient>, node_runtime: Arc<NodeRuntime>, cx: &mut
|
||||||
});
|
});
|
||||||
cx.set_global(copilot.clone());
|
cx.set_global(copilot.clone());
|
||||||
|
|
||||||
|
//////////////////////////////////////
|
||||||
|
// SUBSCRIBE TO COPILOT EVENTS HERE //
|
||||||
|
//////////////////////////////////////
|
||||||
|
|
||||||
cx.observe(&copilot, |handle, cx| {
|
cx.observe(&copilot, |handle, cx| {
|
||||||
let status = handle.read(cx).status();
|
let status = handle.read(cx).status();
|
||||||
cx.update_default_global::<collections::CommandPaletteFilter, _, _>(move |filter, _cx| {
|
cx.update_default_global::<collections::CommandPaletteFilter, _, _>(move |filter, _cx| {
|
||||||
|
@ -270,8 +274,19 @@ pub struct Copilot {
|
||||||
buffers: HashMap<u64, WeakModelHandle<Buffer>>,
|
buffers: HashMap<u64, WeakModelHandle<Buffer>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub enum Event {
|
||||||
|
CompletionAccepted {
|
||||||
|
uuid: String,
|
||||||
|
file_type: Option<Arc<str>>,
|
||||||
|
},
|
||||||
|
CompletionDiscarded {
|
||||||
|
uuids: Vec<String>,
|
||||||
|
file_type: Option<Arc<str>>,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
impl Entity for Copilot {
|
impl Entity for Copilot {
|
||||||
type Event = ();
|
type Event = Event;
|
||||||
|
|
||||||
fn app_will_quit(
|
fn app_will_quit(
|
||||||
&mut self,
|
&mut self,
|
||||||
|
@ -737,18 +752,26 @@ impl Copilot {
|
||||||
pub fn accept_completion(
|
pub fn accept_completion(
|
||||||
&mut self,
|
&mut self,
|
||||||
completion: &Completion,
|
completion: &Completion,
|
||||||
|
file_type: Option<Arc<str>>,
|
||||||
cx: &mut ModelContext<Self>,
|
cx: &mut ModelContext<Self>,
|
||||||
) -> Task<Result<()>> {
|
) -> Task<Result<()>> {
|
||||||
let server = match self.server.as_authenticated() {
|
let server = match self.server.as_authenticated() {
|
||||||
Ok(server) => server,
|
Ok(server) => server,
|
||||||
Err(error) => return Task::ready(Err(error)),
|
Err(error) => return Task::ready(Err(error)),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
cx.emit(Event::CompletionAccepted {
|
||||||
|
uuid: completion.uuid.clone(),
|
||||||
|
file_type,
|
||||||
|
});
|
||||||
|
|
||||||
let request =
|
let request =
|
||||||
server
|
server
|
||||||
.lsp
|
.lsp
|
||||||
.request::<request::NotifyAccepted>(request::NotifyAcceptedParams {
|
.request::<request::NotifyAccepted>(request::NotifyAcceptedParams {
|
||||||
uuid: completion.uuid.clone(),
|
uuid: completion.uuid.clone(),
|
||||||
});
|
});
|
||||||
|
|
||||||
cx.background().spawn(async move {
|
cx.background().spawn(async move {
|
||||||
request.await?;
|
request.await?;
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -758,12 +781,22 @@ impl Copilot {
|
||||||
pub fn discard_completions(
|
pub fn discard_completions(
|
||||||
&mut self,
|
&mut self,
|
||||||
completions: &[Completion],
|
completions: &[Completion],
|
||||||
|
file_type: Option<Arc<str>>,
|
||||||
cx: &mut ModelContext<Self>,
|
cx: &mut ModelContext<Self>,
|
||||||
) -> Task<Result<()>> {
|
) -> Task<Result<()>> {
|
||||||
let server = match self.server.as_authenticated() {
|
let server = match self.server.as_authenticated() {
|
||||||
Ok(server) => server,
|
Ok(server) => server,
|
||||||
Err(error) => return Task::ready(Err(error)),
|
Err(error) => return Task::ready(Err(error)),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
cx.emit(Event::CompletionDiscarded {
|
||||||
|
uuids: completions
|
||||||
|
.iter()
|
||||||
|
.map(|completion| completion.uuid.clone())
|
||||||
|
.collect(),
|
||||||
|
file_type: file_type.clone(),
|
||||||
|
});
|
||||||
|
|
||||||
let request =
|
let request =
|
||||||
server
|
server
|
||||||
.lsp
|
.lsp
|
||||||
|
@ -773,6 +806,7 @@ impl Copilot {
|
||||||
.map(|completion| completion.uuid.clone())
|
.map(|completion| completion.uuid.clone())
|
||||||
.collect(),
|
.collect(),
|
||||||
});
|
});
|
||||||
|
|
||||||
cx.background().spawn(async move {
|
cx.background().spawn(async move {
|
||||||
request.await?;
|
request.await?;
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
@ -3094,8 +3094,14 @@ impl Editor {
|
||||||
if let Some((copilot, completion)) =
|
if let Some((copilot, completion)) =
|
||||||
Copilot::global(cx).zip(self.copilot_state.active_completion())
|
Copilot::global(cx).zip(self.copilot_state.active_completion())
|
||||||
{
|
{
|
||||||
|
let language = self
|
||||||
|
.language_at(completion.range.start.offset, cx)
|
||||||
|
.map(|language| language.name());
|
||||||
|
|
||||||
copilot
|
copilot
|
||||||
.update(cx, |copilot, cx| copilot.accept_completion(completion, cx))
|
.update(cx, |copilot, cx| {
|
||||||
|
copilot.accept_completion(completion, language, cx)
|
||||||
|
})
|
||||||
.detach_and_log_err(cx);
|
.detach_and_log_err(cx);
|
||||||
}
|
}
|
||||||
self.insert_with_autoindent_mode(&suggestion.text.to_string(), None, cx);
|
self.insert_with_autoindent_mode(&suggestion.text.to_string(), None, cx);
|
||||||
|
@ -3109,9 +3115,15 @@ impl Editor {
|
||||||
fn discard_copilot_suggestion(&mut self, cx: &mut ViewContext<Self>) -> bool {
|
fn discard_copilot_suggestion(&mut self, cx: &mut ViewContext<Self>) -> bool {
|
||||||
if self.has_active_copilot_suggestion(cx) {
|
if self.has_active_copilot_suggestion(cx) {
|
||||||
if let Some(copilot) = Copilot::global(cx) {
|
if let Some(copilot) = Copilot::global(cx) {
|
||||||
|
let file_type = self.copilot_state
|
||||||
|
.completions
|
||||||
|
.get(0)
|
||||||
|
.and_then(|completion| self.language_at(completion.range.start.offset, cx))
|
||||||
|
.map(|language| language.name());
|
||||||
|
|
||||||
copilot
|
copilot
|
||||||
.update(cx, |copilot, cx| {
|
.update(cx, |copilot, cx| {
|
||||||
copilot.discard_completions(&self.copilot_state.completions, cx)
|
copilot.discard_completions(&self.copilot_state.completions, file_type, cx)
|
||||||
})
|
})
|
||||||
.detach_and_log_err(cx);
|
.detach_and_log_err(cx);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue