From 0d18136b776cd7cda2c4932f447e6484377f42b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Fri, 29 May 2020 09:44:41 -0700 Subject: [PATCH] Move common code to `WhereClause` --- src/librustc_hir/hir.rs | 7 +++++++ src/librustc_middle/ty/diagnostics.rs | 13 +------------ .../traits/error_reporting/suggestions.rs | 11 +---------- 3 files changed, 9 insertions(+), 22 deletions(-) diff --git a/src/librustc_hir/hir.rs b/src/librustc_hir/hir.rs index ef398ab25d3f..a46871ac8079 100644 --- a/src/librustc_hir/hir.rs +++ b/src/librustc_hir/hir.rs @@ -525,6 +525,13 @@ impl WhereClause<'_> { pub fn span_for_predicates_or_empty_place(&self) -> Span { self.span } + + /// `Span` where further predicates would be suggested, accounting for trailing commas, like + /// in `fn foo(t: T) where T: Foo,` so we don't suggest two trailing commas. + pub fn tail_span_for_suggestion(&self) -> Span { + let end = self.span_for_predicates_or_empty_place().shrink_to_hi(); + self.predicates.last().map(|p| p.span()).unwrap_or(end).shrink_to_hi().to(end) + } } /// A single predicate in a where-clause. diff --git a/src/librustc_middle/ty/diagnostics.rs b/src/librustc_middle/ty/diagnostics.rs index 96c36d989e92..ba3cc0a7af2c 100644 --- a/src/librustc_middle/ty/diagnostics.rs +++ b/src/librustc_middle/ty/diagnostics.rs @@ -220,22 +220,11 @@ pub fn suggest_constraining_type_param( } } - // Account for `fn foo(t: T) where T: Foo,` so we don't suggest two trailing commas. - let end = generics.where_clause.span_for_predicates_or_empty_place().shrink_to_hi(); - let where_clause_span = generics - .where_clause - .predicates - .last() - .map(|p| p.span()) - .unwrap_or(end) - .shrink_to_hi() - .to(end); - match ¶m_spans[..] { &[¶m_span] => suggest_restrict(param_span.shrink_to_hi()), _ => { err.span_suggestion_verbose( - where_clause_span, + generics.where_clause.tail_span_for_suggestion(), &msg_restrict_type_further, format!(", {}: {}", param_name, constraint), Applicability::MachineApplicable, diff --git a/src/librustc_trait_selection/traits/error_reporting/suggestions.rs b/src/librustc_trait_selection/traits/error_reporting/suggestions.rs index eb281b270ff2..a8d4de873f95 100644 --- a/src/librustc_trait_selection/traits/error_reporting/suggestions.rs +++ b/src/librustc_trait_selection/traits/error_reporting/suggestions.rs @@ -169,17 +169,8 @@ pub trait InferCtxtExt<'tcx> { } fn predicate_constraint(generics: &hir::Generics<'_>, pred: String) -> (Span, String) { - let end = generics.where_clause.span_for_predicates_or_empty_place().shrink_to_hi(); ( - // Account for `where T: Foo,` so we don't suggest two trailing commas. - generics - .where_clause - .predicates - .last() - .map(|p| p.span()) - .unwrap_or(end) - .shrink_to_hi() - .to(end), + generics.where_clause.tail_span_for_suggestion(), format!( "{} {}", if !generics.where_clause.predicates.is_empty() { "," } else { " where" },