Skip to content

Commit 41bc29c

Browse files
committed
Store relative offsets in green node
1 parent cfc98d3 commit 41bc29c

File tree

2 files changed

+27
-32
lines changed

2 files changed

+27
-32
lines changed

src/cursor.rs

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -217,15 +217,7 @@ impl SyntaxNode {
217217
match self.0.kind.as_child() {
218218
None => replacement,
219219
Some((parent, me, _offset)) => {
220-
let mut replacement = Some(replacement);
221-
let children = parent.green().children().enumerate().map(|(i, child)| {
222-
if i as u32 == me {
223-
replacement.take().unwrap().into()
224-
} else {
225-
child.cloned()
226-
}
227-
});
228-
let new_parent = GreenNode::new(parent.kind(), children);
220+
let new_parent = parent.green().replace_child(me as usize, replacement.into());
229221
parent.replace_with(new_parent)
230222
}
231223
}

src/green/node.rs

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -32,38 +32,23 @@ impl fmt::Debug for GreenNode {
3232

3333
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
3434
enum GreenChild {
35-
Node {
36-
// offset: TextSize,
37-
node: GreenNode,
38-
},
39-
Token {
40-
// offset: TextSize,
41-
token: GreenToken,
42-
},
43-
}
44-
45-
impl From<GreenElement> for GreenChild {
46-
fn from(e: GreenElement) -> Self {
47-
match e {
48-
NodeOrToken::Node(node) => GreenChild::Node { node },
49-
NodeOrToken::Token(token) => GreenChild::Token { token },
50-
}
51-
}
35+
Node { offset_in_parent: TextSize, node: GreenNode },
36+
Token { offset_in_parent: TextSize, token: GreenToken },
5237
}
5338

5439
impl GreenChild {
5540
fn as_ref(&self) -> GreenElementRef {
5641
match self {
57-
GreenChild::Node { node } => NodeOrToken::Node(node),
58-
GreenChild::Token { token } => NodeOrToken::Token(token),
42+
GreenChild::Node { node, .. } => NodeOrToken::Node(node),
43+
GreenChild::Token { token, .. } => NodeOrToken::Token(token),
5944
}
6045
}
6146
}
6247

6348
#[cfg(target_pointer_width = "64")]
64-
const _: () = {
49+
const _: i32 = {
6550
let cond = mem::size_of::<GreenChild>() == mem::size_of::<usize>() * 2;
66-
[()][(!cond) as usize]
51+
0 / cond as i32
6752
};
6853

6954
impl GreenNode {
@@ -75,8 +60,14 @@ impl GreenNode {
7560
I::IntoIter: ExactSizeIterator,
7661
{
7762
let mut text_len: TextSize = 0.into();
78-
let children =
79-
children.into_iter().inspect(|it| text_len += it.text_len()).map(GreenChild::from);
63+
let children = children.into_iter().map(|el| {
64+
let offset_in_parent = text_len;
65+
text_len += el.text_len();
66+
match el {
67+
NodeOrToken::Node(node) => GreenChild::Node { offset_in_parent, node },
68+
NodeOrToken::Token(token) => GreenChild::Token { offset_in_parent, token },
69+
}
70+
});
8071

8172
let data =
8273
ThinArc::from_header_and_iter(GreenNodeHead { kind, text_len: 0.into() }, children);
@@ -113,6 +104,18 @@ impl GreenNode {
113104
pub fn ptr(&self) -> *const c_void {
114105
self.data.heap_ptr()
115106
}
107+
108+
pub(crate) fn replace_child(&self, idx: usize, new_child: GreenElement) -> GreenNode {
109+
let mut replacement = Some(new_child);
110+
let children = self.children().enumerate().map(|(i, child)| {
111+
if i == idx {
112+
replacement.take().unwrap()
113+
} else {
114+
child.cloned()
115+
}
116+
});
117+
GreenNode::new(self.kind(), children)
118+
}
116119
}
117120

118121
#[derive(Debug, Clone)]

0 commit comments

Comments
 (0)