@@ -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,16 +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 ,
161+ language_prefix : & str ,
155162 schema : & NodeTypeMap ,
163+ trap_writer : & mut TrapWriter ,
156164 path : & Path ,
157165 source : & Vec < u8 > ,
158166 ranges : & [ Range ] ,
159- ) -> std:: io:: Result < Program > {
167+ ) -> std:: io:: Result < ( ) > {
160168 let span = span ! (
161169 Level :: TRACE ,
162170 "extract" ,
@@ -171,8 +179,7 @@ pub fn extract(
171179 parser. set_language ( language) . unwrap ( ) ;
172180 parser. set_included_ranges ( & ranges) . unwrap ( ) ;
173181 let tree = parser. parse ( & source, None ) . expect ( "Failed to parse file" ) ;
174- let mut trap_writer = new_trap_writer ( ) ;
175- trap_writer. comment ( format ! ( "Auto-generated TRAP file for {}" , path. display( ) ) ) ;
182+ & trap_writer. comment ( format ! ( "Auto-generated TRAP file for {}" , path. display( ) ) ) ;
176183 let file_label = & trap_writer. populate_file ( path) ;
177184 let mut visitor = Visitor {
178185 source : & source,
@@ -183,12 +190,13 @@ pub fn extract(
183190 token_counter : 0 ,
184191 toplevel_child_counter : 0 ,
185192 stack : Vec :: new ( ) ,
193+ language_prefix,
186194 schema,
187195 } ;
188196 traverse ( & tree, & mut visitor) ;
189197
190198 parser. reset ( ) ;
191- Ok ( Program ( visitor . trap_writer . trap_output ) )
199+ Ok ( ( ) )
192200}
193201
194202/// Escapes a string for use in a TRAP key, by replacing special characters with
@@ -288,11 +296,13 @@ struct Visitor<'a> {
288296 /// The source code as a UTF-8 byte array
289297 source : & ' a Vec < u8 > ,
290298 /// A TrapWriter to accumulate trap entries
291- trap_writer : TrapWriter ,
299+ trap_writer : & ' a mut TrapWriter ,
292300 /// A counter for tokens
293301 token_counter : usize ,
294302 /// A counter for top-level child nodes
295303 toplevel_child_counter : usize ,
304+ /// Language prefix
305+ language_prefix : & ' a str ,
296306 /// A lookup table from type name to node types
297307 schema : & ' a NodeTypeMap ,
298308 /// A stack for gathering information from child nodes. Whenever a node is
@@ -400,15 +410,15 @@ impl Visitor<'_> {
400410 match & table. kind {
401411 EntryKind :: Token { kind_id, .. } => {
402412 self . trap_writer . add_tuple (
403- "ast_node_parent" ,
413+ & format ! ( "{}_ast_node_parent" , self . language_prefix ) ,
404414 vec ! [
405415 Arg :: Label ( id) ,
406416 Arg :: Label ( parent_id) ,
407417 Arg :: Int ( parent_index) ,
408418 ] ,
409419 ) ;
410420 self . trap_writer . add_tuple (
411- "tokeninfo" ,
421+ & format ! ( "{}_tokeninfo" , self . language_prefix ) ,
412422 vec ! [
413423 Arg :: Label ( id) ,
414424 Arg :: Int ( * kind_id) ,
@@ -426,7 +436,7 @@ impl Visitor<'_> {
426436 } => {
427437 if let Some ( args) = self . complex_node ( & node, fields, & child_nodes, id) {
428438 self . trap_writer . add_tuple (
429- "ast_node_parent" ,
439+ & format ! ( "{}_ast_node_parent" , self . language_prefix ) ,
430440 vec ! [
431441 Arg :: Label ( id) ,
432442 Arg :: Label ( parent_id) ,
0 commit comments