Skip to content

Commit 858ece6

Browse files
committed
integrate new parsed lint attrs into clippy
1 parent 18b780c commit 858ece6

6 files changed

Lines changed: 33 additions & 38 deletions

File tree

src/tools/clippy/clippy_lints/src/attrs/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -586,7 +586,7 @@ impl EarlyLintPass for PostExpansionEarlyAttributes {
586586
if matches!(name, sym::allow | sym::expect) && self.msrv.meets(msrvs::LINT_REASONS_STABILIZATION) {
587587
allow_attributes_without_reason::check(cx, name, items, attr);
588588
}
589-
if is_lint_level(name, attr.id) {
589+
if is_lint_level(name) {
590590
blanket_clippy_restriction_lints::check(cx, name, items);
591591
}
592592
if items.is_empty() || !attr.has_name(sym::deprecated) {

src/tools/clippy/clippy_lints/src/attrs/unnecessary_clippy_cfg.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
use crate::attrs::is_lint_level;
2+
13
use super::{Attribute, UNNECESSARY_CLIPPY_CFG};
24
use clippy_utils::diagnostics::{span_lint_and_note, span_lint_and_sugg};
35
use clippy_utils::source::SpanRangeExt;
46
use itertools::Itertools;
57
use rustc_ast::AttrStyle;
68
use rustc_errors::Applicability;
7-
use rustc_lint::{EarlyContext, Level};
9+
use rustc_lint::{EarlyContext};
810
use rustc_span::sym;
911

1012
pub(super) fn check(
@@ -13,9 +15,10 @@ pub(super) fn check(
1315
behind_cfg_attr: &rustc_ast::MetaItem,
1416
attr: &Attribute,
1517
) {
18+
// FIXME use proper attr parsing here
1619
if cfg_attr.has_name(sym::clippy)
1720
&& let Some(ident) = behind_cfg_attr.ident()
18-
&& Level::from_symbol(ident.name, || Some(attr.id)).is_some()
21+
&& is_lint_level(ident.name)
1922
&& let Some(items) = behind_cfg_attr.meta_item_list()
2023
{
2124
let nb_items = items.len();

src/tools/clippy/clippy_lints/src/attrs/useless_attribute.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ pub(super) fn check(cx: &EarlyContext<'_>, item: &Item, attrs: &[Attribute]) {
1515
return;
1616
}
1717
if let Some(lint_list) = &attr.meta_item_list()
18-
&& attr.name().is_some_and(|name| is_lint_level(name, attr.id))
18+
&& attr.name().is_some_and(|name| is_lint_level(name))
1919
{
2020
for lint in lint_list {
2121
match item.kind {

src/tools/clippy/clippy_lints/src/attrs/utils.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
use clippy_utils::macros::{is_panic, macro_backtrace};
2-
use rustc_ast::{AttrId, MetaItemInner};
2+
use rustc_ast::{MetaItemInner};
33
use rustc_hir::{
44
Block, Expr, ExprKind, ImplItem, ImplItemKind, Item, ItemKind, StmtKind, TraitFn, TraitItem, TraitItemKind,
55
};
6-
use rustc_lint::{LateContext, Level};
6+
use rustc_lint::{LateContext};
77
use rustc_middle::ty;
88
use rustc_span::sym;
99
use rustc_span::symbol::Symbol;
@@ -16,8 +16,8 @@ pub(super) fn is_word(nmi: &MetaItemInner, expected: Symbol) -> bool {
1616
}
1717
}
1818

19-
pub(super) fn is_lint_level(symbol: Symbol, attr_id: AttrId) -> bool {
20-
Level::from_symbol(symbol, || Some(attr_id)).is_some()
19+
pub(super) fn is_lint_level(symbol: Symbol) -> bool {
20+
[sym::allow, sym::deny, sym::expect, sym::forbid, sym::warn].contains(&symbol)
2121
}
2222

2323
pub(super) fn is_relevant_item(cx: &LateContext<'_>, item: &Item<'_>) -> bool {

src/tools/clippy/clippy_lints/src/collapsible_if.rs

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ use clippy_utils::diagnostics::span_lint_hir_and_then;
33
use clippy_utils::msrvs::Msrv;
44
use clippy_utils::source::{IntoSpan as _, SpanRangeExt, snippet, snippet_block_with_applicability};
55
use clippy_utils::{can_use_if_let_chains, span_contains_non_whitespace, sym, tokenize_with_text};
6-
use rustc_ast::{BinOpKind, MetaItemInner};
6+
use rustc_ast::{BinOpKind};
77
use rustc_errors::Applicability;
8-
use rustc_hir::{Block, Expr, ExprKind, StmtKind};
8+
use rustc_hir::attrs::{AttributeKind, LintAttributeKind};
9+
use rustc_hir::{Attribute, Block, Expr, ExprKind, StmtKind};
910
use rustc_lexer::TokenKind;
10-
use rustc_lint::{LateContext, LateLintPass, Level};
11+
use rustc_lint::{LateContext, LateLintPass};
1112
use rustc_session::impl_lint_pass;
1213
use rustc_span::source_map::SourceMap;
1314
use rustc_span::{BytePos, Span, Symbol};
@@ -238,19 +239,16 @@ impl CollapsibleIf {
238239
!span_contains_non_whitespace(cx, span, self.lint_commented_code)
239240
},
240241

241-
[attr]
242-
if matches!(Level::from_attr(attr), Some((Level::Expect, _)))
243-
&& let Some(metas) = attr.meta_item_list()
244-
&& let Some(MetaItemInner::MetaItem(meta_item)) = metas.first()
245-
&& let [tool, lint_name] = meta_item.path.segments.as_slice()
246-
&& tool.ident.name == sym::clippy
247-
&& [expected_lint_name, sym::style, sym::all].contains(&lint_name.ident.name) =>
242+
[Attribute::Parsed(AttributeKind::LintAttribute {kind: LintAttributeKind::Expect, sub_attrs})] =>
248243
{
249-
// There is an `expect` attribute -- check that there is no _other_ significant text
250-
let span_before_attr = inner_if.span.split_at(1).1.until(attr.span());
251-
let span_after_attr = attr.span().between(inner_if_expr.span);
252-
!span_contains_non_whitespace(cx, span_before_attr, self.lint_commented_code)
253-
&& !span_contains_non_whitespace(cx, span_after_attr, self.lint_commented_code)
244+
sub_attrs.into_iter().flat_map(|attr|attr.lint_instances.iter().map(|group|(attr.attr_span, group))).filter(|(_, lint_id)|lint_id.tool_is_named(sym::clippy) && (expected_lint_name == lint_id.lint_name() || [expected_lint_name, sym::style, sym::all].contains(&lint_id.original_lint_name()) )).any(|(attr_span, _)|{
245+
246+
// There is an `expect` attribute -- check that there is no _other_ significant text
247+
let span_before_attr = inner_if.span.split_at(1).1.until(attr_span);
248+
let span_after_attr = attr_span.between(inner_if_expr.span);
249+
!span_contains_non_whitespace(cx, span_before_attr, self.lint_commented_code)
250+
&& !span_contains_non_whitespace(cx, span_after_attr, self.lint_commented_code)
251+
})
254252
},
255253

256254
// There are other attributes, which are significant tokens -- check failed

src/tools/clippy/clippy_lints/src/returns/needless_return.rs

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ use clippy_utils::{
44
binary_expr_needs_parentheses, is_from_proc_macro, leaks_droppable_temporary_with_limited_lifetime,
55
span_contains_cfg, span_find_starting_semi, sym,
66
};
7-
use rustc_ast::MetaItemInner;
87
use rustc_errors::Applicability;
8+
use rustc_hir::attrs::{AttributeKind, LintAttributeKind};
99
use rustc_hir::intravisit::FnKind;
10-
use rustc_hir::{Body, Expr, ExprKind, HirId, LangItem, MatchSource, StmtKind};
11-
use rustc_lint::{LateContext, Level, LintContext};
10+
use rustc_hir::{Attribute, Body, Expr, ExprKind, HirId, LangItem, MatchSource, StmtKind};
11+
use rustc_lint::{LateContext, LintContext};
1212
use rustc_middle::ty::{self, Ty};
1313
use rustc_span::{BytePos, Pos, Span};
1414
use std::borrow::Cow;
@@ -180,18 +180,12 @@ fn check_final_expr<'tcx>(
180180
// actually fulfill the expectation (clippy::#12998)
181181
match cx.tcx.hir_attrs(expr.hir_id) {
182182
[] => {},
183-
[attr] => {
184-
if matches!(Level::from_attr(attr), Some((Level::Expect, _)))
185-
&& let metas = attr.meta_item_list()
186-
&& let Some(lst) = metas
187-
&& let [MetaItemInner::MetaItem(meta_item), ..] = lst.as_slice()
188-
&& let [tool, lint_name] = meta_item.path.segments.as_slice()
189-
&& tool.ident.name == sym::clippy
190-
&& matches!(
191-
lint_name.ident.name,
192-
sym::needless_return | sym::style | sym::all | sym::warnings
193-
)
194-
{
183+
[Attribute::Parsed(AttributeKind::LintAttribute {kind: LintAttributeKind::Expect, sub_attrs})] => {
184+
let lint = &sub_attrs[0].lint_instances[0];
185+
if !lint.tool_is_named(sym::clippy) {
186+
return;
187+
}
188+
if matches!(lint.original_lint_name(), sym::needless_return | sym::style | sym::all | sym::warnings) {
195189
// This is an expectation of the `needless_return` lint
196190
} else {
197191
return;

0 commit comments

Comments
 (0)