summaryrefslogtreecommitdiff
path: root/cli/tools/coverage.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/tools/coverage.rs')
-rw-r--r--cli/tools/coverage.rs63
1 files changed, 41 insertions, 22 deletions
diff --git a/cli/tools/coverage.rs b/cli/tools/coverage.rs
index 53385b482..7cf98cab2 100644
--- a/cli/tools/coverage.rs
+++ b/cli/tools/coverage.rs
@@ -93,7 +93,7 @@ impl CoverageCollector {
// TODO(caspervonb) all of these structs can and should be made private, possibly moved to
// inspector::protocol.
-#[derive(Debug, Serialize, Deserialize)]
+#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct CoverageRange {
pub start_offset: usize,
@@ -101,7 +101,7 @@ pub struct CoverageRange {
pub count: usize,
}
-#[derive(Debug, Serialize, Deserialize)]
+#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct FunctionCoverage {
pub function_name: String,
@@ -109,7 +109,7 @@ pub struct FunctionCoverage {
pub is_block_coverage: bool,
}
-#[derive(Debug, Serialize, Deserialize)]
+#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct ScriptCoverage {
pub script_id: String,
@@ -117,7 +117,7 @@ pub struct ScriptCoverage {
pub functions: Vec<FunctionCoverage>,
}
-#[derive(Debug, Serialize, Deserialize)]
+#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct Coverage {
pub script_coverage: ScriptCoverage,
@@ -237,29 +237,48 @@ fn collect_coverages(dir: &PathBuf) -> Result<Vec<Coverage>, AnyError> {
let entries = fs::read_dir(dir)?;
for entry in entries {
let json = fs::read_to_string(entry.unwrap().path())?;
- let coverage: Coverage = serde_json::from_str(&json)?;
-
- coverages.push(coverage);
- }
-
- // TODO(caspervonb) drain_filter would make this cleaner, its nightly at the moment.
- if coverages.len() > 1 {
- coverages.sort_by_key(|k| k.script_coverage.url.clone());
-
- for i in (1..coverages.len() - 1).rev() {
- if coverages[i].script_coverage.url
- == coverages[i - 1].script_coverage.url
- {
- let current = coverages.remove(i);
- let previous = &mut coverages[i - 1];
-
- for function in current.script_coverage.functions {
- previous.script_coverage.functions.push(function);
+ let new_coverage: Coverage = serde_json::from_str(&json)?;
+
+ let existing_coverage = coverages
+ .iter_mut()
+ .find(|x| x.script_coverage.url == new_coverage.script_coverage.url);
+
+ if let Some(existing_coverage) = existing_coverage {
+ for new_function in new_coverage.script_coverage.functions {
+ let existing_function = existing_coverage
+ .script_coverage
+ .functions
+ .iter_mut()
+ .find(|x| x.function_name == new_function.function_name);
+
+ if let Some(existing_function) = existing_function {
+ for new_range in new_function.ranges {
+ let existing_range =
+ existing_function.ranges.iter_mut().find(|x| {
+ x.start_offset == new_range.start_offset
+ && x.end_offset == new_range.end_offset
+ });
+
+ if let Some(existing_range) = existing_range {
+ existing_range.count += new_range.count;
+ } else {
+ existing_function.ranges.push(new_range);
+ }
+ }
+ } else {
+ existing_coverage
+ .script_coverage
+ .functions
+ .push(new_function);
}
}
+ } else {
+ coverages.push(new_coverage);
}
}
+ coverages.sort_by_key(|k| k.script_coverage.url.clone());
+
Ok(coverages)
}