1
1
use crate :: clean;
2
- use crate :: config:: OutputFormat ;
3
2
use crate :: core:: DocContext ;
4
3
use crate :: fold:: { self , DocFolder } ;
5
4
use crate :: html:: markdown:: { find_testable_code, ErrorCodes } ;
6
5
use crate :: passes:: doc_test_lints:: { should_have_doc_example, Tests } ;
7
6
use crate :: passes:: Pass ;
8
- use rustc_span:: symbol:: { sym, Ident } ;
7
+ use rustc_lint:: builtin:: MISSING_DOCS ;
8
+ use rustc_middle:: lint:: LintSource ;
9
+ use rustc_session:: lint;
10
+ use rustc_span:: symbol:: sym;
9
11
use rustc_span:: FileName ;
10
12
use serde:: Serialize ;
11
13
@@ -19,10 +21,10 @@ pub const CALCULATE_DOC_COVERAGE: Pass = Pass {
19
21
} ;
20
22
21
23
fn calculate_doc_coverage ( krate : clean:: Crate , ctx : & DocContext < ' _ > ) -> clean:: Crate {
22
- let mut calc = CoverageCalculator :: new ( ) ;
24
+ let mut calc = CoverageCalculator :: new ( ctx ) ;
23
25
let krate = calc. fold_crate ( krate) ;
24
26
25
- calc. print_results ( ctx . renderinfo . borrow ( ) . output_format ) ;
27
+ calc. print_results ( ) ;
26
28
27
29
krate
28
30
}
@@ -97,8 +99,9 @@ impl ops::AddAssign for ItemCount {
97
99
}
98
100
}
99
101
100
- struct CoverageCalculator {
102
+ struct CoverageCalculator < ' a , ' b > {
101
103
items : BTreeMap < FileName , ItemCount > ,
104
+ ctx : & ' a DocContext < ' b > ,
102
105
}
103
106
104
107
fn limit_filename_len ( filename : String ) -> String {
@@ -111,9 +114,9 @@ fn limit_filename_len(filename: String) -> String {
111
114
}
112
115
}
113
116
114
- impl CoverageCalculator {
115
- fn new ( ) -> CoverageCalculator {
116
- CoverageCalculator { items : Default :: default ( ) }
117
+ impl < ' a , ' b > CoverageCalculator < ' a , ' b > {
118
+ fn new ( ctx : & ' a DocContext < ' b > ) -> CoverageCalculator < ' a , ' b > {
119
+ CoverageCalculator { items : Default :: default ( ) , ctx }
117
120
}
118
121
119
122
fn to_json ( & self ) -> String {
@@ -127,7 +130,8 @@ impl CoverageCalculator {
127
130
. expect ( "failed to convert JSON data to string" )
128
131
}
129
132
130
- fn print_results ( & self , output_format : Option < OutputFormat > ) {
133
+ fn print_results ( & self ) {
134
+ let output_format = self . ctx . renderinfo . borrow ( ) . output_format ;
131
135
if output_format. map ( |o| o. is_json ( ) ) . unwrap_or_else ( || false ) {
132
136
println ! ( "{}" , self . to_json( ) ) ;
133
137
return ;
@@ -181,7 +185,7 @@ impl CoverageCalculator {
181
185
}
182
186
}
183
187
184
- impl fold:: DocFolder for CoverageCalculator {
188
+ impl < ' a , ' b > fold:: DocFolder for CoverageCalculator < ' a , ' b > {
185
189
fn fold_item ( & mut self , i : clean:: Item ) -> Option < clean:: Item > {
186
190
match i. inner {
187
191
_ if !i. def_id . is_local ( ) => {
@@ -232,15 +236,6 @@ impl fold::DocFolder for CoverageCalculator {
232
236
}
233
237
_ => {
234
238
let has_docs = !i. attrs . doc_strings . is_empty ( ) ;
235
- let should_have_docs = !i. attrs . other_attrs . iter ( ) . any ( |a| {
236
- a. has_name ( sym:: allow)
237
- && a. meta_item_list ( ) . iter ( ) . any ( |meta_list_item| {
238
- meta_list_item. iter ( ) . any ( |li| match li. ident ( ) {
239
- Some ( ident) => ident == Ident :: from_str ( "missing_docs" ) ,
240
- _ => false ,
241
- } )
242
- } )
243
- } ) ;
244
239
let mut tests = Tests { found_tests : 0 } ;
245
240
246
241
find_testable_code (
@@ -257,17 +252,16 @@ impl fold::DocFolder for CoverageCalculator {
257
252
) ;
258
253
259
254
let has_doc_example = tests. found_tests != 0 ;
255
+ let hir_id = self . ctx . tcx . hir ( ) . local_def_id_to_hir_id ( i. def_id . expect_local ( ) ) ;
256
+ let ( level, source) = self . ctx . tcx . lint_level_at_node ( MISSING_DOCS , hir_id) ;
257
+ let should_have_docs = level != lint:: Level :: Allow || !matches ! ( source, LintSource :: Node ( ..) ) ;
260
258
debug ! ( "counting {:?} {:?} in {}" , i. type_( ) , i. name, i. source. filename) ;
261
259
self . items . entry ( i. source . filename . clone ( ) ) . or_default ( ) . count_item (
262
260
has_docs,
263
261
has_doc_example,
264
262
should_have_doc_example ( & i. inner ) ,
265
263
should_have_docs,
266
264
) ;
267
-
268
- if !should_have_docs {
269
- return Some ( i) ;
270
- }
271
265
}
272
266
}
273
267
0 commit comments