From 8f5585ac00af80c55467135b9437c871445179a5 Mon Sep 17 00:00:00 2001 From: hamidreza kalbasi Date: Mon, 10 May 2021 05:53:42 +0430 Subject: [PATCH] remove big match --- .../diagnostics/mutability_errors.rs | 115 ++++++++---------- 1 file changed, 50 insertions(+), 65 deletions(-) diff --git a/compiler/rustc_mir/src/borrow_check/diagnostics/mutability_errors.rs b/compiler/rustc_mir/src/borrow_check/diagnostics/mutability_errors.rs index 3aaa269cd4b..85c5ee71748 100644 --- a/compiler/rustc_mir/src/borrow_check/diagnostics/mutability_errors.rs +++ b/compiler/rustc_mir/src/borrow_check/diagnostics/mutability_errors.rs @@ -524,74 +524,59 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { return (false, None); } let hir_map = self.infcx.tcx.hir(); - let my_hir = hir_map.local_def_id_to_hir_id( - self.body.source.def_id().as_local().unwrap(), - ); - match hir_map.find(hir_map.get_parent_node(my_hir)) { - Some(Node::Item(hir::Item { - kind: - hir::ItemKind::Impl(hir::Impl { - of_trait: - Some(hir::TraitRef { - path: - hir::Path { - res: - hir::def::Res::Def(_, td), - .. - }, - .. - }), - .. - }), - .. - })) => { - (true, td.as_local().and_then(|tld| { - let h = hir_map.local_def_id_to_hir_id(tld); - match hir_map.find(h) { - Some(Node::Item(hir::Item { - kind: hir::ItemKind::Trait( - _, _, _, _, - items - ), - .. - })) => { - let mut f_in_trait_opt = None; - for hir::TraitItemRef { id: fi, kind: k, .. } in *items { - let hi = fi.hir_id(); - if !matches!(k, hir::AssocItemKind::Fn { .. }) { - continue; - } - if hir_map.name(hi) != hir_map.name(my_hir) { - continue; - } - f_in_trait_opt = Some(hi); - break; - } - f_in_trait_opt.and_then(|f_in_trait| { - match hir_map.find(f_in_trait) { - Some(Node::TraitItem(hir::TraitItem { - kind: hir::TraitItemKind::Fn(hir::FnSig { - decl: hir::FnDecl { - inputs, - .. - }, - .. - }, _), - .. - })) => { - let hir::Ty { span, .. } = inputs[local.index() - 1]; - Some(span) - }, - _ => None, - } - }) + let my_def = self.body.source.def_id(); + let my_hir = hir_map.local_def_id_to_hir_id(my_def.as_local().unwrap()); + let td = if let Some(a) = self.infcx.tcx.impl_of_method(my_def).and_then(|x| { + self.infcx.tcx.trait_id_of_impl(x) + }) { + a + } else { + return (false, None); + }; + (true, td.as_local().and_then(|tld| { + let h = hir_map.local_def_id_to_hir_id(tld); + match hir_map.find(h) { + Some(Node::Item(hir::Item { + kind: hir::ItemKind::Trait( + _, _, _, _, + items + ), + .. + })) => { + let mut f_in_trait_opt = None; + for hir::TraitItemRef { id: fi, kind: k, .. } in *items { + let hi = fi.hir_id(); + if !matches!(k, hir::AssocItemKind::Fn { .. }) { + continue; } - _ => None + if hir_map.name(hi) != hir_map.name(my_hir) { + continue; + } + f_in_trait_opt = Some(hi); + break; } - })) + f_in_trait_opt.and_then(|f_in_trait| { + match hir_map.find(f_in_trait) { + Some(Node::TraitItem(hir::TraitItem { + kind: hir::TraitItemKind::Fn(hir::FnSig { + decl: hir::FnDecl { + inputs, + .. + }, + .. + }, _), + .. + })) => { + let hir::Ty { span, .. } = inputs[local.index() - 1]; + Some(span) + }, + _ => None, + } + }) + } + _ => None } - _ => (false, None), - } + })) } // point to span of upvar making closure call require mutable borrow