From 66cb5bd38b43a610080c42efb38c9d85a8aa8cb0 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Wed, 29 Oct 2025 17:22:11 +0100 Subject: [PATCH] tasks: Allow users to define tags for languages If you want your task to only show up in Rust files, you can now add "language:Rust" tag to it and bam, it works. Co-authored-by: Anthony Eid --- crates/project/src/task_inventory.rs | 31 ++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/crates/project/src/task_inventory.rs b/crates/project/src/task_inventory.rs index 4f4939491f19ebe6d32b82f780c4a9988a66c1d4..c1a157087284c2fd31ec6026ab5fc81430e5ee68 100644 --- a/crates/project/src/task_inventory.rs +++ b/crates/project/src/task_inventory.rs @@ -383,15 +383,21 @@ impl Inventory { worktree: Option, cx: &App, ) -> Task> { - let global_tasks = self.global_templates_from_settings().collect::>(); + let language_name = language.as_ref().map(|language| language.name()); + let global_tasks = self + .global_templates_from_settings(language_name.as_ref().map(|name| name.0.as_str())) + .collect::>(); let mut worktree_tasks = worktree .into_iter() .flat_map(|worktree| self.worktree_templates_from_settings(worktree)) .collect::>(); - let task_source_kind = language.as_ref().map(|language| TaskSourceKind::Language { - name: language.name().into(), - }); + let task_source_kind = + language_name + .as_ref() + .map(|language_name| TaskSourceKind::Language { + name: language_name.0.clone(), + }); let language_tasks = language .filter(|language| { language_settings(Some(language.name()), file.as_ref(), cx) @@ -475,7 +481,10 @@ impl Inventory { .collect::>(); let not_used_score = post_inc(&mut lru_score); - let global_tasks = self.global_templates_from_settings().collect::>(); + let language_name = language.map(|language| language.name().0); + let global_tasks = self + .global_templates_from_settings(language_name.as_ref().map(|name| name.as_str())) + .collect::>(); let associated_tasks = language .filter(|language| { language_settings(Some(language.name()), file.as_ref(), cx) @@ -611,8 +620,18 @@ impl Inventory { fn global_templates_from_settings( &self, + language_name: Option<&str>, ) -> impl '_ + Iterator { - self.templates_from_settings.global_scenarios() + let expected_tag = language_name.map(|name| format!("language:{name}")); + + self.templates_from_settings + .global_scenarios() + .filter(move |(_, template)| { + expected_tag.as_ref().is_none_or(|language| { + template.tags.is_empty() + || template.tags.iter().any(|tag| tag.as_str() == language) + }) + }) } fn global_debug_scenarios_from_settings(