charon_lib/ast/items/
trait_impl.rs1use crate::ast::*;
2use crate::ids::IndexVec;
3use derive_generic_visitor::{Drive, DriveMut, DriveTwo};
4use macros::EnumAsGetters;
5use macros::EnumIsA;
6use serde_state::DeserializeState;
7use serde_state::SerializeState;
8
9#[derive(Debug, Clone)]
20#[derive(SerializeState, DeserializeState, Drive, DriveMut, DriveTwo)]
21pub struct TraitImpl {
22 pub def_id: TraitImplId,
23 pub item_meta: ItemMeta,
24 pub src: TraitImplSource,
25 pub impl_trait: TraitDeclRef,
29 pub is_negative: bool,
31 pub is_unsafe: bool,
33 pub generics: GenericParams,
34 pub implied_trait_refs: IndexVec<TraitClauseId, TraitRef>,
36 pub consts: IndexMap<AssocConstId, GlobalDeclRef>,
38 pub types: IndexMap<AssocTypeId, Binder<TraitAssocTyImpl>>,
40 pub methods: IndexMap<TraitMethodId, Binder<FunDeclRef>>,
42 pub vtable: VTableDecl,
44}
45
46#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
48#[derive(SerializeState, DeserializeState, Drive, DriveMut, DriveTwo)]
49pub struct TraitAssocTyImpl {
50 pub value: Ty,
51 pub implied_trait_refs: IndexVec<TraitClauseId, TraitRef>,
54}
55
56#[derive(Debug, Clone)]
58#[derive(SerializeState, DeserializeState, Drive, DriveMut, DriveTwo)]
59#[cfg_attr(feature = "charon_on_charon", charon::variants_suffix("TraitImpl"))]
60pub enum TraitImplSource {
61 Normal,
63 TraitAlias,
65 Closure {
67 #[serde_state(stateless)]
68 kind: ClosureKind,
69 },
70 Destruct,
72}
73
74#[derive(Debug, Clone)]
76#[derive(EnumIsA, EnumAsGetters)]
77#[derive(SerializeState, DeserializeState, Drive, DriveMut, DriveTwo)]
78pub enum VTableDecl {
79 NotDynCompatible,
81 Lazy,
83 #[cfg_attr(feature = "charon_on_charon", charon::rename("VTableInstance"))]
85 VTable(GlobalDeclRef),
86 #[cfg_attr(feature = "charon_on_charon", charon::rename("UnknownVTable"))]
88 Unknown(String),
89}
90
91impl TraitImpl {
92 pub fn methods(&self) -> impl Iterator<Item = &Binder<FunDeclRef>> {
93 self.methods.iter()
94 }
95
96 pub fn is_unsafe_to_declare(&self, _krate: &TranslatedCrate) -> bool {
99 self.is_unsafe || self.item_meta.is_unsafe_to_declare()
100 }
101}