Adds a supermaven provider for completions. There are various other refactors amidst this branch, primarily to make copilot no longer a dependency of project as well as show LSP Logs for global LSPs like copilot properly. This feature is not enabled by default. We're going to seek to refine it in the coming weeks. Release Notes: - N/A --------- Co-authored-by: Antonio Scandurra <me@as-cii.com> Co-authored-by: Nathan Sobo <nathan@zed.dev> Co-authored-by: Max <max@zed.dev> Co-authored-by: Max Brunsfeld <maxbrunsfeld@gmail.com>
122 lines
3.0 KiB
Rust
122 lines
3.0 KiB
Rust
use crate::Direction;
|
|
use gpui::{AppContext, Model, ModelContext};
|
|
use language::Buffer;
|
|
|
|
pub trait InlineCompletionProvider: 'static + Sized {
|
|
fn is_enabled(
|
|
&self,
|
|
buffer: &Model<Buffer>,
|
|
cursor_position: language::Anchor,
|
|
cx: &AppContext,
|
|
) -> bool;
|
|
fn refresh(
|
|
&mut self,
|
|
buffer: Model<Buffer>,
|
|
cursor_position: language::Anchor,
|
|
debounce: bool,
|
|
cx: &mut ModelContext<Self>,
|
|
);
|
|
fn cycle(
|
|
&mut self,
|
|
buffer: Model<Buffer>,
|
|
cursor_position: language::Anchor,
|
|
direction: Direction,
|
|
cx: &mut ModelContext<Self>,
|
|
);
|
|
fn accept(&mut self, cx: &mut ModelContext<Self>);
|
|
fn discard(&mut self, cx: &mut ModelContext<Self>);
|
|
fn active_completion_text<'a>(
|
|
&'a self,
|
|
buffer: &Model<Buffer>,
|
|
cursor_position: language::Anchor,
|
|
cx: &'a AppContext,
|
|
) -> Option<&str>;
|
|
}
|
|
|
|
pub trait InlineCompletionProviderHandle {
|
|
fn is_enabled(
|
|
&self,
|
|
buffer: &Model<Buffer>,
|
|
cursor_position: language::Anchor,
|
|
cx: &AppContext,
|
|
) -> bool;
|
|
fn refresh(
|
|
&self,
|
|
buffer: Model<Buffer>,
|
|
cursor_position: language::Anchor,
|
|
debounce: bool,
|
|
cx: &mut AppContext,
|
|
);
|
|
fn cycle(
|
|
&self,
|
|
buffer: Model<Buffer>,
|
|
cursor_position: language::Anchor,
|
|
direction: Direction,
|
|
cx: &mut AppContext,
|
|
);
|
|
fn accept(&self, cx: &mut AppContext);
|
|
fn discard(&self, cx: &mut AppContext);
|
|
fn active_completion_text<'a>(
|
|
&'a self,
|
|
buffer: &Model<Buffer>,
|
|
cursor_position: language::Anchor,
|
|
cx: &'a AppContext,
|
|
) -> Option<&'a str>;
|
|
}
|
|
|
|
impl<T> InlineCompletionProviderHandle for Model<T>
|
|
where
|
|
T: InlineCompletionProvider,
|
|
{
|
|
fn is_enabled(
|
|
&self,
|
|
buffer: &Model<Buffer>,
|
|
cursor_position: language::Anchor,
|
|
cx: &AppContext,
|
|
) -> bool {
|
|
self.read(cx).is_enabled(buffer, cursor_position, cx)
|
|
}
|
|
|
|
fn refresh(
|
|
&self,
|
|
buffer: Model<Buffer>,
|
|
cursor_position: language::Anchor,
|
|
debounce: bool,
|
|
cx: &mut AppContext,
|
|
) {
|
|
self.update(cx, |this, cx| {
|
|
this.refresh(buffer, cursor_position, debounce, cx)
|
|
})
|
|
}
|
|
|
|
fn cycle(
|
|
&self,
|
|
buffer: Model<Buffer>,
|
|
cursor_position: language::Anchor,
|
|
direction: Direction,
|
|
cx: &mut AppContext,
|
|
) {
|
|
self.update(cx, |this, cx| {
|
|
this.cycle(buffer, cursor_position, direction, cx)
|
|
})
|
|
}
|
|
|
|
fn accept(&self, cx: &mut AppContext) {
|
|
self.update(cx, |this, cx| this.accept(cx))
|
|
}
|
|
|
|
fn discard(&self, cx: &mut AppContext) {
|
|
self.update(cx, |this, cx| this.discard(cx))
|
|
}
|
|
|
|
fn active_completion_text<'a>(
|
|
&'a self,
|
|
buffer: &Model<Buffer>,
|
|
cursor_position: language::Anchor,
|
|
cx: &'a AppContext,
|
|
) -> Option<&'a str> {
|
|
self.read(cx)
|
|
.active_completion_text(buffer, cursor_position, cx)
|
|
}
|
|
}
|