Auto merge of #131808 - jdonszelmann:hir-attributes, r=oli-obk,petrochenkov
Hir attributes This PR needs some explanation, it's somewhat large. - This is step one as described in https://github.com/rust-lang/compiler-team/issues/796. I've added a new `hir::Attribute` which is a lowered version of `ast::Attribute`. Right now, this has few concrete effects, however every place that after this PR parses a `hir::Attribute` should later get a pre-parsed attribute as described in https://github.com/rust-lang/compiler-team/issues/796 and transitively https://github.com/rust-lang/rust/issues/131229. - an extension trait `AttributeExt` is added, which is implemented for both `ast::Attribute` and `hir::Atribute`. This makes `hir::Attributes` mostly compatible with code that used to parse `ast::Attribute`. All its methods are also added as inherent methods to avoid having to import the trait everywhere in the compiler. - Incremental can not not hash `ast::Attribute` at all.
This commit is contained in:
commit
f2b91ccbc2
89 changed files with 1153 additions and 717 deletions
|
@ -387,7 +387,7 @@ pub struct MissingDoc;
|
|||
|
||||
impl_lint_pass!(MissingDoc => [MISSING_DOCS]);
|
||||
|
||||
fn has_doc(attr: &ast::Attribute) -> bool {
|
||||
fn has_doc(attr: &hir::Attribute) -> bool {
|
||||
if attr.is_doc_comment() {
|
||||
return true;
|
||||
}
|
||||
|
@ -1012,7 +1012,7 @@ declare_lint_pass!(InvalidNoMangleItems => [NO_MANGLE_CONST_ITEMS, NO_MANGLE_GEN
|
|||
impl<'tcx> LateLintPass<'tcx> for InvalidNoMangleItems {
|
||||
fn check_item(&mut self, cx: &LateContext<'_>, it: &hir::Item<'_>) {
|
||||
let attrs = cx.tcx.hir().attrs(it.hir_id());
|
||||
let check_no_mangle_on_generic_fn = |no_mangle_attr: &ast::Attribute,
|
||||
let check_no_mangle_on_generic_fn = |no_mangle_attr: &hir::Attribute,
|
||||
impl_generics: Option<&hir::Generics<'_>>,
|
||||
generics: &hir::Generics<'_>,
|
||||
span| {
|
||||
|
@ -1176,7 +1176,7 @@ declare_lint_pass!(
|
|||
);
|
||||
|
||||
impl<'tcx> LateLintPass<'tcx> for UnstableFeatures {
|
||||
fn check_attribute(&mut self, cx: &LateContext<'_>, attr: &ast::Attribute) {
|
||||
fn check_attribute(&mut self, cx: &LateContext<'_>, attr: &hir::Attribute) {
|
||||
if attr.has_name(sym::feature)
|
||||
&& let Some(items) = attr.meta_item_list()
|
||||
{
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use rustc_ast_pretty::pprust;
|
||||
use rustc_attr::AttributeExt;
|
||||
use rustc_data_structures::fx::{FxIndexMap, FxIndexSet};
|
||||
use rustc_errors::{Diag, LintDiagnostic, MultiSpan};
|
||||
use rustc_feature::{Features, GateIssue};
|
||||
|
@ -371,7 +372,7 @@ impl<'tcx> Visitor<'tcx> for LintLevelMaximum<'tcx> {
|
|||
|
||||
/// FIXME(blyxyas): In a future revision, we should also graph #![allow]s,
|
||||
/// but that is handled with more care
|
||||
fn visit_attribute(&mut self, attribute: &'tcx ast::Attribute) {
|
||||
fn visit_attribute(&mut self, attribute: &'tcx hir::Attribute) {
|
||||
if matches!(
|
||||
Level::from_attr(attribute),
|
||||
Some(
|
||||
|
@ -383,10 +384,9 @@ impl<'tcx> Visitor<'tcx> for LintLevelMaximum<'tcx> {
|
|||
)
|
||||
) {
|
||||
let store = unerased_lint_store(self.tcx.sess);
|
||||
let Some(meta) = attribute.meta() else { return };
|
||||
// Lint attributes are always a metalist inside a
|
||||
// metalist (even with just one lint).
|
||||
let Some(meta_item_list) = meta.meta_item_list() else { return };
|
||||
let Some(meta_item_list) = attribute.meta_item_list() else { return };
|
||||
|
||||
for meta_list in meta_item_list {
|
||||
// Convert Path to String
|
||||
|
@ -686,7 +686,12 @@ impl<'s, P: LintLevelsProvider> LintLevelsBuilder<'s, P> {
|
|||
};
|
||||
}
|
||||
|
||||
fn add(&mut self, attrs: &[ast::Attribute], is_crate_node: bool, source_hir_id: Option<HirId>) {
|
||||
fn add(
|
||||
&mut self,
|
||||
attrs: &[impl AttributeExt],
|
||||
is_crate_node: bool,
|
||||
source_hir_id: Option<HirId>,
|
||||
) {
|
||||
let sess = self.sess;
|
||||
for (attr_index, attr) in attrs.iter().enumerate() {
|
||||
if attr.has_name(sym::automatically_derived) {
|
||||
|
@ -910,7 +915,7 @@ impl<'s, P: LintLevelsProvider> LintLevelsBuilder<'s, P> {
|
|||
|
||||
let src = LintLevelSource::Node { name, span: sp, reason };
|
||||
for &id in ids {
|
||||
if self.check_gated_lint(id, attr.span, false) {
|
||||
if self.check_gated_lint(id, attr.span(), false) {
|
||||
self.insert_spec(id, (level, src));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
use rustc_abi::ExternAbi;
|
||||
use rustc_hir::def::{DefKind, Res};
|
||||
use rustc_hir::intravisit::FnKind;
|
||||
use rustc_hir::{GenericParamKind, PatKind};
|
||||
use rustc_hir::{AttrArgs, AttrItem, AttrKind, GenericParamKind, PatKind};
|
||||
use rustc_middle::ty;
|
||||
use rustc_session::config::CrateType;
|
||||
use rustc_session::{declare_lint, declare_lint_pass};
|
||||
|
@ -342,36 +342,37 @@ impl<'tcx> LateLintPass<'tcx> for NonSnakeCase {
|
|||
let crate_ident = if let Some(name) = &cx.tcx.sess.opts.crate_name {
|
||||
Some(Ident::from_str(name))
|
||||
} else {
|
||||
attr::find_by_name(cx.tcx.hir().attrs(hir::CRATE_HIR_ID), sym::crate_name)
|
||||
.and_then(|attr| attr.meta())
|
||||
.and_then(|meta| {
|
||||
meta.name_value_literal().and_then(|lit| {
|
||||
if let ast::LitKind::Str(name, ..) = lit.kind {
|
||||
// Discard the double quotes surrounding the literal.
|
||||
let sp = cx
|
||||
.sess()
|
||||
.source_map()
|
||||
.span_to_snippet(lit.span)
|
||||
.ok()
|
||||
.and_then(|snippet| {
|
||||
let left = snippet.find('"')?;
|
||||
let right =
|
||||
snippet.rfind('"').map(|pos| snippet.len() - pos)?;
|
||||
attr::find_by_name(cx.tcx.hir().attrs(hir::CRATE_HIR_ID), sym::crate_name).and_then(
|
||||
|attr| {
|
||||
if let AttrKind::Normal(n) = &attr.kind
|
||||
&& let AttrItem { args: AttrArgs::Eq { eq_span: _, expr: ref lit }, .. } =
|
||||
n.as_ref()
|
||||
&& let ast::LitKind::Str(name, ..) = lit.kind
|
||||
{
|
||||
// Discard the double quotes surrounding the literal.
|
||||
let sp = cx
|
||||
.sess()
|
||||
.source_map()
|
||||
.span_to_snippet(lit.span)
|
||||
.ok()
|
||||
.and_then(|snippet| {
|
||||
let left = snippet.find('"')?;
|
||||
let right = snippet.rfind('"').map(|pos| snippet.len() - pos)?;
|
||||
|
||||
Some(
|
||||
lit.span
|
||||
.with_lo(lit.span.lo() + BytePos(left as u32 + 1))
|
||||
.with_hi(lit.span.hi() - BytePos(right as u32)),
|
||||
)
|
||||
})
|
||||
.unwrap_or(lit.span);
|
||||
Some(
|
||||
lit.span
|
||||
.with_lo(lit.span.lo() + BytePos(left as u32 + 1))
|
||||
.with_hi(lit.span.hi() - BytePos(right as u32)),
|
||||
)
|
||||
})
|
||||
.unwrap_or(lit.span);
|
||||
|
||||
Some(Ident::new(name, sp))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
})
|
||||
Some(Ident::new(name, sp))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
},
|
||||
)
|
||||
};
|
||||
|
||||
if let Some(ident) = &crate_ident {
|
||||
|
|
|
@ -42,9 +42,9 @@ macro_rules! late_lint_methods {
|
|||
fn check_field_def(a: &'tcx rustc_hir::FieldDef<'tcx>);
|
||||
fn check_variant(a: &'tcx rustc_hir::Variant<'tcx>);
|
||||
fn check_path(a: &rustc_hir::Path<'tcx>, b: rustc_hir::HirId);
|
||||
fn check_attribute(a: &'tcx rustc_ast::Attribute);
|
||||
fn check_attributes(a: &'tcx [rustc_ast::Attribute]);
|
||||
fn check_attributes_post(a: &'tcx [rustc_ast::Attribute]);
|
||||
fn check_attribute(a: &'tcx rustc_hir::Attribute);
|
||||
fn check_attributes(a: &'tcx [rustc_hir::Attribute]);
|
||||
fn check_attributes_post(a: &'tcx [rustc_hir::Attribute]);
|
||||
]);
|
||||
)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue