mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-21 17:52:12 +03:00
Do not mark attributes with unknown namespace as useless (#13766)
Fixes #13764 changelog: [`useless_attribute`]: do not trigger on attributes with unknown namespace
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
use super::USELESS_ATTRIBUTE;
|
||||
use super::utils::{extract_clippy_lint, is_lint_level, is_word};
|
||||
use super::utils::{is_lint_level, is_word, namespace_and_lint};
|
||||
use clippy_utils::diagnostics::span_lint_and_then;
|
||||
use clippy_utils::source::{SpanRangeExt, first_line_of_span};
|
||||
use rustc_ast::{Attribute, Item, ItemKind, MetaItemInner};
|
||||
use rustc_ast::{Attribute, Item, ItemKind};
|
||||
use rustc_errors::Applicability;
|
||||
use rustc_lint::{EarlyContext, LintContext};
|
||||
use rustc_middle::lint::in_external_macro;
|
||||
@@ -20,11 +20,13 @@ pub(super) fn check(cx: &EarlyContext<'_>, item: &Item, attrs: &[Attribute]) {
|
||||
for lint in lint_list {
|
||||
match item.kind {
|
||||
ItemKind::Use(..) => {
|
||||
if let MetaItemInner::MetaItem(meta_item) = lint
|
||||
&& meta_item.is_word()
|
||||
&& let Some(ident) = meta_item.ident()
|
||||
let (namespace @ (Some(sym::clippy) | None), Some(name)) = namespace_and_lint(lint) else {
|
||||
return;
|
||||
};
|
||||
|
||||
if namespace.is_none()
|
||||
&& matches!(
|
||||
ident.name.as_str(),
|
||||
name.as_str(),
|
||||
"ambiguous_glob_reexports"
|
||||
| "dead_code"
|
||||
| "deprecated"
|
||||
@@ -39,9 +41,9 @@ pub(super) fn check(cx: &EarlyContext<'_>, item: &Item, attrs: &[Attribute]) {
|
||||
return;
|
||||
}
|
||||
|
||||
if extract_clippy_lint(lint).is_some_and(|symbol| {
|
||||
matches!(
|
||||
symbol.as_str(),
|
||||
if namespace == Some(sym::clippy)
|
||||
&& matches!(
|
||||
name.as_str(),
|
||||
"wildcard_imports"
|
||||
| "enum_glob_use"
|
||||
| "redundant_pub_crate"
|
||||
@@ -52,7 +54,7 @@ pub(super) fn check(cx: &EarlyContext<'_>, item: &Item, attrs: &[Attribute]) {
|
||||
| "disallowed_types"
|
||||
| "unused_trait_names"
|
||||
)
|
||||
}) {
|
||||
{
|
||||
return;
|
||||
}
|
||||
},
|
||||
|
||||
@@ -75,13 +75,18 @@ fn is_relevant_expr(cx: &LateContext<'_>, typeck_results: &ty::TypeckResults<'_>
|
||||
|
||||
/// Returns the lint name if it is clippy lint.
|
||||
pub(super) fn extract_clippy_lint(lint: &MetaItemInner) -> Option<Symbol> {
|
||||
if let Some(meta_item) = lint.meta_item()
|
||||
&& meta_item.path.segments.len() > 1
|
||||
&& let tool_name = meta_item.path.segments[0].ident
|
||||
&& tool_name.name == sym::clippy
|
||||
{
|
||||
let lint_name = meta_item.path.segments.last().unwrap().ident.name;
|
||||
return Some(lint_name);
|
||||
match namespace_and_lint(lint) {
|
||||
(Some(sym::clippy), name) => name,
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the lint namespace, if any, as well as the lint name. (`None`, `None`) means
|
||||
/// the lint had less than 1 or more than 2 segments.
|
||||
pub(super) fn namespace_and_lint(lint: &MetaItemInner) -> (Option<Symbol>, Option<Symbol>) {
|
||||
match lint.meta_item().map(|m| m.path.segments.as_slice()).unwrap_or_default() {
|
||||
[name] => (None, Some(name.ident.name)),
|
||||
[namespace, name] => (Some(namespace.ident.name), Some(name.ident.name)),
|
||||
_ => (None, None),
|
||||
}
|
||||
None
|
||||
}
|
||||
|
||||
@@ -134,3 +134,12 @@ pub mod ambiguous_glob_exports {
|
||||
pub use my_prelude::*;
|
||||
pub use my_type::*;
|
||||
}
|
||||
|
||||
// Regression test for https://github.com/rust-lang/rust-clippy/issues/13764
|
||||
pub mod unknown_namespace {
|
||||
pub mod some_module {
|
||||
pub struct SomeType;
|
||||
}
|
||||
#[allow(rustc::non_glob_import_of_type_ir_inherent)]
|
||||
use some_module::SomeType;
|
||||
}
|
||||
|
||||
@@ -134,3 +134,12 @@ mod my_type {
|
||||
pub use my_prelude::*;
|
||||
pub use my_type::*;
|
||||
}
|
||||
|
||||
// Regression test for https://github.com/rust-lang/rust-clippy/issues/13764
|
||||
pub mod unknown_namespace {
|
||||
pub mod some_module {
|
||||
pub struct SomeType;
|
||||
}
|
||||
#[allow(rustc::non_glob_import_of_type_ir_inherent)]
|
||||
use some_module::SomeType;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user