extra_unused_type_parameters
:
* Inline `is_empty_exported_or_macro`. * Check if there are any generic parameters before walking the signature.
This commit is contained in:
parent
f178316ae2
commit
d409b5c700
@ -50,21 +50,6 @@ impl ExtraUnusedTypeParameters {
|
|||||||
avoid_breaking_exported_api,
|
avoid_breaking_exported_api,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Don't lint external macros or functions with empty bodies. Also, don't lint exported items
|
|
||||||
/// if the `avoid_breaking_exported_api` config option is set.
|
|
||||||
fn is_empty_exported_or_macro(
|
|
||||||
&self,
|
|
||||||
cx: &LateContext<'_>,
|
|
||||||
span: Span,
|
|
||||||
def_id: LocalDefId,
|
|
||||||
body_id: BodyId,
|
|
||||||
) -> bool {
|
|
||||||
let body = cx.tcx.hir().body(body_id).value;
|
|
||||||
let fn_empty = matches!(&body.kind, ExprKind::Block(blk, None) if blk.stmts.is_empty() && blk.expr.is_none());
|
|
||||||
let is_exported = cx.effective_visibilities.is_exported(def_id);
|
|
||||||
in_external_macro(cx.sess(), span) || fn_empty || (is_exported && self.avoid_breaking_exported_api)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl_lint_pass!(ExtraUnusedTypeParameters => [EXTRA_UNUSED_TYPE_PARAMETERS]);
|
impl_lint_pass!(ExtraUnusedTypeParameters => [EXTRA_UNUSED_TYPE_PARAMETERS]);
|
||||||
@ -266,10 +251,17 @@ impl<'cx, 'tcx> Visitor<'tcx> for TypeWalker<'cx, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_empty_body(cx: &LateContext<'_>, body: BodyId) -> bool {
|
||||||
|
matches!(cx.tcx.hir().body(body).value.kind, ExprKind::Block(b, _) if b.stmts.is_empty() && b.expr.is_none())
|
||||||
|
}
|
||||||
|
|
||||||
impl<'tcx> LateLintPass<'tcx> for ExtraUnusedTypeParameters {
|
impl<'tcx> LateLintPass<'tcx> for ExtraUnusedTypeParameters {
|
||||||
fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx Item<'tcx>) {
|
fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx Item<'tcx>) {
|
||||||
if let ItemKind::Fn(_, generics, body_id) = item.kind
|
if let ItemKind::Fn(_, generics, body_id) = item.kind
|
||||||
&& !self.is_empty_exported_or_macro(cx, item.span, item.owner_id.def_id, body_id)
|
&& !generics.params.is_empty()
|
||||||
|
&& !is_empty_body(cx, body_id)
|
||||||
|
&& (!self.avoid_breaking_exported_api || !cx.effective_visibilities.is_exported(item.owner_id.def_id))
|
||||||
|
&& !in_external_macro(cx.sess(), item.span)
|
||||||
&& !is_from_proc_macro(cx, item)
|
&& !is_from_proc_macro(cx, item)
|
||||||
{
|
{
|
||||||
let mut walker = TypeWalker::new(cx, generics);
|
let mut walker = TypeWalker::new(cx, generics);
|
||||||
@ -281,8 +273,12 @@ impl<'tcx> LateLintPass<'tcx> for ExtraUnusedTypeParameters {
|
|||||||
fn check_impl_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx ImplItem<'tcx>) {
|
fn check_impl_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx ImplItem<'tcx>) {
|
||||||
// Only lint on inherent methods, not trait methods.
|
// Only lint on inherent methods, not trait methods.
|
||||||
if let ImplItemKind::Fn(.., body_id) = item.kind
|
if let ImplItemKind::Fn(.., body_id) = item.kind
|
||||||
|
&& !item.generics.params.is_empty()
|
||||||
&& trait_ref_of_method(cx, item.owner_id.def_id).is_none()
|
&& trait_ref_of_method(cx, item.owner_id.def_id).is_none()
|
||||||
&& !self.is_empty_exported_or_macro(cx, item.span, item.owner_id.def_id, body_id)
|
&& !is_empty_body(cx, body_id)
|
||||||
|
&& (!self.avoid_breaking_exported_api || !cx.effective_visibilities.is_exported(item.owner_id.def_id))
|
||||||
|
&& !in_external_macro(cx.sess(), item.span)
|
||||||
|
&& !is_from_proc_macro(cx, item)
|
||||||
{
|
{
|
||||||
let mut walker = TypeWalker::new(cx, item.generics);
|
let mut walker = TypeWalker::new(cx, item.generics);
|
||||||
walk_impl_item(&mut walker, item);
|
walk_impl_item(&mut walker, item);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user