inline_completion_provider.rs

  1use crate::Direction;
  2use gpui::{AppContext, Model, ModelContext};
  3use language::Buffer;
  4use std::ops::Range;
  5
  6pub trait InlineCompletionProvider: 'static + Sized {
  7    fn name() -> &'static str;
  8    fn is_enabled(
  9        &self,
 10        buffer: &Model<Buffer>,
 11        cursor_position: language::Anchor,
 12        cx: &AppContext,
 13    ) -> bool;
 14    fn refresh(
 15        &mut self,
 16        buffer: Model<Buffer>,
 17        cursor_position: language::Anchor,
 18        debounce: bool,
 19        cx: &mut ModelContext<Self>,
 20    );
 21    fn cycle(
 22        &mut self,
 23        buffer: Model<Buffer>,
 24        cursor_position: language::Anchor,
 25        direction: Direction,
 26        cx: &mut ModelContext<Self>,
 27    );
 28    fn accept(&mut self, cx: &mut ModelContext<Self>);
 29    fn discard(&mut self, should_report_inline_completion_event: bool, cx: &mut ModelContext<Self>);
 30    fn active_completion_text<'a>(
 31        &'a self,
 32        buffer: &Model<Buffer>,
 33        cursor_position: language::Anchor,
 34        cx: &'a AppContext,
 35    ) -> Option<(&'a str, Option<Range<language::Anchor>>)>;
 36}
 37
 38pub trait InlineCompletionProviderHandle {
 39    fn is_enabled(
 40        &self,
 41        buffer: &Model<Buffer>,
 42        cursor_position: language::Anchor,
 43        cx: &AppContext,
 44    ) -> bool;
 45    fn refresh(
 46        &self,
 47        buffer: Model<Buffer>,
 48        cursor_position: language::Anchor,
 49        debounce: bool,
 50        cx: &mut AppContext,
 51    );
 52    fn cycle(
 53        &self,
 54        buffer: Model<Buffer>,
 55        cursor_position: language::Anchor,
 56        direction: Direction,
 57        cx: &mut AppContext,
 58    );
 59    fn accept(&self, cx: &mut AppContext);
 60    fn discard(&self, should_report_inline_completion_event: bool, cx: &mut AppContext);
 61    fn active_completion_text<'a>(
 62        &'a self,
 63        buffer: &Model<Buffer>,
 64        cursor_position: language::Anchor,
 65        cx: &'a AppContext,
 66    ) -> Option<(&'a str, Option<Range<language::Anchor>>)>;
 67}
 68
 69impl<T> InlineCompletionProviderHandle for Model<T>
 70where
 71    T: InlineCompletionProvider,
 72{
 73    fn is_enabled(
 74        &self,
 75        buffer: &Model<Buffer>,
 76        cursor_position: language::Anchor,
 77        cx: &AppContext,
 78    ) -> bool {
 79        self.read(cx).is_enabled(buffer, cursor_position, cx)
 80    }
 81
 82    fn refresh(
 83        &self,
 84        buffer: Model<Buffer>,
 85        cursor_position: language::Anchor,
 86        debounce: bool,
 87        cx: &mut AppContext,
 88    ) {
 89        self.update(cx, |this, cx| {
 90            this.refresh(buffer, cursor_position, debounce, cx)
 91        })
 92    }
 93
 94    fn cycle(
 95        &self,
 96        buffer: Model<Buffer>,
 97        cursor_position: language::Anchor,
 98        direction: Direction,
 99        cx: &mut AppContext,
100    ) {
101        self.update(cx, |this, cx| {
102            this.cycle(buffer, cursor_position, direction, cx)
103        })
104    }
105
106    fn accept(&self, cx: &mut AppContext) {
107        self.update(cx, |this, cx| this.accept(cx))
108    }
109
110    fn discard(&self, should_report_inline_completion_event: bool, cx: &mut AppContext) {
111        self.update(cx, |this, cx| {
112            this.discard(should_report_inline_completion_event, cx)
113        })
114    }
115
116    fn active_completion_text<'a>(
117        &'a self,
118        buffer: &Model<Buffer>,
119        cursor_position: language::Anchor,
120        cx: &'a AppContext,
121    ) -> Option<(&'a str, Option<Range<language::Anchor>>)> {
122        self.read(cx)
123            .active_completion_text(buffer, cursor_position, cx)
124    }
125}