aboutsummaryrefslogtreecommitdiff
path: root/src/yellow/syntax.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/yellow/syntax.rs')
-rw-r--r--src/yellow/syntax.rs63
1 files changed, 10 insertions, 53 deletions
diff --git a/src/yellow/syntax.rs b/src/yellow/syntax.rs
index 78fa5bf95..53d8c82b9 100644
--- a/src/yellow/syntax.rs
+++ b/src/yellow/syntax.rs
@@ -6,14 +6,13 @@ use std::{
6use { 6use {
7 TextRange, TextUnit, 7 TextRange, TextUnit,
8 SyntaxKind::{self, *}, 8 SyntaxKind::{self, *},
9 yellow::{Ptr, RedNode, GreenNode, TextLen}, 9 yellow::{Ptr, RedNode, GreenNode},
10}; 10};
11 11
12#[derive(Clone)] 12#[derive(Clone)]
13pub struct SyntaxNode { 13pub struct SyntaxNode {
14 pub(crate) root: SyntaxRoot, 14 pub(crate) root: SyntaxRoot,
15 red: Ptr<RedNode>, 15 red: Ptr<RedNode>,
16 trivia_pos: Option<(usize, usize)>,
17} 16}
18 17
19#[derive(Clone)] 18#[derive(Clone)]
@@ -29,80 +28,38 @@ pub(crate) struct SyntaxError {
29} 28}
30 29
31impl SyntaxNode { 30impl SyntaxNode {
32 pub(crate) fn new(root: Arc<GreenNode>, errors: Vec<SyntaxError>) -> SyntaxNode { 31 pub(crate) fn new(root: GreenNode, errors: Vec<SyntaxError>) -> SyntaxNode {
33 let root = Arc::new(RedNode::new_root(root)); 32 let root = Arc::new(RedNode::new_root(root));
34 let red = Ptr::new(&root); 33 let red = Ptr::new(&root);
35 let root = SyntaxRoot { red: root, errors: Arc::new(errors) }; 34 let root = SyntaxRoot { red: root, errors: Arc::new(errors) };
36 SyntaxNode { root, red, trivia_pos: None } 35 SyntaxNode { root, red }
37 } 36 }
38 37
39 pub fn kind(&self) -> SyntaxKind { 38 pub fn kind(&self) -> SyntaxKind {
40 let green = self.red().green(); 39 self.red().green().kind()
41 match self.trivia_pos {
42 None => green.kind(),
43 Some((i, j)) => green.nth_trivias(i)[j].kind
44 }
45 } 40 }
46 41
47 pub fn range(&self) -> TextRange { 42 pub fn range(&self) -> TextRange {
48 let red = self.red(); 43 let red = self.red();
49 let green = red.green(); 44 TextRange::offset_len(
50 match self.trivia_pos { 45 red.start_offset(),
51 None => TextRange::offset_len(red.start_offset(), red.green().text_len()), 46 red.green().text_len(),
52 Some((i, j)) => { 47 )
53 let trivias = green.nth_trivias(i);
54 let offset = if i == 0 {
55 red.start_offset()
56 } else {
57 let prev_child = red.nth_child(Ptr::clone(&self.red), i - 1);
58 let mut offset = prev_child.start_offset() + prev_child.green().text_len();
59 for k in 0..j {
60 offset += &trivias[k].text_len();
61 }
62 offset
63 };
64 TextRange::offset_len(offset, trivias[j].text_len())
65 }
66 }
67 } 48 }
68 49
69 pub fn text(&self) -> String { 50 pub fn text(&self) -> String {
70 let green = self.red().green(); 51 self.red().green().text()
71 match self.trivia_pos {
72 None => green.text(),
73 Some((i, j)) => green.nth_trivias(i)[j].text.clone()
74 }
75 } 52 }
76 53
77 pub fn children(&self) -> Vec<SyntaxNode> { 54 pub fn children(&self) -> Vec<SyntaxNode> {
78 let mut res = Vec::new();
79 let red = self.red(); 55 let red = self.red();
80 let green = red.green();
81 if green.is_leaf() || self.trivia_pos.is_some() {
82 return Vec::new();
83 }
84 for (j, _) in green.nth_trivias(0).iter().enumerate() {
85 res.push(SyntaxNode {
86 root: self.root.clone(),
87 red: Ptr::clone(&self.red),
88 trivia_pos: Some((0, j)),
89 })
90 }
91
92 let n_children = red.n_children(); 56 let n_children = red.n_children();
57 let mut res = Vec::with_capacity(n_children);
93 for i in 0..n_children { 58 for i in 0..n_children {
94 res.push(SyntaxNode { 59 res.push(SyntaxNode {
95 root: self.root.clone(), 60 root: self.root.clone(),
96 red: Ptr::new(&red.nth_child(Ptr::clone(&self.red), i)), 61 red: Ptr::new(&red.nth_child(Ptr::clone(&self.red), i)),
97 trivia_pos: None,
98 }); 62 });
99 for (j, _) in green.nth_trivias(i + 1).iter().enumerate() {
100 res.push(SyntaxNode {
101 root: self.root.clone(),
102 red: self.red.clone(),
103 trivia_pos: Some((i + 1, j)),
104 })
105 }
106 } 63 }
107 res 64 res
108 } 65 }