diff options
-rw-r--r-- | src/yellow/red.rs | 19 | ||||
-rw-r--r-- | src/yellow/syntax.rs | 2 |
2 files changed, 13 insertions, 8 deletions
diff --git a/src/yellow/red.rs b/src/yellow/red.rs index 3fdbfe0c5..3002153ca 100644 --- a/src/yellow/red.rs +++ b/src/yellow/red.rs | |||
@@ -1,4 +1,7 @@ | |||
1 | use std::sync::{Arc, RwLock}; | 1 | use std::{ |
2 | ptr, | ||
3 | sync::RwLock, | ||
4 | }; | ||
2 | use { | 5 | use { |
3 | TextUnit, | 6 | TextUnit, |
4 | yellow::GreenNode, | 7 | yellow::GreenNode, |
@@ -8,7 +11,7 @@ use { | |||
8 | pub(crate) struct RedNode { | 11 | pub(crate) struct RedNode { |
9 | green: GreenNode, | 12 | green: GreenNode, |
10 | parent: Option<ParentData>, | 13 | parent: Option<ParentData>, |
11 | children: RwLock<Vec<Option<Arc<RedNode>>>>, | 14 | children: RwLock<Vec<Option<Box<RedNode>>>>, |
12 | } | 15 | } |
13 | 16 | ||
14 | #[derive(Debug)] | 17 | #[derive(Debug)] |
@@ -43,7 +46,8 @@ impl RedNode { | |||
43 | green: GreenNode, | 46 | green: GreenNode, |
44 | parent: Option<ParentData>, | 47 | parent: Option<ParentData>, |
45 | ) -> RedNode { | 48 | ) -> RedNode { |
46 | let children = vec![None; green.children().len()]; | 49 | let n_children = green.children().len(); |
50 | let children = (0..n_children).map(|_| None).collect(); | ||
47 | RedNode { green, parent, children: RwLock::new(children) } | 51 | RedNode { green, parent, children: RwLock::new(children) } |
48 | } | 52 | } |
49 | 53 | ||
@@ -62,9 +66,9 @@ impl RedNode { | |||
62 | self.green.children().len() | 66 | self.green.children().len() |
63 | } | 67 | } |
64 | 68 | ||
65 | pub(crate) fn nth_child(&self, idx: usize) -> Arc<RedNode> { | 69 | pub(crate) fn nth_child(&self, idx: usize) -> ptr::NonNull<RedNode> { |
66 | match &self.children.read().unwrap()[idx] { | 70 | match &self.children.read().unwrap()[idx] { |
67 | Some(child) => return child.clone(), | 71 | Some(child) => return ptr::NonNull::from(&**child), |
68 | None => (), | 72 | None => (), |
69 | } | 73 | } |
70 | let mut children = self.children.write().unwrap(); | 74 | let mut children = self.children.write().unwrap(); |
@@ -73,8 +77,9 @@ impl RedNode { | |||
73 | let start_offset = self.start_offset() | 77 | let start_offset = self.start_offset() |
74 | + green_children[..idx].iter().map(|x| x.text_len()).sum::<TextUnit>(); | 78 | + green_children[..idx].iter().map(|x| x.text_len()).sum::<TextUnit>(); |
75 | let child = RedNode::new_child(green_children[idx].clone(), self, start_offset, idx); | 79 | let child = RedNode::new_child(green_children[idx].clone(), self, start_offset, idx); |
76 | children[idx] = Some(Arc::new(child)) | 80 | children[idx] = Some(Box::new(child)) |
77 | } | 81 | } |
78 | children[idx].as_ref().unwrap().clone() | 82 | let child = children[idx].as_ref().unwrap(); |
83 | ptr::NonNull::from(&**child) | ||
79 | } | 84 | } |
80 | } | 85 | } |
diff --git a/src/yellow/syntax.rs b/src/yellow/syntax.rs index fa51e8d13..cc6122689 100644 --- a/src/yellow/syntax.rs +++ b/src/yellow/syntax.rs | |||
@@ -60,7 +60,7 @@ impl SyntaxNode { | |||
60 | for i in 0..n_children { | 60 | for i in 0..n_children { |
61 | res.push(SyntaxNode { | 61 | res.push(SyntaxNode { |
62 | root: self.root.clone(), | 62 | root: self.root.clone(), |
63 | red: (&*red.nth_child(i)).into(), | 63 | red: red.nth_child(i), |
64 | }); | 64 | }); |
65 | } | 65 | } |
66 | res | 66 | res |