Spanview needs the relevant body_span used for coverage

The coverage body_span doesn't always match the function body_span.
This commit is contained in:
Rich Kadel 2021-05-09 23:08:31 -07:00
parent 9daf546b77
commit e354cca696
3 changed files with 11 additions and 8 deletions

View file

@ -120,6 +120,7 @@ use rustc_index::vec::Idx;
use rustc_middle::mir::coverage::*;
use rustc_middle::mir::{self, BasicBlock, TerminatorKind};
use rustc_middle::ty::TyCtxt;
use rustc_span::Span;
use std::iter;
use std::lazy::SyncOnceCell;
@ -636,6 +637,7 @@ pub(super) fn dump_coverage_spanview(
mir_body: &mir::Body<'tcx>,
basic_coverage_blocks: &CoverageGraph,
pass_name: &str,
body_span: Span,
coverage_spans: &Vec<CoverageSpan>,
) {
let mir_source = mir_body.source;
@ -647,7 +649,7 @@ pub(super) fn dump_coverage_spanview(
let crate_name = tcx.crate_name(def_id.krate);
let item_name = tcx.def_path(def_id).to_filename_friendly_no_crate();
let title = format!("{}.{} - Coverage Spans", crate_name, item_name);
spanview::write_document(tcx, def_id, span_viewables, &title, &mut file)
spanview::write_document(tcx, body_span, span_viewables, &title, &mut file)
.expect("Unexpected IO error dumping coverage spans as HTML");
}

View file

@ -204,6 +204,7 @@ impl<'a, 'tcx> Instrumentor<'a, 'tcx> {
self.mir_body,
&self.basic_coverage_blocks,
self.pass_name,
body_span,
&coverage_spans,
);
}

View file

@ -131,7 +131,7 @@ where
}
}
}
write_document(tcx, def_id, span_viewables, title, w)?;
write_document(tcx, fn_span(tcx, def_id), span_viewables, title, w)?;
Ok(())
}
@ -139,7 +139,7 @@ where
/// list `SpanViewable`s.
pub fn write_document<'tcx, W>(
tcx: TyCtxt<'tcx>,
def_id: DefId,
spanview_span: Span,
mut span_viewables: Vec<SpanViewable>,
title: &str,
w: &mut W,
@ -147,16 +147,16 @@ pub fn write_document<'tcx, W>(
where
W: Write,
{
let fn_span = fn_span(tcx, def_id);
let mut from_pos = fn_span.lo();
let end_pos = fn_span.hi();
let mut from_pos = spanview_span.lo();
let end_pos = spanview_span.hi();
let source_map = tcx.sess.source_map();
let start = source_map.lookup_char_pos(from_pos);
let indent_to_initial_start_col = " ".repeat(start.col.to_usize());
debug!(
"fn_span source is:\n{}{}",
"spanview_span={:?}; source is:\n{}{}",
spanview_span,
indent_to_initial_start_col,
source_map.span_to_snippet(fn_span).expect("function should have printable source")
source_map.span_to_snippet(spanview_span).expect("function should have printable source")
);
writeln!(w, "{}", HEADER)?;
writeln!(w, "<title>{}</title>", title)?;