@@ -5,22 +5,40 @@ use tracing::debug;
55use crate :: coverageinfo:: ffi;
66use crate :: coverageinfo:: mapgen:: LocalFileId ;
77
8+ /// Line and byte-column coordinates of a source code span within some file.
9+ /// The file itself must be tracked separately.
10+ #[ derive( Clone , Copy , Debug ) ]
11+ pub ( crate ) struct Coords {
12+ /// 1-based starting line of the source code span.
13+ pub ( crate ) start_line : u32 ,
14+ /// 1-based starting column (in bytes) of the source code span.
15+ pub ( crate ) start_col : u32 ,
16+ /// 1-based ending line of the source code span.
17+ pub ( crate ) end_line : u32 ,
18+ /// 1-based ending column (in bytes) of the source code span. High bit must be unset.
19+ pub ( crate ) end_col : u32 ,
20+ }
21+
22+ impl Coords {
23+ /// Attaches a local file ID to these coordinates to produce an `ffi::CoverageSpan`.
24+ pub ( crate ) fn make_coverage_span ( & self , local_file_id : LocalFileId ) -> ffi:: CoverageSpan {
25+ let & Self { start_line, start_col, end_line, end_col } = self ;
26+ let file_id = local_file_id. as_u32 ( ) ;
27+ ffi:: CoverageSpan { file_id, start_line, start_col, end_line, end_col }
28+ }
29+ }
30+
831/// Converts the span into its start line and column, and end line and column.
932///
1033/// Line numbers and column numbers are 1-based. Unlike most column numbers emitted by
1134/// the compiler, these column numbers are denoted in **bytes**, because that's what
1235/// LLVM's `llvm-cov` tool expects to see in coverage maps.
1336///
14- /// Returns `None` if the conversion failed for some reason. This shouldn't happen ,
37+ /// Returns `None` if the conversion failed for some reason. This should be uncommon ,
1538/// but it's hard to rule out entirely (especially in the presence of complex macros
1639/// or other expansions), and if it does happen then skipping a span or function is
1740/// better than an ICE or `llvm-cov` failure that the user might have no way to avoid.
18- pub ( crate ) fn make_coverage_span (
19- file_id : LocalFileId ,
20- source_map : & SourceMap ,
21- file : & SourceFile ,
22- span : Span ,
23- ) -> Option < ffi:: CoverageSpan > {
41+ pub ( crate ) fn make_coords ( source_map : & SourceMap , file : & SourceFile , span : Span ) -> Option < Coords > {
2442 let span = ensure_non_empty_span ( source_map, span) ?;
2543
2644 let lo = span. lo ( ) ;
@@ -44,8 +62,7 @@ pub(crate) fn make_coverage_span(
4462 start_line = source_map. doctest_offset_line ( & file. name , start_line) ;
4563 end_line = source_map. doctest_offset_line ( & file. name , end_line) ;
4664
47- check_coverage_span ( ffi:: CoverageSpan {
48- file_id : file_id. as_u32 ( ) ,
65+ check_coords ( Coords {
4966 start_line : start_line as u32 ,
5067 start_col : start_col as u32 ,
5168 end_line : end_line as u32 ,
@@ -80,8 +97,8 @@ fn ensure_non_empty_span(source_map: &SourceMap, span: Span) -> Option<Span> {
8097/// it will immediately exit with a fatal error. To prevent that from happening,
8198/// discard regions that are improperly ordered, or might be interpreted in a
8299/// way that makes them improperly ordered.
83- fn check_coverage_span ( cov_span : ffi :: CoverageSpan ) -> Option < ffi :: CoverageSpan > {
84- let ffi :: CoverageSpan { file_id : _ , start_line, start_col, end_line, end_col } = cov_span ;
100+ fn check_coords ( coords : Coords ) -> Option < Coords > {
101+ let Coords { start_line, start_col, end_line, end_col } = coords ;
85102
86103 // Line/column coordinates are supposed to be 1-based. If we ever emit
87104 // coordinates of 0, `llvm-cov` might misinterpret them.
@@ -94,17 +111,17 @@ fn check_coverage_span(cov_span: ffi::CoverageSpan) -> Option<ffi::CoverageSpan>
94111 let is_ordered = ( start_line, start_col) <= ( end_line, end_col) ;
95112
96113 if all_nonzero && end_col_has_high_bit_unset && is_ordered {
97- Some ( cov_span )
114+ Some ( coords )
98115 } else {
99116 debug ! (
100- ?cov_span ,
117+ ?coords ,
101118 ?all_nonzero,
102119 ?end_col_has_high_bit_unset,
103120 ?is_ordered,
104121 "Skipping source region that would be misinterpreted or rejected by LLVM"
105122 ) ;
106123 // If this happens in a debug build, ICE to make it easier to notice.
107- debug_assert ! ( false , "Improper source region: {cov_span :?}" ) ;
124+ debug_assert ! ( false , "Improper source region: {coords :?}" ) ;
108125 None
109126 }
110127}
0 commit comments