Skip to main content

MacroCallId

Struct MacroCallId 

Source
pub struct MacroCallId(pub(crate) Id, pub(crate) PhantomData<fn() -> &'static ()>);
Expand description

Macro ids. That’s probably the tricksiest bit in rust-analyzer, and the reason why we use salsa at all.

We encode macro definitions into ids of macro calls, this what allows us to be incremental.

Tuple Fields§

§0: Id§1: PhantomData<fn() -> &'static ()>

Implementations§

Source§

impl MacroCallId

Source

pub fn expansion_span_map(self, db: &dyn SourceDatabase) -> &ExpansionSpanMap

Source§

impl MacroCallId

Source

pub fn call_node(self, db: &dyn SourceDatabase) -> InFile<SyntaxNode>

Source

pub fn expansion_level(self, db: &dyn SourceDatabase) -> u32

Source

pub fn parent(self, db: &dyn SourceDatabase) -> HirFileId

Source

pub fn expansion_info(self, db: &dyn SourceDatabase) -> ExpansionInfo<'_>

Return expansion information if it is a macro-expansion file

Source

pub fn kind(self, db: &dyn SourceDatabase) -> MacroKind

Source

pub fn is_include_macro(self, db: &dyn SourceDatabase) -> bool

Source

pub fn is_include_like_macro(self, db: &dyn SourceDatabase) -> bool

Source

pub fn is_env_or_option_env(self, db: &dyn SourceDatabase) -> bool

Source

pub fn is_eager(self, db: &dyn SourceDatabase) -> bool

Source

pub fn eager_arg(self, db: &dyn SourceDatabase) -> Option<MacroCallId>

Source

pub fn is_derive_attr_pseudo_expansion(self, db: &dyn SourceDatabase) -> bool

Source§

impl MacroCallId

Source

pub fn parse_macro_expansion<'db>( self: MacroCallId, db: &'db dyn SourceDatabase, ) -> &'db ExpandResult<(Parse<SyntaxNode>, ExpansionSpanMap)>

Implementation of HirFileId::parse_or_expand for the macro case.

Source

pub fn parse_macro_expansion_error( self, db: &dyn SourceDatabase, ) -> Option<ExpandResult<Arc<[SyntaxError]>>>

Source

pub fn macro_arg_considering_derives<'db>( self, db: &'db dyn SourceDatabase, kind: &MacroCallKind, ) -> &'db (TopSubtree, SyntaxFixupUndoInfo, Span)

This resolves the MacroCallId to check if it is a derive macro if so get the macro_arg for the derive. Other wise return the macro_arg for the macro_call_id.

This is not connected to the database so it does not cache the result. However, the inner macro_arg query is

Source

pub(crate) fn macro_arg<'db>( self: MacroCallId, db: &'db dyn SourceDatabase, ) -> &'db (TopSubtree, SyntaxFixupUndoInfo, Span)

Lowers syntactic macro call to a token tree representation. That’s a firewall query, only typing in the macro call itself changes the returned subtree.

Source

pub(crate) fn macro_expand<'db>( self, db: &'db dyn SourceDatabase, loc: &MacroCallLoc, ) -> ExpandResult<(Cow<'db, TopSubtree>, MatchedArmIndex)>

Source

pub(crate) fn expand_proc_macro<'db>( self: MacroCallId, db: &'db dyn SourceDatabase, ) -> &'db ExpandResult<TopSubtree>

Special case of Self::macro_expand for procedural macros. We can’t LRU proc macros, since they are not deterministic in general, and non-determinism breaks salsa in a very, very, very bad way. @edwin0cheng heroically debugged this once! See #4315 for details

Source§

impl MacroCallId

Source

pub fn expand_speculative( self, db: &dyn SourceDatabase, speculative_args: &SyntaxNode, token_to_map: SyntaxToken, ) -> Option<(SyntaxNode, Vec<(SyntaxToken, u8)>)>

This expands the given macro call, but with different arguments. This is used for completion, where we want to see what ‘would happen’ if we insert a token. The token_to_map mapped down into the expansion, with the mapped token(s) returned with their priority.

Source§

impl MacroCallId

Source

pub fn ingredient(zalsa: &Zalsa) -> &IngredientImpl<Self>

Source§

impl<'db> MacroCallId

Source

