@@ -3,11 +3,13 @@ use std::borrow::Cow;
33use std:: collections:: BTreeMap as Map ;
44use std:: collections:: BTreeSet as Set ;
55use std:: fmt;
6+ use std:: io:: Write ;
67use std:: path:: Path ;
8+
79use tracing:: { error, info, span, Level } ;
810use tree_sitter:: { Language , Node , Parser , Range , Tree } ;
911
10- struct TrapWriter {
12+ pub struct TrapWriter {
1113 /// The accumulated trap entries
1214 trap_output : Vec < TrapEntry > ,
1315 /// A counter for generating fresh labels
@@ -16,7 +18,7 @@ struct TrapWriter {
1618 global_keys : std:: collections:: HashMap < String , Label > ,
1719}
1820
19- fn new_trap_writer ( ) -> TrapWriter {
21+ pub fn new_trap_writer ( ) -> TrapWriter {
2022 TrapWriter {
2123 counter : 0 ,
2224 trap_output : Vec :: new ( ) ,
@@ -147,17 +149,22 @@ impl TrapWriter {
147149 fn comment ( & mut self , text : String ) {
148150 self . trap_output . push ( TrapEntry :: Comment ( text) ) ;
149151 }
152+
153+ pub fn output ( self , writer : & mut dyn Write ) -> std:: io:: Result < ( ) > {
154+ write ! ( writer, "{}" , Program ( self . trap_output) )
155+ }
150156}
151157
152158/// Extracts the source file at `path`, which is assumed to be canonicalized.
153159pub fn extract (
154160 language : Language ,
155161 language_prefix : & str ,
156162 schema : & NodeTypeMap ,
163+ trap_writer : & mut TrapWriter ,
157164 path : & Path ,
158165 source : & Vec < u8 > ,
159166 ranges : & [ Range ] ,
160- ) -> std:: io:: Result < Program > {
167+ ) -> std:: io:: Result < ( ) > {
161168 let span = span ! (
162169 Level :: TRACE ,
163170 "extract" ,
@@ -172,8 +179,7 @@ pub fn extract(
172179 parser. set_language ( language) . unwrap ( ) ;
173180 parser. set_included_ranges ( & ranges) . unwrap ( ) ;
174181 let tree = parser. parse ( & source, None ) . expect ( "Failed to parse file" ) ;
175- let mut trap_writer = new_trap_writer ( ) ;
176- trap_writer. comment ( format ! ( "Auto-generated TRAP file for {}" , path. display( ) ) ) ;
182+ & trap_writer. comment ( format ! ( "Auto-generated TRAP file for {}" , path. display( ) ) ) ;
177183 let file_label = & trap_writer. populate_file ( path) ;
178184 let mut visitor = Visitor {
179185 source : & source,
@@ -190,7 +196,7 @@ pub fn extract(
190196 traverse ( & tree, & mut visitor) ;
191197
192198 parser. reset ( ) ;
193- Ok ( Program ( visitor . trap_writer . trap_output ) )
199+ Ok ( ( ) )
194200}
195201
196202/// Escapes a string for use in a TRAP key, by replacing special characters with
@@ -290,7 +296,7 @@ struct Visitor<'a> {
290296 /// The source code as a UTF-8 byte array
291297 source : & ' a Vec < u8 > ,
292298 /// A TrapWriter to accumulate trap entries
293- trap_writer : TrapWriter ,
299+ trap_writer : & ' a mut TrapWriter ,
294300 /// A counter for tokens
295301 token_counter : usize ,
296302 /// A counter for top-level child nodes
0 commit comments