Struct hir::SemanticsScope

source ·
pub struct SemanticsScope<'a> {
    pub db: &'a dyn HirDatabase,
    /* private fields */
}
Expand description

SemanticsScope encapsulates the notion of a scope (the set of visible names) at a particular program point.

It is a bit tricky, as scopes do not really exist inside the compiler. Rather, the compiler directly computes for each reference the definition it refers to. It might transiently compute the explicit scope map while doing so, but, generally, this is not something left after the analysis.

However, we do very much need explicit scopes for IDE purposes – completion, at its core, lists the contents of the current scope. The notion of scope is also useful to answer questions like “what would be the meaning of this piece of code if we inserted it into this position?”.

So SemanticsScope is constructed from a specific program point (a syntax node or just a raw offset) and provides access to the set of visible names on a somewhat best-effort basis.

Note that if you are wondering “what does this specific existing name mean?”, you’d better use the resolve_ family of methods.

Fields§

§db: &'a dyn HirDatabase

Implementations§

source§

impl SemanticsScope<'_>

source

pub fn module(&self) -> Module

source

pub fn krate(&self) -> Crate

source

pub fn visible_traits(&self) -> VisibleTraits

Note: VisibleTraits should be treated as an opaque type, passed into `Type

source

pub fn process_all_names(&self, f: &mut dyn FnMut(Name, ScopeDef))

Calls the passed closure f on all names in scope.

source

pub fn speculative_resolve(&self, ast_path: &Path) -> Option<PathResolution>

Resolve a path as-if it was written at the given scope. This is necessary a heuristic, as it doesn’t take hygiene into account.

source

pub fn assoc_type_shorthand_candidates<R>( &self, resolution: &PathResolution, cb: impl FnMut(&Name, TypeAlias) -> Option<R>, ) -> Option<R>

Iterates over associated types that may be specified after the given path (using Ty::Assoc syntax).

source

pub fn extern_crates(&self) -> impl Iterator<Item = (Name, Module)> + '_

source

pub fn extern_crate_decls(&self) -> impl Iterator<Item = Name> + '_

source

pub fn has_same_self_type(&self, other: &SemanticsScope<'_>) -> bool

Trait Implementations§

source§

impl<'a> Debug for SemanticsScope<'a>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'a> Freeze for SemanticsScope<'a>

§

impl<'a> !RefUnwindSafe for SemanticsScope<'a>

§

impl<'a> !Send for SemanticsScope<'a>

§

impl<'a> !Sync for SemanticsScope<'a>

§

impl<'a> Unpin for SemanticsScope<'a>

§

impl<'a> !UnwindSafe for SemanticsScope<'a>

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> Cast for T

§

fn cast<U>(self, interner: <U as HasInterner>::Interner) -> U
where Self: CastTo<U>, U: HasInterner,

Cast a value to type U using CastTo.
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
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<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
§

impl<'a, T> Captures<'a> for T
where T: ?Sized,