@@ -124,6 +124,10 @@ fn main() -> std::io::Result<()> {
124
124
125
125
let language = tree_sitter_ruby:: language ( ) ;
126
126
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 ) ;
127
131
let schema = node_types:: read_node_types_str ( "ruby" , tree_sitter_ruby:: NODE_TYPES ) ?;
128
132
let erb_schema =
129
133
node_types:: read_node_types_str ( "erb" , tree_sitter_embedded_template:: NODE_TYPES ) ?;
@@ -149,7 +153,13 @@ fn main() -> std::io::Result<()> {
149
153
& [ ] ,
150
154
) ?;
151
155
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
+ ) ;
153
163
for i in line_breaks {
154
164
if i < source. len ( ) {
155
165
source[ i] = b'\n' ;
@@ -199,18 +209,24 @@ fn write_trap(
199
209
}
200
210
}
201
211
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 > ) {
203
219
let mut parser = Parser :: new ( ) ;
204
220
parser. set_language ( erb) . unwrap ( ) ;
205
221
let tree = parser. parse ( & source, None ) . expect ( "Failed to parse file" ) ;
206
222
let mut result = Vec :: new ( ) ;
207
223
let mut line_breaks = vec ! [ ] ;
208
224
209
225
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 {
212
228
for c in n. children ( & mut tree. walk ( ) ) {
213
- if c. kind ( ) == "code" {
229
+ if c. kind_id ( ) == code_id {
214
230
let mut range = c. range ( ) ;
215
231
if range. end_byte < source. len ( ) {
216
232
line_breaks. push ( range. end_byte ) ;
0 commit comments