Skip to content

Commit a65ea33

Browse files
committed
impl_no_args! macro
1 parent 2629a92 commit a65ea33

File tree

4 files changed

+33
-112
lines changed

4 files changed

+33
-112
lines changed

compiler/rustc_attr_parsing/src/attributes/lint_helpers.rs

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4,32 +4,6 @@ use rustc_span::{Span, Symbol, sym};
44
use crate::attributes::{NoArgsAttributeParser, OnDuplicate};
55
use crate::context::Stage;
66

7-
pub(crate) struct AsPtrParser;
8-
impl<S: Stage> NoArgsAttributeParser<S> for AsPtrParser {
9-
const PATH: &[Symbol] = &[sym::rustc_as_ptr];
10-
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
11-
12-
fn create(span: Span) -> AttributeKind {
13-
AttributeKind::AsPtr(span)
14-
}
15-
}
16-
17-
pub(crate) struct PubTransparentParser;
18-
impl<S: Stage> NoArgsAttributeParser<S> for PubTransparentParser {
19-
const PATH: &[Symbol] = &[sym::rustc_pub_transparent];
20-
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
21-
22-
fn create(span: Span) -> AttributeKind {
23-
AttributeKind::PubTransparent(span)
24-
}
25-
}
26-
27-
pub(crate) struct PassByValueParser;
28-
impl<S: Stage> NoArgsAttributeParser<S> for PassByValueParser {
29-
const PATH: &[Symbol] = &[sym::rustc_pass_by_value];
30-
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
31-
32-
fn create(span: Span) -> AttributeKind {
33-
AttributeKind::PassByValue(span)
34-
}
35-
}
7+
impl_no_args!(AsPtrParser: rustc_as_ptr => AsPtr / Error);
8+
impl_no_args!(PubTransparentParser: rustc_pub_transparent => PubTransparent / Error);
9+
impl_no_args!(PassByValueParser: rustc_pass_by_value => PassByValue / Error);

compiler/rustc_attr_parsing/src/attributes/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ use crate::context::{AcceptContext, FinalizeContext, Stage};
2525
use crate::parser::ArgParser;
2626
use crate::session_diagnostics::UnusedMultiple;
2727

28+
#[macro_use]
29+
pub(crate) mod util;
30+
2831
pub(crate) mod allow_unstable;
2932
pub(crate) mod cfg;
3033
pub(crate) mod codegen_attrs;
@@ -39,7 +42,6 @@ pub(crate) mod semantics;
3942
pub(crate) mod stability;
4043
pub(crate) mod traits;
4144
pub(crate) mod transparency;
42-
pub(crate) mod util;
4345

4446
type AcceptFn<T, S> = for<'sess> fn(&mut T, &mut AcceptContext<'_, 'sess, S>, &ArgParser<'_>);
4547
type AcceptMapping<T, S> = &'static [(&'static [Symbol], AttributeTemplate, AcceptFn<T, S>)];

compiler/rustc_attr_parsing/src/attributes/traits.rs

Lines changed: 13 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ use crate::context::{AcceptContext, Stage};
1111
use crate::parser::ArgParser;
1212

1313
pub(crate) struct SkipDuringMethodDispatchParser;
14-
1514
impl<S: Stage> SingleAttributeParser<S> for SkipDuringMethodDispatchParser {
1615
const PATH: &[Symbol] = &[sym::rustc_skip_during_method_dispatch];
1716
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepFirst;
@@ -55,85 +54,27 @@ impl<S: Stage> SingleAttributeParser<S> for SkipDuringMethodDispatchParser {
5554
}
5655
}
5756

58-
pub(crate) struct ConstTraitParser;
59-
impl<S: Stage> NoArgsAttributeParser<S> for ConstTraitParser {
60-
const PATH: &[Symbol] = &[sym::const_trait];
61-
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Warn;
57+
impl_no_args!(ParenSugarParser: rustc_paren_sugar => ParenSugar / Error);
58+
impl_no_args!(TypeConstParser: type_const => TypeConst / Error);
6259

63-
fn create(span: Span) -> AttributeKind {
64-
AttributeKind::ConstTrait(span)
65-
}
66-
}
67-
68-
pub(crate) struct DenyExplicitImplParser;
69-
impl<S: Stage> NoArgsAttributeParser<S> for DenyExplicitImplParser {
70-
const PATH: &[Symbol] = &[sym::rustc_deny_explicit_impl];
71-
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
60+
// Markers
7261

73-
fn create(span: Span) -> AttributeKind {
74-
AttributeKind::DenyExplicitImpl(span)
75-
}
76-
}
77-
78-
pub(crate) struct DoNotImplementViaObjectParser;
79-
impl<S: Stage> NoArgsAttributeParser<S> for DoNotImplementViaObjectParser {
80-
const PATH: &[Symbol] = &[sym::rustc_do_not_implement_via_object];
81-
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
62+
impl_no_args!(MarkerParser: marker => Marker / Error);
63+
impl_no_args!(DenyExplicitImplParser: rustc_deny_explicit_impl => DenyExplicitImpl / Error);
64+
impl_no_args!(DoNotImplementViaObjectParser: rustc_do_not_implement_via_object => DoNotImplementViaObject / Error);
8265

83-
fn create(span: Span) -> AttributeKind {
84-
AttributeKind::DoNotImplementViaObject(span)
85-
}
86-
}
66+
// Const traits
8767

