hax_rust_engine/ast/
utils.rs1use super::visitors::*;
4use super::*;
5use identifiers::*;
6use std::collections::HashMap;
7
8pub mod mappers {
10 use super::*;
11
12 pub struct SubstLocalIds(HashMap<LocalId, LocalId>);
14
15 impl SubstLocalIds {
16 pub fn one(from: LocalId, to: LocalId) -> Self {
18 Self::many([(from, to)])
19 }
20 pub fn many(replacements: impl IntoIterator<Item = (LocalId, LocalId)>) -> Self {
22 Self(replacements.into_iter().collect())
23 }
24 }
25
26 impl AstVisitorMut for SubstLocalIds {
27 fn visit_local_id(&mut self, local_id: &mut LocalId) {
28 if let Some(replacement) = self.0.get(local_id) {
29 *local_id = replacement.clone();
30 }
31 }
32 }
33}
34
35impl Metadata {
36 pub fn hax_attributes(&self) -> impl Iterator<Item = &hax_lib_macros_types::AttrPayload> {
38 crate::attributes::hax_attributes(&self.attributes)
39 }
40}
41
42impl Pat {
43 pub fn expect_self(&self) -> Option<LocalId> {
45 if let PatKind::Binding { var, .. } = self.kind()
46 && var.is_self()
47 {
48 Some(var.clone())
49 } else {
50 None
51 }
52 }
53}
54
55impl Item {
56 pub fn self_id(&self) -> Option<LocalId> {
61 if let ItemKind::Fn { params, .. } = self.kind()
62 && let [first, ..] = ¶ms[..]
63 && let Some(self_id) = first.pat.expect_self()
64 {
65 Some(self_id.clone())
66 } else {
67 None
68 }
69 }
70}