Skip to content

Commit 1170acb

Browse files
committed
Start using new diagnostic logic on all existing single parsers
1 parent 80854e5 commit 1170acb

File tree

4 files changed

+11
-35
lines changed

4 files changed

+11
-35
lines changed

compiler/rustc_attr_parsing/src/attributes/deprecation.rs

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use rustc_attr_data_structures::{AttributeKind, DeprecatedSince, Deprecation};
22
use rustc_span::symbol::Ident;
33
use rustc_span::{Span, Symbol, sym};
44

5+
use super::{AttributeDuplicates, OnDuplicate, SingleAttributeParser};
56
use super::util::parse_version;
67
use super::{AttributeDuplicates, SingleAttributeParser};
78
use crate::context::AcceptContext;
@@ -48,15 +49,7 @@ fn get(
4849
impl SingleAttributeParser for DeprecationParser {
4950
const PATH: &'static [rustc_span::Symbol] = &[sym::deprecated];
5051
const ON_DUPLICATE_STRATEGY: AttributeDuplicates = AttributeDuplicates::ErrorFollowing;
51-
52-
fn on_duplicate(cx: &AcceptContext<'_>, used: Span, unused: Span) {
53-
// FIXME(jdonszelmann): merge with errors from check_attrs.rs
54-
cx.emit_err(session_diagnostics::UnusedMultiple {
55-
this: used,
56-
other: unused,
57-
name: sym::deprecated,
58-
});
59-
}
52+
const ON_DUPLICATE: OnDuplicate = OnDuplicate::Error;
6053

6154
fn convert(cx: &AcceptContext<'_>, args: &ArgParser<'_>) -> Option<AttributeKind> {
6255
let features = cx.features();

compiler/rustc_attr_parsing/src/attributes/mod.rs

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -76,22 +76,7 @@ pub(crate) trait SingleAttributeParser: 'static {
7676
const PATH: &'static [rustc_span::Symbol];
7777

7878
const ON_DUPLICATE_STRATEGY: AttributeDuplicates;
79-
80-
/// Caled when a duplicate attribute is found.
81-
///
82-
/// - `unused` is the span of the attribute that was unused or bad because of some
83-
/// duplicate reason (see [`AttributeDuplicates`])
84-
/// - `used` is the span of the attribute that was used in favor of the unused attribute
85-
// FIXME(jdonszelmann): default error
86-
fn on_duplicate(cx: &AcceptContext<'_>, used: Span, unused: Span) {
87-
cx.emit_err(UnusedMultiple {
88-
this: used,
89-
other: unused,
90-
name: Symbol::intern(
91-
&Self::PATH.into_iter().map(|i| i.to_string()).collect::<Vec<_>>().join(".."),
92-
),
93-
});
94-
}
79+
const ON_DUPLICATE: OnDuplicate;
9580

9681
/// Converts a single syntactical attribute to a single semantic attribute, or [`AttributeKind`]
9782
fn convert(cx: &AcceptContext<'_>, args: &ArgParser<'_>) -> Option<AttributeKind>;
@@ -112,15 +97,15 @@ impl<T: SingleAttributeParser> AttributeParser for Single<T> {
11297
// keep the first and error
11398
AttributeDuplicates::ErrorFollowing => {
11499
if let Some((_, unused)) = group.1 {
115-
T::on_duplicate(cx, cx.attr_span, unused);
100+
T::ON_DUPLICATE.exec::<T>(cx, cx.attr_span, unused);
116101
return;
117102
}
118103
}
119104
// keep the new one and warn about the previous,
120105
// then replace
121106
AttributeDuplicates::FutureWarnPreceding => {
122107
if let Some((_, used)) = group.1 {
123-
T::on_duplicate(cx, used, cx.attr_span);
108+
T::ON_DUPLICATE.exec::<T>(cx, used, cx.attr_span);
124109
}
125110
}
126111
}

compiler/rustc_attr_parsing/src/attributes/stability.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use rustc_errors::ErrorGuaranteed;
88
use rustc_span::{Span, Symbol, kw, sym};
99

1010
use super::util::parse_version;
11-
use super::{AcceptMapping, AttributeDuplicates, AttributeParser, SingleAttributeParser};
11+
use super::{AcceptMapping, AttributeDuplicates, AttributeParser, OnDuplicate, SingleAttributeParser};
1212
use crate::context::{AcceptContext, FinalizeContext};
1313
use crate::parser::{ArgParser, MetaItemParser};
1414
use crate::session_diagnostics::{self, UnsupportedLiteralReason};
@@ -123,13 +123,12 @@ pub(crate) struct ConstStabilityIndirectParser;
123123
impl SingleAttributeParser for ConstStabilityIndirectParser {
124124
const PATH: &'static [rustc_span::Symbol] = &[sym::rustc_const_stable_indirect];
125125
const ON_DUPLICATE_STRATEGY: AttributeDuplicates = AttributeDuplicates::ErrorFollowing;
126-
127-
// ignore
128-
fn on_duplicate(_cx: &AcceptContext<'_>, _used: Span, _unused: Span) {}
126+
const ON_DUPLICATE: OnDuplicate = OnDuplicate::Ignore;
129127

130128
fn convert(_cx: &AcceptContext<'_>, _args: &ArgParser<'_>) -> Option<AttributeKind> {
131129
Some(AttributeKind::ConstStabilityIndirect)
132130
}
131+
133132
}
134133

135134
#[derive(Default)]

compiler/rustc_attr_parsing/src/attributes/transparency.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use rustc_attr_data_structures::AttributeKind;
22
use rustc_span::hygiene::Transparency;
33
use rustc_span::{Span, sym};
44

5-
use super::{AcceptContext, AttributeDuplicates, SingleAttributeParser};
5+
use super::{AcceptContext, AttributeDuplicates, OnDuplicate, SingleAttributeParser};
66
use crate::parser::ArgParser;
77

88
pub(crate) struct TransparencyParser;
@@ -13,10 +13,9 @@ pub(crate) struct TransparencyParser;
1313
impl SingleAttributeParser for TransparencyParser {
1414
const PATH: &'static [rustc_span::Symbol] = &[sym::rustc_macro_transparency];
1515
const ON_DUPLICATE_STRATEGY: AttributeDuplicates = AttributeDuplicates::ErrorFollowing;
16-
17-
fn on_duplicate(cx: &crate::context::AcceptContext<'_>, used: Span, unused: Span) {
16+
const ON_DUPLICATE: OnDuplicate = OnDuplicate::Custom(|cx, used, unused| {
1817
cx.dcx().span_err(vec![used, unused], "multiple macro transparency attributes");
19-
}
18+
});
2019

2120
fn convert(cx: &AcceptContext<'_>, args: &ArgParser<'_>) -> Option<AttributeKind> {
2221
match args.name_value().and_then(|nv| nv.value_as_str()) {

0 commit comments

Comments
 (0)