diagnostically note source of overruling outer forbid
When we emit E0453 (lint level attribute overruled by outer `forbid` lint level), it could be helpful to note where the `forbid` level was set, for the convenience of users who, e.g., believe that the correct fix is to weaken the `forbid` to `deny`.
This commit is contained in:
parent
7f7969ef44
commit
661b4f09fb
3 changed files with 19 additions and 6 deletions
|
@ -29,7 +29,7 @@ use dep_graph::DepNode;
|
||||||
use middle::privacy::AccessLevels;
|
use middle::privacy::AccessLevels;
|
||||||
use ty::TyCtxt;
|
use ty::TyCtxt;
|
||||||
use session::{config, early_error, Session};
|
use session::{config, early_error, Session};
|
||||||
use lint::{Level, LevelSource, Lint, LintId, LintPass};
|
use lint::{Level, LevelSource, Lint, LintId, LintPass, LintSource};
|
||||||
use lint::{EarlyLintPassObject, LateLintPassObject};
|
use lint::{EarlyLintPassObject, LateLintPassObject};
|
||||||
use lint::{Default, CommandLine, Node, Allow, Warn, Deny, Forbid};
|
use lint::{Default, CommandLine, Node, Allow, Warn, Deny, Forbid};
|
||||||
use lint::builtin;
|
use lint::builtin;
|
||||||
|
@ -599,13 +599,23 @@ pub trait LintContext: Sized {
|
||||||
};
|
};
|
||||||
|
|
||||||
for (lint_id, level, span) in v {
|
for (lint_id, level, span) in v {
|
||||||
let now = self.lints().get_level_source(lint_id).0;
|
let (now, now_source) = self.lints().get_level_source(lint_id);
|
||||||
if now == Forbid && level != Forbid {
|
if now == Forbid && level != Forbid {
|
||||||
let lint_name = lint_id.as_str();
|
let lint_name = lint_id.as_str();
|
||||||
span_err!(self.sess(), span, E0453,
|
let mut diag_builder = struct_span_err!(self.sess(), span, E0453,
|
||||||
"{}({}) overruled by outer forbid({})",
|
"{}({}) overruled by outer forbid({})",
|
||||||
level.as_str(), lint_name,
|
level.as_str(), lint_name,
|
||||||
lint_name);
|
lint_name);
|
||||||
|
match now_source {
|
||||||
|
LintSource::Default => &mut diag_builder,
|
||||||
|
LintSource::Node(forbid_source_span) => {
|
||||||
|
diag_builder.span_note(forbid_source_span,
|
||||||
|
"`forbid` lint level set here")
|
||||||
|
},
|
||||||
|
LintSource::CommandLine => {
|
||||||
|
diag_builder.note("`forbid` lint level was set on command line")
|
||||||
|
}
|
||||||
|
}.emit()
|
||||||
} else if now != level {
|
} else if now != level {
|
||||||
let src = self.lints().get_level_source(lint_id).1;
|
let src = self.lints().get_level_source(lint_id).1;
|
||||||
self.level_stack().push((lint_id, (now, src)));
|
self.level_stack().push((lint_id, (now, src)));
|
||||||
|
|
|
@ -14,6 +14,8 @@
|
||||||
#![feature(plugin)]
|
#![feature(plugin)]
|
||||||
#![plugin(lint_plugin_test)]
|
#![plugin(lint_plugin_test)]
|
||||||
#![forbid(test_lint)]
|
#![forbid(test_lint)]
|
||||||
|
//~^ NOTE lint level defined here
|
||||||
|
//~| NOTE `forbid` lint level set here
|
||||||
|
|
||||||
fn lintme() { } //~ ERROR item is named 'lintme'
|
fn lintme() { } //~ ERROR item is named 'lintme'
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
#![forbid(deprecated)]
|
#![forbid(deprecated)]
|
||||||
|
//~^ NOTE `forbid` lint level set here
|
||||||
|
|
||||||
#[allow(deprecated)] //~ ERROR allow(deprecated) overruled by outer forbid(deprecated)
|
#[allow(deprecated)] //~ ERROR allow(deprecated) overruled by outer forbid(deprecated)
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue