External macro check for missing_*_doc

This commit is contained in:
Andre Bogus 2020-01-04 20:19:14 +01:00
parent d9d20138ec
commit 539cd25262
4 changed files with 58 additions and 9 deletions

View file

@ -2,7 +2,7 @@ use crate::utils::{match_type, paths, return_ty, span_lint};
use itertools::Itertools; use itertools::Itertools;
use rustc::hir; use rustc::hir;
use rustc::impl_lint_pass; use rustc::impl_lint_pass;
use rustc::lint::{LateContext, LateLintPass, LintArray, LintPass}; use rustc::lint::{in_external_macro, LateContext, LateLintPass, LintArray, LintPass};
use rustc_data_structures::fx::FxHashSet; use rustc_data_structures::fx::FxHashSet;
use rustc_session::declare_tool_lint; use rustc_session::declare_tool_lint;
use rustc_span::source_map::{BytePos, MultiSpan, Span}; use rustc_span::source_map::{BytePos, MultiSpan, Span};
@ -153,7 +153,9 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for DocMarkdown {
let headers = check_attrs(cx, &self.valid_idents, &item.attrs); let headers = check_attrs(cx, &self.valid_idents, &item.attrs);
match item.kind { match item.kind {
hir::ItemKind::Fn(ref sig, ..) => { hir::ItemKind::Fn(ref sig, ..) => {
if !in_external_macro(cx.tcx.sess, item.span) {
lint_for_missing_headers(cx, item.hir_id, item.span, sig, headers); lint_for_missing_headers(cx, item.hir_id, item.span, sig, headers);
}
}, },
hir::ItemKind::Impl(_, _, _, _, ref trait_ref, ..) => { hir::ItemKind::Impl(_, _, _, _, ref trait_ref, ..) => {
self.in_trait_impl = trait_ref.is_some(); self.in_trait_impl = trait_ref.is_some();
@ -171,13 +173,15 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for DocMarkdown {
fn check_trait_item(&mut self, cx: &LateContext<'a, 'tcx>, item: &'tcx hir::TraitItem<'_>) { fn check_trait_item(&mut self, cx: &LateContext<'a, 'tcx>, item: &'tcx hir::TraitItem<'_>) {
let headers = check_attrs(cx, &self.valid_idents, &item.attrs); let headers = check_attrs(cx, &self.valid_idents, &item.attrs);
if let hir::TraitItemKind::Method(ref sig, ..) = item.kind { if let hir::TraitItemKind::Method(ref sig, ..) = item.kind {
if !in_external_macro(cx.tcx.sess, item.span) {
lint_for_missing_headers(cx, item.hir_id, item.span, sig, headers); lint_for_missing_headers(cx, item.hir_id, item.span, sig, headers);
} }
} }
}
fn check_impl_item(&mut self, cx: &LateContext<'a, 'tcx>, item: &'tcx hir::ImplItem<'_>) { fn check_impl_item(&mut self, cx: &LateContext<'a, 'tcx>, item: &'tcx hir::ImplItem<'_>) {
let headers = check_attrs(cx, &self.valid_idents, &item.attrs); let headers = check_attrs(cx, &self.valid_idents, &item.attrs);
if self.in_trait_impl { if self.in_trait_impl || in_external_macro(cx.tcx.sess, item.span) {
return; return;
} }
if let hir::ImplItemKind::Method(ref sig, ..) = item.kind { if let hir::ImplItemKind::Method(ref sig, ..) = item.kind {

View file

@ -0,0 +1,8 @@
#[macro_export]
macro_rules! undocd_unsafe {
() => {
pub unsafe fn oy_vey() {
unimplemented!();
}
};
}

View file

@ -1,3 +1,8 @@
// aux-build:doc_unsafe_macros.rs
#[macro_use]
extern crate doc_unsafe_macros;
/// This is not sufficiently documented /// This is not sufficiently documented
pub unsafe fn destroy_the_planet() { pub unsafe fn destroy_the_planet() {
unimplemented!(); unimplemented!();
@ -63,6 +68,26 @@ impl Struct {
} }
} }
macro_rules! very_unsafe {
() => {
pub unsafe fn whee() {
unimplemented!()
}
/// # Safety
///
/// Please keep the seat belt fastened
pub unsafe fn drive() {
whee()
}
};
}
very_unsafe!();
// we don't lint code from external macros
undocd_unsafe!();
#[allow(clippy::let_unit_value)] #[allow(clippy::let_unit_value)]
fn main() { fn main() {
unsafe { unsafe {
@ -71,5 +96,6 @@ fn main() {
let mut universe = (); let mut universe = ();
apocalypse(&mut universe); apocalypse(&mut universe);
private_mod::only_crate_wide_accessible(); private_mod::only_crate_wide_accessible();
drive();
} }
} }

View file

@ -1,5 +1,5 @@
error: unsafe function's docs miss `# Safety` section error: unsafe function's docs miss `# Safety` section
--> $DIR/doc_unsafe.rs:2:1 --> $DIR/doc_unsafe.rs:7:1
| |
LL | / pub unsafe fn destroy_the_planet() { LL | / pub unsafe fn destroy_the_planet() {
LL | | unimplemented!(); LL | | unimplemented!();
@ -9,7 +9,7 @@ LL | | }
= note: `-D clippy::missing-safety-doc` implied by `-D warnings` = note: `-D clippy::missing-safety-doc` implied by `-D warnings`
error: unsafe function's docs miss `# Safety` section error: unsafe function's docs miss `# Safety` section
--> $DIR/doc_unsafe.rs:25:5 --> $DIR/doc_unsafe.rs:30:5
| |
LL | / pub unsafe fn republished() { LL | / pub unsafe fn republished() {
LL | | unimplemented!(); LL | | unimplemented!();
@ -17,18 +17,29 @@ LL | | }
| |_____^ | |_____^
error: unsafe function's docs miss `# Safety` section error: unsafe function's docs miss `# Safety` section
--> $DIR/doc_unsafe.rs:33:5 --> $DIR/doc_unsafe.rs:38:5
| |
LL | unsafe fn woefully_underdocumented(self); LL | unsafe fn woefully_underdocumented(self);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: unsafe function's docs miss `# Safety` section error: unsafe function's docs miss `# Safety` section
--> $DIR/doc_unsafe.rs:52:5 --> $DIR/doc_unsafe.rs:57:5
| |
LL | / pub unsafe fn more_undocumented_unsafe() -> Self { LL | / pub unsafe fn more_undocumented_unsafe() -> Self {
LL | | unimplemented!(); LL | | unimplemented!();
LL | | } LL | | }
| |_____^ | |_____^
error: aborting due to 4 previous errors error: unsafe function's docs miss `# Safety` section
--> $DIR/doc_unsafe.rs:73:9
|
LL | / pub unsafe fn whee() {
LL | | unimplemented!()
LL | | }
| |_________^
...
LL | very_unsafe!();
| --------------- in this macro invocation
error: aborting due to 5 previous errors