summaryrefslogtreecommitdiff
path: root/cli/tools/coverage/mod.rs
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2024-01-04 08:49:17 -0500
committerGitHub <noreply@github.com>2024-01-04 08:49:17 -0500
commit0245ac08d419d462ba7cf9dd4153fcea9a30e843 (patch)
tree3ad8455cc2b1a7467ed6b58a0a274b3ae4457ce4 /cli/tools/coverage/mod.rs
parent7fc6f4902a48a83a341d4384dcce251ffbd06151 (diff)
perf(coverage): faster source mapping (#21783)
I did not measure this change (O(n) to O(log n)), but mainly this should be slightly more accurate at getting the line number.
Diffstat (limited to 'cli/tools/coverage/mod.rs')
-rw-r--r--cli/tools/coverage/mod.rs49
1 files changed, 24 insertions, 25 deletions
diff --git a/cli/tools/coverage/mod.rs b/cli/tools/coverage/mod.rs
index 9c42a5fd9..9f5c142e7 100644
--- a/cli/tools/coverage/mod.rs
+++ b/cli/tools/coverage/mod.rs
@@ -220,20 +220,11 @@ fn generate_coverage_report(
continue;
}
- let dest_line_index = text_lines.line_index(
- text_lines
- .byte_index_from_char_index(function.ranges[0].start_char_offset),
+ let line_index = range_to_src_line_index(
+ &function.ranges[0],
+ &text_lines,
+ &maybe_source_map,
);
- let line_index = if let Some(source_map) = maybe_source_map.as_ref() {
- source_map
- .tokens()
- .find(|token| token.get_dst_line() as usize == dest_line_index)
- .map(|token| token.get_src_line() as usize)
- .unwrap_or(0)
- } else {
- dest_line_index
- };
-
coverage_report.named_functions.push(FunctionCoverageItem {
name: function.function_name.clone(),
line_index,
@@ -244,18 +235,8 @@ fn generate_coverage_report(
for (block_number, function) in script_coverage.functions.iter().enumerate() {
let block_hits = function.ranges[0].count;
for (branch_number, range) in function.ranges[1..].iter().enumerate() {
- let source_line_index = text_lines.line_index(
- text_lines.byte_index_from_char_index(range.start_char_offset),
- );
- let line_index = if let Some(source_map) = maybe_source_map.as_ref() {
- source_map
- .tokens()
- .find(|token| token.get_dst_line() as usize == source_line_index)
- .map(|token| token.get_src_line() as usize)
- .unwrap_or(0)
- } else {
- source_line_index
- };
+ let line_index =
+ range_to_src_line_index(range, &text_lines, &maybe_source_map);
// From https://manpages.debian.org/unstable/lcov/geninfo.1.en.html:
//
@@ -370,6 +351,24 @@ fn generate_coverage_report(
coverage_report
}
+fn range_to_src_line_index(
+ range: &cdp::CoverageRange,
+ text_lines: &TextLines,
+ maybe_source_map: &Option<SourceMap>,
+) -> usize {
+ let source_lc = text_lines.line_and_column_index(
+ text_lines.byte_index_from_char_index(range.start_char_offset),
+ );
+ if let Some(source_map) = maybe_source_map.as_ref() {
+ source_map
+ .lookup_token(source_lc.line_index as u32, source_lc.column_index as u32)
+ .map(|token| token.get_src_line() as usize)
+ .unwrap_or(0)
+ } else {
+ source_lc.line_index
+ }
+}
+
fn collect_coverages(
files: FileFlags,
) -> Result<Vec<cdp::ScriptCoverage>, AnyError> {