Skip to main content

rustc_attr_parsing/attributes/diagnostic/
do_not_recommend.rs

1use 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    // "Allowed" on any target, noop on all but trait impls
19    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 /*doesn't matter */);
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}