From b522ba02374169372a80d867894818c92e8c534a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Tue, 7 Jan 2020 17:31:37 -0800 Subject: [PATCH] review comments --- src/librustc/infer/error_reporting/mod.rs | 50 +++++++++++++++-------- 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/src/librustc/infer/error_reporting/mod.rs b/src/librustc/infer/error_reporting/mod.rs index 8a444b8d4526..bc75e0a75f09 100644 --- a/src/librustc/infer/error_reporting/mod.rs +++ b/src/librustc/infer/error_reporting/mod.rs @@ -1303,10 +1303,39 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { _ => {} } + #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] + enum TyKind { + Closure, + Opaque, + Generator, + Foreign, + } + + impl TyKind { + fn descr(&self) -> &'static str { + match self { + Self::Closure => "closure", + Self::Opaque => "opaque type", + Self::Generator => "generator", + Self::Foreign => "foreign type", + } + } + + fn from_ty(ty: Ty<'_>) -> Option<(Self, DefId)> { + match ty.kind { + ty::Closure(def_id, _) => Some((Self::Closure, def_id)), + ty::Opaque(def_id, _) => Some((Self::Opaque, def_id)), + ty::Generator(def_id, ..) => Some((Self::Generator, def_id)), + ty::Foreign(def_id) => Some((Self::Foreign, def_id)), + _ => None, + } + } + } + struct OpaqueTypesVisitor<'tcx> { - types: FxHashMap<&'static str, FxHashSet>, - expected: FxHashMap<&'static str, FxHashSet>, - found: FxHashMap<&'static str, FxHashSet>, + types: FxHashMap>, + expected: FxHashMap>, + found: FxHashMap>, ignore_span: Span, tcx: TyCtxt<'tcx>, } @@ -1350,7 +1379,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { }, if count > 1 { "one of the " } else { "" }, target, - key, + key.descr(), pluralize!(count), ), ); @@ -1362,18 +1391,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { impl<'tcx> ty::fold::TypeVisitor<'tcx> for OpaqueTypesVisitor<'tcx> { fn visit_ty(&mut self, t: Ty<'tcx>) -> bool { - let kind = match t.kind { - ty::Closure(..) => "closure", - ty::Opaque(..) => "opaque type", - ty::Generator(..) => "generator", - ty::Foreign(..) => "foreign type", - _ => "", - }; - if let ty::Closure(def_id, _) - | ty::Opaque(def_id, _) - | ty::Generator(def_id, ..) - | ty::Foreign(def_id) = t.kind - { + if let Some((kind, def_id)) = TyKind::from_ty(t) { let span = self.tcx.def_span(def_id); // Avoid cluttering the output when the "found" and error span overlap: //