@@ -217,6 +217,41 @@ pub mod tasks {
217217 Ok(())
218218 }
219219
220+ pub fn query_check() -> Result<(), String> {
221+ use crate::helpers::lang_config;
222+ use helix_core::{syntax::read_query, tree_sitter::Query};
223+ use helix_loader::grammar::get_language;
224+
225+ let query_files = [
226+ "highlights.scm",
227+ "locals.scm",
228+ "injections.scm",
229+ "textobjects.scm",
230+ "indents.scm",
231+ ];
232+
233+ for language in lang_config().language {
234+ let language_name = language.language_id.to_ascii_lowercase();
235+ let grammar_name = language.grammar.unwrap_or(language.language_id);
236+ for query_file in query_files {
237+ let language = get_language(&grammar_name);
238+ let query_text = read_query(&language_name, query_file);
239+ if !query_text.is_empty() && language.is_ok() {
240+ if let Err(reason) = Query::new(language.unwrap(), &query_text) {
241+ return Err(format!(
242+ "Failed to parse {} queries for {}: {}",
243+ query_file, language_name, reason
244+ ));
245+ }
246+ }
247+ }
248+ }
249+
250+ println!("Query check succeeded");
251+
252+ Ok(())
253+ }
254+
220255 pub fn print_help() {
221256 println!(
222257 "
@@ -224,6 +259,7 @@ Usage: Run with `cargo xtask <task>`, eg. `cargo xtask docgen`.
224259
225260 Tasks:
226261 docgen: Generate files to be included in the mdbook output.
262+ query-check: Check that tree-sitter queries are valid.
227263"
228264 );
229265 }
@@ -235,6 +271,7 @@ fn main() -> Result<(), DynError> {
235271 None => tasks::print_help(),
236272 Some(t) => match t.as_str() {
237273 "docgen" => tasks::docgen()?,
274+ "query-check" => tasks::query_check()?,
238275 invalid => return Err(format!("Invalid task name: {}", invalid).into()),
239276 },
240277 };