Skip to content

Commit a2275c5

Browse files
Rollup merge of rust-lang#152555 - JonathanBrouwer:port_diagnostic_item, r=jdonszelmann
Port `#[rustc_diagnostic_item]` to the new attribute parsers r? @jdonszelmann
2 parents c3c5c34 + cbc6610 commit a2275c5

File tree

9 files changed

+61
-25
lines changed

9 files changed

+61
-25
lines changed

compiler/rustc_attr_parsing/src/attributes/rustc_internal.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1103,6 +1103,45 @@ impl<S: Stage> NoArgsAttributeParser<S> for RustcEffectiveVisibilityParser {
11031103
const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcEffectiveVisibility;
11041104
}
11051105

1106+
pub(crate) struct RustcDiagnosticItemParser;
1107+
1108+
impl<S: Stage> SingleAttributeParser<S> for RustcDiagnosticItemParser {
1109+
const PATH: &[Symbol] = &[sym::rustc_diagnostic_item];
1110+
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepOutermost;
1111+
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
1112+
const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[
1113+
Allow(Target::Trait),
1114+
Allow(Target::Struct),
1115+
Allow(Target::Enum),
1116+
Allow(Target::MacroDef),
1117+
Allow(Target::TyAlias),
1118+
Allow(Target::AssocTy),
1119+
Allow(Target::AssocConst),
1120+
Allow(Target::Fn),
1121+
Allow(Target::Const),
1122+
Allow(Target::Mod),
1123+
Allow(Target::Impl { of_trait: false }),
1124+
Allow(Target::Method(MethodKind::Inherent)),
1125+
Allow(Target::Method(MethodKind::Trait { body: false })),
1126+
Allow(Target::Method(MethodKind::Trait { body: true })),
1127+
Allow(Target::Method(MethodKind::TraitImpl)),
1128+
Allow(Target::Crate),
1129+
]);
1130+
const TEMPLATE: AttributeTemplate = template!(NameValueStr: "name");
1131+
1132+
fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser) -> Option<AttributeKind> {
1133+
let Some(nv) = args.name_value() else {
1134+
cx.expected_name_value(cx.attr_span, None);
1135+
return None;
1136+
};
1137+
let Some(value) = nv.value_as_str() else {
1138+
cx.expected_string_literal(nv.value_span, Some(nv.value_as_lit()));
1139+
return None;
1140+
};
1141+
Some(AttributeKind::RustcDiagnosticItem(value))
1142+
}
1143+
}
1144+
11061145
pub(crate) struct RustcSymbolName;
11071146

