summaryrefslogtreecommitdiff
path: root/cli/tools/coverage/mod.rs
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2022-07-11 19:02:11 -0400
committerGitHub <noreply@github.com>2022-07-11 19:02:11 -0400
commit82431062fa6dd82679e1903dda4e33103a0299da (patch)
tree1b0c0784bba6d7e767110b352a6616020f962d58 /cli/tools/coverage/mod.rs
parentb68115db3a7c87518c59e6db7fa0ca2f1e3b4ca7 (diff)
fix(coverage): better handling of multi-byte characters (#15159)
Diffstat (limited to 'cli/tools/coverage/mod.rs')
-rw-r--r--cli/tools/coverage/mod.rs33
1 files changed, 20 insertions, 13 deletions
diff --git a/cli/tools/coverage/mod.rs b/cli/tools/coverage/mod.rs
index 0b1a9bc35..bba7271f5 100644
--- a/cli/tools/coverage/mod.rs
+++ b/cli/tools/coverage/mod.rs
@@ -202,16 +202,18 @@ fn generate_coverage_report(
continue;
}
- let source_line_index =
- text_lines.line_index(function.ranges[0].start_offset);
+ let dest_line_index = text_lines.line_index(
+ text_lines
+ .byte_index_from_char_index(function.ranges[0].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)
+ .find(|token| token.get_dst_line() as usize == dest_line_index)
.map(|token| token.get_src_line() as usize)
.unwrap_or(0)
} else {
- source_line_index
+ dest_line_index
};
coverage_report.named_functions.push(FunctionCoverageItem {
@@ -224,7 +226,9 @@ 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(range.start_offset);
+ 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()
@@ -264,11 +268,14 @@ fn generate_coverage_report(
// parts of a line in color (word diff style) instead of the entire line.
let mut line_counts = Vec::with_capacity(text_lines.lines_count());
for line_index in 0..text_lines.lines_count() {
- let line_start_offset = text_lines.line_start(line_index);
- let line_end_offset = text_lines.line_end(line_index);
+ let line_start_byte_offset = text_lines.line_start(line_index);
+ let line_start_char_offset = text_lines.char_index(line_start_byte_offset);
+ let line_end_byte_offset = text_lines.line_end(line_index);
+ let line_end_char_offset = text_lines.char_index(line_end_byte_offset);
let ignore = comment_ranges.iter().any(|range| {
- range.start <= line_start_offset && range.end >= line_end_offset
- }) || script_source[line_start_offset..line_end_offset]
+ range.start <= line_start_byte_offset && range.end >= line_end_byte_offset
+ }) || script_source
+ [line_start_byte_offset..line_end_byte_offset]
.trim()
.is_empty();
let mut count = 0;
@@ -280,8 +287,8 @@ fn generate_coverage_report(
// as long as the code has been evaluated.
for function in &script_coverage.functions {
for range in &function.ranges {
- if range.start_offset <= line_start_offset
- && range.end_offset >= line_end_offset
+ if range.start_char_offset <= line_start_char_offset
+ && range.end_char_offset >= line_end_char_offset
{
count += range.count;
}
@@ -295,8 +302,8 @@ fn generate_coverage_report(
continue;
}
- let overlaps = range.start_offset < line_end_offset
- && range.end_offset > line_start_offset;
+ let overlaps = range.start_char_offset < line_end_char_offset
+ && range.end_char_offset > line_start_char_offset;
if overlaps {
count = 0;
}