rustc_attr_parsing/attributes/diagnostic/
do_not_recommend.rs1use rustc_feature::AttributeStability;
2use rustc_hir::Target;
3use rustc_hir::attrs::AttributeKind;
4use rustc_session::lint::builtin::MALFORMED_DIAGNOSTIC_ATTRIBUTES;
5use rustc_span::{Symbol, sym};
6
7use crate::attributes::prelude::Allow;
8use crate::attributes::{OnDuplicate, SingleAttributeParser};
9use crate::context::AcceptContext;
10use crate::parser::ArgParser;
11use crate::target_checking::AllowedTargets;
12use crate::{AttributeTemplate, template};
13
14pub(crate) struct DoNotRecommendParser;
15impl SingleAttributeParser for DoNotRecommendParser {
16 const PATH: &[Symbol] = &[sym::diagnostic, sym::do_not_recommend];
17 const ON_DUPLICATE: OnDuplicate = OnDuplicate::Warn;
18 const ALLOWED_TARGETS: AllowedTargets =
20 AllowedTargets::AllowListWarnRest(&[Allow(Target::Impl { of_trait: true })]);
21 const TEMPLATE: AttributeTemplate = crate::AttributeTemplate {
word: true,
list: None,
one_of: &[],
name_value_str: None,
docs: None,
}template!(Word );
22 const STABILITY: AttributeStability = AttributeStability::Stable;
23
24 fn convert(cx: &mut AcceptContext<'_, '_>, args: &ArgParser) -> Option<AttributeKind> {
25 let attr_span = cx.attr_span;
26 if !#[allow(non_exhaustive_omitted_patterns)] match args {
ArgParser::NoArgs => true,
_ => false,
}matches!(args, ArgParser::NoArgs) {
27 cx.emit_lint(
28 MALFORMED_DIAGNOSTIC_ATTRIBUTES,
29 crate::diagnostics::DoNotRecommendDoesNotExpectArgs,
30 attr_span,
31 );
32 }
33
34 Some(AttributeKind::DoNotRecommend)
35 }
36}