self as hir,
def::{CtorOf, DefKind, Res},
def_id::LocalDefId,
- intravisit::{walk_ty, NestedVisitorMap, Visitor},
- Expr, ExprKind, FnRetTy, FnSig, GenericArg, HirId, Impl, ImplItemKind, Item, ItemKind, Path, QPath, TyKind,
+ intravisit::{walk_ty, walk_inf, NestedVisitorMap, Visitor},
+ Expr, ExprKind, FnRetTy, FnSig, GenericArg, HirId, Impl, ImplItemKind, Item, ItemKind, Path,
+ QPath, TyKind,
};
use rustc_lint::{LateContext, LateLintPass, LintContext};
use rustc_middle::hir::map::Map;
impl<'tcx> LateLintPass<'tcx> for UseSelf {
fn check_item(&mut self, _cx: &LateContext<'_>, item: &Item<'_>) {
- if !is_item_interesting(item) {
- // This does two things:
- // 1) Reduce needless churn on `self.stack`
- // 2) Don't push `StackItem::NoCheck` when entering `ItemKind::OpaqueTy`,
- // in order to lint `foo() -> impl <..>`
+ if matches!(item.kind, ItemKind::OpaqueTy(_)) {
+ // skip over `ItemKind::OpaqueTy` in order to lint `foo() -> impl <..>`
return;
}
// We push the self types of `impl`s on a stack here. Only the top type on the stack is
}
fn check_item_post(&mut self, _: &LateContext<'_>, item: &Item<'_>) {
- if is_item_interesting(item) {
+ if !matches!(item.kind, ItemKind::OpaqueTy(_)) {
self.stack.pop();
}
}
impl<'tcx> Visitor<'tcx> for SkipTyCollector {
type Map = Map<'tcx>;
+ fn visit_infer(&mut self, inf: &hir::InferArg) {
+ self.types_to_skip.push(inf.hir_id);
+
+ walk_inf(self, inf)
+ }
fn visit_ty(&mut self, hir_ty: &hir::Ty<'_>) {
self.types_to_skip.push(hir_ty.hir_id);
span_lint(cx, span);
}
}
-
-fn is_item_interesting(item: &Item<'_>) -> bool {
- use rustc_hir::ItemKind::{Const, Enum, Fn, Impl, Static, Struct, Trait, Union};
- matches!(
- item.kind,
- Impl { .. } | Static(..) | Const(..) | Fn(..) | Enum(..) | Struct(..) | Union(..) | Trait(..)
- )
-}