Repository: qltysh/qlty
Pull request #2050: Add tool name to WorkspaceEntryMatcher match function
Author: login: marschattha
Created: 2025-05-16T20:19:58Z | Merged: 2025-05-16T20:29:07Z



Diff:
diff --git a/qlty-analysis/src/workspace_entries/matchers.rs b/qlty-analysis/src/workspace_entries/matchers.rs
index c9030863b..23a2cf3e2 100644
--- a/qlty-analysis/src/workspace_entries/matchers.rs
+++ b/qlty-analysis/src/workspace_entries/matchers.rs
@@ -21,5 +21,5 @@ pub use prefix_matcher::PrefixMatcher;
 use super::workspace_entry::WorkspaceEntry;
 
 pub trait WorkspaceEntryMatcher: core::fmt::Debug {
-    fn matches(&self, workspace_entry: WorkspaceEntry) -> Option<WorkspaceEntry>;
+    fn matches(&self, workspace_entry: WorkspaceEntry, tool_name: &str) -> Option<WorkspaceEntry>;
 }
diff --git a/qlty-analysis/src/workspace_entries/matchers/and_matcher.rs b/qlty-analysis/src/workspace_entries/matchers/and_matcher.rs
index d09da1bab..e86ebe060 100644
--- a/qlty-analysis/src/workspace_entries/matchers/and_matcher.rs
+++ b/qlty-analysis/src/workspace_entries/matchers/and_matcher.rs
@@ -18,11 +18,11 @@ impl AndMatcher {
 }
 
 impl WorkspaceEntryMatcher for AndMatcher {
-    fn matches(&self, workspace_entry: WorkspaceEntry) -> Option<WorkspaceEntry> {
+    fn matches(&self, workspace_entry: WorkspaceEntry, tool_name: &str) -> Option<WorkspaceEntry> {
         let mut matched_workspace_entry = workspace_entry.clone();
 
         for matcher in &self.matchers {
-            if let Some(matched) = matcher.matches(matched_workspace_entry) {
+            if let Some(matched) = matcher.matches(matched_workspace_entry, tool_name) {
                 matched_workspace_entry = matched;
             } else {
                 return None;
diff --git a/qlty-analysis/src/workspace_entries/matchers/any_matcher.rs b/qlty-analysis/src/workspace_entries/matchers/any_matcher.rs
index c2a8c14de..f5df8ae40 100644
--- a/qlty-analysis/src/workspace_entries/matchers/any_matcher.rs
+++ b/qlty-analysis/src/workspace_entries/matchers/any_matcher.rs
@@ -5,7 +5,7 @@ use crate::WorkspaceEntry;
 pub struct AnyMatcher;
 
 impl WorkspaceEntryMatcher for AnyMatcher {
-    fn matches(&self, workspace_entry: WorkspaceEntry) -> Option<WorkspaceEntry> {
+    fn matches(&self, workspace_entry: WorkspaceEntry, _tool_name: &str) -> Option<WorkspaceEntry> {
         Some(workspace_entry)
     }
 }
diff --git a/qlty-analysis/src/workspace_entries/matchers/file_matcher.rs b/qlty-analysis/src/workspace_entries/matchers/file_matcher.rs
index 925354938..6404eb962 100644
--- a/qlty-analysis/src/workspace_entries/matchers/file_matcher.rs
+++ b/qlty-analysis/src/workspace_entries/matchers/file_matcher.rs
@@ -6,7 +6,7 @@ use crate::{WorkspaceEntry, WorkspaceEntryKind};
 pub struct FileMatcher;
 
 impl WorkspaceEntryMatcher for FileMatcher {
-    fn matches(&self, workspace_entry: WorkspaceEntry) -> Option<WorkspaceEntry> {
+    fn matches(&self, workspace_entry: WorkspaceEntry, _tool_name: &str) -> Option<WorkspaceEntry> {
         if workspace_entry.kind == WorkspaceEntryKind::File {
             Some(workspace_entry)
         } else {
@@ -35,7 +35,7 @@ mod test {
 
         let matcher = FileMatcher;
         assert!(
-            matcher.matches(workspace_entry).is_some(),
+            matcher.matches(workspace_entry, "test").is_some(),
             "Expected workspace_entry to match as it is of type File"
         );
     }
@@ -52,7 +52,7 @@ mod test {
 
         let matcher = FileMatcher;
         assert!(
-            matcher.matches(workspace_entry).is_none(),
+            matcher.matches(workspace_entry, "test").is_none(),
             "Expected workspace_entry not to match as it is of type Directory"
         );
     }
diff --git a/qlty-analysis/src/workspace_entries/matchers/globs_matcher.rs b/qlty-analysis/src/workspace_entries/matchers/globs_matcher.rs
index 03c13635c..a5662af27 100644
--- a/qlty-analysis/src/workspace_entries/matchers/globs_matcher.rs
+++ b/qlty-analysis/src/workspace_entries/matchers/globs_matcher.rs
@@ -32,7 +32,7 @@ impl GlobsMatcher {
 }
 
 impl WorkspaceEntryMatcher for GlobsMatcher {
-    fn matches(&self, workspace_entry: WorkspaceEntry) -> Option<WorkspaceEntry> {
+    fn matches(&self, workspace_entry: WorkspaceEntry, _tool_name: &str) -> Option<WorkspaceEntry> {
         let matches = self.glob_set.is_match(workspace_entry.path_string());
 
         if matches == self.include {
@@ -88,7 +88,7 @@ mod test {
         let matcher = GlobsMatcher::new_for_file_types(&file_types).unwrap();
 
         assert!(
-            matcher.matches(workspace_entry).is_some(),
+            matcher.matches(workspace_entry, "test").is_some(),
             "Expected workspace_entry to match as it is of type rust"
         );
     }
@@ -118,7 +118,7 @@ mod test {
         let matcher = GlobsMatcher::new_for_file_types(&file_types).unwrap();
 
         assert!(
-            matcher.matches(workspace_entry).is_none(),
+            matcher.matches(workspace_entry, "test").is_none(),
             "Expected workspace_entry not to match as it is of type ruby"
         );
     }
diff --git a/qlty-analysis/src/workspace_entries/matchers/ignore_groups_matcher.rs b/qlty-analysis/src/workspace_entries/matchers/ignore_groups_matcher.rs
index 64a544ded..b70e981ff 100644
--- a/qlty-analysis/src/workspace_entries/matchers/ignore_groups_matcher.rs
+++ b/qlty-analysis/src/workspace_entries/matchers/ignore_groups_matcher.rs
@@ -21,7 +21,7 @@ impl IgnoreGroupsMatcher {
 }
 
 impl WorkspaceEntryMatcher for IgnoreGroupsMatcher {
-    fn matches(&self, workspace_entry: WorkspaceEntry) -> Option<WorkspaceEntry> {
+    fn matches(&self, workspace_entry: WorkspaceEntry, _tool_name: &str) -> Option<WorkspaceEntry> {
         // By default, include the file
         let path = workspace_entry.path_string();
 
@@ -66,13 +66,13 @@ mod test {
         let matcher = IgnoreGroupsMatcher::new(ignore_groups);
 
         assert!(matcher
-            .matches(create_workspace_entry("src/main.rs"))
+            .matches(create_workspace_entry("src/main.rs"), "test")
             .is_some());
         assert!(matcher
-            .matches(create_workspace_entry("logs/output.log"))
+            .matches(create_workspace_entry("logs/output.log"), "test")
             .is_none());
         assert!(matcher
-            .matches(create_workspace_entry("target/debug/app"))
+            .matches(create_workspace_entry("target/debug/app"), "test")
             .is_none());
     }
 
@@ -91,10 +91,10 @@ mod test {
         let matcher = IgnoreGroupsMatcher::new(ignore_groups);
 
         assert!(matcher
-            .matches(create_workspace_entry("logs/error.log"))
+            .matches(create_workspace_entry("logs/error.log"), "test")
             .is_none());
         assert!(matcher
-            .matches(create_workspace_entry("logs/important.log"))
+            .matches(create_workspace_entry("logs/important.log"), "test")
             .is_some());
     }
 
@@ -102,7 +102,7 @@ mod test {
     fn test_ignore_groups_matcher_empty_list() {
         let matcher = IgnoreGroupsMatcher::new(vec![]);
         assert!(matcher
-            .matches(create_workspace_entry("src/main.rs"))
+            .matches(create_workspace_entry("src/main.rs"), "test")
             .is_some());
     }
 }
diff --git a/qlty-analysis/src/workspace_entries/matchers/language_globs_matcher.rs b/qlty-analysis/src/workspace_entries/matchers/language_globs_matcher.rs
index 09284c36d..bec45f4ad 100644
--- a/qlty-analysis/src/workspace_entries/matchers/language_globs_matcher.rs
+++ b/qlty-analysis/src/workspace_entries/matchers/language_globs_matcher.rs
@@ -24,8 +24,8 @@ impl LanguageGlobsMatcher {
 }
 
 impl WorkspaceEntryMatcher for LanguageGlobsMatcher {
-    fn matches(&self, workspace_entry: WorkspaceEntry) -> Option<WorkspaceEntry> {
-        match self.matcher.matches(workspace_entry) {
+    fn matches(&self, workspace_entry: WorkspaceEntry, tool_name: &str) -> Option<WorkspaceEntry> {
+        match self.matcher.matches(workspace_entry, tool_name) {
             Some(mut workspace_entry) => {
                 workspace_entry.language_name = Some(self.language_name.clone());
                 Some(workspace_entry)
diff --git a/qlty-analysis/src/workspace_entries/matchers/languages_shebang_matcher.rs b/qlty-analysis/src/workspace_entries/matchers/languages_shebang_matcher.rs
index d175f20d5..c53be1bdd 100644
--- a/qlty-analysis/src/workspace_entries/matchers/languages_shebang_matcher.rs
+++ b/qlty-analysis/src/workspace_entries/matchers/languages_shebang_matcher.rs
@@ -16,7 +16,7 @@ impl LanguagesShebangMatcher {
 }
 
 impl WorkspaceEntryMatcher for LanguagesShebangMatcher {
-    fn matches(&self, workspace_entry: WorkspaceEntry) -> Option<WorkspaceEntry> {
+    fn matches(&self, workspace_entry: WorkspaceEntry, _tool_name: &str) -> Option<WorkspaceEntry> {
         let file = std::fs::File::open(&workspace_entry.path);
 
         if let Ok(file) = file {
diff --git a/qlty-analysis/src/workspace_entries/matchers/or_matcher.rs b/qlty-analysis/src/workspace_entries/matchers/or_matcher.rs
index e52e7670b..fe35e69ea 100644
--- a/qlty-analysis/src/workspace_entries/matchers/or_matcher.rs
+++ b/qlty-analysis/src/workspace_entries/matchers/or_matcher.rs
@@ -18,9 +18,11 @@ impl OrMatcher {
 }
 
 impl WorkspaceEntryMatcher for OrMatcher {
-    fn matches(&self, workspace_entry: WorkspaceEntry) -> Option<WorkspaceEntry> {
+    fn matches(&self, workspace_entry: WorkspaceEntry, tool_name: &str) -> Option<WorkspaceEntry> {
         for matcher in &self.matchers {
-            if let Some(matched_workspace_entry) = matcher.matches(workspace_entry.clone()) {
+            if let Some(matched_workspace_entry) =
+                matcher.matches(workspace_entry.clone(), tool_name)
+            {
                 return Some(matched_workspace_entry);
             }
         }
diff --git a/qlty-analysis/src/workspace_entries/matchers/prefix_matcher.rs b/qlty-analysis/src/workspace_entries/matchers/prefix_matcher.rs
index 5943c410d..bc03e2be7 100644
--- a/qlty-analysis/src/workspace_entries/matchers/prefix_matcher.rs
+++ b/qlty-analysis/src/workspace_entries/matchers/prefix_matcher.rs
@@ -16,7 +16,7 @@ impl PrefixMatcher {
 }
 
 impl WorkspaceEntryMatcher for PrefixMatcher {
-    fn matches(&self, workspace_entry: WorkspaceEntry) -> Option<WorkspaceEntry> {
+    fn matches(&self, workspace_entry: WorkspaceEntry, _tool_name: &str) -> Option<WorkspaceEntry> {
         match workspace_entry.full_path(&self.root) {
             Ok(full_path) => {
                 if full_path.starts_with(path_to_string(&self.path_prefix)) {
diff --git a/qlty-analysis/src/workspace_entries/workspace_entry_finder.rs b/qlty-analysis/src/workspace_entries/workspace_entry_finder.rs
index d2c4cad53..29b1cecf9 100644
--- a/qlty-analysis/src/workspace_entries/workspace_entry_finder.rs
+++ b/qlty-analysis/src/workspace_entries/workspace_entry_finder.rs
@@ -37,8 +37,8 @@ impl WorkspaceEntryFinder {
         }
     }
 
-    pub fn files(&mut self) -> Result<Vec<Arc<File>>> {
-        let workspace_entries = self.workspace_entries()?;
+    pub fn files_for_qlty(&mut self) -> Result<Vec<Arc<File>>> {
+        let workspace_entries = self.workspace_entries("qlty")?;
         let mut files = Vec::new();
 
         for workspace_entry in workspace_entries {
@@ -54,20 +54,20 @@ impl WorkspaceEntryFinder {
         Ok(files)
     }
 
-    pub fn workspace_entries(&mut self) -> Result<Vec<WorkspaceEntry>> {
-        self.compute_workspace_entries()?;
+    pub fn workspace_entries(&mut self, tool_name: &str) -> Result<Vec<WorkspaceEntry>> {
+        self.compute_workspace_entries(tool_name)?;
         Ok(self.results.as_ref().unwrap().to_owned())
     }
 
-    pub fn sample(&mut self, sample: usize) -> Result<Vec<WorkspaceEntry>> {
-        self.compute_workspace_entries()?;
+    pub fn sample(&mut self, sample: usize, tool_name: &str) -> Result<Vec<WorkspaceEntry>> {
+        self.compute_workspace_entries(tool_name)?;
         let mut workspace_entries = self.results.as_ref().unwrap().to_owned();
         workspace_entries.shuffle(&mut thread_rng());
         workspace_entries.truncate(sample);
         Ok(workspace_entries)
     }
 
-    fn compute_workspace_entries(&mut self) -> Result<()> {
+    fn compute_workspace_entries(&mut self, tool_name: &str) -> Result<()> {
         if self.results.is_some() {
             return Ok(());
         }
@@ -76,7 +76,8 @@ impl WorkspaceEntryFinder {
 
         let entries = self.source.entries()?;
         for workspace_entry in entries.iter() {
-            if let Some(workspace_entry) = self.matcher.matches(workspace_entry.clone()) {
+            if let Some(workspace_entry) = self.matcher.matches(workspace_entry.clone(), tool_name)
+            {
                 trace!("Adding workspace entry: {:?}", &workspace_entry);
                 workspace_entries.push(workspace_entry);
             } else {
@@ -110,7 +111,7 @@ mod test {
         let source = AllSource::new(root.path().to_path_buf());
         let mut workspace_entry_finder =
             WorkspaceEntryFinder::new(Arc::new(source), Box::new(AnyMatcher));
-        let workspace_entries = workspace_entry_finder.workspace_entries().unwrap();
+        let workspace_entries = workspace_entry_finder.workspace_entries("test").unwrap();
         let mut paths = vec![];
         for workspace_entry in workspace_entries {
             paths.push((workspace_entry.path, workspace_entry.kind));
@@ -155,7 +156,7 @@ mod test {
             Box::new(AndMatcher::new(vec![file_matcher, file_type_matcher])),
         );
 
-        let workspace_entries = workspace_entry_finder.workspace_entries().unwrap();
+        let workspace_entries = workspace_entry_finder.workspace_entries("test").unwrap();
         let mut paths = vec![];
         for workspace_entry in workspace_entries {
             paths.push((workspace_entry.path, workspace_entry.kind));
@@ -205,7 +206,7 @@ mod test {
         let source = AllSource::new(root.path().to_path_buf());
         let mut workspace_entry_finder =
             WorkspaceEntryFinder::new(Arc::new(source), Box::new(AnyMatcher));
-        let workspace_entries = workspace_entry_finder.sample(3).unwrap();
+        let workspace_entries = workspace_entry_finder.sample(3, "test").unwrap();
         let mut paths = vec![];
         for workspace_entry in workspace_entries {
             paths.push(workspace_entry.path);
diff --git a/qlty-check/src/planner/driver.rs b/qlty-check/src/planner/driver.rs
index 79e38fcf3..bfbb7dc2f 100644
--- a/qlty-check/src/planner/driver.rs
+++ b/qlty-check/src/planner/driver.rs
@@ -118,8 +118,10 @@ impl DriverPlanner {
                 .build(file_types, self.plugin.prefix.clone())?;
 
             self.workspace_entries = match self.target_mode {
-                TargetMode::Sample(sample) => Arc::new(workspace_entry_finder.sample(sample)?),
-                _ => Arc::new(workspace_entry_finder.workspace_entries()?),
+                TargetMode::Sample(sample) => {
+                    Arc::new(workspace_entry_finder.sample(sample, &self.plugin_name)?)
+                }
+                _ => Arc::new(workspace_entry_finder.workspace_entries(&self.plugin_name)?),
             };
 
             if self.workspace_entries.is_empty() {
diff --git a/qlty-check/src/planner/plugin.rs b/qlty-check/src/planner/plugin.rs
index 64729b75d..2463e2cad 100644
--- a/qlty-check/src/planner/plugin.rs
+++ b/qlty-check/src/planner/plugin.rs
@@ -129,8 +129,10 @@ impl PluginPlanner {
             .build(&self.plugin.file_types, self.plugin.prefix.clone())?;
 
         self.workspace_entries = match self.target_mode {
-            TargetMode::Sample(sample) => Arc::new(workspace_entry_finder.sample(sample)?),
-            _ => Arc::new(workspace_entry_finder.workspace_entries()?),
+            TargetMode::Sample(sample) => {
+                Arc::new(workspace_entry_finder.sample(sample, &self.plugin_name)?)
+            }
+            _ => Arc::new(workspace_entry_finder.workspace_entries(&self.plugin_name)?),
         };
 
         if self.workspace_entries.is_empty() {
diff --git a/qlty-cli/src/commands/build.rs b/qlty-cli/src/commands/build.rs
index 72756bd66..29bd99234 100644
--- a/qlty-cli/src/commands/build.rs
+++ b/qlty-cli/src/commands/build.rs
@@ -74,7 +74,7 @@ impl Build {
         };
 
         let mut workspace_entry_finder = workspace_entry_finder_builder.build()?;
-        let workspace_entry_files = workspace_entry_finder.files()?;
+        let workspace_entry_files = workspace_entry_finder.files_for_qlty()?;
 
         report.metadata.files_analyzed = Some(workspace_entry_files.len().try_into().unwrap());
 
@@ -210,7 +210,10 @@ impl Build {
         let planner = qlty_smells::duplication::Planner::new(
             config,
             &settings,
-            workspace_entry_finder_builder.build()?.files()?.to_vec(),
+            workspace_entry_finder_builder
+                .build()?
+                .files_for_qlty()?
+                .to_vec(),
         )?;
         let plan = planner.compute()?;
         let mut executor = qlty_smells::duplication::Executor::new(&plan);
diff --git a/qlty-cli/src/commands/metrics.rs b/qlty-cli/src/commands/metrics.rs
index fedbd982a..8928acb9a 100644
--- a/qlty-cli/src/commands/metrics.rs
+++ b/qlty-cli/src/commands/metrics.rs
@@ -99,7 +99,7 @@ impl Metrics {
             config: config.clone(),
             ..Default::default()
         };
-        let files = workspace_entry_finder_builder.build()?.files()?;
+        let files = workspace_entry_finder_builder.build()?.files_for_qlty()?;
 
         let settings = Settings {
             functions: self.functions,
diff --git a/qlty-cli/src/commands/parse.rs b/qlty-cli/src/commands/parse.rs
index 8dd0ef509..249475f63 100644
--- a/qlty-cli/src/commands/parse.rs
+++ b/qlty-cli/src/commands/parse.rs
@@ -34,7 +34,7 @@ impl Parse {
         };
 
         let mut workspace_entry_finder = workspace_entry_finder_builder.build()?;
-        let workspace_entries = workspace_entry_finder.workspace_entries()?;
+        let workspace_entries = workspace_entry_finder.workspace_entries("qlty")?;
         let source_file = File::from_workspace_entry(workspace_entries.first().unwrap())?;
 
         let stdout = std::io::stdout();
diff --git a/qlty-cli/src/commands/smells.rs b/qlty-cli/src/commands/smells.rs
index 7d833606b..d241012b5 100644
--- a/qlty-cli/src/commands/smells.rs
+++ b/qlty-cli/src/commands/smells.rs
@@ -80,7 +80,7 @@ impl Smells {
             exclude_tests: !self.include_tests,
             ..Default::default()
         };
-        let files = workspace_entry_finder_builder.build()?.files()?;
+        let files = workspace_entry_finder_builder.build()?.files_for_qlty()?;
 
         steps.start(
             EYES,
@@ -194,7 +194,10 @@ impl Smells {
         let planner = qlty_smells::duplication::Planner::new(
             config,
             &settings,
-            workspace_entry_finder_builder.build()?.files()?.to_vec(),
+            workspace_entry_finder_builder
+                .build()?
+                .files_for_qlty()?
+                .to_vec(),
         )?;
         let plan = planner.compute()?;
 


Reviews:
user: login: copilot-pull-request-reviewer[bot]
body: ## Pull Request Overview

This PR updates the workspace entry matching and file retrieval functions to include a tool name parameter, ensuring that only relevant entries are processed. Key changes include:
- Replacing functions that previously defaulted to all files with variants that filter by a specific tool (e.g. using files_for_qlty and workspace_entries("qlty")).
- Updating the WorkspaceEntryMatcher trait and its implementations to accept a tool name parameter.
- Propagating these API changes across the qlty-cli, qlty-check, and qlty-analysis modules.

### Reviewed Changes

Copilot reviewed 17 out of 17 changed files in this pull request and generated 2 comments.

| File                                                    | Description                                                        |
| ------------------------------------------------------- | ------------------------------------------------------------------ |
| qlty-cli/src/commands/smells.rs, parse.rs, metrics.rs, build.rs | Update file retrieval calls to use the new tool-specific methods     |
| qlty-check/src/planner/plugin.rs, driver.rs             | Update workspace entry calls by passing the tool name to finder methods |
| qlty-analysis/src/workspace_entries/workspace_entry_finder.rs | Update API for workspace entries to include tool name filtering       |
| qlty-analysis/src/workspace_entries/matchers/*          | Update matcher implementations for the extended matches signature   |




state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-16T20:20:28Z
user: login: brynary
state: APPROVED
author_association: MEMBER
submitted_at: 2025-05-16T20:27:01Z

Review comments:
diff_hunk: @@ -37,8 +37,8 @@ impl WorkspaceEntryFinder {
         }
     }
 
-    pub fn files(&mut self) -> Result<Vec<Arc<File>>> {
-        let workspace_entries = self.workspace_entries()?;
+    pub fn files_for_qlty(&mut self) -> Result<Vec<Arc<File>>> {
path: qlty-analysis/src/workspace_entries/workspace_entry_finder.rs
user: login: Copilot
body: [nitpick] Consider renaming 'files_for_qlty' to a more generic method name (e.g. 'files_for') that accepts a tool name parameter, to make the API more flexible for future tool integrations.
created_at: 2025-05-16T20:20:27Z
author_association: CONTRIBUTOR
diff_hunk: @@ -54,20 +54,20 @@ impl WorkspaceEntryFinder {
         Ok(files)
     }
 
-    pub fn workspace_entries(&mut self) -> Result<Vec<WorkspaceEntry>> {
-        self.compute_workspace_entries()?;
+    pub fn workspace_entries(&mut self, tool_name: &str) -> Result<Vec<WorkspaceEntry>> {
path: qlty-analysis/src/workspace_entries/workspace_entry_finder.rs
user: login: Copilot
body: [nitpick] Since the tool name is now passed as a string literal in multiple locations, consider defining constants for common tool names (e.g. 'qlty', 'test') to reduce potential typos and improve maintainability.
created_at: 2025-05-16T20:20:28Z
author_association: CONTRIBUTOR

PR comments:
user: login: qltysh[bot]
created_at: 2025-05-16T20:22:20Z
body: <p><strong>Diff Coverage for macos-15:</strong> The code coverage on the diff in this pull request is <strong>90.4%</strong>.</p>
<p><strong>Total Coverage for macos-15:</strong> This PR will not change total coverage.</p>

  <details>
  <summary>File Coverage Changes</summary>

  | Path  | File Coverage Δ | Indirect |
  | ------------- | ------------- | ------------- |
 | qlty-analysis/src/workspace_entries/matchers/or_matcher.rs | 1.6 |  |
 | qlty-check/src/planner/driver.rs | -0.4 |  |
 | qlty-check/src/planner/plugin.rs | -1.0 |  |
 | qlty-cli/src/commands/build.rs | 0.1 |  |
 | qlty-cli/src/commands/smells.rs | 0.3 |  |
</details>

<details>
  <summary>🛟 Help</summary>
  <ul>
    <li>
      <p>
        <strong>Diff Coverage:</strong> Coverage for added or modified lines of code (excludes deleted files). <a href="https://qlty.sh/d/diff-coverage">
          Learn more.
          </a>
      </p>
    </li>
    <li>
      <p>
        <strong>Total Coverage:</strong> Coverage for the whole repository, calculated as the sum of all File Coverage.
        <a href="https://qlty.sh/d/total-coverage">
           Learn more.
        </a>
      </p>
    </li>
    <li>
      <p>
        <strong>File Coverage:</strong> Covered Lines divided by Covered Lines plus Missed Lines. (Excludes non-executable lines including blank lines and comments.)
      </p>
      <ul>
        <li>
        <p>
          <strong>Indirect Changes:</strong> Changes to File Coverage for files that were not modified in this PR. <a href="https://qlty.sh/d/indirect-coverage-changes">
            Learn more.
            </a>
        </p>
      </li>
      </ul>
    </li>
  </ul>
</details>
  

<a href="#coverage-summary-comment-macos-15"></a>
author_association: CONTRIBUTOR
user: login: qltysh[bot]
created_at: 2025-05-16T20:22:39Z
body: <p><strong>Diff Coverage for ubuntu-latest:</strong> The code coverage on the diff in this pull request is <strong>90.4%</strong>.</p>
<p><strong>Total Coverage for ubuntu-latest:</strong> This PR will not change total coverage.</p>

  <details>
  <summary>File Coverage Changes</summary>

  | Path  | File Coverage Δ | Indirect |
  | ------------- | ------------- | ------------- |
 | qlty-analysis/src/workspace_entries/matchers/or_matcher.rs | 1.6 |  |
 | qlty-check/src/planner/driver.rs | -0.4 |  |
 | qlty-check/src/planner/plugin.rs | -1.0 |  |
 | qlty-cli/src/commands/build.rs | 0.1 |  |
 | qlty-cli/src/commands/smells.rs | 0.3 |  |
</details>

<details>
  <summary>🛟 Help</summary>
  <ul>
    <li>
      <p>
        <strong>Diff Coverage:</strong> Coverage for added or modified lines of code (excludes deleted files). <a href="https://qlty.sh/d/diff-coverage">
          Learn more.
          </a>
      </p>
    </li>
    <li>
      <p>
        <strong>Total Coverage:</strong> Coverage for the whole repository, calculated as the sum of all File Coverage.
        <a href="https://qlty.sh/d/total-coverage">
           Learn more.
        </a>
      </p>
    </li>
    <li>
      <p>
        <strong>File Coverage:</strong> Covered Lines divided by Covered Lines plus Missed Lines. (Excludes non-executable lines including blank lines and comments.)
      </p>
      <ul>
        <li>
        <p>
          <strong>Indirect Changes:</strong> Changes to File Coverage for files that were not modified in this PR. <a href="https://qlty.sh/d/indirect-coverage-changes">
            Learn more.
            </a>
        </p>
      </li>
      </ul>
    </li>
  </ul>
</details>
  

<a href="#coverage-summary-comment-ubuntu-latest"></a>
author_association: CONTRIBUTOR