Rollup merge of #109358 - petrochenkov:nosess, r=cjgillot

rustc: Remove unused `Session` argument from some attribute functions

(One auxiliary test file containing one of these functions was unused, so I removed it instead of updating.)
This commit is contained in:
Matthias Krüger 2023-03-22 22:44:41 +01:00 committed by GitHub
commit 577d85f92f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
37 changed files with 173 additions and 299 deletions

View file

@ -180,6 +180,12 @@ impl Attribute {
self.doc_str().map_or(false, |s| comments::may_have_doc_links(s.as_str())) self.doc_str().map_or(false, |s| comments::may_have_doc_links(s.as_str()))
} }
pub fn is_proc_macro_attr(&self) -> bool {
[sym::proc_macro, sym::proc_macro_attribute, sym::proc_macro_derive]
.iter()
.any(|kind| self.has_name(*kind))
}
/// Extracts the MetaItem from inside this Attribute. /// Extracts the MetaItem from inside this Attribute.
pub fn meta(&self) -> Option<MetaItem> { pub fn meta(&self) -> Option<MetaItem> {
match &self.kind { match &self.kind {
@ -627,6 +633,22 @@ pub fn mk_attr_name_value_str(
mk_attr(g, style, path, args, span) mk_attr(g, style, path, args, span)
} }
pub fn filter_by_name(attrs: &[Attribute], name: Symbol) -> impl Iterator<Item = &Attribute> {
attrs.iter().filter(move |attr| attr.has_name(name))
}
pub fn find_by_name(attrs: &[Attribute], name: Symbol) -> Option<&Attribute> {
filter_by_name(attrs, name).next()
}
pub fn first_attr_value_str_by_name(attrs: &[Attribute], name: Symbol) -> Option<Symbol> {
find_by_name(attrs, name).and_then(|attr| attr.value_str())
}
pub fn contains_name(attrs: &[Attribute], name: Symbol) -> bool {
find_by_name(attrs, name).is_some()
}
pub fn list_contains_name(items: &[NestedMetaItem], name: Symbol) -> bool { pub fn list_contains_name(items: &[NestedMetaItem], name: Symbol) -> bool {
items.iter().any(|item| item.has_name(name)) items.iter().any(|item| item.has_name(name))
} }

View file

@ -2185,7 +2185,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
def_id: self.local_def_id(param.id), def_id: self.local_def_id(param.id),
name, name,
span: self.lower_span(param.span()), span: self.lower_span(param.span()),
pure_wrt_drop: self.tcx.sess.contains_name(&param.attrs, sym::may_dangle), pure_wrt_drop: attr::contains_name(&param.attrs, sym::may_dangle),
kind, kind,
colon_span: param.colon_span.map(|s| self.lower_span(s)), colon_span: param.colon_span.map(|s| self.lower_span(s)),
source, source,

View file

@ -799,11 +799,11 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
} }
fn visit_item(&mut self, item: &'a Item) { fn visit_item(&mut self, item: &'a Item) {
if item.attrs.iter().any(|attr| self.session.is_proc_macro_attr(attr)) { if item.attrs.iter().any(|attr| attr.is_proc_macro_attr()) {
self.has_proc_macro_decls = true; self.has_proc_macro_decls = true;
} }
if self.session.contains_name(&item.attrs, sym::no_mangle) { if attr::contains_name(&item.attrs, sym::no_mangle) {
self.check_nomangle_item_asciionly(item.ident, item.span); self.check_nomangle_item_asciionly(item.ident, item.span);
} }
@ -973,7 +973,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
} }
// Ensure that `path` attributes on modules are recorded as used (cf. issue #35584). // Ensure that `path` attributes on modules are recorded as used (cf. issue #35584).
if !matches!(mod_kind, ModKind::Loaded(_, Inline::Yes, _)) if !matches!(mod_kind, ModKind::Loaded(_, Inline::Yes, _))
&& !self.session.contains_name(&item.attrs, sym::path) && !attr::contains_name(&item.attrs, sym::path)
{ {
self.check_mod_file_item_asciionly(item.ident); self.check_mod_file_item_asciionly(item.ident);
} }
@ -1248,7 +1248,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
} }
fn visit_assoc_item(&mut self, item: &'a AssocItem, ctxt: AssocCtxt) { fn visit_assoc_item(&mut self, item: &'a AssocItem, ctxt: AssocCtxt) {
if self.session.contains_name(&item.attrs, sym::no_mangle) { if attr::contains_name(&item.attrs, sym::no_mangle) {
self.check_nomangle_item_asciionly(item.ident, item.span); self.check_nomangle_item_asciionly(item.ident, item.span);
} }

View file

@ -1,6 +1,6 @@
use rustc_ast as ast; use rustc_ast as ast;
use rustc_ast::visit::{self, AssocCtxt, FnCtxt, FnKind, Visitor}; use rustc_ast::visit::{self, AssocCtxt, FnCtxt, FnKind, Visitor};
use rustc_ast::{AssocConstraint, AssocConstraintKind, NodeId}; use rustc_ast::{attr, AssocConstraint, AssocConstraintKind, NodeId};
use rustc_ast::{PatKind, RangeEnd}; use rustc_ast::{PatKind, RangeEnd};
use rustc_errors::{Applicability, StashKey}; use rustc_errors::{Applicability, StashKey};
use rustc_feature::{AttributeGate, BuiltinAttribute, Features, GateIssue, BUILTIN_ATTRIBUTE_MAP}; use rustc_feature::{AttributeGate, BuiltinAttribute, Features, GateIssue, BUILTIN_ATTRIBUTE_MAP};
@ -232,7 +232,7 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
} }
ast::ItemKind::Fn(..) => { ast::ItemKind::Fn(..) => {
if self.sess.contains_name(&i.attrs, sym::start) { if attr::contains_name(&i.attrs, sym::start) {
gate_feature_post!( gate_feature_post!(
&self, &self,
start, start,
@ -245,7 +245,7 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
} }
ast::ItemKind::Struct(..) => { ast::ItemKind::Struct(..) => {
for attr in self.sess.filter_by_name(&i.attrs, sym::repr) { for attr in attr::filter_by_name(&i.attrs, sym::repr) {
for item in attr.meta_item_list().unwrap_or_else(ThinVec::new) { for item in attr.meta_item_list().unwrap_or_else(ThinVec::new) {
if item.has_name(sym::simd) { if item.has_name(sym::simd) {
gate_feature_post!( gate_feature_post!(
@ -306,7 +306,7 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
fn visit_foreign_item(&mut self, i: &'a ast::ForeignItem) { fn visit_foreign_item(&mut self, i: &'a ast::ForeignItem) {
match i.kind { match i.kind {
ast::ForeignItemKind::Fn(..) | ast::ForeignItemKind::Static(..) => { ast::ForeignItemKind::Fn(..) | ast::ForeignItemKind::Static(..) => {
let link_name = self.sess.first_attr_value_str_by_name(&i.attrs, sym::link_name); let link_name = attr::first_attr_value_str_by_name(&i.attrs, sym::link_name);
let links_to_llvm = let links_to_llvm =
link_name.map_or(false, |val| val.as_str().starts_with("llvm.")); link_name.map_or(false, |val| val.as_str().starts_with("llvm."));
if links_to_llvm { if links_to_llvm {

View file

@ -1,6 +1,6 @@
//! Parsing and validation of builtin attributes //! Parsing and validation of builtin attributes
use rustc_ast as ast; use rustc_ast::{self as ast, attr};
use rustc_ast::{Attribute, LitKind, MetaItem, MetaItemKind, MetaItemLit, NestedMetaItem, NodeId}; use rustc_ast::{Attribute, LitKind, MetaItem, MetaItemKind, MetaItemLit, NestedMetaItem, NodeId};
use rustc_ast_pretty::pprust; use rustc_ast_pretty::pprust;
use rustc_feature::{find_gated_cfg, is_builtin_attr_name, Features, GatedCfg}; use rustc_feature::{find_gated_cfg, is_builtin_attr_name, Features, GatedCfg};
@ -556,8 +556,8 @@ where
(stab, const_stab, body_stab) (stab, const_stab, body_stab)
} }
pub fn find_crate_name(sess: &Session, attrs: &[Attribute]) -> Option<Symbol> { pub fn find_crate_name(attrs: &[Attribute]) -> Option<Symbol> {
sess.first_attr_value_str_by_name(attrs, sym::crate_name) attr::first_attr_value_str_by_name(attrs, sym::crate_name)
} }
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
@ -1177,7 +1177,7 @@ fn allow_unstable<'a>(
attrs: &'a [Attribute], attrs: &'a [Attribute],
symbol: Symbol, symbol: Symbol,
) -> impl Iterator<Item = Symbol> + 'a { ) -> impl Iterator<Item = Symbol> + 'a {
let attrs = sess.filter_by_name(attrs, symbol); let attrs = attr::filter_by_name(attrs, symbol);
let list = attrs let list = attrs
.filter_map(move |attr| { .filter_map(move |attr| {
attr.meta_item_list().or_else(|| { attr.meta_item_list().or_else(|| {

View file

@ -1,7 +1,7 @@
use crate::deriving::generic::ty::*; use crate::deriving::generic::ty::*;
use crate::deriving::generic::*; use crate::deriving::generic::*;
use rustc_ast as ast; use rustc_ast as ast;
use rustc_ast::{walk_list, EnumDef, VariantData}; use rustc_ast::{attr, walk_list, EnumDef, VariantData};
use rustc_errors::Applicability; use rustc_errors::Applicability;
use rustc_expand::base::{Annotatable, DummyResult, ExtCtxt}; use rustc_expand::base::{Annotatable, DummyResult, ExtCtxt};
use rustc_span::symbol::Ident; use rustc_span::symbol::Ident;
@ -106,7 +106,7 @@ fn extract_default_variant<'a>(
let default_variants: SmallVec<[_; 1]> = enum_def let default_variants: SmallVec<[_; 1]> = enum_def
.variants .variants
.iter() .iter()
.filter(|variant| cx.sess.contains_name(&variant.attrs, kw::Default)) .filter(|variant| attr::contains_name(&variant.attrs, kw::Default))
.collect(); .collect();
let variant = match default_variants.as_slice() { let variant = match default_variants.as_slice() {
@ -116,7 +116,7 @@ fn extract_default_variant<'a>(
.variants .variants
.iter() .iter()
.filter(|variant| matches!(variant.data, VariantData::Unit(..))) .filter(|variant| matches!(variant.data, VariantData::Unit(..)))
.filter(|variant| !cx.sess.contains_name(&variant.attrs, sym::non_exhaustive)); .filter(|variant| !attr::contains_name(&variant.attrs, sym::non_exhaustive));
let mut diag = cx.struct_span_err(trait_span, "no default declared"); let mut diag = cx.struct_span_err(trait_span, "no default declared");
diag.help("make a unit variant default by placing `#[default]` above it"); diag.help("make a unit variant default by placing `#[default]` above it");
@ -146,7 +146,7 @@ fn extract_default_variant<'a>(
if v.span == variant.span { if v.span == variant.span {
None None
} else { } else {
Some((cx.sess.find_by_name(&v.attrs, kw::Default)?.span, String::new())) Some((attr::find_by_name(&v.attrs, kw::Default)?.span, String::new()))
} }
}) })
.collect(); .collect();
@ -174,7 +174,7 @@ fn extract_default_variant<'a>(
return Err(()); return Err(());
} }
if let Some(non_exhaustive_attr) = cx.sess.find_by_name(&variant.attrs, sym::non_exhaustive) { if let Some(non_exhaustive_attr) = attr::find_by_name(&variant.attrs, sym::non_exhaustive) {
cx.struct_span_err(variant.ident.span, "default variant must be exhaustive") cx.struct_span_err(variant.ident.span, "default variant must be exhaustive")
.span_label(non_exhaustive_attr.span, "declared `#[non_exhaustive]` here") .span_label(non_exhaustive_attr.span, "declared `#[non_exhaustive]` here")
.help("consider a manual implementation of `Default`") .help("consider a manual implementation of `Default`")
@ -191,7 +191,7 @@ fn validate_default_attribute(
default_variant: &rustc_ast::Variant, default_variant: &rustc_ast::Variant,
) -> Result<(), ()> { ) -> Result<(), ()> {
let attrs: SmallVec<[_; 1]> = let attrs: SmallVec<[_; 1]> =
cx.sess.filter_by_name(&default_variant.attrs, kw::Default).collect(); attr::filter_by_name(&default_variant.attrs, kw::Default).collect();
let attr = match attrs.as_slice() { let attr = match attrs.as_slice() {
[attr] => attr, [attr] => attr,

View file

@ -1,6 +1,6 @@
use rustc_ast::ptr::P; use rustc_ast::ptr::P;
use rustc_ast::visit::{self, Visitor}; use rustc_ast::visit::{self, Visitor};
use rustc_ast::{self as ast, NodeId}; use rustc_ast::{self as ast, attr, NodeId};
use rustc_ast_pretty::pprust; use rustc_ast_pretty::pprust;
use rustc_expand::base::{parse_macro_name_and_helper_attrs, ExtCtxt, ResolverExpand}; use rustc_expand::base::{parse_macro_name_and_helper_attrs, ExtCtxt, ResolverExpand};
use rustc_expand::expand::{AstFragment, ExpansionConfig}; use rustc_expand::expand::{AstFragment, ExpansionConfig};
@ -34,7 +34,6 @@ enum ProcMacro {
} }
struct CollectProcMacros<'a> { struct CollectProcMacros<'a> {
sess: &'a Session,
macros: Vec<ProcMacro>, macros: Vec<ProcMacro>,
in_root: bool, in_root: bool,
handler: &'a rustc_errors::Handler, handler: &'a rustc_errors::Handler,
@ -56,7 +55,6 @@ pub fn inject(
let mut cx = ExtCtxt::new(sess, ecfg, resolver, None); let mut cx = ExtCtxt::new(sess, ecfg, resolver, None);
let mut collect = CollectProcMacros { let mut collect = CollectProcMacros {
sess,
macros: Vec::new(), macros: Vec::new(),
in_root: true, in_root: true,
handler, handler,
@ -160,7 +158,7 @@ impl<'a> CollectProcMacros<'a> {
impl<'a> Visitor<'a> for CollectProcMacros<'a> { impl<'a> Visitor<'a> for CollectProcMacros<'a> {
fn visit_item(&mut self, item: &'a ast::Item) { fn visit_item(&mut self, item: &'a ast::Item) {
if let ast::ItemKind::MacroDef(..) = item.kind { if let ast::ItemKind::MacroDef(..) = item.kind {
if self.is_proc_macro_crate && self.sess.contains_name(&item.attrs, sym::macro_export) { if self.is_proc_macro_crate && attr::contains_name(&item.attrs, sym::macro_export) {
let msg = let msg =
"cannot export macro_rules! macros from a `proc-macro` crate type currently"; "cannot export macro_rules! macros from a `proc-macro` crate type currently";
self.handler.span_err(self.source_map.guess_head_span(item.span), msg); self.handler.span_err(self.source_map.guess_head_span(item.span), msg);
@ -176,7 +174,7 @@ impl<'a> Visitor<'a> for CollectProcMacros<'a> {
let mut found_attr: Option<&'a ast::Attribute> = None; let mut found_attr: Option<&'a ast::Attribute> = None;
for attr in &item.attrs { for attr in &item.attrs {
if self.sess.is_proc_macro_attr(&attr) { if attr.is_proc_macro_attr() {
if let Some(prev_attr) = found_attr { if let Some(prev_attr) = found_attr {
let prev_item = prev_attr.get_normal_item(); let prev_item = prev_attr.get_normal_item();
let item = attr.get_normal_item(); let item = attr.get_normal_item();

View file

@ -1,4 +1,4 @@
use rustc_ast as ast; use rustc_ast::{self as ast, attr};
use rustc_expand::base::{ExtCtxt, ResolverExpand}; use rustc_expand::base::{ExtCtxt, ResolverExpand};
use rustc_expand::expand::ExpansionConfig; use rustc_expand::expand::ExpansionConfig;
use rustc_session::Session; use rustc_session::Session;
@ -16,10 +16,10 @@ pub fn inject(
let edition = sess.parse_sess.edition; let edition = sess.parse_sess.edition;
// the first name in this list is the crate name of the crate with the prelude // the first name in this list is the crate name of the crate with the prelude
let names: &[Symbol] = if sess.contains_name(&krate.attrs, sym::no_core) { let names: &[Symbol] = if attr::contains_name(&krate.attrs, sym::no_core) {
return krate; return krate;
} else if sess.contains_name(&krate.attrs, sym::no_std) { } else if attr::contains_name(&krate.attrs, sym::no_std) {
if sess.contains_name(&krate.attrs, sym::compiler_builtins) { if attr::contains_name(&krate.attrs, sym::compiler_builtins) {
&[sym::core] &[sym::core]
} else { } else {
&[sym::core, sym::compiler_builtins] &[sym::core, sym::compiler_builtins]

View file

@ -1,12 +1,11 @@
/// The expansion from a test function to the appropriate test struct for libtest /// The expansion from a test function to the appropriate test struct for libtest
/// Ideally, this code would be in libtest but for efficiency and error messages it lives here. /// Ideally, this code would be in libtest but for efficiency and error messages it lives here.
use crate::util::{check_builtin_macro_attribute, warn_on_duplicate_attribute}; use crate::util::{check_builtin_macro_attribute, warn_on_duplicate_attribute};
use rustc_ast as ast;
use rustc_ast::ptr::P; use rustc_ast::ptr::P;
use rustc_ast::{self as ast, attr};
use rustc_ast_pretty::pprust; use rustc_ast_pretty::pprust;
use rustc_errors::Applicability; use rustc_errors::Applicability;
use rustc_expand::base::*; use rustc_expand::base::*;
use rustc_session::Session;
use rustc_span::symbol::{sym, Ident, Symbol}; use rustc_span::symbol::{sym, Ident, Symbol};
use rustc_span::{FileNameDisplayPreference, Span}; use rustc_span::{FileNameDisplayPreference, Span};
use std::iter; use std::iter;
@ -291,14 +290,11 @@ pub fn expand_test_or_bench(
), ),
), ),
// ignore: true | false // ignore: true | false
field( field("ignore", cx.expr_bool(sp, should_ignore(&item)),),
"ignore",
cx.expr_bool(sp, should_ignore(&cx.sess, &item)),
),
// ignore_message: Some("...") | None // ignore_message: Some("...") | None
field( field(
"ignore_message", "ignore_message",
if let Some(msg) = should_ignore_message(cx, &item) { if let Some(msg) = should_ignore_message(&item) {
cx.expr_some(sp, cx.expr_str(sp, msg)) cx.expr_some(sp, cx.expr_str(sp, msg))
} else { } else {
cx.expr_none(sp) cx.expr_none(sp)
@ -425,12 +421,12 @@ enum ShouldPanic {
Yes(Option<Symbol>), Yes(Option<Symbol>),
} }
fn should_ignore(sess: &Session, i: &ast::Item) -> bool { fn should_ignore(i: &ast::Item) -> bool {
sess.contains_name(&i.attrs, sym::ignore) attr::contains_name(&i.attrs, sym::ignore)
} }
fn should_ignore_message(cx: &ExtCtxt<'_>, i: &ast::Item) -> Option<Symbol> { fn should_ignore_message(i: &ast::Item) -> Option<Symbol> {
match cx.sess.find_by_name(&i.attrs, sym::ignore) { match attr::find_by_name(&i.attrs, sym::ignore) {
Some(attr) => { Some(attr) => {
match attr.meta_item_list() { match attr.meta_item_list() {
// Handle #[ignore(bar = "foo")] // Handle #[ignore(bar = "foo")]
@ -444,7 +440,7 @@ fn should_ignore_message(cx: &ExtCtxt<'_>, i: &ast::Item) -> Option<Symbol> {
} }
fn should_panic(cx: &ExtCtxt<'_>, i: &ast::Item) -> ShouldPanic { fn should_panic(cx: &ExtCtxt<'_>, i: &ast::Item) -> ShouldPanic {
match cx.sess.find_by_name(&i.attrs, sym::should_panic) { match attr::find_by_name(&i.attrs, sym::should_panic) {
Some(attr) => { Some(attr) => {
let sd = &cx.sess.parse_sess.span_diagnostic; let sd = &cx.sess.parse_sess.span_diagnostic;
@ -510,7 +506,7 @@ fn test_type(cx: &ExtCtxt<'_>) -> TestType {
} }
fn has_test_signature(cx: &ExtCtxt<'_>, i: &ast::Item) -> bool { fn has_test_signature(cx: &ExtCtxt<'_>, i: &ast::Item) -> bool {
let has_should_panic_attr = cx.sess.contains_name(&i.attrs, sym::should_panic); let has_should_panic_attr = attr::contains_name(&i.attrs, sym::should_panic);
let sd = &cx.sess.parse_sess.span_diagnostic; let sd = &cx.sess.parse_sess.span_diagnostic;
match &i.kind { match &i.kind {
ast::ItemKind::Fn(box ast::Fn { sig, generics, .. }) => { ast::ItemKind::Fn(box ast::Fn { sig, generics, .. }) => {

View file

@ -47,11 +47,11 @@ pub fn inject(sess: &Session, resolver: &mut dyn ResolverExpand, krate: &mut ast
// unconditional, so that the attribute is still marked as used in // unconditional, so that the attribute is still marked as used in
// non-test builds. // non-test builds.
let reexport_test_harness_main = let reexport_test_harness_main =
sess.first_attr_value_str_by_name(&krate.attrs, sym::reexport_test_harness_main); attr::first_attr_value_str_by_name(&krate.attrs, sym::reexport_test_harness_main);
// Do this here so that the test_runner crate attribute gets marked as used // Do this here so that the test_runner crate attribute gets marked as used
// even in non-test builds // even in non-test builds
let test_runner = get_test_runner(sess, span_diagnostic, &krate); let test_runner = get_test_runner(span_diagnostic, &krate);
if sess.opts.test { if sess.opts.test {
let panic_strategy = match (panic_strategy, sess.opts.unstable_opts.panic_abort_tests) { let panic_strategy = match (panic_strategy, sess.opts.unstable_opts.panic_abort_tests) {
@ -123,7 +123,7 @@ impl<'a> MutVisitor for TestHarnessGenerator<'a> {
fn flat_map_item(&mut self, i: P<ast::Item>) -> SmallVec<[P<ast::Item>; 1]> { fn flat_map_item(&mut self, i: P<ast::Item>) -> SmallVec<[P<ast::Item>; 1]> {
let mut item = i.into_inner(); let mut item = i.into_inner();
if let Some(name) = get_test_name(&self.cx.ext_cx.sess, &item) { if let Some(name) = get_test_name(&item) {
debug!("this is a test item"); debug!("this is a test item");
let test = Test { span: item.span, ident: item.ident, name }; let test = Test { span: item.span, ident: item.ident, name };
@ -145,12 +145,12 @@ impl<'a> MutVisitor for TestHarnessGenerator<'a> {
// Beware, this is duplicated in librustc_passes/entry.rs (with // Beware, this is duplicated in librustc_passes/entry.rs (with
// `rustc_hir::Item`), so make sure to keep them in sync. // `rustc_hir::Item`), so make sure to keep them in sync.
fn entry_point_type(sess: &Session, item: &ast::Item, depth: usize) -> EntryPointType { fn entry_point_type(item: &ast::Item, depth: usize) -> EntryPointType {
match item.kind { match item.kind {
ast::ItemKind::Fn(..) => { ast::ItemKind::Fn(..) => {
if sess.contains_name(&item.attrs, sym::start) { if attr::contains_name(&item.attrs, sym::start) {
EntryPointType::Start EntryPointType::Start
} else if sess.contains_name(&item.attrs, sym::rustc_main) { } else if attr::contains_name(&item.attrs, sym::rustc_main) {
EntryPointType::RustcMainAttr EntryPointType::RustcMainAttr
} else if item.ident.name == sym::main { } else if item.ident.name == sym::main {
if depth == 0 { if depth == 0 {
@ -184,7 +184,7 @@ impl<'a> MutVisitor for EntryPointCleaner<'a> {
// Remove any #[rustc_main] or #[start] from the AST so it doesn't // Remove any #[rustc_main] or #[start] from the AST so it doesn't
// clash with the one we're going to add, but mark it as // clash with the one we're going to add, but mark it as
// #[allow(dead_code)] to avoid printing warnings. // #[allow(dead_code)] to avoid printing warnings.
let item = match entry_point_type(self.sess, &item, self.depth) { let item = match entry_point_type(&item, self.depth) {
EntryPointType::MainNamed | EntryPointType::RustcMainAttr | EntryPointType::Start => { EntryPointType::MainNamed | EntryPointType::RustcMainAttr | EntryPointType::Start => {
item.map(|ast::Item { id, ident, attrs, kind, vis, span, tokens }| { item.map(|ast::Item { id, ident, attrs, kind, vis, span, tokens }| {
let allow_dead_code = attr::mk_attr_nested_word( let allow_dead_code = attr::mk_attr_nested_word(
@ -373,16 +373,12 @@ fn mk_tests_slice(cx: &TestCtxt<'_>, sp: Span) -> P<ast::Expr> {
) )
} }
fn get_test_name(sess: &Session, i: &ast::Item) -> Option<Symbol> { fn get_test_name(i: &ast::Item) -> Option<Symbol> {
sess.first_attr_value_str_by_name(&i.attrs, sym::rustc_test_marker) attr::first_attr_value_str_by_name(&i.attrs, sym::rustc_test_marker)
} }
fn get_test_runner( fn get_test_runner(sd: &rustc_errors::Handler, krate: &ast::Crate) -> Option<ast::Path> {
sess: &Session, let test_attr = attr::find_by_name(&krate.attrs, sym::test_runner)?;
sd: &rustc_errors::Handler,
krate: &ast::Crate,
) -> Option<ast::Path> {
let test_attr = sess.find_by_name(&krate.attrs, sym::test_runner)?;
let meta_list = test_attr.meta_item_list()?; let meta_list = test_attr.meta_item_list()?;
let span = test_attr.span; let span = test_attr.span;
match &*meta_list { match &*meta_list {

View file

@ -1,4 +1,4 @@
use rustc_ast::{AttrStyle, Attribute, MetaItem}; use rustc_ast::{attr, AttrStyle, Attribute, MetaItem};
use rustc_expand::base::{Annotatable, ExtCtxt}; use rustc_expand::base::{Annotatable, ExtCtxt};
use rustc_feature::AttributeTemplate; use rustc_feature::AttributeTemplate;
use rustc_lint_defs::builtin::DUPLICATE_MACRO_ATTRIBUTES; use rustc_lint_defs::builtin::DUPLICATE_MACRO_ATTRIBUTES;
@ -36,7 +36,7 @@ pub fn warn_on_duplicate_attribute(ecx: &ExtCtxt<'_>, item: &Annotatable, name:
_ => None, _ => None,
}; };
if let Some(attrs) = attrs { if let Some(attrs) = attrs {
if let Some(attr) = ecx.sess.find_by_name(attrs, name) { if let Some(attr) = attr::find_by_name(attrs, name) {
ecx.parse_sess().buffer_lint( ecx.parse_sess().buffer_lint(
DUPLICATE_MACRO_ATTRIBUTES, DUPLICATE_MACRO_ATTRIBUTES,
attr.span, attr.span,

View file

@ -5,12 +5,12 @@ use crate::llvm;
use crate::builder::Builder; use crate::builder::Builder;
use crate::common::CodegenCx; use crate::common::CodegenCx;
use crate::value::Value; use crate::value::Value;
use rustc_ast::attr;
use rustc_codegen_ssa::base::collect_debugger_visualizers_transitive; use rustc_codegen_ssa::base::collect_debugger_visualizers_transitive;
use rustc_codegen_ssa::traits::*; use rustc_codegen_ssa::traits::*;
use rustc_hir::def_id::LOCAL_CRATE; use rustc_hir::def_id::LOCAL_CRATE;
use rustc_middle::bug; use rustc_middle::bug;
use rustc_session::config::{CrateType, DebugInfo}; use rustc_session::config::{CrateType, DebugInfo};
use rustc_span::symbol::sym; use rustc_span::symbol::sym;
use rustc_span::DebuggerVisualizerType; use rustc_span::DebuggerVisualizerType;
@ -87,7 +87,7 @@ pub fn get_or_insert_gdb_debug_scripts_section_global<'ll>(cx: &CodegenCx<'ll, '
pub fn needs_gdb_debug_scripts_section(cx: &CodegenCx<'_, '_>) -> bool { pub fn needs_gdb_debug_scripts_section(cx: &CodegenCx<'_, '_>) -> bool {
let omit_gdb_pretty_printer_section = let omit_gdb_pretty_printer_section =
cx.tcx.sess.contains_name(cx.tcx.hir().krate_attrs(), sym::omit_gdb_pretty_printer_section); attr::contains_name(cx.tcx.hir().krate_attrs(), sym::omit_gdb_pretty_printer_section);
// To ensure the section `__rustc_debug_gdb_scripts_section__` will not create // To ensure the section `__rustc_debug_gdb_scripts_section__` will not create
// ODR violations at link time, this section will not be emitted for rlibs since // ODR violations at link time, this section will not be emitted for rlibs since

View file

@ -8,6 +8,7 @@ use crate::{
CachedModuleCodegen, CodegenResults, CompiledModule, CrateInfo, ModuleCodegen, ModuleKind, CachedModuleCodegen, CodegenResults, CompiledModule, CrateInfo, ModuleCodegen, ModuleKind,
}; };
use jobserver::{Acquired, Client}; use jobserver::{Acquired, Client};
use rustc_ast::attr;
use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::fx::FxHashMap;
use rustc_data_structures::memmap::Mmap; use rustc_data_structures::memmap::Mmap;
use rustc_data_structures::profiling::SelfProfilerRef; use rustc_data_structures::profiling::SelfProfilerRef;
@ -447,8 +448,8 @@ pub fn start_async_codegen<B: ExtraBackendMethods>(
let sess = tcx.sess; let sess = tcx.sess;
let crate_attrs = tcx.hir().attrs(rustc_hir::CRATE_HIR_ID); let crate_attrs = tcx.hir().attrs(rustc_hir::CRATE_HIR_ID);
let no_builtins = tcx.sess.contains_name(crate_attrs, sym::no_builtins); let no_builtins = attr::contains_name(crate_attrs, sym::no_builtins);
let is_compiler_builtins = tcx.sess.contains_name(crate_attrs, sym::compiler_builtins); let is_compiler_builtins = attr::contains_name(crate_attrs, sym::compiler_builtins);
let crate_info = CrateInfo::new(tcx, target_cpu); let crate_info = CrateInfo::new(tcx, target_cpu);

View file

@ -809,7 +809,7 @@ impl CrateInfo {
.collect(); .collect();
let local_crate_name = tcx.crate_name(LOCAL_CRATE); let local_crate_name = tcx.crate_name(LOCAL_CRATE);
let crate_attrs = tcx.hir().attrs(rustc_hir::CRATE_HIR_ID); let crate_attrs = tcx.hir().attrs(rustc_hir::CRATE_HIR_ID);
let subsystem = tcx.sess.first_attr_value_str_by_name(crate_attrs, sym::windows_subsystem); let subsystem = attr::first_attr_value_str_by_name(crate_attrs, sym::windows_subsystem);
let windows_subsystem = subsystem.map(|subsystem| { let windows_subsystem = subsystem.map(|subsystem| {
if subsystem != sym::windows && subsystem != sym::console { if subsystem != sym::windows && subsystem != sym::console {
tcx.sess.emit_fatal(errors::InvalidWindowsSubsystem { subsystem }); tcx.sess.emit_fatal(errors::InvalidWindowsSubsystem { subsystem });

View file

@ -776,16 +776,14 @@ impl SyntaxExtension {
let allow_internal_unstable = let allow_internal_unstable =
attr::allow_internal_unstable(sess, &attrs).collect::<Vec<Symbol>>(); attr::allow_internal_unstable(sess, &attrs).collect::<Vec<Symbol>>();
let allow_internal_unsafe = sess.contains_name(attrs, sym::allow_internal_unsafe); let allow_internal_unsafe = attr::contains_name(attrs, sym::allow_internal_unsafe);
let local_inner_macros = sess let local_inner_macros = attr::find_by_name(attrs, sym::macro_export)
.find_by_name(attrs, sym::macro_export)
.and_then(|macro_export| macro_export.meta_item_list()) .and_then(|macro_export| macro_export.meta_item_list())
.map_or(false, |l| attr::list_contains_name(&l, sym::local_inner_macros)); .map_or(false, |l| attr::list_contains_name(&l, sym::local_inner_macros));
let collapse_debuginfo = sess.contains_name(attrs, sym::collapse_debuginfo); let collapse_debuginfo = attr::contains_name(attrs, sym::collapse_debuginfo);
tracing::debug!(?local_inner_macros, ?collapse_debuginfo, ?allow_internal_unsafe); tracing::debug!(?local_inner_macros, ?collapse_debuginfo, ?allow_internal_unsafe);
let (builtin_name, helper_attrs) = sess let (builtin_name, helper_attrs) = attr::find_by_name(attrs, sym::rustc_builtin_macro)
.find_by_name(attrs, sym::rustc_builtin_macro)
.map(|attr| { .map(|attr| {
// Override `helper_attrs` passed above if it's a built-in macro, // Override `helper_attrs` passed above if it's a built-in macro,
// marking `proc_macro_derive` macros as built-in is not a realistic use case. // marking `proc_macro_derive` macros as built-in is not a realistic use case.

View file

@ -1,3 +1,4 @@
use rustc_ast::attr;
use rustc_hir::def_id::LocalDefId; use rustc_hir::def_id::LocalDefId;
use rustc_middle::ty::query::Providers; use rustc_middle::ty::query::Providers;
use rustc_middle::ty::TyCtxt; use rustc_middle::ty::TyCtxt;
@ -8,7 +9,7 @@ fn proc_macro_decls_static(tcx: TyCtxt<'_>, (): ()) -> Option<LocalDefId> {
for id in tcx.hir().items() { for id in tcx.hir().items() {
let attrs = tcx.hir().attrs(id.hir_id()); let attrs = tcx.hir().attrs(id.hir_id());
if tcx.sess.contains_name(attrs, sym::rustc_proc_macro_decls) { if attr::contains_name(attrs, sym::rustc_proc_macro_decls) {
decls = Some(id.owner_id.def_id); decls = Some(id.owner_id.def_id);
} }
} }

View file

@ -505,7 +505,7 @@ pub fn build_output_filenames(attrs: &[ast::Attribute], sess: &Session) -> Outpu
.opts .opts
.crate_name .crate_name
.clone() .clone()
.or_else(|| rustc_attr::find_crate_name(sess, attrs).map(|n| n.to_string())) .or_else(|| rustc_attr::find_crate_name(attrs).map(|n| n.to_string()))
.unwrap_or_else(|| sess.io.input.filestem().to_owned()); .unwrap_or_else(|| sess.io.input.filestem().to_owned());
OutputFilenames::new( OutputFilenames::new(

View file

@ -358,29 +358,29 @@ impl EarlyLintPass for UnsafeCode {
} }
ast::ItemKind::Fn(..) => { ast::ItemKind::Fn(..) => {
if let Some(attr) = cx.sess().find_by_name(&it.attrs, sym::no_mangle) { if let Some(attr) = attr::find_by_name(&it.attrs, sym::no_mangle) {
self.report_unsafe(cx, attr.span, BuiltinUnsafe::NoMangleFn); self.report_unsafe(cx, attr.span, BuiltinUnsafe::NoMangleFn);
} }
if let Some(attr) = cx.sess().find_by_name(&it.attrs, sym::export_name) { if let Some(attr) = attr::find_by_name(&it.attrs, sym::export_name) {
self.report_unsafe(cx, attr.span, BuiltinUnsafe::ExportNameFn); self.report_unsafe(cx, attr.span, BuiltinUnsafe::ExportNameFn);
} }
if let Some(attr) = cx.sess().find_by_name(&it.attrs, sym::link_section) { if let Some(attr) = attr::find_by_name(&it.attrs, sym::link_section) {
self.report_unsafe(cx, attr.span, BuiltinUnsafe::LinkSectionFn); self.report_unsafe(cx, attr.span, BuiltinUnsafe::LinkSectionFn);
} }
} }
ast::ItemKind::Static(..) => { ast::ItemKind::Static(..) => {
if let Some(attr) = cx.sess().find_by_name(&it.attrs, sym::no_mangle) { if let Some(attr) = attr::find_by_name(&it.attrs, sym::no_mangle) {
self.report_unsafe(cx, attr.span, BuiltinUnsafe::NoMangleStatic); self.report_unsafe(cx, attr.span, BuiltinUnsafe::NoMangleStatic);
} }
if let Some(attr) = cx.sess().find_by_name(&it.attrs, sym::export_name) { if let Some(attr) = attr::find_by_name(&it.attrs, sym::export_name) {
self.report_unsafe(cx, attr.span, BuiltinUnsafe::ExportNameStatic); self.report_unsafe(cx, attr.span, BuiltinUnsafe::ExportNameStatic);
} }
if let Some(attr) = cx.sess().find_by_name(&it.attrs, sym::link_section) { if let Some(attr) = attr::find_by_name(&it.attrs, sym::link_section) {
self.report_unsafe(cx, attr.span, BuiltinUnsafe::LinkSectionStatic); self.report_unsafe(cx, attr.span, BuiltinUnsafe::LinkSectionStatic);
} }
} }
@ -391,10 +391,10 @@ impl EarlyLintPass for UnsafeCode {
fn check_impl_item(&mut self, cx: &EarlyContext<'_>, it: &ast::AssocItem) { fn check_impl_item(&mut self, cx: &EarlyContext<'_>, it: &ast::AssocItem) {
if let ast::AssocItemKind::Fn(..) = it.kind { if let ast::AssocItemKind::Fn(..) = it.kind {
if let Some(attr) = cx.sess().find_by_name(&it.attrs, sym::no_mangle) { if let Some(attr) = attr::find_by_name(&it.attrs, sym::no_mangle) {
self.report_unsafe(cx, attr.span, BuiltinUnsafe::NoMangleMethod); self.report_unsafe(cx, attr.span, BuiltinUnsafe::NoMangleMethod);
} }
if let Some(attr) = cx.sess().find_by_name(&it.attrs, sym::export_name) { if let Some(attr) = attr::find_by_name(&it.attrs, sym::export_name) {
self.report_unsafe(cx, attr.span, BuiltinUnsafe::ExportNameMethod); self.report_unsafe(cx, attr.span, BuiltinUnsafe::ExportNameMethod);
} }
} }
@ -1123,12 +1123,12 @@ impl<'tcx> LateLintPass<'tcx> for InvalidNoMangleItems {
}; };
match it.kind { match it.kind {
hir::ItemKind::Fn(.., ref generics, _) => { hir::ItemKind::Fn(.., ref generics, _) => {
if let Some(no_mangle_attr) = cx.sess().find_by_name(attrs, sym::no_mangle) { if let Some(no_mangle_attr) = attr::find_by_name(attrs, sym::no_mangle) {
check_no_mangle_on_generic_fn(no_mangle_attr, None, generics, it.span); check_no_mangle_on_generic_fn(no_mangle_attr, None, generics, it.span);
} }
} }
hir::ItemKind::Const(..) => { hir::ItemKind::Const(..) => {
if cx.sess().contains_name(attrs, sym::no_mangle) { if attr::contains_name(attrs, sym::no_mangle) {
// account for "pub const" (#45562) // account for "pub const" (#45562)
let start = cx let start = cx
.tcx .tcx
@ -1152,9 +1152,8 @@ impl<'tcx> LateLintPass<'tcx> for InvalidNoMangleItems {
hir::ItemKind::Impl(hir::Impl { generics, items, .. }) => { hir::ItemKind::Impl(hir::Impl { generics, items, .. }) => {
for it in *items { for it in *items {
if let hir::AssocItemKind::Fn { .. } = it.kind { if let hir::AssocItemKind::Fn { .. } = it.kind {
if let Some(no_mangle_attr) = cx if let Some(no_mangle_attr) =
.sess() attr::find_by_name(cx.tcx.hir().attrs(it.id.hir_id()), sym::no_mangle)
.find_by_name(cx.tcx.hir().attrs(it.id.hir_id()), sym::no_mangle)
{ {
check_no_mangle_on_generic_fn( check_no_mangle_on_generic_fn(
no_mangle_attr, no_mangle_attr,
@ -1836,7 +1835,7 @@ impl<'tcx> LateLintPass<'tcx> for UnnameableTestItems {
} }
let attrs = cx.tcx.hir().attrs(it.hir_id()); let attrs = cx.tcx.hir().attrs(it.hir_id());
if let Some(attr) = cx.sess().find_by_name(attrs, sym::rustc_test_marker) { if let Some(attr) = attr::find_by_name(attrs, sym::rustc_test_marker) {
cx.emit_spanned_lint(UNNAMEABLE_TEST_ITEMS, attr.span, BuiltinUnnameableTestItems); cx.emit_spanned_lint(UNNAMEABLE_TEST_ITEMS, attr.span, BuiltinUnnameableTestItems);
} }
} }

View file

@ -328,8 +328,7 @@ impl<'tcx> LateLintPass<'tcx> for NonSnakeCase {
let crate_ident = if let Some(name) = &cx.tcx.sess.opts.crate_name { let crate_ident = if let Some(name) = &cx.tcx.sess.opts.crate_name {
Some(Ident::from_str(name)) Some(Ident::from_str(name))
} else { } else {
cx.sess() attr::find_by_name(&cx.tcx.hir().attrs(hir::CRATE_HIR_ID), sym::crate_name)
.find_by_name(&cx.tcx.hir().attrs(hir::CRATE_HIR_ID), sym::crate_name)
.and_then(|attr| attr.meta()) .and_then(|attr| attr.meta())
.and_then(|meta| { .and_then(|meta| {
meta.name_value_literal().and_then(|lit| { meta.name_value_literal().and_then(|lit| {
@ -489,7 +488,7 @@ impl<'tcx> LateLintPass<'tcx> for NonUpperCaseGlobals {
fn check_item(&mut self, cx: &LateContext<'_>, it: &hir::Item<'_>) { fn check_item(&mut self, cx: &LateContext<'_>, it: &hir::Item<'_>) {
let attrs = cx.tcx.hir().attrs(it.hir_id()); let attrs = cx.tcx.hir().attrs(it.hir_id());
match it.kind { match it.kind {
hir::ItemKind::Static(..) if !cx.sess().contains_name(attrs, sym::no_mangle) => { hir::ItemKind::Static(..) if !attr::contains_name(attrs, sym::no_mangle) => {
NonUpperCaseGlobals::check_upper_case(cx, "static variable", &it.ident); NonUpperCaseGlobals::check_upper_case(cx, "static variable", &it.ident);
} }
hir::ItemKind::Const(..) => { hir::ItemKind::Const(..) => {

View file

@ -687,8 +687,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
// compilation mode also comes into play. // compilation mode also comes into play.
let desired_strategy = self.sess.panic_strategy(); let desired_strategy = self.sess.panic_strategy();
let mut runtime_found = false; let mut runtime_found = false;
let mut needs_panic_runtime = let mut needs_panic_runtime = attr::contains_name(&krate.attrs, sym::needs_panic_runtime);
self.sess.contains_name(&krate.attrs, sym::needs_panic_runtime);
for (cnum, data) in self.cstore.iter_crate_data() { for (cnum, data) in self.cstore.iter_crate_data() {
needs_panic_runtime = needs_panic_runtime || data.needs_panic_runtime(); needs_panic_runtime = needs_panic_runtime || data.needs_panic_runtime();
@ -756,7 +755,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
info!("loading profiler"); info!("loading profiler");
let name = Symbol::intern(&self.sess.opts.unstable_opts.profiler_runtime); let name = Symbol::intern(&self.sess.opts.unstable_opts.profiler_runtime);
if name == sym::profiler_builtins && self.sess.contains_name(&krate.attrs, sym::no_core) { if name == sym::profiler_builtins && attr::contains_name(&krate.attrs, sym::no_core) {
self.sess.emit_err(errors::ProfilerBuiltinsNeedsCore); self.sess.emit_err(errors::ProfilerBuiltinsNeedsCore);
} }
@ -770,14 +769,14 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
} }
fn inject_allocator_crate(&mut self, krate: &ast::Crate) { fn inject_allocator_crate(&mut self, krate: &ast::Crate) {
self.cstore.has_global_allocator = match &*global_allocator_spans(&self.sess, krate) { self.cstore.has_global_allocator = match &*global_allocator_spans(krate) {
[span1, span2, ..] => { [span1, span2, ..] => {
self.sess.emit_err(errors::NoMultipleGlobalAlloc { span2: *span2, span1: *span1 }); self.sess.emit_err(errors::NoMultipleGlobalAlloc { span2: *span2, span1: *span1 });
true true
} }
spans => !spans.is_empty(), spans => !spans.is_empty(),
}; };
self.cstore.has_alloc_error_handler = match &*alloc_error_handler_spans(&self.sess, krate) { self.cstore.has_alloc_error_handler = match &*alloc_error_handler_spans(krate) {
[span1, span2, ..] => { [span1, span2, ..] => {
self.sess self.sess
.emit_err(errors::NoMultipleAllocErrorHandler { span2: *span2, span1: *span1 }); .emit_err(errors::NoMultipleAllocErrorHandler { span2: *span2, span1: *span1 });
@ -789,7 +788,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
// Check to see if we actually need an allocator. This desire comes // Check to see if we actually need an allocator. This desire comes
// about through the `#![needs_allocator]` attribute and is typically // about through the `#![needs_allocator]` attribute and is typically
// written down in liballoc. // written down in liballoc.
if !self.sess.contains_name(&krate.attrs, sym::needs_allocator) if !attr::contains_name(&krate.attrs, sym::needs_allocator)
&& !self.cstore.iter_crate_data().any(|(_, data)| data.needs_allocator()) && !self.cstore.iter_crate_data().any(|(_, data)| data.needs_allocator())
{ {
return; return;
@ -848,7 +847,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
// allocator. At this point our allocator request is typically fulfilled // allocator. At this point our allocator request is typically fulfilled
// by the standard library, denoted by the `#![default_lib_allocator]` // by the standard library, denoted by the `#![default_lib_allocator]`
// attribute. // attribute.
if !self.sess.contains_name(&krate.attrs, sym::default_lib_allocator) if !attr::contains_name(&krate.attrs, sym::default_lib_allocator)
&& !self.cstore.iter_crate_data().any(|(_, data)| data.has_default_lib_allocator()) && !self.cstore.iter_crate_data().any(|(_, data)| data.has_default_lib_allocator())
{ {
self.sess.emit_err(errors::GlobalAllocRequired); self.sess.emit_err(errors::GlobalAllocRequired);
@ -970,7 +969,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
} }
None => item.ident.name, None => item.ident.name,
}; };
let dep_kind = if self.sess.contains_name(&item.attrs, sym::no_link) { let dep_kind = if attr::contains_name(&item.attrs, sym::no_link) {
CrateDepKind::MacrosOnly CrateDepKind::MacrosOnly
} else { } else {
CrateDepKind::Explicit CrateDepKind::Explicit
@ -1016,16 +1015,15 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
} }
} }
fn global_allocator_spans(sess: &Session, krate: &ast::Crate) -> Vec<Span> { fn global_allocator_spans(krate: &ast::Crate) -> Vec<Span> {
struct Finder<'a> { struct Finder {
sess: &'a Session,
name: Symbol, name: Symbol,
spans: Vec<Span>, spans: Vec<Span>,
} }
impl<'ast, 'a> visit::Visitor<'ast> for Finder<'a> { impl<'ast> visit::Visitor<'ast> for Finder {
fn visit_item(&mut self, item: &'ast ast::Item) { fn visit_item(&mut self, item: &'ast ast::Item) {
if item.ident.name == self.name if item.ident.name == self.name
&& self.sess.contains_name(&item.attrs, sym::rustc_std_internal_symbol) && attr::contains_name(&item.attrs, sym::rustc_std_internal_symbol)
{ {
self.spans.push(item.span); self.spans.push(item.span);
} }
@ -1034,21 +1032,20 @@ fn global_allocator_spans(sess: &Session, krate: &ast::Crate) -> Vec<Span> {
} }
let name = Symbol::intern(&AllocatorKind::Global.fn_name(sym::alloc)); let name = Symbol::intern(&AllocatorKind::Global.fn_name(sym::alloc));
let mut f = Finder { sess, name, spans: Vec::new() }; let mut f = Finder { name, spans: Vec::new() };
visit::walk_crate(&mut f, krate); visit::walk_crate(&mut f, krate);
f.spans f.spans
} }
fn alloc_error_handler_spans(sess: &Session, krate: &ast::Crate) -> Vec<Span> { fn alloc_error_handler_spans(krate: &ast::Crate) -> Vec<Span> {
struct Finder<'a> { struct Finder {
sess: &'a Session,
name: Symbol, name: Symbol,
spans: Vec<Span>, spans: Vec<Span>,
} }
impl<'ast, 'a> visit::Visitor<'ast> for Finder<'a> { impl<'ast> visit::Visitor<'ast> for Finder {
fn visit_item(&mut self, item: &'ast ast::Item) { fn visit_item(&mut self, item: &'ast ast::Item) {
if item.ident.name == self.name if item.ident.name == self.name
&& self.sess.contains_name(&item.attrs, sym::rustc_std_internal_symbol) && attr::contains_name(&item.attrs, sym::rustc_std_internal_symbol)
{ {
self.spans.push(item.span); self.spans.push(item.span);
} }
@ -1057,7 +1054,7 @@ fn alloc_error_handler_spans(sess: &Session, krate: &ast::Crate) -> Vec<Span> {
} }
let name = Symbol::intern(&AllocatorKind::Global.fn_name(sym::oom)); let name = Symbol::intern(&AllocatorKind::Global.fn_name(sym::oom));
let mut f = Finder { sess, name, spans: Vec::new() }; let mut f = Finder { name, spans: Vec::new() };
visit::walk_crate(&mut f, krate); visit::walk_crate(&mut f, krate);
f.spans f.spans
} }

View file

@ -681,17 +681,15 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
has_global_allocator: tcx.has_global_allocator(LOCAL_CRATE), has_global_allocator: tcx.has_global_allocator(LOCAL_CRATE),
has_alloc_error_handler: tcx.has_alloc_error_handler(LOCAL_CRATE), has_alloc_error_handler: tcx.has_alloc_error_handler(LOCAL_CRATE),
has_panic_handler: tcx.has_panic_handler(LOCAL_CRATE), has_panic_handler: tcx.has_panic_handler(LOCAL_CRATE),
has_default_lib_allocator: tcx has_default_lib_allocator: attr::contains_name(&attrs, sym::default_lib_allocator),
.sess
.contains_name(&attrs, sym::default_lib_allocator),
proc_macro_data, proc_macro_data,
debugger_visualizers, debugger_visualizers,
compiler_builtins: tcx.sess.contains_name(&attrs, sym::compiler_builtins), compiler_builtins: attr::contains_name(&attrs, sym::compiler_builtins),
needs_allocator: tcx.sess.contains_name(&attrs, sym::needs_allocator), needs_allocator: attr::contains_name(&attrs, sym::needs_allocator),
needs_panic_runtime: tcx.sess.contains_name(&attrs, sym::needs_panic_runtime), needs_panic_runtime: attr::contains_name(&attrs, sym::needs_panic_runtime),
no_builtins: tcx.sess.contains_name(&attrs, sym::no_builtins), no_builtins: attr::contains_name(&attrs, sym::no_builtins),
panic_runtime: tcx.sess.contains_name(&attrs, sym::panic_runtime), panic_runtime: attr::contains_name(&attrs, sym::panic_runtime),
profiler_runtime: tcx.sess.contains_name(&attrs, sym::profiler_runtime), profiler_runtime: attr::contains_name(&attrs, sym::profiler_runtime),
symbol_mangling_version: tcx.sess.opts.get_symbol_mangling_version(), symbol_mangling_version: tcx.sess.opts.get_symbol_mangling_version(),
crate_deps, crate_deps,
@ -1747,11 +1745,11 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
// Proc-macros may have attributes like `#[allow_internal_unstable]`, // Proc-macros may have attributes like `#[allow_internal_unstable]`,
// so downstream crates need access to them. // so downstream crates need access to them.
let attrs = hir.attrs(proc_macro); let attrs = hir.attrs(proc_macro);
let macro_kind = if tcx.sess.contains_name(attrs, sym::proc_macro) { let macro_kind = if attr::contains_name(attrs, sym::proc_macro) {
MacroKind::Bang MacroKind::Bang
} else if tcx.sess.contains_name(attrs, sym::proc_macro_attribute) { } else if attr::contains_name(attrs, sym::proc_macro_attribute) {
MacroKind::Attr MacroKind::Attr
} else if let Some(attr) = tcx.sess.find_by_name(attrs, sym::proc_macro_derive) { } else if let Some(attr) = attr::find_by_name(attrs, sym::proc_macro_derive) {
// This unwrap chain should have been checked by the proc-macro harness. // This unwrap chain should have been checked by the proc-macro harness.
name = attr.meta_item_list().unwrap()[0] name = attr.meta_item_list().unwrap()[0]
.meta_item() .meta_item()

View file

@ -28,7 +28,7 @@ use crate::ty::{
TraitObjectVisitor, Ty, TyKind, TyVar, TyVid, TypeAndMut, TypeckResults, UintTy, Visibility, TraitObjectVisitor, Ty, TyKind, TyVar, TyVid, TypeAndMut, TypeckResults, UintTy, Visibility,
}; };
use crate::ty::{GenericArg, InternalSubsts, SubstsRef}; use crate::ty::{GenericArg, InternalSubsts, SubstsRef};
use rustc_ast as ast; use rustc_ast::{self as ast, attr};
use rustc_data_structures::fingerprint::Fingerprint; use rustc_data_structures::fingerprint::Fingerprint;
use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_data_structures::fx::{FxHashMap, FxHashSet};
use rustc_data_structures::intern::Interned; use rustc_data_structures::intern::Interned;
@ -2520,9 +2520,9 @@ pub fn provide(providers: &mut ty::query::Providers) {
providers.extern_mod_stmt_cnum = providers.extern_mod_stmt_cnum =
|tcx, id| tcx.resolutions(()).extern_crate_map.get(&id).cloned(); |tcx, id| tcx.resolutions(()).extern_crate_map.get(&id).cloned();
providers.is_panic_runtime = providers.is_panic_runtime =
|tcx, LocalCrate| tcx.sess.contains_name(tcx.hir().krate_attrs(), sym::panic_runtime); |tcx, LocalCrate| attr::contains_name(tcx.hir().krate_attrs(), sym::panic_runtime);
providers.is_compiler_builtins = providers.is_compiler_builtins =
|tcx, LocalCrate| tcx.sess.contains_name(tcx.hir().krate_attrs(), sym::compiler_builtins); |tcx, LocalCrate| attr::contains_name(tcx.hir().krate_attrs(), sym::compiler_builtins);
providers.has_panic_handler = |tcx, LocalCrate| { providers.has_panic_handler = |tcx, LocalCrate| {
// We want to check if the panic handler was defined in this crate // We want to check if the panic handler was defined in this crate
tcx.lang_items().panic_impl().map_or(false, |did| did.is_local()) tcx.lang_items().panic_impl().map_or(false, |did| did.is_local())

View file

@ -3,6 +3,7 @@ use crate::build::expr::as_place::PlaceBuilder;
use crate::build::scope::DropKind; use crate::build::scope::DropKind;
use rustc_apfloat::ieee::{Double, Single}; use rustc_apfloat::ieee::{Double, Single};
use rustc_apfloat::Float; use rustc_apfloat::Float;
use rustc_ast::attr;
use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::fx::FxHashMap;
use rustc_data_structures::sorted_map::SortedIndexMultiMap; use rustc_data_structures::sorted_map::SortedIndexMultiMap;
use rustc_errors::ErrorGuaranteed; use rustc_errors::ErrorGuaranteed;
@ -680,7 +681,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
// Some functions always have overflow checks enabled, // Some functions always have overflow checks enabled,
// however, they may not get codegen'd, depending on // however, they may not get codegen'd, depending on
// the settings for the crate they are codegened in. // the settings for the crate they are codegened in.
let mut check_overflow = tcx.sess.contains_name(attrs, sym::rustc_inherit_overflow_checks); let mut check_overflow = attr::contains_name(attrs, sym::rustc_inherit_overflow_checks);
// Respect -C overflow-checks. // Respect -C overflow-checks.
check_overflow |= tcx.sess.overflow_checks(); check_overflow |= tcx.sess.overflow_checks();
// Constants always need overflow checks. // Constants always need overflow checks.

View file

@ -1907,7 +1907,7 @@ impl CheckAttrVisitor<'_> {
match target { match target {
Target::Fn => { Target::Fn => {
for attr in attrs { for attr in attrs {
if self.tcx.sess.is_proc_macro_attr(attr) { if attr.is_proc_macro_attr() {
debug!("Is proc macro attr"); debug!("Is proc macro attr");
return true; return true;
} }

View file

@ -1,3 +1,4 @@
use rustc_ast::attr;
use rustc_ast::entry::EntryPointType; use rustc_ast::entry::EntryPointType;
use rustc_errors::error_code; use rustc_errors::error_code;
use rustc_hir::def::DefKind; use rustc_hir::def::DefKind;
@ -37,7 +38,7 @@ fn entry_fn(tcx: TyCtxt<'_>, (): ()) -> Option<(DefId, EntryFnType)> {
} }
// If the user wants no main function at all, then stop here. // If the user wants no main function at all, then stop here.
if tcx.sess.contains_name(&tcx.hir().attrs(CRATE_HIR_ID), sym::no_main) { if attr::contains_name(&tcx.hir().attrs(CRATE_HIR_ID), sym::no_main) {
return None; return None;
} }
@ -57,9 +58,9 @@ fn entry_fn(tcx: TyCtxt<'_>, (): ()) -> Option<(DefId, EntryFnType)> {
// An equivalent optimization was not applied to the duplicated code in test_harness.rs. // An equivalent optimization was not applied to the duplicated code in test_harness.rs.
fn entry_point_type(ctxt: &EntryContext<'_>, id: ItemId, at_root: bool) -> EntryPointType { fn entry_point_type(ctxt: &EntryContext<'_>, id: ItemId, at_root: bool) -> EntryPointType {
let attrs = ctxt.tcx.hir().attrs(id.hir_id()); let attrs = ctxt.tcx.hir().attrs(id.hir_id());
if ctxt.tcx.sess.contains_name(attrs, sym::start) { if attr::contains_name(attrs, sym::start) {
EntryPointType::Start EntryPointType::Start
} else if ctxt.tcx.sess.contains_name(attrs, sym::rustc_main) { } else if attr::contains_name(attrs, sym::rustc_main) {
EntryPointType::RustcMainAttr EntryPointType::RustcMainAttr
} else { } else {
if let Some(name) = ctxt.tcx.opt_item_name(id.owner_id.to_def_id()) if let Some(name) = ctxt.tcx.opt_item_name(id.owner_id.to_def_id())
@ -78,7 +79,7 @@ fn entry_point_type(ctxt: &EntryContext<'_>, id: ItemId, at_root: bool) -> Entry
fn attr_span_by_symbol(ctxt: &EntryContext<'_>, id: ItemId, sym: Symbol) -> Option<Span> { fn attr_span_by_symbol(ctxt: &EntryContext<'_>, id: ItemId, sym: Symbol) -> Option<Span> {
let attrs = ctxt.tcx.hir().attrs(id.hir_id()); let attrs = ctxt.tcx.hir().attrs(id.hir_id());
ctxt.tcx.sess.find_by_name(attrs, sym).map(|attr| attr.span) attr::find_by_name(attrs, sym).map(|attr| attr.span)
} }
fn find_item(id: ItemId, ctxt: &mut EntryContext<'_>) { fn find_item(id: ItemId, ctxt: &mut EntryContext<'_>) {

View file

@ -570,7 +570,7 @@ impl<'a, 'b, 'tcx> BuildReducedGraphVisitor<'a, 'b, 'tcx> {
} }
ast::UseTreeKind::Glob => { ast::UseTreeKind::Glob => {
let kind = ImportKind::Glob { let kind = ImportKind::Glob {
is_prelude: self.r.tcx.sess.contains_name(&item.attrs, sym::prelude_import), is_prelude: attr::contains_name(&item.attrs, sym::prelude_import),
max_vis: Cell::new(None), max_vis: Cell::new(None),
id, id,
}; };
@ -685,7 +685,7 @@ impl<'a, 'b, 'tcx> BuildReducedGraphVisitor<'a, 'b, 'tcx> {
expansion.to_expn_id(), expansion.to_expn_id(),
item.span, item.span,
parent.no_implicit_prelude parent.no_implicit_prelude
|| self.r.tcx.sess.contains_name(&item.attrs, sym::no_implicit_prelude), || attr::contains_name(&item.attrs, sym::no_implicit_prelude),
); );
self.r.define(parent, ident, TypeNS, (module, vis, sp, expansion)); self.r.define(parent, ident, TypeNS, (module, vis, sp, expansion));
@ -750,7 +750,7 @@ impl<'a, 'b, 'tcx> BuildReducedGraphVisitor<'a, 'b, 'tcx> {
// If the structure is marked as non_exhaustive then lower the visibility // If the structure is marked as non_exhaustive then lower the visibility
// to within the crate. // to within the crate.
let mut ctor_vis = if vis.is_public() let mut ctor_vis = if vis.is_public()
&& self.r.tcx.sess.contains_name(&item.attrs, sym::non_exhaustive) && attr::contains_name(&item.attrs, sym::non_exhaustive)
{ {
ty::Visibility::Restricted(CRATE_DEF_ID) ty::Visibility::Restricted(CRATE_DEF_ID)
} else { } else {
@ -1168,12 +1168,11 @@ impl<'a, 'b, 'tcx> BuildReducedGraphVisitor<'a, 'b, 'tcx> {
} }
fn proc_macro_stub(&self, item: &ast::Item) -> Option<(MacroKind, Ident, Span)> { fn proc_macro_stub(&self, item: &ast::Item) -> Option<(MacroKind, Ident, Span)> {
if self.r.tcx.sess.contains_name(&item.attrs, sym::proc_macro) { if attr::contains_name(&item.attrs, sym::proc_macro) {
return Some((MacroKind::Bang, item.ident, item.span)); return Some((MacroKind::Bang, item.ident, item.span));
} else if self.r.tcx.sess.contains_name(&item.attrs, sym::proc_macro_attribute) { } else if attr::contains_name(&item.attrs, sym::proc_macro_attribute) {
return Some((MacroKind::Attr, item.ident, item.span)); return Some((MacroKind::Attr, item.ident, item.span));
} else if let Some(attr) = self.r.tcx.sess.find_by_name(&item.attrs, sym::proc_macro_derive) } else if let Some(attr) = attr::find_by_name(&item.attrs, sym::proc_macro_derive) {
{
if let Some(nested_meta) = attr.meta_item_list().and_then(|list| list.get(0).cloned()) { if let Some(nested_meta) = attr.meta_item_list().and_then(|list| list.get(0).cloned()) {
if let Some(ident) = nested_meta.ident() { if let Some(ident) = nested_meta.ident() {
return Some((MacroKind::Derive, ident, ident.span)); return Some((MacroKind::Derive, ident, ident.span));
@ -1228,7 +1227,7 @@ impl<'a, 'b, 'tcx> BuildReducedGraphVisitor<'a, 'b, 'tcx> {
if macro_rules { if macro_rules {
let ident = ident.normalize_to_macros_2_0(); let ident = ident.normalize_to_macros_2_0();
self.r.macro_names.insert(ident); self.r.macro_names.insert(ident);
let is_macro_export = self.r.tcx.sess.contains_name(&item.attrs, sym::macro_export); let is_macro_export = attr::contains_name(&item.attrs, sym::macro_export);
let vis = if is_macro_export { let vis = if is_macro_export {
ty::Visibility::Public ty::Visibility::Public
} else { } else {
@ -1488,13 +1487,12 @@ impl<'a, 'b, 'tcx> Visitor<'b> for BuildReducedGraphVisitor<'a, 'b, 'tcx> {
self.r.visibilities.insert(def_id, vis); self.r.visibilities.insert(def_id, vis);
// If the variant is marked as non_exhaustive then lower the visibility to within the crate. // If the variant is marked as non_exhaustive then lower the visibility to within the crate.
let ctor_vis = if vis.is_public() let ctor_vis =
&& self.r.tcx.sess.contains_name(&variant.attrs, sym::non_exhaustive) if vis.is_public() && attr::contains_name(&variant.attrs, sym::non_exhaustive) {
{ ty::Visibility::Restricted(CRATE_DEF_ID)
ty::Visibility::Restricted(CRATE_DEF_ID) } else {
} else { vis
vis };
};
// Define a constructor name in the value namespace. // Define a constructor name in the value namespace.
if let Some((ctor_kind, ctor_node_id)) = CtorKind::from_ast(&variant.data) { if let Some((ctor_kind, ctor_node_id)) = CtorKind::from_ast(&variant.data) {

View file

@ -23,7 +23,7 @@ extern crate tracing;
use rustc_arena::{DroplessArena, TypedArena}; use rustc_arena::{DroplessArena, TypedArena};
use rustc_ast::node_id::NodeMap; use rustc_ast::node_id::NodeMap;
use rustc_ast::{self as ast, NodeId, CRATE_NODE_ID}; use rustc_ast::{self as ast, attr, NodeId, CRATE_NODE_ID};
use rustc_ast::{AngleBracketedArg, Crate, Expr, ExprKind, GenericArg, GenericArgs, LitKind, Path}; use rustc_ast::{AngleBracketedArg, Crate, Expr, ExprKind, GenericArg, GenericArgs, LitKind, Path};
use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexMap, FxIndexSet}; use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexMap, FxIndexSet};
use rustc_data_structures::intern::Interned; use rustc_data_structures::intern::Interned;
@ -1190,7 +1190,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
ModuleKind::Def(DefKind::Mod, root_def_id, kw::Empty), ModuleKind::Def(DefKind::Mod, root_def_id, kw::Empty),
ExpnId::root(), ExpnId::root(),
krate.spans.inner_span, krate.spans.inner_span,
tcx.sess.contains_name(&krate.attrs, sym::no_implicit_prelude), attr::contains_name(&krate.attrs, sym::no_implicit_prelude),
&mut module_map, &mut module_map,
); );
let empty_module = arenas.new_module( let empty_module = arenas.new_module(
@ -1222,9 +1222,9 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
.map(|(name, _)| (Ident::from_str(name), Default::default())) .map(|(name, _)| (Ident::from_str(name), Default::default()))
.collect(); .collect();
if !tcx.sess.contains_name(&krate.attrs, sym::no_core) { if !attr::contains_name(&krate.attrs, sym::no_core) {
extern_prelude.insert(Ident::with_dummy_span(sym::core), Default::default()); extern_prelude.insert(Ident::with_dummy_span(sym::core), Default::default());
if !tcx.sess.contains_name(&krate.attrs, sym::no_std) { if !attr::contains_name(&krate.attrs, sym::no_std) {
extern_prelude.insert(Ident::with_dummy_span(sym::std), Default::default()); extern_prelude.insert(Ident::with_dummy_span(sym::std), Default::default());
} }
} }

View file

@ -5,7 +5,7 @@ use crate::Namespace::*;
use crate::{BuiltinMacroState, Determinacy}; use crate::{BuiltinMacroState, Determinacy};
use crate::{DeriveData, Finalize, ParentScope, ResolutionError, Resolver, ScopeSet}; use crate::{DeriveData, Finalize, ParentScope, ResolutionError, Resolver, ScopeSet};
use crate::{ModuleKind, ModuleOrUniformRoot, NameBinding, PathResult, Segment}; use crate::{ModuleKind, ModuleOrUniformRoot, NameBinding, PathResult, Segment};
use rustc_ast::{self as ast, Inline, ItemKind, ModKind, NodeId}; use rustc_ast::{self as ast, attr, Inline, ItemKind, ModKind, NodeId};
use rustc_ast_pretty::pprust; use rustc_ast_pretty::pprust;
use rustc_attr::StabilityLevel; use rustc_attr::StabilityLevel;
use rustc_data_structures::intern::Interned; use rustc_data_structures::intern::Interned;
@ -113,7 +113,7 @@ fn fast_print_path(path: &ast::Path) -> Symbol {
pub(crate) fn registered_tools(tcx: TyCtxt<'_>, (): ()) -> RegisteredTools { pub(crate) fn registered_tools(tcx: TyCtxt<'_>, (): ()) -> RegisteredTools {
let mut registered_tools = RegisteredTools::default(); let mut registered_tools = RegisteredTools::default();
let krate = tcx.crate_for_resolver(()).borrow(); let krate = tcx.crate_for_resolver(()).borrow();
for attr in tcx.sess.filter_by_name(&krate.attrs, sym::register_tool) { for attr in attr::filter_by_name(&krate.attrs, sym::register_tool) {
for nested_meta in attr.meta_item_list().unwrap_or_default() { for nested_meta in attr.meta_item_list().unwrap_or_default() {
match nested_meta.ident() { match nested_meta.ident() {
Some(ident) => { Some(ident) => {

View file

@ -5,7 +5,7 @@ use crate::errors::{
InvalidCharacterInCrateName, InvalidCharacterInCrateName,
}; };
use crate::Session; use crate::Session;
use rustc_ast as ast; use rustc_ast::{self as ast, attr};
use rustc_span::symbol::sym; use rustc_span::symbol::sym;
use rustc_span::{Span, Symbol}; use rustc_span::{Span, Symbol};
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
@ -56,7 +56,7 @@ pub fn find_crate_name(sess: &Session, attrs: &[ast::Attribute]) -> Symbol {
// the command line over one found in the #[crate_name] attribute. If we // the command line over one found in the #[crate_name] attribute. If we
// find both we ensure that they're the same later on as well. // find both we ensure that they're the same later on as well.
let attr_crate_name = let attr_crate_name =
sess.find_by_name(attrs, sym::crate_name).and_then(|at| at.value_str().map(|s| (at, s))); attr::find_by_name(attrs, sym::crate_name).and_then(|at| at.value_str().map(|s| (at, s)));
if let Some(ref s) = sess.opts.crate_name { if let Some(ref s) = sess.opts.crate_name {
let s = Symbol::intern(s); let s = Symbol::intern(s);

View file

@ -30,7 +30,7 @@ use rustc_macros::HashStable_Generic;
pub use rustc_span::def_id::StableCrateId; pub use rustc_span::def_id::StableCrateId;
use rustc_span::edition::Edition; use rustc_span::edition::Edition;
use rustc_span::source_map::{FileLoader, RealFileLoader, SourceMap, Span}; use rustc_span::source_map::{FileLoader, RealFileLoader, SourceMap, Span};
use rustc_span::{sym, SourceFileHashAlgorithm, Symbol}; use rustc_span::{SourceFileHashAlgorithm, Symbol};
use rustc_target::asm::InlineAsmArch; use rustc_target::asm::InlineAsmArch;
use rustc_target::spec::{CodeModel, PanicStrategy, RelocModel, RelroLevel}; use rustc_target::spec::{CodeModel, PanicStrategy, RelocModel, RelroLevel};
use rustc_target::spec::{ use rustc_target::spec::{
@ -1003,40 +1003,6 @@ impl Session {
|| self.opts.unstable_opts.sanitizer.intersects(SanitizerSet::ADDRESS | SanitizerSet::KERNELADDRESS | SanitizerSet::MEMORY | SanitizerSet::HWADDRESS) || self.opts.unstable_opts.sanitizer.intersects(SanitizerSet::ADDRESS | SanitizerSet::KERNELADDRESS | SanitizerSet::MEMORY | SanitizerSet::HWADDRESS)
} }
pub fn is_proc_macro_attr(&self, attr: &Attribute) -> bool {
[sym::proc_macro, sym::proc_macro_attribute, sym::proc_macro_derive]
.iter()
.any(|kind| attr.has_name(*kind))
}
pub fn contains_name(&self, attrs: &[Attribute], name: Symbol) -> bool {
attrs.iter().any(|item| item.has_name(name))
}
pub fn find_by_name<'a>(
&'a self,
attrs: &'a [Attribute],
name: Symbol,
) -> Option<&'a Attribute> {
attrs.iter().find(|attr| attr.has_name(name))
}
pub fn filter_by_name<'a>(
&'a self,
attrs: &'a [Attribute],
name: Symbol,
) -> impl Iterator<Item = &'a Attribute> {
attrs.iter().filter(move |attr| attr.has_name(name))
}
pub fn first_attr_value_str_by_name(
&self,
attrs: &[Attribute],
name: Symbol,
) -> Option<Symbol> {
attrs.iter().find(|at| at.has_name(name)).and_then(|at| at.value_str())
}
pub fn diagnostic_width(&self) -> usize { pub fn diagnostic_width(&self) -> usize {
let default_column_width = 140; let default_column_width = 140;
if let Some(width) = self.opts.diagnostic_width { if let Some(width) = self.opts.diagnostic_width {

View file

@ -28,7 +28,7 @@ pub(super) fn check_item<'tcx>(cx: &LateContext<'tcx>, item: &'tcx hir::Item<'_>
let fn_header_span = item.span.with_hi(sig.decl.output.span().hi()); let fn_header_span = item.span.with_hi(sig.decl.output.span().hi());
if let Some(attr) = attr { if let Some(attr) = attr {
check_needless_must_use(cx, sig.decl, item.owner_id, item.span, fn_header_span, attr); check_needless_must_use(cx, sig.decl, item.owner_id, item.span, fn_header_span, attr);
} else if is_public && !is_proc_macro(cx.sess(), attrs) && !attrs.iter().any(|a| a.has_name(sym::no_mangle)) { } else if is_public && !is_proc_macro(attrs) && !attrs.iter().any(|a| a.has_name(sym::no_mangle)) {
check_must_use_candidate( check_must_use_candidate(
cx, cx,
sig.decl, sig.decl,
@ -51,7 +51,7 @@ pub(super) fn check_impl_item<'tcx>(cx: &LateContext<'tcx>, item: &'tcx hir::Imp
if let Some(attr) = attr { if let Some(attr) = attr {
check_needless_must_use(cx, sig.decl, item.owner_id, item.span, fn_header_span, attr); check_needless_must_use(cx, sig.decl, item.owner_id, item.span, fn_header_span, attr);
} else if is_public } else if is_public
&& !is_proc_macro(cx.sess(), attrs) && !is_proc_macro(attrs)
&& trait_ref_of_method(cx, item.owner_id.def_id).is_none() && trait_ref_of_method(cx, item.owner_id.def_id).is_none()
{ {
check_must_use_candidate( check_must_use_candidate(
@ -78,7 +78,7 @@ pub(super) fn check_trait_item<'tcx>(cx: &LateContext<'tcx>, item: &'tcx hir::Tr
check_needless_must_use(cx, sig.decl, item.owner_id, item.span, fn_header_span, attr); check_needless_must_use(cx, sig.decl, item.owner_id, item.span, fn_header_span, attr);
} else if let hir::TraitFn::Provided(eid) = *eid { } else if let hir::TraitFn::Provided(eid) = *eid {
let body = cx.tcx.hir().body(eid); let body = cx.tcx.hir().body(eid);
if attr.is_none() && is_public && !is_proc_macro(cx.sess(), attrs) { if attr.is_none() && is_public && !is_proc_macro(attrs) {
check_must_use_candidate( check_must_use_candidate(
cx, cx,
sig.decl, sig.decl,

View file

@ -145,8 +145,8 @@ pub fn get_unique_attr<'a>(
/// Return true if the attributes contain any of `proc_macro`, /// Return true if the attributes contain any of `proc_macro`,
/// `proc_macro_derive` or `proc_macro_attribute`, false otherwise /// `proc_macro_derive` or `proc_macro_attribute`, false otherwise
pub fn is_proc_macro(sess: &Session, attrs: &[ast::Attribute]) -> bool { pub fn is_proc_macro(attrs: &[ast::Attribute]) -> bool {
attrs.iter().any(|attr| sess.is_proc_macro_attr(attr)) attrs.iter().any(|attr| attr.is_proc_macro_attr())
} }
/// Return true if the attributes contain `#[doc(hidden)]` /// Return true if the attributes contain `#[doc(hidden)]`

View file

@ -2,7 +2,7 @@
use rustc_ast::ast; use rustc_ast::ast;
use rustc_ast::HasAttrs; use rustc_ast::HasAttrs;
use rustc_span::{symbol::sym, Span, Symbol}; use rustc_span::{symbol::sym, Span};
use self::doc_comment::DocCommentFormatter; use self::doc_comment::DocCommentFormatter;
use crate::comment::{contains_comment, rewrite_doc_comment, CommentStyle}; use crate::comment::{contains_comment, rewrite_doc_comment, CommentStyle};
@ -19,20 +19,6 @@ use crate::utils::{count_newlines, mk_sp};
mod doc_comment; mod doc_comment;
pub(crate) fn contains_name(attrs: &[ast::Attribute], name: Symbol) -> bool {
attrs.iter().any(|attr| attr.has_name(name))
}
pub(crate) fn first_attr_value_str_by_name(
attrs: &[ast::Attribute],
name: Symbol,
) -> Option<Symbol> {
attrs
.iter()
.find(|attr| attr.has_name(name))
.and_then(|attr| attr.value_str())
}
/// Returns attributes on the given statement. /// Returns attributes on the given statement.
pub(crate) fn get_attrs_from_stmt(stmt: &ast::Stmt) -> &[ast::Attribute] { pub(crate) fn get_attrs_from_stmt(stmt: &ast::Stmt) -> &[ast::Attribute] {
stmt.attrs() stmt.attrs()

View file

@ -2,13 +2,12 @@ use std::panic::{catch_unwind, AssertUnwindSafe};
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use rustc_ast::token::TokenKind; use rustc_ast::token::TokenKind;
use rustc_ast::{ast, ptr}; use rustc_ast::{ast, attr, ptr};
use rustc_errors::Diagnostic; use rustc_errors::Diagnostic;
use rustc_parse::{new_parser_from_file, parser::Parser as RawParser}; use rustc_parse::{new_parser_from_file, parser::Parser as RawParser};
use rustc_span::{sym, Span}; use rustc_span::{sym, Span};
use thin_vec::ThinVec; use thin_vec::ThinVec;
use crate::attr::first_attr_value_str_by_name;
use crate::parse::session::ParseSess; use crate::parse::session::ParseSess;
use crate::Input; use crate::Input;
@ -93,7 +92,7 @@ pub(crate) enum ParserError {
impl<'a> Parser<'a> { impl<'a> Parser<'a> {
pub(crate) fn submod_path_from_attr(attrs: &[ast::Attribute], path: &Path) -> Option<PathBuf> { pub(crate) fn submod_path_from_attr(attrs: &[ast::Attribute], path: &Path) -> Option<PathBuf> {
let path_sym = first_attr_value_str_by_name(attrs, sym::path)?; let path_sym = attr::first_attr_value_str_by_name(attrs, sym::path)?;
let path_str = path_sym.as_str(); let path_str = path_sym.as_str();
// On windows, the base path might have the form // On windows, the base path might have the form

View file

@ -8,7 +8,7 @@
use std::cmp::{Ord, Ordering}; use std::cmp::{Ord, Ordering};
use rustc_ast::ast; use rustc_ast::{ast, attr};
use rustc_span::{symbol::sym, Span}; use rustc_span::{symbol::sym, Span};
use crate::config::{Config, GroupImportsTactic}; use crate::config::{Config, GroupImportsTactic};
@ -167,7 +167,7 @@ fn rewrite_reorderable_or_regroupable_items(
} }
fn contains_macro_use_attr(item: &ast::Item) -> bool { fn contains_macro_use_attr(item: &ast::Item) -> bool {
crate::attr::contains_name(&item.attrs, sym::macro_use) attr::contains_name(&item.attrs, sym::macro_use)
} }
/// Divides imports into three groups, corresponding to standard, external /// Divides imports into three groups, corresponding to standard, external

View file

@ -1,80 +0,0 @@
// force-host
#![feature(rustc_private)]
extern crate rustc_driver;
extern crate rustc_hir;
extern crate rustc_lint;
extern crate rustc_span;
#[macro_use]
extern crate rustc_session;
extern crate rustc_ast;
use rustc_ast::attr;
use rustc_driver::plugin::Registry;
use rustc_lint::{LateContext, LateLintPass, LintContext, LintPass};
use rustc_span::def_id::CRATE_DEF_ID;
use rustc_span::symbol::Symbol;
macro_rules! fake_lint_pass {
($struct:ident, $($attr:expr),*) => {
struct $struct;
impl LintPass for $struct {
fn name(&self) -> &'static str {
stringify!($struct)
}
}
impl LateLintPass<'_> for $struct {
fn check_crate(&mut self, cx: &LateContext) {
let attrs = cx.tcx.hir().attrs(rustc_hir::CRATE_HIR_ID);
let span = cx.tcx.def_span(CRATE_DEF_ID);
$(
if !cx.sess().contains_name(attrs, $attr) {
cx.lint(CRATE_NOT_OKAY, |lint| {
let msg = format!("crate is not marked with #![{}]", $attr);
lint.build(&msg).set_span(span).emit();
});
}
)*
}
}
}
}
declare_lint!(CRATE_NOT_OKAY, Warn, "crate not marked with #![crate_okay]");
declare_lint!(CRATE_NOT_RED, Warn, "crate not marked with #![crate_red]");
declare_lint!(CRATE_NOT_BLUE, Warn, "crate not marked with #![crate_blue]");
declare_lint!(CRATE_NOT_GREY, Warn, "crate not marked with #![crate_grey]");
declare_lint!(CRATE_NOT_GREEN, Warn, "crate not marked with #![crate_green]");
fake_lint_pass! {
PassOkay,
Symbol::intern("crate_okay")
}
fake_lint_pass! {
PassRedBlue,
Symbol::intern("crate_red"), Symbol::intern("crate_blue")
}
fake_lint_pass! {
PassGreyGreen,
Symbol::intern("crate_grey"), Symbol::intern("crate_green")
}
#[no_mangle]
fn __rustc_plugin_registrar(reg: &mut Registry) {
reg.lint_store.register_lints(&[
&CRATE_NOT_OKAY,
&CRATE_NOT_RED,
&CRATE_NOT_BLUE,
&CRATE_NOT_GREY,
&CRATE_NOT_GREEN,
]);
reg.lint_store.register_late_pass(|_| Box::new(PassOkay));
reg.lint_store.register_late_pass(|_| Box::new(PassRedBlue));
reg.lint_store.register_late_pass(|_| Box::new(PassGreyGreen));
}

View file

@ -4,13 +4,13 @@
extern crate rustc_driver; extern crate rustc_driver;
extern crate rustc_hir; extern crate rustc_hir;
#[macro_use]
extern crate rustc_lint; extern crate rustc_lint;
#[macro_use] #[macro_use]
extern crate rustc_session; extern crate rustc_session;
extern crate rustc_ast; extern crate rustc_ast;
extern crate rustc_span; extern crate rustc_span;
use rustc_ast::attr;
use rustc_driver::plugin::Registry; use rustc_driver::plugin::Registry;
use rustc_lint::{LateContext, LateLintPass, LintContext}; use rustc_lint::{LateContext, LateLintPass, LintContext};
use rustc_span::def_id::CRATE_DEF_ID; use rustc_span::def_id::CRATE_DEF_ID;
@ -28,12 +28,10 @@ impl<'tcx> LateLintPass<'tcx> for Pass {
fn check_crate(&mut self, cx: &LateContext) { fn check_crate(&mut self, cx: &LateContext) {
let attrs = cx.tcx.hir().attrs(rustc_hir::CRATE_HIR_ID); let attrs = cx.tcx.hir().attrs(rustc_hir::CRATE_HIR_ID);
let span = cx.tcx.def_span(CRATE_DEF_ID); let span = cx.tcx.def_span(CRATE_DEF_ID);
if !cx.sess().contains_name(attrs, Symbol::intern("crate_okay")) { if !attr::contains_name(attrs, Symbol::intern("crate_okay")) {
cx.lint( cx.lint(CRATE_NOT_OKAY, "crate is not marked with #![crate_okay]", |lint| {
CRATE_NOT_OKAY, lint.set_span(span)
"crate is not marked with #![crate_okay]", });
|lint| lint.set_span(span)
);
} }
} }
} }