diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2022-07-11 19:02:11 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-11 19:02:11 -0400 |
commit | 82431062fa6dd82679e1903dda4e33103a0299da (patch) | |
tree | 1b0c0784bba6d7e767110b352a6616020f962d58 /cli/tools/coverage/mod.rs | |
parent | b68115db3a7c87518c59e6db7fa0ca2f1e3b4ca7 (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.rs | 33 |
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; } |