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(
18 Debug, PartialEq, Eq, Clone, SerializeState, DeserializeState, Drive, DriveMut, DriveTwo,
19)]
20pub struct TraitImpl {
21 pub def_id: TraitImplId,
22 pub item_meta: ItemMeta,
23 pub src: TraitImplSource,
24 pub impl_trait: TraitDeclRef,
28 pub generics: GenericParams,
29 pub implied_trait_refs: IndexVec<TraitClauseId, TraitRef>,
31 pub consts: IndexMap<AssocConstId, GlobalDeclRef>,
33 pub types: IndexMap<AssocTypeId, Binder<TraitAssocTyImpl>>,
35 pub methods: IndexMap<TraitMethodId, Binder<FunDeclRef>>,
37 pub vtable: Option<GlobalDeclRef>,
40}
41
42#[derive(
44 Debug,
45 Clone,
46 PartialEq,
47 Eq,
48 PartialOrd,
49 Ord,
50 Hash,
51 SerializeState,
52 DeserializeState,
53 Drive,
54 DriveMut,
55 DriveTwo,
56)]
57pub struct TraitAssocTyImpl {
58 pub value: Ty,
59 pub implied_trait_refs: IndexVec<TraitClauseId, TraitRef>,
62}
63
64#[derive(
66 Debug, Clone, PartialEq, Eq, SerializeState, DeserializeState, Drive, DriveMut, DriveTwo,
67)]
68#[cfg_attr(feature = "charon_on_charon", charon::variants_suffix("TraitImpl"))]
69pub enum TraitImplSource {
70 Normal,
72 TraitAlias,
74 Closure {
76 #[serde_state(stateless)]
77 kind: ClosureKind,
78 },
79 Destruct,
81}
82
83impl TraitImpl {
84 pub fn methods(&self) -> impl Iterator<Item = &Binder<FunDeclRef>> {
85 self.methods.iter()
86 }
87}