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
impl MacroCallId
pub fn expansion_span_map(self, db: &dyn SourceDatabase) -> &ExpansionSpanMap
Source§impl MacroCallId
impl MacroCallId
pub fn call_node(self, db: &dyn SourceDatabase) -> InFile<SyntaxNode>
pub fn expansion_level(self, db: &dyn SourceDatabase) -> u32
pub fn parent(self, db: &dyn SourceDatabase) -> HirFileId
Sourcepub fn expansion_info(self, db: &dyn SourceDatabase) -> ExpansionInfo<'_>
pub fn expansion_info(self, db: &dyn SourceDatabase) -> ExpansionInfo<'_>
Return expansion information if it is a macro-expansion file
pub fn kind(self, db: &dyn SourceDatabase) -> MacroKind
pub fn is_include_macro(self, db: &dyn SourceDatabase) -> bool
pub fn is_include_like_macro(self, db: &dyn SourceDatabase) -> bool
pub fn is_env_or_option_env(self, db: &dyn SourceDatabase) -> bool
pub fn is_eager(self, db: &dyn SourceDatabase) -> bool
pub fn eager_arg(self, db: &dyn SourceDatabase) -> Option<MacroCallId>
pub fn is_derive_attr_pseudo_expansion(self, db: &dyn SourceDatabase) -> bool
Source§impl MacroCallId
impl MacroCallId
Sourcepub fn parse_macro_expansion<'db>(
self: MacroCallId,
db: &'db dyn SourceDatabase,
) -> &'db ExpandResult<(Parse<SyntaxNode>, ExpansionSpanMap)>
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.
pub fn parse_macro_expansion_error( self, db: &dyn SourceDatabase, ) -> Option<ExpandResult<Arc<[SyntaxError]>>>
Sourcepub fn macro_arg_considering_derives<'db>(
self,
db: &'db dyn SourceDatabase,
kind: &MacroCallKind,
) -> &'db (TopSubtree, SyntaxFixupUndoInfo, Span)
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
Sourcepub(crate) fn macro_arg<'db>(
self: MacroCallId,
db: &'db dyn SourceDatabase,
) -> &'db (TopSubtree, SyntaxFixupUndoInfo, Span)
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.
pub(crate) fn macro_expand<'db>( self, db: &'db dyn SourceDatabase, loc: &MacroCallLoc, ) -> ExpandResult<(Cow<'db, TopSubtree>, MatchedArmIndex)>
Sourcepub(crate) fn expand_proc_macro<'db>(
self: MacroCallId,
db: &'db dyn SourceDatabase,
) -> &'db ExpandResult<TopSubtree>
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
impl MacroCallId
Sourcepub fn expand_speculative(
self,
db: &dyn SourceDatabase,
speculative_args: &SyntaxNode,
token_to_map: SyntaxToken,
) -> Option<(SyntaxNode, Vec<(SyntaxToken, u8)>)>
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
impl MacroCallId
pub fn ingredient(zalsa: &Zalsa) -> &IngredientImpl<Self>
Source§impl<'db> MacroCallId
impl<'db> MacroCallId
pub fn new<Db_, T0: Lookup<MacroCallLoc> + Hash>(db: &'db Db_, loc: T0) -> Selfwhere
Db_: ?Sized + Database,
MacroCallLoc: HashEqLike<T0>,
pub fn loc<Db_>(self, db: &'db Db_) -> &'db MacroCallLocwhere
Db_: ?Sized + Database,
Source§impl MacroCallId
impl MacroCallId
Sourcepub fn default_debug_fmt(this: Self, f: &mut Formatter<'_>) -> Resultwhere
for<'db> MacroCallLoc: Debug,
pub fn default_debug_fmt(this: Self, f: &mut Formatter<'_>) -> Resultwhere
for<'db> MacroCallLoc: Debug,
Default debug formatting for this struct (may be useful if you define your own Debug impl)
Trait Implementations§
Source§impl Clone for MacroCallId
impl Clone for MacroCallId
Source§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 moreSource§impl Configuration for MacroCallId
impl Configuration for MacroCallId
const LOCATION: Location
const DEBUG_NAME: &'static str = "MacroCallId"
const REVISIONS: NonZeroUsize
Source§type Fields<'a> = (MacroCallLoc,)
type Fields<'a> = (MacroCallLoc,)
Source§type Struct<'db> = MacroCallId
type Struct<'db> = MacroCallId
Source§fn serialize<S: Serializer>(
fields: &Self::Fields<'_>,
serializer: S,
) -> Result<S::Ok, S::Error>
fn serialize<S: Serializer>( fields: &Self::Fields<'_>, serializer: S, ) -> Result<S::Ok, S::Error>
serde. Read moreSource§fn deserialize<'de, D: Deserializer<'de>>(
deserializer: D,
) -> Result<Self::Fields<'static>, D::Error>
fn deserialize<'de, D: Deserializer<'de>>( deserializer: D, ) -> Result<Self::Fields<'static>, D::Error>
serde. Read moreSource§impl Debug for MacroCallId
impl Debug for MacroCallId
Source§impl FileIdToSyntax for MacroCallId
impl FileIdToSyntax for MacroCallId
fn file_syntax(self, db: &dyn SourceDatabase) -> SyntaxNode
Source§impl From<MacroCallId> for HirFileId
impl From<MacroCallId> for HirFileId
Source§fn from(file_id: MacroCallId) -> Self
fn from(file_id: MacroCallId) -> Self
Source§impl From<MacroCallId> for MacroCallId
impl From<MacroCallId> for MacroCallId
Source§impl From<MacroCallId> for MacroCallId
impl From<MacroCallId> for MacroCallId
Source§fn from(value: MacroCallId) -> MacroCallId
fn from(value: MacroCallId) -> MacroCallId
Source§impl HasJar for MacroCallId
impl HasJar for MacroCallId
Source§impl Hash for MacroCallId
impl Hash for MacroCallId
Source§impl Lookup for MacroCallId
impl Lookup for MacroCallId
Source§impl PartialEq for MacroCallId
impl PartialEq for MacroCallId
Source§fn eq(&self, other: &MacroCallId) -> bool
fn eq(&self, other: &MacroCallId) -> bool
self and other values to be equal, and is used by ==.Source§impl SalsaStructInDb for MacroCallId
impl SalsaStructInDb for MacroCallId
Source§const LEAF_TYPE_IDS: &'static [ConstTypeId]
const LEAF_TYPE_IDS: &'static [ConstTypeId]
type MemoIngredientMap = MemoIngredientSingletonIndex
Source§fn lookup_ingredient_index(aux: &Zalsa) -> IngredientIndices
fn lookup_ingredient_index(aux: &Zalsa) -> IngredientIndices
Source§fn entries(zalsa: &Zalsa) -> impl Iterator<Item = DatabaseKeyIndex> + '_
fn entries(zalsa: &Zalsa) -> impl Iterator<Item = DatabaseKeyIndex> + '_
Source§fn cast(id: Id, type_id: TypeId) -> Option<Self>
fn cast(id: Id, type_id: TypeId) -> Option<Self>
Source§unsafe fn memo_table(
zalsa: &Zalsa,
id: Id,
current_revision: Revision,
) -> MemoTableWithTypes<'_>
unsafe fn memo_table( zalsa: &Zalsa, id: Id, current_revision: Revision, ) -> MemoTableWithTypes<'_>
id. Read moreSource§impl Update for MacroCallId
impl Update for MacroCallId
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<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
key and return true if they are equal.§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