@@ -17,35 +17,32 @@ pub(crate) fn build_tree(
1717 parser_output : parser:: Output ,
1818 synthetic_root : bool ,
1919) -> ( GreenNode , Vec < SyntaxError > , bool ) {
20- let mut builder = TextTreeSink :: new ( lexed) ;
20+ let mut builder = Builder :: new ( lexed) ;
2121
2222 if synthetic_root {
23- builder. start_node ( SyntaxKind :: SOURCE_FILE ) ;
23+ builder. enter ( SyntaxKind :: SOURCE_FILE ) ;
2424 }
2525
2626 for event in parser_output. iter ( ) {
2727 match event {
2828 parser:: Step :: Token { kind, n_input_tokens : n_raw_tokens } => {
2929 builder. token ( kind, n_raw_tokens)
3030 }
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 ( ) ,
3333 parser:: Step :: Error { msg } => {
3434 let text_pos = builder. lexed . text_start ( builder. pos ) . try_into ( ) . unwrap ( ) ;
3535 builder. inner . error ( msg. to_string ( ) , text_pos) ;
3636 }
3737 }
3838 }
3939 if synthetic_root {
40- builder. finish_node ( )
40+ builder. exit ( )
4141 }
42- builder. finish_eof ( )
42+ builder. build ( )
4343}
4444
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 > {
4946 lexed : LexedStr < ' a > ,
5047 pos : usize ,
5148 state : State ,
@@ -58,7 +55,35 @@ enum State {
5855 PendingFinish ,
5956}
6057
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+
6287 fn token ( & mut self , kind : SyntaxKind , n_tokens : u8 ) {
6388 match mem:: replace ( & mut self . state , State :: Normal ) {
6489 State :: PendingStart => unreachable ! ( ) ,
@@ -69,7 +94,7 @@ impl<'a> TextTreeSink<'a> {
6994 self . do_token ( kind, n_tokens as usize ) ;
7095 }
7196
72- fn start_node ( & mut self , kind : SyntaxKind ) {
97+ fn enter ( & mut self , kind : SyntaxKind ) {
7398 match mem:: replace ( & mut self . state , State :: Normal ) {
7499 State :: PendingStart => {
75100 self . inner . start_node ( kind) ;
@@ -93,43 +118,13 @@ impl<'a> TextTreeSink<'a> {
93118 self . eat_n_trivias ( n_attached_trivias) ;
94119 }
95120
96- fn finish_node ( & mut self ) {
121+ fn exit ( & mut self ) {
97122 match mem:: replace ( & mut self . state , State :: PendingFinish ) {
98123 State :: PendingStart => unreachable ! ( ) ,
99124 State :: PendingFinish => self . inner . finish_node ( ) ,
100125 State :: Normal => ( ) ,
101126 }
102127 }
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- }
133128
134129 fn eat_trivias ( & mut self ) {
135130 while self . pos < self . lexed . len ( ) {
0 commit comments