parse line coverage of library from lcov data
(lcov: &str, coverage: &mut CodeCoverage)
| 627 | |
| 628 | /// parse line coverage of library from lcov data |
| 629 | pub fn parse_lcov_data(lcov: &str, coverage: &mut CodeCoverage) -> Result<()> { |
| 630 | let mut de = crate::program::serde::Deserializer::from_input(lcov); |
| 631 | // fn: line of function begion, function name; |
| 632 | while de.is_next_token("SF:") { |
| 633 | let mut fns: Vec<(usize, &str)> = Vec::new(); |
| 634 | de.eat_token("SF:")?; |
| 635 | let _sf = de.consume_token_until("\n")?; |
| 636 | // parse function lines |
| 637 | while de.is_next_token("FN:") { |
| 638 | de.eat_token("FN:")?; |
| 639 | let line: usize = de.parse_number()?; |
| 640 | de.eat_token(",")?; |
| 641 | let f_name = de.consume_token_until("\n")?; |
| 642 | fns.push((line, f_name)); |
| 643 | } |
| 644 | fns.sort_by(|a, b| a.0.cmp(&b.0)); |
| 645 | |
| 646 | let mut line_counts: Vec<(usize, usize)> = Vec::new(); |
| 647 | de.eat_token_until("FNH:")?; |
| 648 | de.eat_token_until("DA:")?; |
| 649 | while de.is_next_token("DA:") { |
| 650 | de.eat_token("DA:")?; |
| 651 | let line: usize = de.parse_number()?; |
| 652 | de.eat_token(",")?; |
| 653 | let count: usize = de.parse_number()?; |
| 654 | line_counts.push((line, count)); |
| 655 | } |
| 656 | |
| 657 | let mut i = 0; |
| 658 | let mut j = 0; |
| 659 | while i < fns.len() && j < line_counts.len() { |
| 660 | let (cur_begin, f_name) = fns[i]; |
| 661 | let (line, count) = line_counts[j]; |
| 662 | if line < cur_begin { |
| 663 | j += 1; |
| 664 | continue; |
| 665 | } |
| 666 | // if cur fn is the last one |
| 667 | if i == fns.len() - 1 { |
| 668 | let func_cov = coverage.get_function_cov_mut(f_name).unwrap(); |
| 669 | func_cov.lines.push([line, count]); |
| 670 | j += 1; |
| 671 | } else { |
| 672 | let (next_begin, _) = fns[i + 1]; |
| 673 | // if line still in the range of f_name |
| 674 | if line < next_begin { |
| 675 | let func_cov = coverage |
| 676 | .get_function_cov_mut(f_name) |
| 677 | .unwrap_or_else(|| panic!("cannot obtain coverage of :{f_name}")); |
| 678 | func_cov.lines.push([line, count]); |
| 679 | j += 1; |
| 680 | // else get the next fn |
| 681 | } else { |
| 682 | i += 1; |
| 683 | } |
| 684 | } |
| 685 | } |
| 686 | de.consume_token_until("end_of_record")?; |
nothing calls this directly
no test coverage detected