Struct MacroCallId
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§
§impl MacroCallId
impl MacroCallId
pub fn expansion_span_map(self, db: &(dyn SourceDatabase + 'static)) -> &SpanMap
§impl MacroCallId
impl MacroCallId
pub fn call_node( self, db: &(dyn SourceDatabase + 'static), ) -> InFileWrapper<HirFileId, SyntaxNode<RustLanguage>>
pub fn expansion_level(self, db: &(dyn SourceDatabase + 'static)) -> u32
pub fn parent(self, db: &(dyn SourceDatabase + 'static)) -> HirFileId
pub fn expansion_info(
self,
db: &(dyn SourceDatabase + 'static),
) -> ExpansionInfo<'_>
pub fn expansion_info( self, db: &(dyn SourceDatabase + 'static), ) -> ExpansionInfo<'_>
Return expansion information if it is a macro-expansion file
pub fn kind(self, db: &(dyn SourceDatabase + 'static)) -> MacroKind
pub fn is_include_macro(self, db: &(dyn SourceDatabase + 'static)) -> bool
pub fn is_include_like_macro(self, db: &(dyn SourceDatabase + 'static)) -> bool
pub fn is_env_or_option_env(self, db: &(dyn SourceDatabase + 'static)) -> bool
pub fn is_eager(self, db: &(dyn SourceDatabase + 'static)) -> bool
pub fn eager_arg( self, db: &(dyn SourceDatabase + 'static), ) -> Option<MacroCallId>
pub fn is_derive_attr_pseudo_expansion( self, db: &(dyn SourceDatabase + 'static), ) -> bool
§impl MacroCallId
impl MacroCallId
pub fn parse_macro_expansion<'db>(
self,
db: &'db (dyn SourceDatabase + 'static),
) -> &'db ValueResult<(Parse<SyntaxNode<RustLanguage>>, SpanMap), ExpandError>
pub fn parse_macro_expansion<'db>( self, db: &'db (dyn SourceDatabase + 'static), ) -> &'db ValueResult<(Parse<SyntaxNode<RustLanguage>>, SpanMap), ExpandError>
Implementation of HirFileId::parse_or_expand for the macro case.
pub fn parse_macro_expansion_error( self, db: &(dyn SourceDatabase + 'static), ) -> Option<ValueResult<Arc<[SyntaxError]>, ExpandError>>
pub fn macro_arg_considering_derives<'db>(
self,
db: &'db (dyn SourceDatabase + 'static),
kind: &MacroCallKind,
) -> &'db (TopSubtree, SyntaxFixupUndoInfo, Span)
pub fn macro_arg_considering_derives<'db>( self, db: &'db (dyn SourceDatabase + 'static), 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
§impl MacroCallId
impl MacroCallId
pub fn expand_speculative(
self,
db: &(dyn SourceDatabase + 'static),
speculative_args: &SyntaxNode<RustLanguage>,
token_to_map: SyntaxToken<RustLanguage>,
) -> Option<(SyntaxNode<RustLanguage>, Vec<(SyntaxToken<RustLanguage>, u8)>)>
pub fn expand_speculative( self, db: &(dyn SourceDatabase + 'static), speculative_args: &SyntaxNode<RustLanguage>, token_to_map: SyntaxToken<RustLanguage>, ) -> Option<(SyntaxNode<RustLanguage>, Vec<(SyntaxToken<RustLanguage>, 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.
§impl MacroCallId
impl MacroCallId
pub fn ingredient(zalsa: &Zalsa) -> &IngredientImpl<MacroCallId>
§impl<'db> MacroCallId
impl<'db> MacroCallId
§impl MacroCallId
impl MacroCallId
pub fn default_debug_fmt(
this: MacroCallId,
f: &mut Formatter<'_>,
) -> Result<(), Error>where
MacroCallLoc: for<'db> Debug,
pub fn default_debug_fmt(
this: MacroCallId,
f: &mut Formatter<'_>,
) -> Result<(), Error>where
MacroCallLoc: for<'db> Debug,
Default debug formatting for this struct (may be useful if you define your own Debug impl)
Trait Implementations§
§impl Clone for MacroCallId
impl Clone for MacroCallId
§fn clone(&self) -> MacroCallId
fn clone(&self) -> MacroCallId
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more§impl Debug for MacroCallId
impl Debug for MacroCallId
§impl From<MacroCallId> for HirFileId
impl From<MacroCallId> for HirFileId
§fn from(file_id: MacroCallId) -> HirFileId
fn from(file_id: MacroCallId) -> HirFileId
§impl From<MacroCallId> for MacroCallId
impl From<MacroCallId> for MacroCallId
§fn from(value: MacroCallId) -> MacroCallId
fn from(value: MacroCallId) -> MacroCallId
§impl Hash for MacroCallId
impl Hash for MacroCallId
§impl Lookup for MacroCallId
impl Lookup for MacroCallId
type Data = MacroCallLoc
fn lookup<'db>( &self, db: &'db (dyn SourceDatabase + 'static), ) -> &'db <MacroCallId as Lookup>::Data
§impl PartialEq for MacroCallId
impl PartialEq for MacroCallId
§impl Update for MacroCallId
impl Update for MacroCallId
§unsafe fn maybe_update(
old_pointer: *mut MacroCallId,
new_value: MacroCallId,
) -> bool
unsafe fn maybe_update( old_pointer: *mut MacroCallId, new_value: MacroCallId, ) -> bool
impl Copy for MacroCallId
impl Eq for MacroCallId
impl Send for MacroCallId
impl StructuralPartialEq for MacroCallId
impl Sync for MacroCallId
Auto Trait Implementations§
impl Freeze for MacroCallId
impl RefUnwindSafe for MacroCallId
impl Unpin for MacroCallId
impl UnsafeUnpin for MacroCallId
impl UnwindSafe for MacroCallId
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<T> HashEqLike<T> for T
impl<T> HashEqLike<T> for T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
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