fn get_range_for_replace_node()

in src/utilities/tree_sitter_utilities.rs [163:196]


fn get_range_for_replace_node(
  query: &Query, query_matches: &[Vec<tree_sitter::QueryCapture>], replace_node_name: &String,
  replace_node_idx: Option<u8>,
) -> Option<Range> {
  let tag_names_by_index: HashMap<usize, &String> =
    query.capture_names().iter().enumerate().collect();
  // Iterate over each tag name in the query
  for tag_name in query.capture_names().iter() {
    // Iterate over each query match for this range of code snippet
    for captures in query_matches.iter().cloned() {
      // Iterate over each capture
      for capture in captures {
        if tag_names_by_index[&(capture.index as usize)].eq(tag_name)
          && tag_name.eq(replace_node_name)
        {
          if let Some(child_index) = replace_node_idx {
            let c_usize = child_index as usize;
            if c_usize >= capture.node.named_child_count() {
              return None;
            }
            return Some(capture.node.named_child(c_usize).unwrap().range().into());
          }

          return Some(capture.node.range().into());
        }
      }
    }
  }
  panic!(
    "Could not fetch range or node for replace_node {}. Context: {:?}",
    replace_node_name,
    query.capture_names()
  );
}