1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//! Generic tree traversal traits for ink! entities.

use ra_ap_syntax::TextSize;

use crate::tree::{InkTree, ItemAtOffset};
use crate::FromSyntax;

/// Convenience methods implemented by all ink! entities for traversing the ink! entity's syntax tree.
pub trait IsInkEntity {
    /// Returns ink! entity tree.
    fn tree(&self) -> InkTree;

    /// Returns a representation of a token in the subtree which covers the position.
    fn item_at_offset(&self, offset: TextSize) -> ItemAtOffset;
}

/// Blanket implementation of the `IsInkEntity` trait for `SyntaxNode` wrappers.
impl<T> IsInkEntity for T
where
    T: FromSyntax,
{
    fn tree(&self) -> InkTree {
        InkTree::new(self.syntax())
    }

    fn item_at_offset(&self, offset: TextSize) -> ItemAtOffset {
        ItemAtOffset::new(self.syntax(), offset)
    }
}