charon_lib/ast/items/
trait_impl.rs1use crate::ast::*;
2use crate::ids::IndexVec;
3use derive_generic_visitor::{Drive, DriveMut, DriveTwo};
4use serde_state::DeserializeState;
5use serde_state::SerializeState;
6
7#[derive(Debug, Clone, SerializeState, DeserializeState, Drive, DriveMut, DriveTwo)]
18pub struct TraitImpl {
19 pub def_id: TraitImplId,
20 pub item_meta: ItemMeta,
21 pub src: TraitImplSource,
22 pub impl_trait: TraitDeclRef,
26 pub generics: GenericParams,
27 pub implied_trait_refs: IndexVec<TraitClauseId, TraitRef>,
29 pub consts: IndexMap<AssocConstId, GlobalDeclRef>,
31 pub types: IndexMap<AssocTypeId, Binder<TraitAssocTyImpl>>,
33 pub methods: IndexMap<TraitMethodId, Binder<FunDeclRef>>,
35 pub vtable: Option<GlobalDeclRef>,
38}
39
40#[derive(
42 Debug,
43 Clone,
44 PartialEq,
45 Eq,
46 PartialOrd,
47 Ord,
48 Hash,
49 SerializeState,
50 DeserializeState,
51 Drive,
52 DriveMut,
53 DriveTwo,
54)]
55pub struct TraitAssocTyImpl {
56 pub value: Ty,
57 pub implied_trait_refs: IndexVec<TraitClauseId, TraitRef>,
60}
61
62#[derive(Debug, Clone, SerializeState, DeserializeState, Drive, DriveMut, DriveTwo)]
64#[cfg_attr(feature = "charon_on_charon", charon::variants_suffix("TraitImpl"))]
65pub enum TraitImplSource {
66 Normal,
68 TraitAlias,
70 Closure {
72 #[serde_state(stateless)]
73 kind: ClosureKind,
74 },
75 Destruct,
77}
78
79impl TraitImpl {
80 pub fn methods(&self) -> impl Iterator<Item = &Binder<FunDeclRef>> {
81 self.methods.iter()
82 }
83}