use cairo_lang_filesystem::ids::{FileId, SpanInFile};
use cairo_lang_filesystem::span::TextWidth;
use cairo_lang_proc_macros::HeapSize;
use cairo_lang_utils::define_short_id;
use salsa::Database;
use super::SyntaxNode;
use super::green::GreenNode;
use super::kind::SyntaxKind;
define_short_id!(GreenId, GreenNode<'db>);
impl<'a> GreenId<'a> {
pub fn width(&self, db: &dyn Database) -> TextWidth {
self.long(db).width(db)
}
}
#[derive(Copy, Debug, Clone, PartialEq, Eq, Hash, salsa::Update, HeapSize)]
pub struct SyntaxStablePtrId<'a>(pub SyntaxNode<'a>);
impl<'a> SyntaxStablePtrId<'a> {
pub fn lookup(&self, _db: &'a dyn Database) -> SyntaxNode<'a> {
self.0
}
pub fn file_id(&self, db: &'a dyn Database) -> FileId<'a> {
self.0.file_id(db)
}
pub fn parent<'r: 'a>(&self, db: &'r dyn Database) -> SyntaxStablePtrId<'a> {
SyntaxStablePtrId(self.0.parent(db).unwrap())
}
pub fn nth_parent<'r: 'a>(&self, db: &'r dyn Database, n: usize) -> SyntaxStablePtrId<'a> {
SyntaxStablePtrId(self.0.nth_parent(db, n))
}
pub fn kind(&self, db: &'a dyn Database) -> SyntaxKind {
self.0.kind(db)
}
pub fn span_in_file(&self, db: &'a dyn Database) -> SpanInFile<'a> {
SpanInFile { file_id: self.file_id(db), span: self.lookup(db).span_without_trivia(db) }
}
}