Skip to main content

AssistContext

Struct AssistContext 

Source
pub(crate) struct AssistContext<'a, 'db> {
    pub(crate) config: &'a AssistConfig,
    pub(crate) sema: Semantics<'db, RootDatabase>,
    frange: FileRange,
    trimmed_range: TextRange,
    source_file: SourceFile,
    token_at_offset: TokenAtOffset<SyntaxToken>,
    covering_element: SyntaxElement,
}
Expand description

AssistContext allows to apply an assist or check if it could be applied.

Assists use a somewhat over-engineered approach, given the current needs. The assists workflow consists of two phases. In the first phase, a user asks for the list of available assists. In the second phase, the user picks a particular assist and it gets applied.

There are two peculiarities here:

  • first, we ideally avoid computing more things then necessary to answer “is assist applicable” in the first phase.
  • second, when we are applying assist, we don’t have a guarantee that there weren’t any changes between the point when user asked for assists and when they applied a particular assist. So, when applying assist, we need to do all the checks from scratch.

To avoid repeating the same code twice for both “check” and “apply” functions, we use an approach reminiscent of that of Django’s function based views dealing with forms. Each assist receives a runtime parameter, resolve. It first check if an edit is applicable (potentially computing info required to compute the actual edit). If it is applicable, and resolve is true, it then computes the actual edit.

So, to implement the original assists workflow, we can first apply each edit with resolve = false, and then applying the selected edit again, with resolve = true this time.

Note, however, that we don’t actually use such two-phase logic at the moment, because the LSP API is pretty awkward in this place, and it’s much easier to just compute the edit eagerly :-)

Fields§

§config: &'a AssistConfig§sema: Semantics<'db, RootDatabase>§frange: FileRange§trimmed_range: TextRange§source_file: SourceFile§token_at_offset: TokenAtOffset<SyntaxToken>§covering_element: SyntaxElement

Implementations§

Source§

impl<'a, 'db> AssistContext<'a, 'db>

Source

pub(crate) fn new( sema: Semantics<'db, RootDatabase>, config: &'a AssistConfig, frange: FileRange, ) -> AssistContext<'a, 'db>

Source

pub(crate) fn db(&self) -> &'db RootDatabase

Source

pub(crate) fn offset(&self) -> TextSize

Source

pub(crate) fn vfs_file_id(&self) -> FileId

Source

pub(crate) fn file_id(&self) -> EditionedFileId

Source

pub(crate) fn edition(&self) -> Edition

Source

pub(crate) fn has_empty_selection(&self) -> bool

Source

pub(crate) fn selection_trimmed(&self) -> TextRange

Returns the selected range trimmed for whitespace tokens, that is the range will be snapped to the nearest enclosed token.

Source

pub(crate) fn source_file(&self) -> &SourceFile

Source

pub(crate) fn token_at_offset(&self) -> TokenAtOffset<SyntaxToken>

Source

pub(crate) fn find_token_syntax_at_offset( &self, kind: SyntaxKind, ) -> Option<SyntaxToken>

Source

pub(crate) fn find_token_at_offset<T: AstToken>(&self) -> Option<T>

Source

pub(crate) fn find_node_at_offset<N: AstNode>(&self) -> Option<N>

Source

pub(crate) fn find_node_at_trimmed_offset<N: AstNode>(&self) -> Option<N>

Source

pub(crate) fn find_node_at_range<N: AstNode>(&self) -> Option<N>

Source

pub(crate) fn find_node_at_offset_with_descend<N: AstNode>(&self) -> Option<N>

Source

pub(crate) fn covering_element(&self) -> SyntaxElement

Returns the element covered by the selection range, this excludes trailing whitespace in the selection.

Auto Trait Implementations§

§

impl<'a, 'db> !Freeze for AssistContext<'a, 'db>

§

impl<'a, 'db> !RefUnwindSafe for AssistContext<'a, 'db>

§

impl<'a, 'db> !Send for AssistContext<'a, 'db>

§

impl<'a, 'db> !Sync for AssistContext<'a, 'db>

§

impl<'a, 'db> Unpin for AssistContext<'a, 'db>

§

impl<'a, 'db> UnsafeUnpin for AssistContext<'a, 'db>

§

impl<'a, 'db> !UnwindSafe for AssistContext<'a, 'db>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T, R> CollectAndApply<T, R> for T

§

fn collect_and_apply<I, F>(iter: I, f: F) -> R
where I: Iterator<Item = T>, F: FnOnce(&[T]) -> R,

Equivalent to f(&iter.collect::<Vec<_>>()).

§

type Output = R

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> IntoBox<dyn Any> for T
where T: Any,

§

fn into_box(self) -> Box<dyn Any>

Convert self into the appropriate boxed form.
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> Lookup<T> for T

§

fn into_owned(self) -> T

§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<I, T, U> Upcast<I, U> for T
where U: UpcastFrom<I, T>,

§

fn upcast(self, interner: I) -> U

§

impl<I, T> UpcastFrom<I, T> for T

§

fn upcast_from(from: T, _tcx: I) -> T

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more