diff options
author | Aleksey Kladov <[email protected]> | 2018-07-29 14:19:16 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2018-07-29 14:19:16 +0100 |
commit | 13c6a5c4b02d6436e4197c3ca93a8a5c3112a967 (patch) | |
tree | efaeaedca21c1727976a1aa67e2c76b13feccd18 /src/yellow/syntax.rs | |
parent | 415c891d641fa305e7ddbbbcc78db990dd5d3564 (diff) |
Avoid optimizing trivia for now
Diffstat (limited to 'src/yellow/syntax.rs')
-rw-r--r-- | src/yellow/syntax.rs | 63 |
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::{ | |||
6 | use { | 6 | use { |
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)] |
13 | pub struct SyntaxNode { | 13 | pub 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 | ||
31 | impl SyntaxNode { | 30 | impl 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 | } |