diff --git a/cli/src/query.rs b/cli/src/query.rs index 9c524877..bf67edf6 100644 --- a/cli/src/query.rs +++ b/cli/src/query.rs @@ -58,6 +58,7 @@ pub fn query_files_at_paths( results.push(query_testing::CaptureInfo { name: capture_name.to_string(), position: capture.node.start_position(), + terminus: capture.node.end_position(), }); } } else { @@ -85,6 +86,7 @@ pub fn query_files_at_paths( results.push(query_testing::CaptureInfo { name: capture_name.to_string(), position: capture.node.start_position(), + terminus: capture.node.end_position(), }); } } diff --git a/cli/src/query_testing.rs b/cli/src/query_testing.rs index 58feec42..96ccf6b2 100644 --- a/cli/src/query_testing.rs +++ b/cli/src/query_testing.rs @@ -2,7 +2,6 @@ use crate::error; use crate::error::Result; use lazy_static::lazy_static; use regex::Regex; -use std::collections::hash_map::HashMap; use std::fs; use tree_sitter::{Language, Parser, Point}; @@ -14,6 +13,7 @@ lazy_static! { pub struct CaptureInfo { pub name: String, pub position: Point, + pub terminus: Point, } #[derive(Debug, PartialEq, Eq)] @@ -134,22 +134,20 @@ pub fn assert_expected_captures( ) -> Result<()> { let contents = fs::read_to_string(path)?; let pairs = parse_position_comments(parser, language, contents.as_bytes())?; - - let per_position_index: HashMap = pairs - .iter() - .map(|a| (a.position, &a.expected_capture_name)) - .collect(); - for info in &infos { - if !per_position_index.contains_key(&info.position) { - continue; - } - let found = per_position_index.get(&info.position).unwrap(); - if **found != info.name && info.name != "name" { - Err(error::Error::new(format!( - "Assertion failed: at {}, found {}, expected {}", - info.position, found, info.name - )))? + let found = pairs.iter().find(|p| { + p.position.row == info.position.row + && p.position >= info.position + && p.position < info.terminus + }); + + if let Some(found) = found { + if found.expected_capture_name != info.name && info.name != "name" { + Err(error::Error::new(format!( + "Assertion failed: at {}, found {}, expected {}", + info.position, found.expected_capture_name, info.name + )))? + } } } Ok(())