mirror of
https://github.com/rust-lang/rust.git
synced 2025-11-05 07:26:48 +00:00
85 lines
3.3 KiB
Rust
85 lines
3.3 KiB
Rust
use std::borrow::Cow;
|
|
|
|
use rustc_errors::{DiagArgValue, LintEmitter};
|
|
use rustc_hir::Target;
|
|
use rustc_hir::lints::{AttributeLint, AttributeLintKind};
|
|
use rustc_span::sym;
|
|
|
|
use crate::session_diagnostics;
|
|
|
|
pub fn emit_attribute_lint<L: LintEmitter>(lint: &AttributeLint<L::Id>, lint_emitter: L) {
|
|
let AttributeLint { id, span, kind } = lint;
|
|
|
|
match kind {
|
|
&AttributeLintKind::UnusedDuplicate { this, other, warning } => lint_emitter
|
|
.emit_node_span_lint(
|
|
rustc_session::lint::builtin::UNUSED_ATTRIBUTES,
|
|
*id,
|
|
*span,
|
|
session_diagnostics::UnusedDuplicate { this, other, warning },
|
|
),
|
|
AttributeLintKind::IllFormedAttributeInput { suggestions } => {
|
|
lint_emitter.emit_node_span_lint(
|
|
rustc_session::lint::builtin::ILL_FORMED_ATTRIBUTE_INPUT,
|
|
*id,
|
|
*span,
|
|
session_diagnostics::IllFormedAttributeInput {
|
|
num_suggestions: suggestions.len(),
|
|
suggestions: DiagArgValue::StrListSepByAnd(
|
|
suggestions.into_iter().map(|s| format!("`{s}`").into()).collect(),
|
|
),
|
|
},
|
|
);
|
|
}
|
|
AttributeLintKind::EmptyAttribute { first_span } => lint_emitter.emit_node_span_lint(
|
|
rustc_session::lint::builtin::UNUSED_ATTRIBUTES,
|
|
*id,
|
|
*first_span,
|
|
session_diagnostics::EmptyAttributeList { attr_span: *first_span },
|
|
),
|
|
AttributeLintKind::InvalidTarget { name, target, applied, only } => lint_emitter
|
|
.emit_node_span_lint(
|
|
// This check is here because `deprecated` had its own lint group and removing this would be a breaking change
|
|
if name.segments[0].name == sym::deprecated
|
|
&& ![
|
|
Target::Closure,
|
|
Target::Expression,
|
|
Target::Statement,
|
|
Target::Arm,
|
|
Target::MacroCall,
|
|
]
|
|
.contains(target)
|
|
{
|
|
rustc_session::lint::builtin::USELESS_DEPRECATED
|
|
} else {
|
|
rustc_session::lint::builtin::UNUSED_ATTRIBUTES
|
|
},
|
|
*id,
|
|
*span,
|
|
session_diagnostics::InvalidTargetLint {
|
|
name: name.clone(),
|
|
target: target.plural_name(),
|
|
applied: DiagArgValue::StrListSepByAnd(
|
|
applied.into_iter().map(|i| Cow::Owned(i.to_string())).collect(),
|
|
),
|
|
only,
|
|
attr_span: *span,
|
|
},
|
|
),
|
|
|
|
&AttributeLintKind::InvalidStyle { ref name, is_used_as_inner, target, target_span } => {
|
|
lint_emitter.emit_node_span_lint(
|
|
rustc_session::lint::builtin::UNUSED_ATTRIBUTES,
|
|
*id,
|
|
*span,
|
|
session_diagnostics::InvalidAttrStyle {
|
|
name: name.clone(),
|
|
is_used_as_inner,
|
|
target_span: (!is_used_as_inner).then_some(target_span),
|
|
target,
|
|
},
|
|
)
|
|
}
|
|
}
|
|
}
|