charon_lib/ast/
names_utils.rs1use crate::ast::*;
6
7impl PathElem {
8 fn equals_ident(&self, id: &str) -> bool {
9 match self {
10 PathElem::Ident(s, d) => s == id && d.is_zero(),
11 _ => false,
12 }
13 }
14
15 pub fn as_monomorphized(&self) -> Option<&GenericArgs> {
16 let binder = self.as_instantiated()?;
17 binder.params.is_empty().then_some(&binder.skip_binder)
18 }
19 pub fn is_monomorphized(&self) -> bool {
20 self.as_monomorphized().is_some()
21 }
22}
23
24impl Name {
25 pub fn from_path(path: &[&str]) -> Name {
28 Name {
29 name: path
30 .iter()
31 .map(|elem| PathElem::Ident(elem.to_string(), Disambiguator::ZERO))
32 .collect(),
33 }
34 }
35
36 #[allow(clippy::len_without_is_empty)]
37 pub fn len(&self) -> usize {
38 self.name.len()
39 }
40
41 pub fn mono_args(&self) -> Option<&GenericArgs> {
43 Some(self.name.last()?.as_monomorphized()?)
44 }
45
46 pub fn compare_with_ref_name(&self, equal: bool, ref_name: &[&str]) -> bool {
52 let name: Vec<&PathElem> = self.name.iter().filter(|e| e.is_ident()).collect();
53
54 if name.len() < ref_name.len() || (equal && name.len() != ref_name.len()) {
55 return false;
56 }
57
58 for i in 0..ref_name.len() {
59 if !name[i].equals_ident(ref_name[i]) {
60 return false;
61 }
62 }
63 true
64 }
65
66 pub fn equals_ref_name(&self, ref_name: &[&str]) -> bool {
69 self.compare_with_ref_name(true, ref_name)
70 }
71
72 pub fn instantiate(mut self, binder: Binder<GenericArgs>) -> Self {
75 if let [.., PathElem::Instantiated(box x)] = self.name.as_mut_slice() {
76 let old_args = std::mem::replace(x, binder);
78 x.skip_binder = old_args.apply(&x.skip_binder);
80 } else {
81 self.name.push(PathElem::Instantiated(Box::new(binder)));
82 }
83 self
84 }
85}