diff options
Diffstat (limited to 'crates/ra_syntax/src')
-rw-r--r-- | crates/ra_syntax/src/parser_api.rs | 21 | ||||
-rw-r--r-- | crates/ra_syntax/src/parser_impl.rs | 71 | ||||
-rw-r--r-- | crates/ra_syntax/src/parser_impl/event.rs | 53 | ||||
-rw-r--r-- | crates/ra_syntax/src/parser_impl/input.rs | 27 | ||||
-rw-r--r-- | crates/ra_syntax/src/yellow/builder.rs | 4 |
5 files changed, 117 insertions, 59 deletions
diff --git a/crates/ra_syntax/src/parser_api.rs b/crates/ra_syntax/src/parser_api.rs index 02421def1..3487aef85 100644 --- a/crates/ra_syntax/src/parser_api.rs +++ b/crates/ra_syntax/src/parser_api.rs | |||
@@ -61,7 +61,7 @@ impl<'t> Parser<'t> { | |||
61 | Marker::new(self.0.start()) | 61 | Marker::new(self.0.start()) |
62 | } | 62 | } |
63 | 63 | ||
64 | /// Advances the parser by one token. | 64 | /// Advances the parser by one token unconditionally. |
65 | pub(crate) fn bump(&mut self) { | 65 | pub(crate) fn bump(&mut self) { |
66 | self.0.bump(); | 66 | self.0.bump(); |
67 | } | 67 | } |
@@ -91,7 +91,7 @@ impl<'t> Parser<'t> { | |||
91 | self.0.error(message.into()) | 91 | self.0.error(message.into()) |
92 | } | 92 | } |
93 | 93 | ||
94 | /// Consume the next token if it is `kind`. | 94 | /// Consume the next token if `kind` matches. |
95 | pub(crate) fn eat(&mut self, kind: SyntaxKind) -> bool { | 95 | pub(crate) fn eat(&mut self, kind: SyntaxKind) -> bool { |
96 | if !self.at(kind) { | 96 | if !self.at(kind) { |
97 | return false; | 97 | return false; |
@@ -142,11 +142,13 @@ impl Marker { | |||
142 | } | 142 | } |
143 | } | 143 | } |
144 | 144 | ||
145 | /// Finishes the syntax tree node and assigns `kind` to it. | 145 | /// Finishes the syntax tree node and assigns `kind` to it, |
146 | /// and mark the create a `CompletedMarker` for possible future | ||
147 | /// operation like `.precede()` to deal with forward_parent. | ||
146 | pub(crate) fn complete(mut self, p: &mut Parser, kind: SyntaxKind) -> CompletedMarker { | 148 | pub(crate) fn complete(mut self, p: &mut Parser, kind: SyntaxKind) -> CompletedMarker { |
147 | self.bomb.defuse(); | 149 | self.bomb.defuse(); |
148 | p.0.complete(self.pos, kind); | 150 | p.0.complete(self.pos, kind); |
149 | CompletedMarker(self.pos, kind) | 151 | CompletedMarker::new(self.pos, kind) |
150 | } | 152 | } |
151 | 153 | ||
152 | /// Abandons the syntax tree node. All its children | 154 | /// Abandons the syntax tree node. All its children |
@@ -160,13 +162,22 @@ impl Marker { | |||
160 | pub(crate) struct CompletedMarker(u32, SyntaxKind); | 162 | pub(crate) struct CompletedMarker(u32, SyntaxKind); |
161 | 163 | ||
162 | impl CompletedMarker { | 164 | impl CompletedMarker { |
163 | /// This one is tricky :-) | 165 | fn new(pos: u32, kind: SyntaxKind) -> Self { |
166 | CompletedMarker(pos, kind) | ||
167 | } | ||
168 | |||
164 | /// This method allows to create a new node which starts | 169 | /// This method allows to create a new node which starts |
165 | /// *before* the current one. That is, parser could start | 170 | /// *before* the current one. That is, parser could start |
166 | /// node `A`, then complete it, and then after parsing the | 171 | /// node `A`, then complete it, and then after parsing the |
167 | /// whole `A`, decide that it should have started some node | 172 | /// whole `A`, decide that it should have started some node |
168 | /// `B` before starting `A`. `precede` allows to do exactly | 173 | /// `B` before starting `A`. `precede` allows to do exactly |
169 | /// that. See also docs about `forward_parent` in `Event::Start`. | 174 | /// that. See also docs about `forward_parent` in `Event::Start`. |
175 | /// | ||
176 | /// Given completed events `[START, FINISH]` and its corresponding | ||
177 | /// `CompletedMarker(pos: 0, _)`. | ||
178 | /// Append a new `START` events as `[START, FINISH, NEWSTART]`, | ||
179 | /// then mark `NEWSTART` as `START`'s parent with saving its relative | ||
180 | /// distance to `NEWSTART` into forward_parent(=2 in this case); | ||
170 | pub(crate) fn precede(self, p: &mut Parser) -> Marker { | 181 | pub(crate) fn precede(self, p: &mut Parser) -> Marker { |
171 | Marker::new(p.0.precede(self.0)) | 182 | Marker::new(p.0.precede(self.0)) |
172 | } | 183 | } |
diff --git a/crates/ra_syntax/src/parser_impl.rs b/crates/ra_syntax/src/parser_impl.rs index cb6e370ac..01a51cd8d 100644 --- a/crates/ra_syntax/src/parser_impl.rs +++ b/crates/ra_syntax/src/parser_impl.rs | |||
@@ -22,10 +22,21 @@ use crate::SyntaxKind::{self, EOF, TOMBSTONE}; | |||
22 | pub(crate) trait Sink { | 22 | pub(crate) trait Sink { |
23 | type Tree; | 23 | type Tree; |
24 | 24 | ||
25 | /// Adds new leaf to the current branch. | ||
25 | fn leaf(&mut self, kind: SyntaxKind, text: SmolStr); | 26 | fn leaf(&mut self, kind: SyntaxKind, text: SmolStr); |
26 | fn start_internal(&mut self, kind: SyntaxKind); | 27 | |
27 | fn finish_internal(&mut self); | 28 | /// Start new branch and make it current. |
29 | fn start_branch(&mut self, kind: SyntaxKind); | ||
30 | |||
31 | /// Finish current branch and restore previous | ||
32 | /// branch as current. | ||
33 | fn finish_branch(&mut self); | ||
34 | |||
28 | fn error(&mut self, error: SyntaxError); | 35 | fn error(&mut self, error: SyntaxError); |
36 | |||
37 | /// Complete tree building. Make sure that | ||
38 | /// `start_branch` and `finish_branch` calls | ||
39 | /// are paired! | ||
29 | fn finish(self) -> Self::Tree; | 40 | fn finish(self) -> Self::Tree; |
30 | } | 41 | } |
31 | 42 | ||
@@ -52,8 +63,7 @@ pub(crate) fn parse_with<S: Sink>( | |||
52 | /// to a separate struct in order not to pollute | 63 | /// to a separate struct in order not to pollute |
53 | /// the public API of the `Parser`. | 64 | /// the public API of the `Parser`. |
54 | pub(crate) struct ParserImpl<'t> { | 65 | pub(crate) struct ParserImpl<'t> { |
55 | inp: &'t ParserInput<'t>, | 66 | parser_input: &'t ParserInput<'t>, |
56 | |||
57 | pos: InputPosition, | 67 | pos: InputPosition, |
58 | events: Vec<Event>, | 68 | events: Vec<Event>, |
59 | steps: Cell<u32>, | 69 | steps: Cell<u32>, |
@@ -62,8 +72,7 @@ pub(crate) struct ParserImpl<'t> { | |||
62 | impl<'t> ParserImpl<'t> { | 72 | impl<'t> ParserImpl<'t> { |
63 | pub(crate) fn new(inp: &'t ParserInput<'t>) -> ParserImpl<'t> { | 73 | pub(crate) fn new(inp: &'t ParserInput<'t>) -> ParserImpl<'t> { |
64 | ParserImpl { | 74 | ParserImpl { |
65 | inp, | 75 | parser_input: inp, |
66 | |||
67 | pos: InputPosition::new(), | 76 | pos: InputPosition::new(), |
68 | events: Vec::new(), | 77 | events: Vec::new(), |
69 | steps: Cell::new(0), | 78 | steps: Cell::new(0), |
@@ -76,9 +85,11 @@ impl<'t> ParserImpl<'t> { | |||
76 | } | 85 | } |
77 | 86 | ||
78 | pub(super) fn next2(&self) -> Option<(SyntaxKind, SyntaxKind)> { | 87 | pub(super) fn next2(&self) -> Option<(SyntaxKind, SyntaxKind)> { |
79 | let c1 = self.inp.kind(self.pos); | 88 | let c1 = self.parser_input.kind(self.pos); |
80 | let c2 = self.inp.kind(self.pos + 1); | 89 | let c2 = self.parser_input.kind(self.pos + 1); |
81 | if self.inp.start(self.pos + 1) == self.inp.start(self.pos) + self.inp.len(self.pos) { | 90 | if self.parser_input.token_start_at(self.pos + 1) |
91 | == self.parser_input.token_start_at(self.pos) + self.parser_input.token_len(self.pos) | ||
92 | { | ||
82 | Some((c1, c2)) | 93 | Some((c1, c2)) |
83 | } else { | 94 | } else { |
84 | None | 95 | None |
@@ -86,12 +97,14 @@ impl<'t> ParserImpl<'t> { | |||
86 | } | 97 | } |
87 | 98 | ||
88 | pub(super) fn next3(&self) -> Option<(SyntaxKind, SyntaxKind, SyntaxKind)> { | 99 | pub(super) fn next3(&self) -> Option<(SyntaxKind, SyntaxKind, SyntaxKind)> { |
89 | let c1 = self.inp.kind(self.pos); | 100 | let c1 = self.parser_input.kind(self.pos); |
90 | let c2 = self.inp.kind(self.pos + 1); | 101 | let c2 = self.parser_input.kind(self.pos + 1); |
91 | let c3 = self.inp.kind(self.pos + 2); | 102 | let c3 = self.parser_input.kind(self.pos + 2); |
92 | if self.inp.start(self.pos + 1) == self.inp.start(self.pos) + self.inp.len(self.pos) | 103 | if self.parser_input.token_start_at(self.pos + 1) |
93 | && self.inp.start(self.pos + 2) | 104 | == self.parser_input.token_start_at(self.pos) + self.parser_input.token_len(self.pos) |
94 | == self.inp.start(self.pos + 1) + self.inp.len(self.pos + 1) | 105 | && self.parser_input.token_start_at(self.pos + 2) |
106 | == self.parser_input.token_start_at(self.pos + 1) | ||
107 | + self.parser_input.token_len(self.pos + 1) | ||
95 | { | 108 | { |
96 | Some((c1, c2, c3)) | 109 | Some((c1, c2, c3)) |
97 | } else { | 110 | } else { |
@@ -99,29 +112,27 @@ impl<'t> ParserImpl<'t> { | |||
99 | } | 112 | } |
100 | } | 113 | } |
101 | 114 | ||
115 | /// Get the syntax kind of the nth token. | ||
102 | pub(super) fn nth(&self, n: u32) -> SyntaxKind { | 116 | pub(super) fn nth(&self, n: u32) -> SyntaxKind { |
103 | let steps = self.steps.get(); | 117 | let steps = self.steps.get(); |
104 | if steps > 10_000_000 { | 118 | assert!(steps <= 10_000_000, "the parser seems stuck"); |
105 | panic!("the parser seems stuck"); | ||
106 | } | ||
107 | self.steps.set(steps + 1); | 119 | self.steps.set(steps + 1); |
108 | 120 | ||
109 | self.inp.kind(self.pos + n) | 121 | self.parser_input.kind(self.pos + n) |
110 | } | 122 | } |
111 | 123 | ||
112 | pub(super) fn at_kw(&self, t: &str) -> bool { | 124 | pub(super) fn at_kw(&self, t: &str) -> bool { |
113 | self.inp.text(self.pos) == t | 125 | self.parser_input.token_text(self.pos) == t |
114 | } | 126 | } |
115 | 127 | ||
128 | /// Start parsing right behind the last event. | ||
116 | pub(super) fn start(&mut self) -> u32 { | 129 | pub(super) fn start(&mut self) -> u32 { |
117 | let pos = self.events.len() as u32; | 130 | let pos = self.events.len() as u32; |
118 | self.event(Event::Start { | 131 | self.push_event(Event::tombstone()); |
119 | kind: TOMBSTONE, | ||
120 | forward_parent: None, | ||
121 | }); | ||
122 | pos | 132 | pos |
123 | } | 133 | } |
124 | 134 | ||
135 | /// Advances the parser by one token unconditionally. | ||
125 | pub(super) fn bump(&mut self) { | 136 | pub(super) fn bump(&mut self) { |
126 | let kind = self.nth(0); | 137 | let kind = self.nth(0); |
127 | if kind == EOF { | 138 | if kind == EOF { |
@@ -144,15 +155,17 @@ impl<'t> ParserImpl<'t> { | |||
144 | 155 | ||
145 | fn do_bump(&mut self, kind: SyntaxKind, n_raw_tokens: u8) { | 156 | fn do_bump(&mut self, kind: SyntaxKind, n_raw_tokens: u8) { |
146 | self.pos += u32::from(n_raw_tokens); | 157 | self.pos += u32::from(n_raw_tokens); |
147 | self.event(Event::Token { kind, n_raw_tokens }); | 158 | self.push_event(Event::Token { kind, n_raw_tokens }); |
148 | } | 159 | } |
149 | 160 | ||
161 | /// Append one Error event to the back of events. | ||
150 | pub(super) fn error(&mut self, msg: String) { | 162 | pub(super) fn error(&mut self, msg: String) { |
151 | self.event(Event::Error { | 163 | self.push_event(Event::Error { |
152 | msg: ParseError(msg), | 164 | msg: ParseError(msg), |
153 | }) | 165 | }) |
154 | } | 166 | } |
155 | 167 | ||
168 | /// Complete an event with appending a `Finish` event. | ||
156 | pub(super) fn complete(&mut self, pos: u32, kind: SyntaxKind) { | 169 | pub(super) fn complete(&mut self, pos: u32, kind: SyntaxKind) { |
157 | match self.events[pos as usize] { | 170 | match self.events[pos as usize] { |
158 | Event::Start { | 171 | Event::Start { |
@@ -162,9 +175,10 @@ impl<'t> ParserImpl<'t> { | |||
162 | } | 175 | } |
163 | _ => unreachable!(), | 176 | _ => unreachable!(), |
164 | } | 177 | } |
165 | self.event(Event::Finish); | 178 | self.push_event(Event::Finish); |
166 | } | 179 | } |
167 | 180 | ||
181 | /// Ignore the dummy `Start` event. | ||
168 | pub(super) fn abandon(&mut self, pos: u32) { | 182 | pub(super) fn abandon(&mut self, pos: u32) { |
169 | let idx = pos as usize; | 183 | let idx = pos as usize; |
170 | if idx == self.events.len() - 1 { | 184 | if idx == self.events.len() - 1 { |
@@ -178,6 +192,7 @@ impl<'t> ParserImpl<'t> { | |||
178 | } | 192 | } |
179 | } | 193 | } |
180 | 194 | ||
195 | /// Save the relative distance of a completed event to its forward_parent. | ||
181 | pub(super) fn precede(&mut self, pos: u32) -> u32 { | 196 | pub(super) fn precede(&mut self, pos: u32) -> u32 { |
182 | let new_pos = self.start(); | 197 | let new_pos = self.start(); |
183 | match self.events[pos as usize] { | 198 | match self.events[pos as usize] { |
@@ -192,7 +207,7 @@ impl<'t> ParserImpl<'t> { | |||
192 | new_pos | 207 | new_pos |
193 | } | 208 | } |
194 | 209 | ||
195 | fn event(&mut self, event: Event) { | 210 | fn push_event(&mut self, event: Event) { |
196 | self.events.push(event) | 211 | self.events.push(event) |
197 | } | 212 | } |
198 | } | 213 | } |
diff --git a/crates/ra_syntax/src/parser_impl/event.rs b/crates/ra_syntax/src/parser_impl/event.rs index 3d8b062d5..73dd6e02b 100644 --- a/crates/ra_syntax/src/parser_impl/event.rs +++ b/crates/ra_syntax/src/parser_impl/event.rs | |||
@@ -36,7 +36,7 @@ pub(crate) enum Event { | |||
36 | /// | 36 | /// |
37 | /// For left-recursive syntactic constructs, the parser produces | 37 | /// For left-recursive syntactic constructs, the parser produces |
38 | /// a child node before it sees a parent. `forward_parent` | 38 | /// a child node before it sees a parent. `forward_parent` |
39 | /// exists to allow to tweak parent-child relationships. | 39 | /// saves the position of current event's parent. |
40 | /// | 40 | /// |
41 | /// Consider this path | 41 | /// Consider this path |
42 | /// | 42 | /// |
@@ -84,6 +84,15 @@ pub(crate) enum Event { | |||
84 | }, | 84 | }, |
85 | } | 85 | } |
86 | 86 | ||
87 | impl Event { | ||
88 | pub(crate) fn tombstone() -> Self { | ||
89 | Event::Start { | ||
90 | kind: TOMBSTONE, | ||
91 | forward_parent: None, | ||
92 | } | ||
93 | } | ||
94 | } | ||
95 | |||
87 | pub(super) struct EventProcessor<'a, S: Sink> { | 96 | pub(super) struct EventProcessor<'a, S: Sink> { |
88 | sink: S, | 97 | sink: S, |
89 | text_pos: TextUnit, | 98 | text_pos: TextUnit, |
@@ -110,17 +119,12 @@ impl<'a, S: Sink> EventProcessor<'a, S> { | |||
110 | } | 119 | } |
111 | } | 120 | } |
112 | 121 | ||
122 | /// Generate the syntax tree with the control of events. | ||
113 | pub(super) fn process(mut self) -> S { | 123 | pub(super) fn process(mut self) -> S { |
114 | fn tombstone() -> Event { | ||
115 | Event::Start { | ||
116 | kind: TOMBSTONE, | ||
117 | forward_parent: None, | ||
118 | } | ||
119 | } | ||
120 | let mut forward_parents = Vec::new(); | 124 | let mut forward_parents = Vec::new(); |
121 | 125 | ||
122 | for i in 0..self.events.len() { | 126 | for i in 0..self.events.len() { |
123 | match mem::replace(&mut self.events[i], tombstone()) { | 127 | match mem::replace(&mut self.events[i], Event::tombstone()) { |
124 | Event::Start { | 128 | Event::Start { |
125 | kind: TOMBSTONE, .. | 129 | kind: TOMBSTONE, .. |
126 | } => (), | 130 | } => (), |
@@ -129,12 +133,18 @@ impl<'a, S: Sink> EventProcessor<'a, S> { | |||
129 | kind, | 133 | kind, |
130 | forward_parent, | 134 | forward_parent, |
131 | } => { | 135 | } => { |
136 | // For events[A, B, C], B is A's forward_parent, C is B's forward_parent, | ||
137 | // in the normal control flow, the parent-child relation: `A -> B -> C`, | ||
138 | // while with the magic forward_parent, it writes: `C <- B <- A`. | ||
139 | |||
140 | // append `A` into parents. | ||
132 | forward_parents.push(kind); | 141 | forward_parents.push(kind); |
133 | let mut idx = i; | 142 | let mut idx = i; |
134 | let mut fp = forward_parent; | 143 | let mut fp = forward_parent; |
135 | while let Some(fwd) = fp { | 144 | while let Some(fwd) = fp { |
136 | idx += fwd as usize; | 145 | idx += fwd as usize; |
137 | fp = match mem::replace(&mut self.events[idx], tombstone()) { | 146 | // append `A`'s forward_parent `B` |
147 | fp = match mem::replace(&mut self.events[idx], Event::tombstone()) { | ||
138 | Event::Start { | 148 | Event::Start { |
139 | kind, | 149 | kind, |
140 | forward_parent, | 150 | forward_parent, |
@@ -144,17 +154,19 @@ impl<'a, S: Sink> EventProcessor<'a, S> { | |||
144 | } | 154 | } |
145 | _ => unreachable!(), | 155 | _ => unreachable!(), |
146 | }; | 156 | }; |
157 | // append `B`'s forward_parent `C` in the next stage. | ||
147 | } | 158 | } |
159 | |||
148 | for kind in forward_parents.drain(..).rev() { | 160 | for kind in forward_parents.drain(..).rev() { |
149 | self.start(kind); | 161 | self.start(kind); |
150 | } | 162 | } |
151 | } | 163 | } |
152 | Event::Finish => { | 164 | Event::Finish => { |
153 | let last = i == self.events.len() - 1; | 165 | let is_last = i == self.events.len() - 1; |
154 | self.finish(last); | 166 | self.finish(is_last); |
155 | } | 167 | } |
156 | Event::Token { kind, n_raw_tokens } => { | 168 | Event::Token { kind, n_raw_tokens } => { |
157 | self.eat_ws(); | 169 | self.eat_trivias(); |
158 | let n_raw_tokens = n_raw_tokens as usize; | 170 | let n_raw_tokens = n_raw_tokens as usize; |
159 | let len = self.tokens[self.token_pos..self.token_pos + n_raw_tokens] | 171 | let len = self.tokens[self.token_pos..self.token_pos + n_raw_tokens] |
160 | .iter() | 172 | .iter() |
@@ -171,9 +183,10 @@ impl<'a, S: Sink> EventProcessor<'a, S> { | |||
171 | self.sink | 183 | self.sink |
172 | } | 184 | } |
173 | 185 | ||
186 | /// Add the node into syntax tree but discard the comments/whitespaces. | ||
174 | fn start(&mut self, kind: SyntaxKind) { | 187 | fn start(&mut self, kind: SyntaxKind) { |
175 | if kind == SOURCE_FILE { | 188 | if kind == SOURCE_FILE { |
176 | self.sink.start_internal(kind); | 189 | self.sink.start_branch(kind); |
177 | return; | 190 | return; |
178 | } | 191 | } |
179 | let n_trivias = self.tokens[self.token_pos..] | 192 | let n_trivias = self.tokens[self.token_pos..] |
@@ -194,18 +207,18 @@ impl<'a, S: Sink> EventProcessor<'a, S> { | |||
194 | n_attached_trivias(kind, leading_trivias) | 207 | n_attached_trivias(kind, leading_trivias) |
195 | }; | 208 | }; |
196 | self.eat_n_trivias(n_trivias - n_attached_trivias); | 209 | self.eat_n_trivias(n_trivias - n_attached_trivias); |
197 | self.sink.start_internal(kind); | 210 | self.sink.start_branch(kind); |
198 | self.eat_n_trivias(n_attached_trivias); | 211 | self.eat_n_trivias(n_attached_trivias); |
199 | } | 212 | } |
200 | 213 | ||
201 | fn finish(&mut self, last: bool) { | 214 | fn finish(&mut self, is_last: bool) { |
202 | if last { | 215 | if is_last { |
203 | self.eat_ws() | 216 | self.eat_trivias() |
204 | } | 217 | } |
205 | self.sink.finish_internal(); | 218 | self.sink.finish_branch(); |
206 | } | 219 | } |
207 | 220 | ||
208 | fn eat_ws(&mut self) { | 221 | fn eat_trivias(&mut self) { |
209 | while let Some(&token) = self.tokens.get(self.token_pos) { | 222 | while let Some(&token) = self.tokens.get(self.token_pos) { |
210 | if !token.kind.is_trivia() { | 223 | if !token.kind.is_trivia() { |
211 | break; | 224 | break; |
@@ -236,7 +249,7 @@ fn n_attached_trivias<'a>( | |||
236 | trivias: impl Iterator<Item = (SyntaxKind, &'a str)>, | 249 | trivias: impl Iterator<Item = (SyntaxKind, &'a str)>, |
237 | ) -> usize { | 250 | ) -> usize { |
238 | match kind { | 251 | match kind { |
239 | STRUCT_DEF | ENUM_DEF | FN_DEF | TRAIT_DEF | MODULE => { | 252 | CONST_DEF | TYPE_DEF | STRUCT_DEF | ENUM_DEF | FN_DEF | TRAIT_DEF | MODULE => { |
240 | let mut res = 0; | 253 | let mut res = 0; |
241 | for (i, (kind, text)) in trivias.enumerate() { | 254 | for (i, (kind, text)) in trivias.enumerate() { |
242 | match kind { | 255 | match kind { |
diff --git a/crates/ra_syntax/src/parser_impl/input.rs b/crates/ra_syntax/src/parser_impl/input.rs index ac6d900d8..7fde5b3ab 100644 --- a/crates/ra_syntax/src/parser_impl/input.rs +++ b/crates/ra_syntax/src/parser_impl/input.rs | |||
@@ -4,11 +4,26 @@ use std::ops::{Add, AddAssign}; | |||
4 | 4 | ||
5 | pub(crate) struct ParserInput<'t> { | 5 | pub(crate) struct ParserInput<'t> { |
6 | text: &'t str, | 6 | text: &'t str, |
7 | /// start position of each token(expect whitespace and comment) | ||
8 | /// ```non-rust | ||
9 | /// struct Foo; | ||
10 | /// ^------^--- | ||
11 | /// | | ^- | ||
12 | /// 0 7 10 | ||
13 | /// ``` | ||
14 | /// (token, start_offset): `[(struct, 0), (Foo, 7), (;, 10)]` | ||
7 | start_offsets: Vec<TextUnit>, | 15 | start_offsets: Vec<TextUnit>, |
8 | tokens: Vec<Token>, // non-whitespace tokens | 16 | /// non-whitespace/comment tokens |
17 | /// ```non-rust | ||
18 | /// struct Foo {} | ||
19 | /// ^^^^^^ ^^^ ^^ | ||
20 | /// ``` | ||
21 | /// tokens: `[struct, Foo, {, }]` | ||
22 | tokens: Vec<Token>, | ||
9 | } | 23 | } |
10 | 24 | ||
11 | impl<'t> ParserInput<'t> { | 25 | impl<'t> ParserInput<'t> { |
26 | /// Generate input from tokens(expect comment and whitespace). | ||
12 | pub fn new(text: &'t str, raw_tokens: &'t [Token]) -> ParserInput<'t> { | 27 | pub fn new(text: &'t str, raw_tokens: &'t [Token]) -> ParserInput<'t> { |
13 | let mut tokens = Vec::new(); | 28 | let mut tokens = Vec::new(); |
14 | let mut start_offsets = Vec::new(); | 29 | let mut start_offsets = Vec::new(); |
@@ -28,6 +43,7 @@ impl<'t> ParserInput<'t> { | |||
28 | } | 43 | } |
29 | } | 44 | } |
30 | 45 | ||
46 | /// Get the syntax kind of token at given input position. | ||
31 | pub fn kind(&self, pos: InputPosition) -> SyntaxKind { | 47 | pub fn kind(&self, pos: InputPosition) -> SyntaxKind { |
32 | let idx = pos.0 as usize; | 48 | let idx = pos.0 as usize; |
33 | if !(idx < self.tokens.len()) { | 49 | if !(idx < self.tokens.len()) { |
@@ -36,7 +52,8 @@ impl<'t> ParserInput<'t> { | |||
36 | self.tokens[idx].kind | 52 | self.tokens[idx].kind |
37 | } | 53 | } |
38 | 54 | ||
39 | pub fn len(&self, pos: InputPosition) -> TextUnit { | 55 | /// Get the length of a token at given input position. |
56 | pub fn token_len(&self, pos: InputPosition) -> TextUnit { | ||
40 | let idx = pos.0 as usize; | 57 | let idx = pos.0 as usize; |
41 | if !(idx < self.tokens.len()) { | 58 | if !(idx < self.tokens.len()) { |
42 | return 0.into(); | 59 | return 0.into(); |
@@ -44,7 +61,8 @@ impl<'t> ParserInput<'t> { | |||
44 | self.tokens[idx].len | 61 | self.tokens[idx].len |
45 | } | 62 | } |
46 | 63 | ||
47 | pub fn start(&self, pos: InputPosition) -> TextUnit { | 64 | /// Get the start position of a taken at given input position. |
65 | pub fn token_start_at(&self, pos: InputPosition) -> TextUnit { | ||
48 | let idx = pos.0 as usize; | 66 | let idx = pos.0 as usize; |
49 | if !(idx < self.tokens.len()) { | 67 | if !(idx < self.tokens.len()) { |
50 | return 0.into(); | 68 | return 0.into(); |
@@ -52,7 +70,8 @@ impl<'t> ParserInput<'t> { | |||
52 | self.start_offsets[idx] | 70 | self.start_offsets[idx] |
53 | } | 71 | } |
54 | 72 | ||
55 | pub fn text(&self, pos: InputPosition) -> &'t str { | 73 | /// Get the raw text of a token at given input position. |
74 | pub fn token_text(&self, pos: InputPosition) -> &'t str { | ||
56 | let idx = pos.0 as usize; | 75 | let idx = pos.0 as usize; |
57 | if !(idx < self.tokens.len()) { | 76 | if !(idx < self.tokens.len()) { |
58 | return ""; | 77 | return ""; |
diff --git a/crates/ra_syntax/src/yellow/builder.rs b/crates/ra_syntax/src/yellow/builder.rs index 9fcebfb93..37ae6329b 100644 --- a/crates/ra_syntax/src/yellow/builder.rs +++ b/crates/ra_syntax/src/yellow/builder.rs | |||
@@ -26,11 +26,11 @@ impl Sink for GreenBuilder { | |||
26 | self.inner.leaf(kind, text); | 26 | self.inner.leaf(kind, text); |
27 | } | 27 | } |
28 | 28 | ||
29 | fn start_internal(&mut self, kind: SyntaxKind) { | 29 | fn start_branch(&mut self, kind: SyntaxKind) { |
30 | self.inner.start_internal(kind) | 30 | self.inner.start_internal(kind) |
31 | } | 31 | } |
32 | 32 | ||
33 | fn finish_internal(&mut self) { | 33 | fn finish_branch(&mut self) { |
34 | self.inner.finish_internal(); | 34 | self.inner.finish_internal(); |
35 | } | 35 | } |
36 | 36 | ||