Skip to content

Commit b2c4dae

Browse files
authored
Merge pull request #303 from github/nickrolfe/node_kind_id
Use integer comparisons instead of strings when scanning ERB files
2 parents 2a4747b + d60410e commit b2c4dae

File tree

1 file changed

+21
-5
lines changed

1 file changed

+21
-5
lines changed

extractor/src/main.rs

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)