11081147
impl<S: Stage> SingleAttributeParser<S> for RustcSymbolName {

compiler/rustc_attr_parsing/src/context.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@ attribute_parsers!(
203203
Single<RustcBuiltinMacroParser>,
204204
Single<RustcDefPath>,
205205
Single<RustcDeprecatedSafe2024Parser>,
206+
Single<RustcDiagnosticItemParser>,
206207
Single<RustcForceInlineParser>,
207208
Single<RustcIfThisChangedParser>,
208209
Single<RustcLayoutScalarValidRangeEndParser>,

compiler/rustc_expand/src/base.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -919,7 +919,7 @@ impl SyntaxExtension {
919919
fn get_hide_backtrace(attrs: &[hir::Attribute]) -> bool {
920920
// FIXME(estebank): instead of reusing `#[rustc_diagnostic_item]` as a proxy, introduce a
921921
// new attribute purely for this under the `#[diagnostic]` namespace.
922-
ast::attr::find_by_name(attrs, sym::rustc_diagnostic_item).is_some()
922+
find_attr!(attrs, AttributeKind::RustcDiagnosticItem(..))
923923
}
924924

925925
/// Constructs a syntax extension with the given properties

compiler/rustc_hir/src/attrs/data_structures.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1156,6 +1156,9 @@ pub enum AttributeKind {
11561156
/// Represents `#[rustc_deprecated_safe_2024]`
11571157
RustcDeprecatedSafe2024 { suggestion: Symbol },
11581158

1159+
/// Represents `#[rustc_diagnostic_item]`
1160+
RustcDiagnosticItem(Symbol),
1161+
11591162
/// Represents `#[rustc_dummy]`.
11601163
RustcDummy,
11611164

compiler/rustc_hir/src/attrs/encode_cross_crate.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ impl AttributeKind {
113113
RustcDelayedBugFromInsideQuery => No,
114114
RustcDenyExplicitImpl(..) => No,
115115
RustcDeprecatedSafe2024 { .. } => Yes,
116+
RustcDiagnosticItem(..) => Yes,
116117
RustcDummy => No,
117118
RustcDumpDefParents => No,
118119
RustcDumpItemBounds => No,

compiler/rustc_passes/src/check_attr.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,7 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
308308
| AttributeKind::RustcDelayedBugFromInsideQuery
309309
| AttributeKind::RustcDenyExplicitImpl(..)
310310
| AttributeKind::RustcDeprecatedSafe2024 {..}
311+
| AttributeKind::RustcDiagnosticItem(..)
311312
| AttributeKind::RustcDummy
312313
| AttributeKind::RustcDumpDefParents
313314
| AttributeKind::RustcDumpItemBounds
@@ -398,7 +399,6 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
398399
| sym::panic_handler
399400
| sym::lang
400401
| sym::default_lib_allocator
401-
| sym::rustc_diagnostic_item
402402
| sym::rustc_nonnull_optimization_guaranteed
403403
| sym::rustc_inherit_overflow_checks
404404
| sym::rustc_on_unimplemented

compiler/rustc_passes/src/diagnostic_items.rs

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,21 @@
99
//!
1010
//! * Compiler internal types like `Ty` and `TyCtxt`
1111
12+
use rustc_hir::attrs::AttributeKind;
1213
use rustc_hir::diagnostic_items::DiagnosticItems;
13-
use rustc_hir::{Attribute, CRATE_OWNER_ID, OwnerId};
14+
use rustc_hir::{CRATE_OWNER_ID, OwnerId, find_attr};
1415
use rustc_middle::query::{LocalCrate, Providers};
1516
use rustc_middle::ty::TyCtxt;
17+
use rustc_span::Symbol;
1618
use rustc_span::def_id::{DefId, LOCAL_CRATE};
17-
use rustc_span::{Symbol, sym};
1819

1920
use crate::errors::DuplicateDiagnosticItemInCrate;
2021

2122
fn observe_item<'tcx>(tcx: TyCtxt<'tcx>, diagnostic_items: &mut DiagnosticItems, owner: OwnerId) {
2223
let attrs = tcx.hir_attrs(owner.into());
23-
if let Some(name) = extract(attrs) {
24+
if let Some(name) = find_attr!(attrs, AttributeKind::RustcDiagnosticItem(name) => name) {
2425
// insert into our table
25-
collect_item(tcx, diagnostic_items, name, owner.to_def_id());
26+
collect_item(tcx, diagnostic_items, *name, owner.to_def_id());
2627
}
2728
}
2829

@@ -53,13 +54,6 @@ fn report_duplicate_item(
5354
});
5455
}
5556

56-
/// Extract the first `rustc_diagnostic_item = "$name"` out of a list of attributes.
57-
fn extract(attrs: &[Attribute]) -> Option<Symbol> {
58-
attrs.iter().find_map(|attr| {
59-
if attr.has_name(sym::rustc_diagnostic_item) { attr.value_str() } else { None }
60-
})
61-
}
62-
6357
/// Traverse and collect the diagnostic items in the current
6458
fn diagnostic_items(tcx: TyCtxt<'_>, _: LocalCrate) -> DiagnosticItems {
6559
// Initialize the collector.

compiler/rustc_resolve/src/diagnostics.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1425,14 +1425,12 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
14251425
// a note about editions
14261426
let note = if let Some(did) = did {
14271427
let requires_note = !did.is_local()
1428-
&& this.tcx.get_attrs(did, sym::rustc_diagnostic_item).any(
1429-
|attr| {
1430-
[sym::TryInto, sym::TryFrom, sym::FromIterator]
1431-
.map(|x| Some(x))
1432-
.contains(&attr.value_str())
1433-
},
1428+
&& find_attr!(
1429+
this.tcx.get_all_attrs(did),
1430+
AttributeKind::RustcDiagnosticItem(
1431+
sym::TryInto | sym::TryFrom | sym::FromIterator
1432+
)
14341433
);
1435-
14361434
requires_note.then(|| {
14371435
format!(
14381436
"'{}' is included in the prelude starting in Edition 2021",

compiler/rustc_resolve/src/late/diagnostics.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use rustc_hir::attrs::AttributeKind;
2121
use rustc_hir::def::Namespace::{self, *};
2222
use rustc_hir::def::{self, CtorKind, CtorOf, DefKind, MacroKinds};
2323
use rustc_hir::def_id::{CRATE_DEF_ID, DefId};
24-
use rustc_hir::{MissingLifetimeKind, PrimTy};
24+
use rustc_hir::{MissingLifetimeKind, PrimTy, find_attr};
2525
use rustc_middle::ty;
2626
use rustc_session::{Session, lint};
2727
use rustc_span::edit_distance::{edit_distance, find_best_match_for_name};
@@ -2446,10 +2446,10 @@ impl<'ast, 'ra, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
24462446
.iter()
24472447
.filter_map(|candidate| candidate.did)
24482448
.find(|did| {
2449-
self.r
2450-
.tcx
2451-
.get_attrs(*did, sym::rustc_diagnostic_item)
2452-
.any(|attr| attr.value_str() == Some(sym::Default))
2449+
find_attr!(
2450+
self.r.tcx.get_all_attrs(*did),
2451+
AttributeKind::RustcDiagnosticItem(sym::Default)
2452+
)
24532453
});
24542454
let Some(default_trait) = default_trait else {
24552455
return;

0 commit comments

Comments
 (0)