aboutsummaryrefslogtreecommitdiff
path: root/src/yellow/syntax.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2018-07-30 21:45:10 +0100
committerAleksey Kladov <[email protected]>2018-07-30 21:45:10 +0100
commitaea86d154ec5adde6adb05088a50f01380ffb8bf (patch)
treefd10ec3e5379e24e40f3eff78cb1e035f4bb5c89 /src/yellow/syntax.rs
parent70b337292117a9bb90e85056dcb4069f8bbc6c0a (diff)
stackless traversal
Diffstat (limited to 'src/yellow/syntax.rs')
-rw-r--r--src/yellow/syntax.rs28
1 files changed, 27 insertions, 1 deletions
diff --git a/src/yellow/syntax.rs b/src/yellow/syntax.rs
index 5c31a3f35..65ce647c7 100644
--- a/src/yellow/syntax.rs
+++ b/src/yellow/syntax.rs
@@ -18,6 +18,15 @@ pub struct SyntaxNode<R: TreeRoot = Arc<SyntaxRoot>> {
18 red: ptr::NonNull<RedNode>, 18 red: ptr::NonNull<RedNode>,
19} 19}
20 20
21impl <R1: TreeRoot, R2: TreeRoot> PartialEq<SyntaxNode<R1>> for SyntaxNode<R2> {
22 fn eq(&self, other: &SyntaxNode<R1>) -> bool {
23 self.red == other.red
24 }
25}
26
27impl <R: TreeRoot> Eq for SyntaxNode<R> {
28}
29
21pub type SyntaxNodeRef<'a> = SyntaxNode<&'a SyntaxRoot>; 30pub type SyntaxNodeRef<'a> = SyntaxNode<&'a SyntaxRoot>;
22 31
23#[derive(Debug)] 32#[derive(Debug)]
@@ -53,7 +62,7 @@ impl SyntaxNode<Arc<SyntaxRoot>> {
53} 62}
54 63
55impl<R: TreeRoot> SyntaxNode<R> { 64impl<R: TreeRoot> SyntaxNode<R> {
56 pub fn borrow<'a>(&'a self) -> SyntaxNode<&'a SyntaxRoot> { 65 pub fn as_ref<'a>(&'a self) -> SyntaxNode<&'a SyntaxRoot> {
57 SyntaxNode { 66 SyntaxNode {
58 root: &*self.root, 67 root: &*self.root,
59 red: ptr::NonNull::clone(&self.red), 68 red: ptr::NonNull::clone(&self.red),
@@ -92,6 +101,23 @@ impl<R: TreeRoot> SyntaxNode<R> {
92 }) 101 })
93 } 102 }
94 103
104 pub fn first_child(&self) -> Option<SyntaxNode<R>> {
105 self.children().next()
106 }
107
108 pub fn next_sibling(&self) -> Option<SyntaxNode<R>> {
109 let red = self.red();
110 let parent = self.parent()?;
111 let next_sibling_idx = red.index_in_parent()? + 1;
112 if next_sibling_idx == red.n_children() {
113 return None;
114 }
115 Some(SyntaxNode {
116 root: self.root.clone(),
117 red: parent.red().nth_child(next_sibling_idx),
118 })
119 }
120
95 fn red(&self) -> &RedNode { 121 fn red(&self) -> &RedNode {
96 unsafe { self.red.as_ref() } 122 unsafe { self.red.as_ref() }
97 } 123 }