@@ -5,22 +5,40 @@ use tracing::debug;
5
5
use crate :: coverageinfo:: ffi;
6
6
use crate :: coverageinfo:: mapgen:: LocalFileId ;
7
7
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
+
8
31
/// Converts the span into its start line and column, and end line and column.
9
32
///
10
33
/// Line numbers and column numbers are 1-based. Unlike most column numbers emitted by
11
34
/// the compiler, these column numbers are denoted in **bytes**, because that's what
12
35
/// LLVM's `llvm-cov` tool expects to see in coverage maps.
13
36
///
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 ,
15
38
/// but it's hard to rule out entirely (especially in the presence of complex macros
16
39
/// or other expansions), and if it does happen then skipping a span or function is
17
40
/// 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 > {
24
42
let span = ensure_non_empty_span ( source_map, span) ?;
25
43
26
44
let lo = span. lo ( ) ;
@@ -44,8 +62,7 @@ pub(crate) fn make_coverage_span(
44
62
start_line = source_map. doctest_offset_line ( & file. name , start_line) ;
45
63
end_line = source_map. doctest_offset_line ( & file. name , end_line) ;
46
64
47
- check_coverage_span ( ffi:: CoverageSpan {
48
- file_id : file_id. as_u32 ( ) ,
65
+ check_coords ( Coords {
49
66
start_line : start_line as u32 ,
50
67
start_col : start_col as u32 ,
51
68
end_line : end_line as u32 ,
@@ -80,8 +97,8 @@ fn ensure_non_empty_span(source_map: &SourceMap, span: Span) -> Option<Span> {
80
97
/// it will immediately exit with a fatal error. To prevent that from happening,
81
98
/// discard regions that are improperly ordered, or might be interpreted in a
82
99
/// 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 ;
85
102
86
103
// Line/column coordinates are supposed to be 1-based. If we ever emit
87
104
// coordinates of 0, `llvm-cov` might misinterpret them.
@@ -94,17 +111,17 @@ fn check_coverage_span(cov_span: ffi::CoverageSpan) -> Option<ffi::CoverageSpan>
94
111
let is_ordered = ( start_line, start_col) <= ( end_line, end_col) ;
95
112
96
113
if all_nonzero && end_col_has_high_bit_unset && is_ordered {
97
- Some ( cov_span )
114
+ Some ( coords )
98
115
} else {
99
116
debug ! (
100
- ?cov_span ,
117
+ ?coords ,
101
118
?all_nonzero,
102
119
?end_col_has_high_bit_unset,
103
120
?is_ordered,
104
121
"Skipping source region that would be misinterpreted or rejected by LLVM"
105
122
) ;
106
123
// 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 :?}" ) ;
108
125
None
109
126
}
110
127
}
0 commit comments