]> git.lizzy.rs Git - rust.git/commitdiff
Unify intercrate ambiguity emitters into a function.
authorMasaki Hara <ackie.h.gmai@gmail.com>
Tue, 25 Jul 2017 07:52:36 +0000 (16:52 +0900)
committerNiko Matsakis <niko@alum.mit.edu>
Tue, 5 Sep 2017 16:19:35 +0000 (12:19 -0400)
src/librustc/traits/select.rs
src/librustc/traits/specialize/mod.rs
src/librustc_typeck/coherence/inherent_impls_overlap.rs

index 6815cb8c55ebd060691edbb63ed304d7dc847371..366bb6aeb5caf4d2728b5d1b6b702de555ba08a1 100644 (file)
@@ -100,6 +100,26 @@ pub enum IntercrateAmbiguityCause {
     UpstreamCrateUpdate(DefId),
 }
 
+impl IntercrateAmbiguityCause {
+    /// Emits notes when the overlap is caused by complex intercrate ambiguities.
+    /// See #23980 for details.
+    pub fn add_intercrate_ambiguity_hint<'a, 'tcx>(&self,
+                                                   tcx: TyCtxt<'a, 'tcx, 'tcx>,
+                                                   err: &mut ::errors::DiagnosticBuilder) {
+        match self {
+            &IntercrateAmbiguityCause::DownstreamCrate(def_id) => {
+                err.note(&format!("downstream crates may implement `{}`",
+                                  tcx.item_path_str(def_id)));
+            }
+            &IntercrateAmbiguityCause::UpstreamCrateUpdate(def_id) => {
+                err.note(&format!("upstream crates may add new impl for `{}` \
+                                  in future versions",
+                                  tcx.item_path_str(def_id)));
+            }
+        }
+    }
+}
+
 // A stack that walks back up the stack frame.
 struct TraitObligationStack<'prev, 'tcx: 'prev> {
     obligation: &'prev TraitObligation<'tcx>,
index 1c79190fd93bbaac1cc31d94f8c357c67a6e82b7..98d8c64634c6b9f87a574af79caced25a6ac690b 100644 (file)
@@ -340,17 +340,7 @@ pub(super) fn specialization_graph_provider<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx
                 }
 
                 for cause in &overlap.intercrate_ambiguity_causes {
-                    match cause {
-                        &IntercrateAmbiguityCause::DownstreamCrate(def_id) => {
-                            err.note(&format!("downstream crates may implement `{}`",
-                                              tcx.item_path_str(def_id)));
-                        }
-                        &IntercrateAmbiguityCause::UpstreamCrateUpdate(def_id) => {
-                            err.note(&format!("upstream crates may add new impl for `{}` \
-                                              in future versions",
-                                              tcx.item_path_str(def_id)));
-                        }
-                    }
+                    cause.add_intercrate_ambiguity_hint(tcx, &mut err);
                 }
 
                 err.emit();
index e733b5328d3bad80d0c870b7a380c914562ac3b1..0fad16c95822222a2ef0a768827deb597b41e858 100644 (file)
@@ -12,7 +12,6 @@
 use rustc::hir;
 use rustc::hir::itemlikevisit::ItemLikeVisitor;
 use rustc::traits;
-use rustc::traits::IntercrateAmbiguityCause;
 use rustc::ty::{self, TyCtxt};
 
 pub fn crate_inherent_impls_overlap_check<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
@@ -64,17 +63,7 @@ enum Namespace {
                                    format!("other definition for `{}`", name));
 
                     for cause in &overlap.intercrate_ambiguity_causes {
-                        match cause {
-                            &IntercrateAmbiguityCause::DownstreamCrate(def_id) => {
-                                err.note(&format!("downstream crates may implement `{}`",
-                                                  self.tcx.item_path_str(def_id)));
-                            }
-                            &IntercrateAmbiguityCause::UpstreamCrateUpdate(def_id) => {
-                                err.note(&format!("upstream crates may add new impl for `{}` \
-                                                  in future versions",
-                                                  self.tcx.item_path_str(def_id)));
-                            }
-                        }
+                        cause.add_intercrate_ambiguity_hint(self.tcx, &mut err);
                     }
 
                     err.emit();