cairo_lang_syntax/node/
ids.rs1use cairo_lang_filesystem::ids::{FileId, SpanInFile};
2use cairo_lang_filesystem::span::TextWidth;
3use cairo_lang_utils::define_short_id;
4use salsa::Database;
5
6use super::SyntaxNode;
7use super::green::GreenNode;
8use super::kind::SyntaxKind;
9
10define_short_id!(GreenId, GreenNode<'db>);
11impl<'a> GreenId<'a> {
12 pub fn width(&self, db: &dyn Database) -> TextWidth {
14 match &self.long(db).details {
15 super::green::GreenNodeDetails::Token(text) => TextWidth::from_str(text.long(db)),
16 super::green::GreenNodeDetails::Node { width, .. } => *width,
17 }
18 }
19}
20
21#[derive(Copy, Debug, Clone, PartialEq, Eq, Hash, salsa::Update)]
22pub struct SyntaxStablePtrId<'a>(pub SyntaxNode<'a>);
23
24impl<'a> SyntaxStablePtrId<'a> {
25 pub fn lookup(&self, _db: &'a dyn Database) -> SyntaxNode<'a> {
28 self.0
29 }
30 pub fn file_id(&self, db: &'a dyn Database) -> FileId<'a> {
31 self.0.file_id(db)
32 }
33 pub fn parent<'r: 'a>(&self, db: &'r dyn Database) -> SyntaxStablePtrId<'a> {
36 SyntaxStablePtrId(self.0.parent(db).unwrap())
37 }
38 pub fn nth_parent<'r: 'a>(&self, db: &'r dyn Database, n: usize) -> SyntaxStablePtrId<'a> {
45 SyntaxStablePtrId(self.0.nth_parent(db, n))
46 }
47 pub fn kind(&self, db: &'a dyn Database) -> SyntaxKind {
50 self.0.kind(db)
51 }
52 pub fn span_in_file(&self, db: &'a dyn Database) -> SpanInFile<'a> {
54 SpanInFile { file_id: self.file_id(db), span: self.lookup(db).span_without_trivia(db) }
55 }
56}