@@ -17,35 +17,32 @@ pub(crate) fn build_tree(
17
17
parser_output : parser:: Output ,
18
18
synthetic_root : bool ,
19
19
) -> ( GreenNode , Vec < SyntaxError > , bool ) {
20
- let mut builder = TextTreeSink :: new ( lexed) ;
20
+ let mut builder = Builder :: new ( lexed) ;
21
21
22
22
if synthetic_root {
23
- builder. start_node ( SyntaxKind :: SOURCE_FILE ) ;
23
+ builder. enter ( SyntaxKind :: SOURCE_FILE ) ;
24
24
}
25
25
26
26
for event in parser_output. iter ( ) {
27
27
match event {
28
28
parser:: Step :: Token { kind, n_input_tokens : n_raw_tokens } => {
29
29
builder. token ( kind, n_raw_tokens)
30
30
}
31
- parser:: Step :: Enter { kind } => builder. start_node ( kind) ,
32
- parser:: Step :: Exit => builder. finish_node ( ) ,
31
+ parser:: Step :: Enter { kind } => builder. enter ( kind) ,
32
+ parser:: Step :: Exit => builder. exit ( ) ,
33
33
parser:: Step :: Error { msg } => {
34
34
let text_pos = builder. lexed . text_start ( builder. pos ) . try_into ( ) . unwrap ( ) ;
35
35
builder. inner . error ( msg. to_string ( ) , text_pos) ;
36
36
}
37
37
}
38
38
}
39
39
if synthetic_root {
40
- builder. finish_node ( )
40
+ builder. exit ( )
41
41
}
42
- builder. finish_eof ( )
42
+ builder. build ( )
43
43
}
44
44
45
- /// Bridges the parser with our specific syntax tree representation.
46
- ///
47
- /// `TextTreeSink` also handles attachment of trivia (whitespace) to nodes.
48
- struct TextTreeSink < ' a > {
45
+ struct Builder < ' a > {
49
46
lexed : LexedStr < ' a > ,
50
47
pos : usize ,
51
48
state : State ,
@@ -58,7 +55,35 @@ enum State {
58
55
PendingFinish ,
59
56
}
60
57
61
- impl < ' a > TextTreeSink < ' a > {
58
+ impl < ' a > Builder < ' a > {
59
+ fn new ( lexed : parser:: LexedStr < ' a > ) -> Self {
60
+ Self { lexed, pos : 0 , state : State :: PendingStart , inner : SyntaxTreeBuilder :: default ( ) }
61
+ }
62
+
63
+ fn build ( mut self ) -> ( GreenNode , Vec < SyntaxError > , bool ) {
64
+ match mem:: replace ( & mut self . state , State :: Normal ) {
65
+ State :: PendingFinish => {
66
+ self . eat_trivias ( ) ;
67
+ self . inner . finish_node ( ) ;
68
+ }
69
+ State :: PendingStart | State :: Normal => unreachable ! ( ) ,
70
+ }
71
+
72
+ let ( node, mut errors) = self . inner . finish_raw ( ) ;
73
+ for ( i, err) in self . lexed . errors ( ) {
74
+ let text_range = self . lexed . text_range ( i) ;
75
+ let text_range = TextRange :: new (
76
+ text_range. start . try_into ( ) . unwrap ( ) ,
77
+ text_range. end . try_into ( ) . unwrap ( ) ,
78
+ ) ;
79
+ errors. push ( SyntaxError :: new ( err, text_range) )
80
+ }
81
+
82
+ let is_eof = self . pos == self . lexed . len ( ) ;
83
+
84
+ ( node, errors, is_eof)
85
+ }
86
+
62
87
fn token ( & mut self , kind : SyntaxKind , n_tokens : u8 ) {
63
88
match mem:: replace ( & mut self . state , State :: Normal ) {
64
89
State :: PendingStart => unreachable ! ( ) ,
@@ -69,7 +94,7 @@ impl<'a> TextTreeSink<'a> {
69
94
self . do_token ( kind, n_tokens as usize ) ;
70
95
}
71
96
72
- fn start_node ( & mut self , kind : SyntaxKind ) {
97
+ fn enter ( & mut self , kind : SyntaxKind ) {
73
98
match mem:: replace ( & mut self . state , State :: Normal ) {
74
99
State :: PendingStart => {
75
100
self . inner . start_node ( kind) ;
@@ -93,43 +118,13 @@ impl<'a> TextTreeSink<'a> {
93
118
self . eat_n_trivias ( n_attached_trivias) ;
94
119
}
95
120
96
- fn finish_node ( & mut self ) {
121
+ fn exit ( & mut self ) {
97
122
match mem:: replace ( & mut self . state , State :: PendingFinish ) {
98
123
State :: PendingStart => unreachable ! ( ) ,
99
124
State :: PendingFinish => self . inner . finish_node ( ) ,
100
125
State :: Normal => ( ) ,
101
126
}
102
127
}
103
- }
104
-
105
- impl < ' a > TextTreeSink < ' a > {
106
- pub ( super ) fn new ( lexed : parser:: LexedStr < ' a > ) -> Self {
107
- Self { lexed, pos : 0 , state : State :: PendingStart , inner : SyntaxTreeBuilder :: default ( ) }
108
- }
109
-
110
- pub ( super ) fn finish_eof ( mut self ) -> ( GreenNode , Vec < SyntaxError > , bool ) {
111
- match mem:: replace ( & mut self . state , State :: Normal ) {
112
- State :: PendingFinish => {
113
- self . eat_trivias ( ) ;
114
- self . inner . finish_node ( ) ;
115
- }
116
- State :: PendingStart | State :: Normal => unreachable ! ( ) ,
117
- }
118
-
119
- let ( node, mut errors) = self . inner . finish_raw ( ) ;
120
- for ( i, err) in self . lexed . errors ( ) {
121
- let text_range = self . lexed . text_range ( i) ;
122
- let text_range = TextRange :: new (
123
- text_range. start . try_into ( ) . unwrap ( ) ,
124
- text_range. end . try_into ( ) . unwrap ( ) ,
125
- ) ;
126
- errors. push ( SyntaxError :: new ( err, text_range) )
127
- }
128
-
129
- let is_eof = self . pos == self . lexed . len ( ) ;
130
-
131
- ( node, errors, is_eof)
132
- }
133
128
134
129
fn eat_trivias ( & mut self ) {
135
130
while self . pos < self . lexed . len ( ) {
0 commit comments