Allow individual lints to opt into being reported in external macros

This commit is contained in:
Oliver Schneider 2018-07-20 22:45:52 +02:00
parent d63e9257b9
commit b6e0547680
2 changed files with 16 additions and 4 deletions

View file

@ -77,7 +77,8 @@ declare_lint! {
declare_lint! {
pub UNREACHABLE_CODE,
Warn,
"detects unreachable code paths"
"detects unreachable code paths",
report_in_external_macro
}
declare_lint! {
@ -216,7 +217,8 @@ declare_lint! {
declare_lint! {
pub DEPRECATED,
Warn,
"detects use of deprecated items"
"detects use of deprecated items",
report_in_external_macro
}
declare_lint! {

View file

@ -80,6 +80,9 @@ pub struct Lint {
/// Starting at the given edition, default to the given lint level. If this is `None`, then use
/// `default_level`.
pub edition_lint_opts: Option<(Edition, Level)>,
/// Whether this lint is reported even inside expansions of external macros
pub report_in_external_macro: bool,
}
impl Lint {
@ -100,11 +103,18 @@ impl Lint {
#[macro_export]
macro_rules! declare_lint {
($vis: vis $NAME: ident, $Level: ident, $desc: expr) => (
declare_lint!{$vis $NAME, $Level, $desc, false}
);
($vis: vis $NAME: ident, $Level: ident, $desc: expr, report_in_external_macro) => (
declare_lint!{$vis $NAME, $Level, $desc, true}
);
($vis: vis $NAME: ident, $Level: ident, $desc: expr, $external: expr) => (
$vis static $NAME: &$crate::lint::Lint = &$crate::lint::Lint {
name: stringify!($NAME),
default_level: $crate::lint::$Level,
desc: $desc,
edition_lint_opts: None,
report_in_external_macro: $external,
};
);
($vis: vis $NAME: ident, $Level: ident, $desc: expr,
@ -115,6 +125,7 @@ macro_rules! declare_lint {
default_level: $crate::lint::$Level,
desc: $desc,
edition_lint_opts: Some(($lint_edition, $crate::lint::Level::$edition_level)),
report_in_external_macro: false,
};
);
}
@ -583,8 +594,7 @@ pub fn struct_lint_level<'a>(sess: &'a Session,
// items to take care of (delete the macro invocation). As a result we have
// a few lints we whitelist here for allowing a lint even though it's in a
// foreign macro invocation.
} else if lint_id != LintId::of(builtin::UNREACHABLE_CODE) &&
lint_id != LintId::of(builtin::DEPRECATED) {
} else if !lint.report_in_external_macro {
if err.span.primary_spans().iter().any(|s| in_external_macro(sess, *s)) {
err.cancel();
}