use cairo_lang_defs::ids::{MemberId, NamedLanguageElementId};
use cairo_lang_syntax::node::ids::SyntaxStablePtrId;
use cairo_lang_syntax::node::{SyntaxNode, TypedSyntaxNode, ast};
use crate::lang::db::AnalysisDatabase;
use crate::lang::defs::ItemDef;
#[derive(Eq, PartialEq, Debug, Clone)]
pub struct MemberDef<'db> {
member_id: MemberId<'db>,
struct_item: ItemDef<'db>,
definition_stable_ptr: SyntaxStablePtrId<'db>,
}
impl<'db> MemberDef<'db> {
pub(super) fn new(
db: &'db AnalysisDatabase,
member_id: MemberId<'db>,
definition_node: SyntaxNode<'db>,
) -> Option<Self> {
let struct_ast = definition_node.ancestor_of_type::<ast::ItemStruct>(db)?;
let struct_item = ItemDef::new(db, struct_ast.name(db).as_syntax_node())?;
Some(Self { member_id, struct_item, definition_stable_ptr: definition_node.stable_ptr(db) })
}
pub fn definition_stable_ptr(&self) -> SyntaxStablePtrId<'db> {
self.definition_stable_ptr
}
pub fn member_id(&self) -> MemberId<'db> {
self.member_id
}
pub fn struct_item(&self) -> &ItemDef<'db> {
&self.struct_item
}
pub fn name(&self, db: &'db AnalysisDatabase) -> String {
self.member_id.name(db).to_string(db)
}
}