changeset 6770:7b5782139252

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.
author Michael Davis <mcarsondavis@gmail.com>
date Thu, 08 May 2025 09:04:18 -0400
parents 744f9134531f
children 45926fcdbafa
files xtask/src/main.rs
diffstat 1 files changed, 25 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- 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<Item = String>) -> 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<Item = String>) -> 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 <task>`, 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()),
         },
     };