From 6ab93d7430d75941373ad48fc681bb8337a31465 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Mon, 2 May 2016 10:37:28 +0200 Subject: [PATCH] typeck: limit number of candidates shown for a single error Limit of 4 taken consistent with limit for "similar impl candidates" in rustc::traits::error_reporting. Fixes: #25356 --- src/librustc_typeck/check/method/suggest.rs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/librustc_typeck/check/method/suggest.rs b/src/librustc_typeck/check/method/suggest.rs index 540af8b04bf..be329ec11af 100644 --- a/src/librustc_typeck/check/method/suggest.rs +++ b/src/librustc_typeck/check/method/suggest.rs @@ -101,8 +101,10 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { sources.sort(); sources.dedup(); + // Dynamic limit to avoid hiding just one candidate, which is silly. + let limit = if sources.len() == 5 { 5 } else { 4 }; - for (idx, source) in sources.iter().enumerate() { + for (idx, source) in sources.iter().take(limit).enumerate() { match *source { CandidateSource::ImplSource(impl_did) => { // Provide the best span we can. Use the item, if local to crate, else @@ -151,6 +153,9 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { } } } + if sources.len() > limit { + err.note(&format!("and {} others", sources.len() - limit)); + } }; match error { @@ -295,11 +300,15 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { err.help(&msg[..]); - for (i, trait_did) in candidates.iter().enumerate() { + let limit = if candidates.len() == 5 { 5 } else { 4 }; + for (i, trait_did) in candidates.iter().take(limit).enumerate() { err.help(&format!("candidate #{}: `use {}`", i + 1, self.tcx.item_path_str(*trait_did))); } + if candidates.len() > limit { + err.note(&format!("and {} others", candidates.len() - limit)); + } return }