use std::slice;
use rustc_data_structures::sync::{RwLock, ReadGuard};
use lint::{EarlyLintPassObject, LateLintPassObject};
-use lint::{Level, Lint, LintId, LintPass, LintBuffer};
+use lint::{self, Level, Lint, LintId, LintPass, LintBuffer};
use lint::builtin::BuiltinLintDiagnostics;
use lint::levels::{LintLevelSets, LintLevelsBuilder};
use middle::privacy::AccessLevels;
/// Lint doesn't exist
NoLint,
/// The lint is either renamed or removed. This is the warning
- /// message.
- Warning(String),
+ /// message, and an optional new name (`None` if removed).
+ Warning(String, Option<String>),
}
impl LintStore {
level: Level) {
let db = match self.check_lint_name(lint_name) {
CheckLintNameResult::Ok(_) => None,
- CheckLintNameResult::Warning(ref msg) => {
+ CheckLintNameResult::Warning(ref msg, _) => {
Some(sess.struct_warn(msg))
},
CheckLintNameResult::NoLint => {
match self.by_name.get(lint_name) {
Some(&Renamed(ref new_name, _)) => {
CheckLintNameResult::Warning(
- format!("lint {} has been renamed to {}", lint_name, new_name)
+ format!("lint `{}` has been renamed to `{}`", lint_name, new_name),
+ Some(new_name.to_owned())
)
},
Some(&Removed(ref reason)) => {
CheckLintNameResult::Warning(
- format!("lint {} has been removed: {}", lint_name, reason)
+ format!("lint `{}` has been removed: `{}`", lint_name, reason),
+ None
)
},
None => {
/// Emit a lint at the appropriate level, for a particular span.
fn span_lint<S: Into<MultiSpan>>(&self, lint: &'static Lint, span: S, msg: &str) {
- self.lookup_and_emit(lint, Some(span), msg);
+ match self.lints().future_incompatible(LintId::of(lint)) {
+ Some(_) => self.lookup_and_emit(lint, Some(span), msg),
+ None => {
+ if !lint::in_external_macro(lint, span) {
+ self.lookup_and_emit(lint, Some(span), msg);
+ }
+ }
+ }
}
fn struct_span_lint<S: Into<MultiSpan>>(&self,