rustc_attr_parsing/
lints.rs1use rustc_attr_data_structures::lints::{AttributeLint, AttributeLintKind};
2use rustc_errors::{DiagArgValue, LintEmitter};
3use rustc_hir::HirId;
4
5use crate::session_diagnostics;
6
7pub fn emit_attribute_lint<L: LintEmitter>(lint: &AttributeLint<HirId>, lint_emitter: L) {
8    let AttributeLint { id, span, kind } = lint;
9
10    match kind {
11        &AttributeLintKind::UnusedDuplicate { this, other, warning } => lint_emitter
12            .emit_node_span_lint(
13                rustc_session::lint::builtin::UNUSED_ATTRIBUTES,
14                *id,
15                *span,
16                session_diagnostics::UnusedDuplicate { this, other, warning },
17            ),
18        AttributeLintKind::IllFormedAttributeInput { suggestions } => {
19            lint_emitter.emit_node_span_lint(
20                rustc_session::lint::builtin::ILL_FORMED_ATTRIBUTE_INPUT,
21                *id,
22                *span,
23                session_diagnostics::IllFormedAttributeInput {
24                    num_suggestions: suggestions.len(),
25                    suggestions: DiagArgValue::StrListSepByAnd(
26                        suggestions.into_iter().map(|s| format!("`{s}`").into()).collect(),
27                    ),
28                },
29            );
30        }
31        AttributeLintKind::EmptyAttribute { first_span } => lint_emitter.emit_node_span_lint(
32            rustc_session::lint::builtin::UNUSED_ATTRIBUTES,
33            *id,
34            *first_span,
35            session_diagnostics::EmptyAttributeList { attr_span: *first_span },
36        ),
37    }
38}