use super::visitors::*;
use super::*;
use identifiers::*;
use std::collections::HashMap;
pub mod mappers {
use super::*;
pub struct SubstLocalIds(HashMap<LocalId, LocalId>);
impl SubstLocalIds {
pub fn one(from: LocalId, to: LocalId) -> Self {
Self::many([(from, to)])
}
pub fn many(replacements: impl IntoIterator<Item = (LocalId, LocalId)>) -> Self {
Self(replacements.into_iter().collect())
}
}
impl AstVisitorMut for SubstLocalIds {
fn visit_local_id(&mut self, local_id: &mut LocalId) {
if let Some(replacement) = self.0.get(local_id) {
*local_id = replacement.clone();
}
}
}
}
impl Metadata {
pub fn hax_attributes(&self) -> impl Iterator<Item = &hax_lib_macros_types::AttrPayload> {
crate::attributes::hax_attributes(&self.attributes)
}
}
impl Pat {
pub fn expect_self(&self) -> Option<LocalId> {
if let PatKind::Binding { var, .. } = self.kind()
&& var.is_self()
{
Some(var.clone())
} else {
None
}
}
}
impl Item {
pub fn self_id(&self) -> Option<LocalId> {
if let ItemKind::Fn { params, .. } = self.kind()
&& let [first, ..] = ¶ms[..]
&& let Some(self_id) = first.pat.expect_self()
{
Some(self_id.clone())
} else {
None
}
}
}