Make Clippy understand generic const items
This commit is contained in:
parent
8c390286e4
commit
59bb77c7fe
@ -50,7 +50,11 @@ impl<'tcx> LateLintPass<'tcx> for LargeConstArrays {
|
||||
fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx Item<'_>) {
|
||||
if_chain! {
|
||||
if !item.span.from_expansion();
|
||||
if let ItemKind::Const(hir_ty, _) = &item.kind;
|
||||
if let ItemKind::Const(hir_ty, generics, _) = &item.kind;
|
||||
// Since static items may not have generics, skip generic const items.
|
||||
// FIXME(generic_const_items): I don't think checking `generics.hwcp` suffices as it
|
||||
// doesn't account for empty where-clauses that only consist of keyword `where` IINM.
|
||||
if generics.params.is_empty() && !generics.has_where_clause_predicates;
|
||||
let ty = hir_ty_to_ty(cx.tcx, hir_ty);
|
||||
if let ty::Array(element_type, cst) = ty.kind();
|
||||
if let ConstKind::Value(ty::ValTree::Leaf(element_count)) = cst.kind();
|
||||
|
@ -302,7 +302,7 @@ fn lint(cx: &LateContext<'_>, source: Source) {
|
||||
|
||||
impl<'tcx> LateLintPass<'tcx> for NonCopyConst {
|
||||
fn check_item(&mut self, cx: &LateContext<'tcx>, it: &'tcx Item<'_>) {
|
||||
if let ItemKind::Const(hir_ty, body_id) = it.kind {
|
||||
if let ItemKind::Const(hir_ty, _generics, body_id) = it.kind {
|
||||
let ty = hir_ty_to_ty(cx.tcx, hir_ty);
|
||||
if !ignored_macro(cx, it) && is_unfrozen(cx, ty) && is_value_unfrozen_poly(cx, body_id, ty) {
|
||||
lint(cx, Source::Item { item: it.span });
|
||||
|
@ -349,7 +349,7 @@ fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx Item<'_>) {
|
||||
let is_exported = cx.effective_visibilities.is_exported(item.owner_id.def_id);
|
||||
|
||||
match item.kind {
|
||||
ItemKind::Static(ty, _, _) | ItemKind::Const(ty, _) => self.check_ty(
|
||||
ItemKind::Static(ty, _, _) | ItemKind::Const(ty, _, _) => self.check_ty(
|
||||
cx,
|
||||
ty,
|
||||
CheckTyContext {
|
||||
|
@ -301,15 +301,17 @@ pub fn eq_item_kind(l: &ItemKind, r: &ItemKind) -> bool {
|
||||
(
|
||||
Const(box ast::ConstItem {
|
||||
defaultness: ld,
|
||||
generics: lg,
|
||||
ty: lt,
|
||||
expr: le,
|
||||
}),
|
||||
Const(box ast::ConstItem {
|
||||
defaultness: rd,
|
||||
generics: rg,
|
||||
ty: rt,
|
||||
expr: re,
|
||||
}),
|
||||
) => eq_defaultness(*ld, *rd) && eq_ty(lt, rt) && eq_expr_opt(le, re),
|
||||
) => eq_defaultness(*ld, *rd) && eq_generics(lg, rg) && eq_ty(lt, rt) && eq_expr_opt(le, re),
|
||||
(
|
||||
Fn(box ast::Fn {
|
||||
defaultness: ld,
|
||||
@ -476,15 +478,17 @@ pub fn eq_assoc_item_kind(l: &AssocItemKind, r: &AssocItemKind) -> bool {
|
||||
(
|
||||
Const(box ast::ConstItem {
|
||||
defaultness: ld,
|
||||
generics: lg,
|
||||
ty: lt,
|
||||
expr: le,
|
||||
}),
|
||||
Const(box ast::ConstItem {
|
||||
defaultness: rd,
|
||||
generics: rg,
|
||||
ty: rt,
|
||||
expr: re,
|
||||
}),
|
||||
) => eq_defaultness(*ld, *rd) && eq_ty(lt, rt) && eq_expr_opt(le, re),
|
||||
) => eq_defaultness(*ld, *rd) && eq_generics(lg, rg) && eq_ty(lt, rt) && eq_expr_opt(le, re),
|
||||
(
|
||||
Fn(box ast::Fn {
|
||||
defaultness: ld,
|
||||
|
@ -461,7 +461,7 @@ fn fetch_path(&mut self, qpath: &QPath<'_>, id: HirId, ty: Ty<'tcx>) -> Option<C
|
||||
// Check if this constant is based on `cfg!(..)`,
|
||||
// which is NOT constant for our purposes.
|
||||
if let Some(node) = self.lcx.tcx.hir().get_if_local(def_id)
|
||||
&& let Node::Item(Item { kind: ItemKind::Const(_, body_id), .. }) = node
|
||||
&& let Node::Item(Item { kind: ItemKind::Const(.., body_id), .. }) = node
|
||||
&& let Node::Expr(Expr { kind: ExprKind::Lit(_), span, .. }) = self.lcx
|
||||
.tcx
|
||||
.hir()
|
||||
|
@ -2380,7 +2380,7 @@ fn with_test_item_names(tcx: TyCtxt<'_>, module: LocalDefId, f: impl Fn(&[Symbol
|
||||
for id in tcx.hir().module_items(module) {
|
||||
if matches!(tcx.def_kind(id.owner_id), DefKind::Const)
|
||||
&& let item = tcx.hir().item(id)
|
||||
&& let ItemKind::Const(ty, _body) = item.kind {
|
||||
&& let ItemKind::Const(ty, _generics, _body) = item.kind {
|
||||
if let TyKind::Path(QPath::Resolved(_, path)) = ty.kind {
|
||||
// We could also check for the type name `test::TestDescAndFn`
|
||||
if let Res::Def(DefKind::Struct, _) = path.res {
|
||||
|
Loading…
Reference in New Issue
Block a user