From 82431062fa6dd82679e1903dda4e33103a0299da Mon Sep 17 00:00:00 2001 From: David Sherret Date: Mon, 11 Jul 2022 19:02:11 -0400 Subject: fix(coverage): better handling of multi-byte characters (#15159) --- cli/tools/coverage/mod.rs | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) (limited to 'cli/tools/coverage/mod.rs') 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; } -- cgit v1.2.3