@@ -124,6 +124,10 @@ fn main() -> std::io::Result<()> {
124124
125125 let language = tree_sitter_ruby:: language ( ) ;
126126 let erb = tree_sitter_embedded_template:: language ( ) ;
127+ // Look up tree-sitter kind ids now, to avoid string comparisons when scanning ERB files.
128+ let erb_directive_id = erb. id_for_node_kind ( "directive" , true ) ;
129+ let erb_output_directive_id = erb. id_for_node_kind ( "output_directive" , true ) ;
130+ let erb_code_id = erb. id_for_node_kind ( "code" , true ) ;
127131 let schema = node_types:: read_node_types_str ( "ruby" , tree_sitter_ruby:: NODE_TYPES ) ?;
128132 let erb_schema =
129133 node_types:: read_node_types_str ( "erb" , tree_sitter_embedded_template:: NODE_TYPES ) ?;
@@ -149,7 +153,13 @@ fn main() -> std::io::Result<()> {
149153 & [ ] ,
150154 ) ?;
151155
152- let ( ranges, line_breaks) = scan_erb ( erb, & source) ;
156+ let ( ranges, line_breaks) = scan_erb (
157+ erb,
158+ & source,
159+ erb_directive_id,
160+ erb_output_directive_id,
161+ erb_code_id,
162+ ) ;
153163 for i in line_breaks {
154164 if i < source. len ( ) {
155165 source[ i] = b'\n' ;
@@ -199,18 +209,24 @@ fn write_trap(
199209 }
200210}
201211
202- fn scan_erb ( erb : Language , source : & std:: vec:: Vec < u8 > ) -> ( Vec < Range > , Vec < usize > ) {
212+ fn scan_erb (
213+ erb : Language ,
214+ source : & Vec < u8 > ,
215+ directive_id : u16 ,
216+ output_directive_id : u16 ,
217+ code_id : u16 ,
218+ ) -> ( Vec < Range > , Vec < usize > ) {
203219 let mut parser = Parser :: new ( ) ;
204220 parser. set_language ( erb) . unwrap ( ) ;
205221 let tree = parser. parse ( & source, None ) . expect ( "Failed to parse file" ) ;
206222 let mut result = Vec :: new ( ) ;
207223 let mut line_breaks = vec ! [ ] ;
208224
209225 for n in tree. root_node ( ) . children ( & mut tree. walk ( ) ) {
210- let kind = n. kind ( ) ;
211- if kind == "directive" || kind == "output_directive" {
226+ let kind_id = n. kind_id ( ) ;
227+ if kind_id == directive_id || kind_id == output_directive_id {
212228 for c in n. children ( & mut tree. walk ( ) ) {
213- if c. kind ( ) == "code" {
229+ if c. kind_id ( ) == code_id {
214230 let mut range = c. range ( ) ;
215231 if range. end_byte < source. len ( ) {
216232 line_breaks. push ( range. end_byte ) ;
0 commit comments