# HG changeset patch # User Michael Davis # Date 1746709458 14400 # Node ID 7b5782139252198894aad48795c0e345e09d757f # Parent 744f9134531f08f46d172eedfdd6ed0e92e01b8d xtask: Allow passing languages and themes to check This is for convenience when testing a few languages or themes, for example while updating a language's parser and queries. query-check in particular can take a while since parser initialization and query analysis can each take some time and there are now many many languages. Specifying the exact language makes the feedback loop much faster. diff -r 744f9134531f -r 7b5782139252 xtask/src/main.rs --- a/xtask/src/main.rs Thu May 08 13:56:36 2025 +0100 +++ b/xtask/src/main.rs Thu May 08 09:04:18 2025 -0400 @@ -8,6 +8,7 @@ pub mod tasks { use crate::DynError; + use std::collections::HashSet; pub fn docgen() -> Result<(), DynError> { use crate::docgen::*; @@ -17,7 +18,7 @@ Ok(()) } - pub fn querycheck() -> Result<(), DynError> { + pub fn querycheck(languages: impl Iterator) -> Result<(), DynError> { use crate::helpers::lang_config; use helix_core::{syntax::read_query, tree_sitter::Query}; use helix_loader::grammar::get_language; @@ -30,7 +31,14 @@ "indents.scm", ]; + let languages_to_check: HashSet<_> = languages.collect(); + for language in lang_config().language { + if !languages_to_check.is_empty() && !languages_to_check.contains(&language.language_id) + { + continue; + } + let language_name = &language.language_id; let grammar_name = language.grammar.as_ref().unwrap_or(language_name); for query_file in query_files { @@ -55,9 +63,11 @@ Ok(()) } - pub fn themecheck() -> Result<(), DynError> { + pub fn themecheck(themes: impl Iterator) -> Result<(), DynError> { use helix_view::theme::Loader; + let themes_to_check: HashSet<_> = themes.collect(); + let theme_names = [ vec!["default".to_string(), "base16_default".to_string()], Loader::read_names(&crate::path::themes()), @@ -67,6 +77,10 @@ let mut errors_present = false; for name in theme_names { + if !themes_to_check.is_empty() && !themes_to_check.contains(&name) { + continue; + } + let (_, warnings) = loader.load_with_warnings(&name).unwrap(); if !warnings.is_empty() { @@ -93,22 +107,25 @@ Usage: Run with `cargo xtask `, eg. `cargo xtask docgen`. Tasks: - docgen: Generate files to be included in the mdbook output. - query-check: Check that tree-sitter queries are valid. - theme-check: Check that theme files in runtime/themes are valid. + docgen Generate files to be included in the mdbook output. + query-check [languages] Check that tree-sitter queries are valid for the given + languages, or all languages if none are specified. + theme-check [themes] Check that the theme files in runtime/themes/ are valid for the + given themes, or all themes if none are specified. " ); } } fn main() -> Result<(), DynError> { - let task = env::args().nth(1); + let mut args = env::args().skip(1); + let task = args.next(); match task { None => tasks::print_help(), Some(t) => match t.as_str() { "docgen" => tasks::docgen()?, - "query-check" => tasks::querycheck()?, - "theme-check" => tasks::themecheck()?, + "query-check" => tasks::querycheck(args)?, + "theme-check" => tasks::themecheck(args)?, invalid => return Err(format!("Invalid task name: {}", invalid).into()), }, };