rustc_attr_parsing/attributes/loop_match.rs
1use rustc_attr_data_structures::AttributeKind;
2use rustc_feature::{AttributeTemplate, template};
3use rustc_span::{Symbol, sym};
4
5use crate::attributes::{AttributeOrder, OnDuplicate, SingleAttributeParser};
6use crate::context::{AcceptContext, Stage};
7use crate::parser::ArgParser;
8
9pub(crate) struct LoopMatchParser;
10impl<S: Stage> SingleAttributeParser<S> for LoopMatchParser {
11 const PATH: &[Symbol] = &[sym::loop_match];
12 const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepFirst;
13 const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Warn;
14 const TEMPLATE: AttributeTemplate = template!(Word);
15
16 fn convert(cx: &mut AcceptContext<'_, '_, S>, _args: &ArgParser<'_>) -> Option<AttributeKind> {
17 Some(AttributeKind::LoopMatch(cx.attr_span))
18 }
19}
20
21pub(crate) struct ConstContinueParser;
22impl<S: Stage> SingleAttributeParser<S> for ConstContinueParser {
23 const PATH: &[Symbol] = &[sym::const_continue];
24 const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepFirst;
25 const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Warn;
26 const TEMPLATE: AttributeTemplate = template!(Word);
27
28 fn convert(cx: &mut AcceptContext<'_, '_, S>, _args: &ArgParser<'_>) -> Option<AttributeKind> {
29 Some(AttributeKind::ConstContinue(cx.attr_span))
30 }
31}