pub fn new<Db_, T0: Lookup<MacroCallLoc> + Hash>(db: &'db Db_, loc: T0) -> Self
where Db_: ?Sized + Database, MacroCallLoc: HashEqLike<T0>,

Source

pub fn loc<Db_>(self, db: &'db Db_) -> &'db MacroCallLoc
where Db_: ?Sized + Database,

Source§

impl MacroCallId

Source

pub fn default_debug_fmt(this: Self, f: &mut Formatter<'_>) -> Result
where for<'db> MacroCallLoc: Debug,

Default debug formatting for this struct (may be useful if you define your own Debug impl)

Trait Implementations§

Source§

impl AsId for MacroCallId

Source§

fn as_id(&self) -> Id

Source§

impl Clone for MacroCallId

Source§

fn clone(&self) -> MacroCallId

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Configuration for MacroCallId

Source§

const LOCATION: Location

Source§

const DEBUG_NAME: &'static str = "MacroCallId"

Source§

const PERSIST: bool = false

Whether this struct should be persisted with the database.
Source§

const REVISIONS: NonZeroUsize

Source§

type Fields<'a> = (MacroCallLoc,)

The fields of the struct being interned.
Source§

type Struct<'db> = MacroCallId

The end user struct
Source§

fn serialize<S: Serializer>( fields: &Self::Fields<'_>, serializer: S, ) -> Result<S::Ok, S::Error>

Serialize the fields using serde. Read more
Source§

fn deserialize<'de, D: Deserializer<'de>>( deserializer: D, ) -> Result<Self::Fields<'static>, D::Error>

Deserialize the fields using serde. Read more
§

fn heap_size(_value: &Self::Fields<'_>) -> Option<usize>

Returns the size of any heap allocations in the output value, in bytes.
Source§

impl Debug for MacroCallId

Source§

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

Formats the value using the given formatter. Read more
Source§

impl FileIdToSyntax for MacroCallId

Source§

fn file_syntax(self, db: &dyn SourceDatabase) -> SyntaxNode

Source§

impl From<MacroCallId> for HirFileId

Source§

fn from(file_id: MacroCallId) -> Self

Converts to this type from the input type.
Source§

impl From<MacroCallId> for MacroCallId

Source§

fn from(value: MacroCallId) -> Self

Converts to this type from the input type.
Source§

impl From<MacroCallId> for MacroCallId

Source§

fn from(value: MacroCallId) -> MacroCallId

Converts to this type from the input type.
Source§

impl FromId for MacroCallId

Source§

fn from_id(id: Id) -> Self

Source§

impl HasJar for MacroCallId

Source§

const KIND: JarKind = zalsa_::JarKind::Struct

The [JarKind] for Self::Jar.
Source§

type Jar = JarImpl<MacroCallId>

The [Jar] associated with this ingredient.
Source§

impl Hash for MacroCallId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl Lookup for MacroCallId

Source§

type Data = MacroCallLoc

Source§

fn lookup<'db>(&self, db: &'db dyn SourceDatabase) -> &'db Self::Data

Source§

impl PartialEq for MacroCallId

Source§

fn eq(&self, other: &MacroCallId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl SalsaStructInDb for MacroCallId

Source§

const LEAF_TYPE_IDS: &'static [ConstTypeId]

The type IDs of all concrete (leaf) salsa struct types that this type can contain. Read more
Source§

type MemoIngredientMap = MemoIngredientSingletonIndex

Source§

fn lookup_ingredient_index(aux: &Zalsa) -> IngredientIndices

Lookup or create ingredient indices. Read more
Source§

fn entries(zalsa: &Zalsa) -> impl Iterator<Item = DatabaseKeyIndex> + '_

Returns the IDs of any instances of this struct in the database.
Source§

fn cast(id: Id, type_id: TypeId) -> Option<Self>

Plumbing to support nested salsa supertypes. Read more
Source§

unsafe fn memo_table( zalsa: &Zalsa, id: Id, current_revision: Revision, ) -> MemoTableWithTypes<'_>

Return the memo table associated with id. Read more
Source§

impl Update for MacroCallId

Source§

unsafe fn maybe_update(old_pointer: *mut Self, new_value: Self) -> bool

Returns Read more
Source§

impl Copy for MacroCallId

Source§

impl Eq for MacroCallId

Source§

impl Send for MacroCallId

Source§

impl StructuralPartialEq for MacroCallId

Source§

impl Sync for MacroCallId

Auto Trait Implementations§

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
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> HashEqLike<&T> for T
where T: Hash + Eq,

§

fn hash<H>(&self, h: &mut H)
where H: Hasher,

§

fn eq(&self, data: &&T) -> bool

§

impl<T> HashEqLike<Cow<'_, T>> for T
where T: Hash + Eq + Clone,

§

fn hash<H>(&self, h: &mut H)
where H: Hasher,

§

fn eq(&self, data: &Cow<'_, T>) -> bool

§

impl<T> HashEqLike<T> for T
where T: Hash + Eq,

§

fn hash<H>(&self, h: &mut H)
where H: Hasher,

§

fn eq(&self, data: &T) -> bool

§

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.
§

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

§

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

Convert self into the appropriate boxed form.
§

impl<T> IntoBox<dyn Any + Send + Sync> for T
where T: Any + Send + Sync,

§

fn into_box(self) -> Box<dyn Any + Send + Sync>

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> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. 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