88-
pub(crate) struct CoinductiveParser;
89-
impl<S: Stage> NoArgsAttributeParser<S> for CoinductiveParser {
90-
const PATH: &[Symbol] = &[sym::rustc_coinductive];
91-
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
68+
impl_no_args!(ConstTraitParser: const_trait => ConstTrait / Warn);
9269

93-
fn create(span: Span) -> AttributeKind {
94-
AttributeKind::Coinductive(span)
95-
}
96-
}
70+
// Specialization
9771

98-
pub(crate) struct TypeConstParser;
99-
impl<S: Stage> NoArgsAttributeParser<S> for TypeConstParser {
100-
const PATH: &[Symbol] = &[sym::type_const];
101-
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
72+
impl_no_args!(SpecializationTraitParser: rustc_specialization_trait => SpecializationTrait / Error);
73+
impl_no_args!(UnsafeSpecializationMarkerParser: rustc_unsafe_specialization_marker => UnsafeSpecializationMarker / Error);
10274

103-
fn create(span: Span) -> AttributeKind {
104-
AttributeKind::TypeConst(span)
105-
}
106-
}
75+
// Coherence
10776

108-
pub(crate) struct SpecializationTraitParser;
109-
impl<S: Stage> NoArgsAttributeParser<S> for SpecializationTraitParser {
110-
const PATH: &[Symbol] = &[sym::rustc_specialization_trait];
111-
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
112-
113-
fn create(span: Span) -> AttributeKind {
114-
AttributeKind::SpecializationTrait(span)
115-
}
116-
}
117-
118-
pub(crate) struct UnsafeSpecializationMarkerParser;
119-
impl<S: Stage> NoArgsAttributeParser<S> for UnsafeSpecializationMarkerParser {
120-
const PATH: &[Symbol] = &[sym::rustc_unsafe_specialization_marker];
121-
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
122-
123-
fn create(span: Span) -> AttributeKind {
124-
AttributeKind::UnsafeSpecializationMarker(span)
125-
}
126-
}
127-
128-
pub(crate) struct MarkerParser;
129-
impl<S: Stage> NoArgsAttributeParser<S> for MarkerParser {
130-
const PATH: &[Symbol] = &[sym::marker];
131-
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Warn;
132-
133-
fn create(span: Span) -> AttributeKind {
134-
AttributeKind::Marker(span)
135-
}
136-
}
77+
impl_no_args!(CoinductiveParser: rustc_coinductive => Coinductive / Error);
13778

13879
pub(crate) struct FundamentalParser;
13980
impl<S: Stage> NoArgsAttributeParser<S> for FundamentalParser {
@@ -144,13 +85,3 @@ impl<S: Stage> NoArgsAttributeParser<S> for FundamentalParser {
14485
AttributeKind::Fundamental
14586
}
14687
}
147-
148-
pub(crate) struct ParenSugarParser;
149-
impl<S: Stage> NoArgsAttributeParser<S> for ParenSugarParser {
150-
const PATH: &[Symbol] = &[sym::rustc_paren_sugar];
151-
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
152-
153-
fn create(span: Span) -> AttributeKind {
154-
AttributeKind::ParenSugar(span)
155-
}
156-
}

compiler/rustc_attr_parsing/src/attributes/util.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,17 @@ pub fn is_doc_alias_attrs_contain_symbol<'tcx, T: AttributeExt + 'tcx>(
5656
}
5757
false
5858
}
59+
60+
macro_rules! impl_no_args {
61+
($parser:ident : $sym:ident => $attrkind:ident / $on_duplicate:ident) => {
62+
pub(crate) struct $parser;
63+
impl<S: Stage> NoArgsAttributeParser<S> for $parser {
64+
const PATH: &[Symbol] = &[sym::$sym];
65+
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::$on_duplicate;
66+
67+
fn create(span: Span) -> AttributeKind {
68+
AttributeKind::$attrkind(span)
69+
}
70+
}
71+
};
72+
}

0 commit comments

Comments
 (0)