aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_syntax/src/yellow
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_syntax/src/yellow')
-rw-r--r--crates/ra_syntax/src/yellow/builder.rs32
1 files changed, 13 insertions, 19 deletions
diff --git a/crates/ra_syntax/src/yellow/builder.rs b/crates/ra_syntax/src/yellow/builder.rs
index 35dbaec05..c307b2bd0 100644
--- a/crates/ra_syntax/src/yellow/builder.rs
+++ b/crates/ra_syntax/src/yellow/builder.rs
@@ -1,33 +1,29 @@
1use rowan::GreenNodeBuilder; 1use rowan::GreenNodeBuilder;
2use { 2use {
3 TextUnit, SmolStr,
3 parser_impl::Sink, 4 parser_impl::Sink,
4 yellow::{GreenNode, SyntaxError, RaTypes}, 5 yellow::{GreenNode, SyntaxError, RaTypes},
5 SyntaxKind, TextRange, TextUnit, 6 SyntaxKind,
6}; 7};
7 8
8pub(crate) struct GreenBuilder<'a> { 9pub(crate) struct GreenBuilder {
9 text: &'a str,
10 pos: TextUnit,
11 errors: Vec<SyntaxError>, 10 errors: Vec<SyntaxError>,
12 inner: GreenNodeBuilder<RaTypes>, 11 inner: GreenNodeBuilder<RaTypes>,
13} 12}
14 13
15impl<'a> Sink<'a> for GreenBuilder<'a> { 14impl GreenBuilder {
16 type Tree = (GreenNode, Vec<SyntaxError>); 15 pub(crate) fn new() -> GreenBuilder {
17
18 fn new(text: &'a str) -> Self {
19 GreenBuilder { 16 GreenBuilder {
20 text,
21 pos: 0.into(),
22 errors: Vec::new(), 17 errors: Vec::new(),
23 inner: GreenNodeBuilder::new(), 18 inner: GreenNodeBuilder::new(),
24 } 19 }
25 } 20 }
21}
22
23impl Sink for GreenBuilder {
24 type Tree = (GreenNode, Vec<SyntaxError>);
26 25
27 fn leaf(&mut self, kind: SyntaxKind, len: TextUnit) { 26 fn leaf(&mut self, kind: SyntaxKind, text: SmolStr) {
28 let range = TextRange::offset_len(self.pos, len);
29 self.pos += len;
30 let text = self.text[range].into();
31 self.inner.leaf(kind, text); 27 self.inner.leaf(kind, text);
32 } 28 }
33 29
@@ -39,11 +35,9 @@ impl<'a> Sink<'a> for GreenBuilder<'a> {
39 self.inner.finish_internal(); 35 self.inner.finish_internal();
40 } 36 }
41 37
42 fn error(&mut self, message: String) { 38 fn error(&mut self, message: String, offset: TextUnit) {
43 self.errors.push(SyntaxError { 39 let error = SyntaxError { msg: message, offset };
44 msg: message, 40 self.errors.push(error)
45 offset: self.pos,
46 })
47 } 41 }
48 42
49 fn finish(self) -> (GreenNode, Vec<SyntaxError>) { 43 fn finish(self) -> (GreenNode, Vec<SyntaxError>) {