Skip to content

Commit

Permalink
review changes
Browse files Browse the repository at this point in the history
  • Loading branch information
nrc committed Oct 27, 2016
1 parent 9322332 commit 8c4a39c
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 17 deletions.
29 changes: 22 additions & 7 deletions src/librustc_lint/builtin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,9 @@ use lint::{LintPass, LateLintPass, EarlyLintPass, EarlyContext};

use std::collections::HashSet;

use syntax::{ast, feature_gate};
use syntax::ast;
use syntax::attr;
use syntax::feature_gate::{AttributeGate, AttributeType, Stability, deprecated_attributes};
use syntax_pos::Span;

use rustc::hir::{self, PatKind};
Expand Down Expand Up @@ -749,7 +750,19 @@ declare_lint! {

/// Checks for use of attributes which have been deprecated.
#[derive(Clone)]
pub struct DeprecatedAttr;
pub struct DeprecatedAttr {
// This is not free to compute, so we want to keep it around, rather than
// compute it for every attribute.
depr_attrs: Vec<&'static (&'static str, AttributeType, AttributeGate)>,
}

impl DeprecatedAttr {
pub fn new() -> DeprecatedAttr {
DeprecatedAttr {
depr_attrs: deprecated_attributes(),
}
}
}

impl LintPass for DeprecatedAttr {
fn get_lints(&self) -> LintArray {
Expand All @@ -760,14 +773,16 @@ impl LintPass for DeprecatedAttr {
impl EarlyLintPass for DeprecatedAttr {
fn check_attribute(&mut self, cx: &EarlyContext, attr: &ast::Attribute) {
let name = &*attr.name();
for &(n, _, ref g) in feature_gate::KNOWN_ATTRIBUTES {
for &&(n, _, ref g) in &self.depr_attrs {
if n == name {
if let &feature_gate::AttributeGate::Gated(feature_gate::Stability::Deprecated,
ref name,
..) = g {
if let &AttributeGate::Gated(Stability::Deprecated(link),
ref name,
ref reason,
_) = g {
cx.span_lint(DEPRECATED,
attr.span,
&format!("use of deprecated attribute: {}", name));
&format!("use of deprecated attribute `{}`: {}. See {}",
name, reason, link));
}
return;
}
Expand Down
14 changes: 13 additions & 1 deletion src/librustc_lint/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
#![feature(rustc_private)]
#![feature(slice_patterns)]
#![feature(staged_api)]
#![feature(dotdot_in_tuple_patterns)]

#[macro_use]
extern crate syntax;
Expand Down Expand Up @@ -95,6 +96,14 @@ pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) {
)
}

macro_rules! add_early_builtin_with_new {
($sess:ident, $($name:ident),*,) => (
{$(
store.register_early_pass($sess, false, box $name::new());
)*}
)
}

macro_rules! add_lint_group {
($sess:ident, $name:expr, $($lint:ident),*) => (
store.register_group($sess, false, $name, vec![$(LintId::of($lint)),*]);
Expand All @@ -103,9 +112,12 @@ pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) {

add_early_builtin!(sess,
UnusedParens,
DeprecatedAttr,
);

add_early_builtin_with_new!(sess,
DeprecatedAttr,
);

add_builtin!(sess,
HardwiredLints,
WhileTrue,
Expand Down
31 changes: 23 additions & 8 deletions src/libsyntax/feature_gate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -377,17 +377,28 @@ pub enum AttributeGate {
Ungated,
}

#[derive(Copy, Clone, PartialEq, Eq)]
impl AttributeGate {
fn is_deprecated(&self) -> bool {
match *self {
Gated(Stability::Deprecated(_), ..) => true,
_ => false,
}
}
}

#[derive(Copy, Clone, PartialEq, Eq, Debug)]
pub enum Stability {
Unstable,
Deprecated,
// Argument is tracking issue link.
Deprecated(&'static str),
}

// fn() is not Debug
impl ::std::fmt::Debug for AttributeGate {
fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
match *self {
Gated(_, ref name, ref expl, _) => write!(fmt, "Gated({}, {})", name, expl),
Gated(ref stab, ref name, ref expl, _) =>
write!(fmt, "Gated({:?}, {}, {})", stab, name, expl),
Ungated => write!(fmt, "Ungated")
}
}
Expand All @@ -402,6 +413,10 @@ macro_rules! cfg_fn {
}}
}

pub fn deprecated_attributes() -> Vec<&'static (&'static str, AttributeType, AttributeGate)> {
KNOWN_ATTRIBUTES.iter().filter(|a| a.2.is_deprecated()).collect()
}

// Attributes that have a special meaning to rustc or rustdoc
pub const KNOWN_ATTRIBUTES: &'static [(&'static str, AttributeType, AttributeGate)] = &[
// Normal attributes
Expand Down Expand Up @@ -643,11 +658,11 @@ pub const KNOWN_ATTRIBUTES: &'static [(&'static str, AttributeType, AttributeGat
("link_section", Whitelisted, Ungated),
("no_builtins", Whitelisted, Ungated),
("no_mangle", Whitelisted, Ungated),
("no_debug", Whitelisted, Gated(Stability::Deprecated,
"no_debug",
"the `#[no_debug]` attribute \
is an experimental feature",
cfg_fn!(no_debug))),
("no_debug", Whitelisted, Gated(
Stability::Deprecated("https://github.com/rust-lang/rust/issues/29721"),
"no_debug",
"the `#[no_debug]` attribute is an experimental feature",
cfg_fn!(no_debug))),
("omit_gdb_pretty_printer_section", Whitelisted, Gated(Stability::Unstable,
"omit_gdb_pretty_printer_section",
"the `#[omit_gdb_pretty_printer_section]` \
Expand Down
1 change: 1 addition & 0 deletions src/libsyntax/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#![cfg_attr(stage0, feature(question_mark))]
#![feature(rustc_diagnostic_macros)]
#![feature(specialization)]
#![feature(dotdot_in_tuple_patterns)]

extern crate serialize;
extern crate term;
Expand Down
2 changes: 1 addition & 1 deletion src/test/compile-fail/feature-gate-no-debug-2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,5 @@
#![deny(deprecated)]
#![feature(no_debug)]

#[no_debug] //~ ERROR use of deprecated attribute: no_debug
#[no_debug] //~ ERROR use of deprecated attribute `no_debug`
fn main() {}

0 comments on commit 8c4a39c

Please sign in to comment.