use crate::hir::intravisit::{self, NestedVisitorMap, Visitor};
use syntax::symbol::Symbol;
use syntax::ast::{Attribute, MetaItem, MetaItemKind};
-use syntax_pos::Span;
+use syntax_pos::{Span, symbols};
use rustc_data_structures::fx::{FxHashSet, FxHashMap};
use rustc_macros::HashStable;
use errors::DiagnosticId;
}
fn extract(&self, attr: &Attribute) -> Option<(Symbol, Option<Symbol>, Span)> {
- let stab_attrs = vec!["stable", "unstable", "rustc_const_unstable"];
+ let stab_attrs = [symbols::stable, symbols::unstable, symbols::rustc_const_unstable];
// Find a stability attribute (i.e., `#[stable (..)]`, `#[unstable (..)]`,
// `#[rustc_const_unstable (..)]`).
if let Some(stab_attr) = stab_attrs.iter().find(|stab_attr| {
- attr.check_name(stab_attr)
+ attr.check_name(**stab_attr)
}) {
let meta_item = attr.meta();
if let Some(MetaItem { node: MetaItemKind::List(ref metas), .. }) = meta_item {
fn is_active_attr(&mut self, attr: &Attribute) -> bool {
for attr_name in &self.attr_names {
- if attr.check_name(attr_name) && check_config(self.tcx, attr) {
+ if attr.check_name(*attr_name) && check_config(self.tcx, attr) {
return true;
}
}
let plugin_attributes = cx.sess().plugin_attributes.borrow_mut();
for &(ref name, ty) in plugin_attributes.iter() {
- if ty == AttributeType::Whitelisted && attr.check_name(&name) {
+ if ty == AttributeType::Whitelisted && attr.check_name(&**name) {
debug!("{:?} (plugin attr) is whitelisted with ty {:?}", name, ty);
break;
}
}
/// Returns `true` if this list item is a MetaItem with a name of `name`.
- pub fn check_name(&self, name: &str) -> bool {
+ pub fn check_name<T>(&self, name: T) -> bool
+ where
+ Path: PartialEq<T>,
+ {
self.meta_item().map_or(false, |meta_item| meta_item.check_name(name))
}
- /// Returns `true` if this list item is a MetaItem with a name of `name`.
- pub fn check_name_symbol(&self, name: Symbol) -> bool {
- self.meta_item().map_or(false, |meta_item| meta_item.check_name_symbol(name))
- }
-
/// For a single-segment meta-item returns its name, otherwise returns `None`.
pub fn ident(&self) -> Option<Ident> {
self.meta_item().and_then(|meta_item| meta_item.ident())
/// attribute is marked as used.
///
/// To check the attribute name without marking it used, use the `path` field directly.
- pub fn check_name(&self, name: &str) -> bool {
- let matches = self.path == name;
- if matches {
- mark_used(self);
- }
- matches
- }
-
- /// Returns `true` if the attribute's path matches the argument. If it matches, then the
- /// attribute is marked as used.
- ///
- /// To check the attribute name without marking it used, use the `path` field directly.
- pub fn check_name_symbol(&self, name: Symbol) -> bool {
+ pub fn check_name<T>(&self, name: T) -> bool
+ where
+ Path: PartialEq<T>,
+ {
let matches = self.path == name;
if matches {
mark_used(self);
}
}
- pub fn check_name(&self, name: &str) -> bool {
- self.path == name
- }
-
- pub fn check_name_symbol(&self, name: Symbol) -> bool {
+ pub fn check_name<T>(&self, name: T) -> bool
+ where
+ Path: PartialEq<T>,
+ {
self.path == name
}
}
} else if n == "doc" {
if let Some(content) = attr.meta_item_list() {
- if content.iter().any(|c| c.check_name_symbol(symbols::include)) {
+ if content.iter().any(|c| c.check_name(symbols::include)) {
gate_feature!(self, external_doc, attr.span,
"#[doc(include = \"...\")] is experimental"
);
// check for gated attributes
self.context.check_attribute(attr, false);
- if attr.check_name_symbol(symbols::doc) {
+ if attr.check_name(symbols::doc) {
if let Some(content) = attr.meta_item_list() {
- if content.len() == 1 && content[0].check_name_symbol(symbols::cfg) {
+ if content.len() == 1 && content[0].check_name(symbols::cfg) {
gate_feature_post!(&self, doc_cfg, attr.span,
"#[doc(cfg(...))] is experimental"
);
- } else if content.iter().any(|c| c.check_name_symbol(symbols::masked)) {
+ } else if content.iter().any(|c| c.check_name(symbols::masked)) {
gate_feature_post!(&self, doc_masked, attr.span,
"#[doc(masked)] is experimental"
);
- } else if content.iter().any(|c| c.check_name_symbol(symbols::spotlight)) {
+ } else if content.iter().any(|c| c.check_name(symbols::spotlight)) {
gate_feature_post!(&self, doc_spotlight, attr.span,
"#[doc(spotlight)] is experimental"
);
- } else if content.iter().any(|c| c.check_name_symbol(symbols::alias)) {
+ } else if content.iter().any(|c| c.check_name(symbols::alias)) {
gate_feature_post!(&self, doc_alias, attr.span,
"#[doc(alias = \"...\")] is experimental"
);
- } else if content.iter().any(|c| c.check_name_symbol(symbols::keyword)) {
+ } else if content.iter().any(|c| c.check_name(symbols::keyword)) {
gate_feature_post!(&self, doc_keyword, attr.span,
"#[doc(keyword = \"...\")] is experimental"
);
ast::ItemKind::Struct(..) => {
for attr in attr::filter_by_name(&i.attrs[..], "repr") {
for item in attr.meta_item_list().unwrap_or_else(Vec::new) {
- if item.check_name_symbol(symbols::simd) {
+ if item.check_name(symbols::simd) {
gate_feature_post!(&self, repr_simd, attr.span,
"SIMD types are experimental and possibly buggy");
}
ast::ItemKind::Enum(..) => {
for attr in attr::filter_by_name(&i.attrs[..], "repr") {
for item in attr.meta_item_list().unwrap_or_else(Vec::new) {
- if item.check_name_symbol(symbols::align) {
+ if item.check_name(symbols::align) {
gate_feature_post!(&self, repr_align_enum, attr.span,
"`#[repr(align(x))]` on enums is experimental");
}
// Process the edition umbrella feature-gates first, to ensure
// `edition_enabled_features` is completed before it's queried.
for attr in krate_attrs {
- if !attr.check_name_symbol(symbols::feature) {
+ if !attr.check_name(symbols::feature) {
continue
}
}
for attr in krate_attrs {
- if !attr.check_name_symbol(symbols::feature) {
+ if !attr.check_name(symbols::feature) {
continue
}
};
if !allow_features {
for attr in &krate.attrs {
- if attr.check_name_symbol(symbols::feature) {
+ if attr.check_name(symbols::feature) {
let release_channel = option_env!("CFG_RELEASE_CHANNEL").unwrap_or("(unknown)");
span_err!(span_handler, attr.span, E0554,
"#![feature] may not be used on the {} release channel",
}
pub fn is_proc_macro_attr(attr: &ast::Attribute) -> bool {
- PROC_MACRO_KINDS.iter().any(|kind| attr.check_name(kind))
+ PROC_MACRO_KINDS.iter().any(|kind| attr.check_name(*kind))
}
impl<'a> CollectProcMacros<'a> {
// Other symbols that can be referred to with syntax_pos::symbols::*
Other {
- doc, cfg, masked, spotlight, alias, keyword, feature, include, simd, align,
+ doc, cfg, masked, spotlight, alias, keyword, feature, include, simd, align, stable,
+ unstable, rustc_const_unstable,
}
}