diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc/infer/error_reporting/mod.rs | 6 | ||||
| -rw-r--r-- | src/librustc/ty/diagnostics.rs | 56 | ||||
| -rw-r--r-- | src/librustc/ty/mod.rs | 46 |
3 files changed, 60 insertions, 48 deletions
diff --git a/src/librustc/infer/error_reporting/mod.rs b/src/librustc/infer/error_reporting/mod.rs index cccdcc68a57..f2607b23527 100644 --- a/src/librustc/infer/error_reporting/mod.rs +++ b/src/librustc/infer/error_reporting/mod.rs @@ -1197,10 +1197,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { }; if let Some((expected, found)) = expected_found { - let expected_label = exp_found.map(|ef| ef.expected.prefix_string()) - .unwrap_or("type".into()); - let found_label = exp_found.map(|ef| ef.found.prefix_string()) - .unwrap_or("type".into()); + let expected_label = exp_found.map_or("type".into(), |ef| ef.expected.prefix_string()); + let found_label = exp_found.map_or("type".into(), |ef| ef.found.prefix_string()); match (&terr, expected == found) { (TypeError::Sorts(values), extra) => { let sort_string = |ty: Ty<'tcx>| match (extra, &ty.kind) { diff --git a/src/librustc/ty/diagnostics.rs b/src/librustc/ty/diagnostics.rs new file mode 100644 index 00000000000..95bdce2d222 --- /dev/null +++ b/src/librustc/ty/diagnostics.rs @@ -0,0 +1,56 @@ +//! Diagnostics related methods for `TyS`. + +use crate::ty::TyS; +use crate::ty::TyKind::*; +use crate::ty::sty::InferTy; + +impl<'tcx> TyS<'tcx> { + /// Similar to `TyS::is_primitive`, but also considers inferred numeric values to be primitive. + pub fn is_primitive_ty(&self) -> bool { + match self.kind { + Bool | Char | Str | Int(_) | Uint(_) | Float(_) | + Infer(InferTy::IntVar(_)) | Infer(InferTy::FloatVar(_)) | + Infer(InferTy::FreshIntTy(_)) | Infer(InferTy::FreshFloatTy(_)) => true, + _ => false, + } + } + + /// Whether the type is succinctly representable as a type instead of just refered to with a + /// description in error messages. This is used in the main error message. + pub fn is_simple_ty(&self) -> bool { + match self.kind { + Bool | Char | Str | Int(_) | Uint(_) | Float(_) | + Infer(InferTy::IntVar(_)) | Infer(InferTy::FloatVar(_)) | + Infer(InferTy::FreshIntTy(_)) | Infer(InferTy::FreshFloatTy(_)) => true, + Ref(_, x, _) | Array(x, _) | Slice(x) => x.peel_refs().is_simple_ty(), + Tuple(tys) if tys.is_empty() => true, + _ => false, + } + } + + /// Whether the type is succinctly representable as a type instead of just refered to with a + /// description in error messages. This is used in the primary span label. Beyond what + /// `is_simple_ty` includes, it also accepts ADTs with no type arguments and references to + /// ADTs with no type arguments. + pub fn is_simple_text(&self) -> bool { + match self.kind { + Adt(_, substs) => substs.types().next().is_none(), + Ref(_, ty, _) => ty.is_simple_text(), + _ => self.is_simple_ty(), + } + } + + /// Whether the type can be safely suggested during error recovery. + pub fn is_suggestable(&self) -> bool { + match self.kind { + Opaque(..) | + FnDef(..) | + FnPtr(..) | + Dynamic(..) | + Closure(..) | + Infer(..) | + Projection(..) => false, + _ => true, + } + } +} diff --git a/src/librustc/ty/mod.rs b/src/librustc/ty/mod.rs index 5fc2812fd97..280a5a157e9 100644 --- a/src/librustc/ty/mod.rs +++ b/src/librustc/ty/mod.rs @@ -71,6 +71,7 @@ pub use self::sty::BoundRegion::*; pub use self::sty::InferTy::*; pub use self::sty::RegionKind::*; pub use self::sty::TyKind::*; +pub use crate::ty::diagnostics::*; pub use self::binding::BindingMode; pub use self::binding::BindingMode::*; @@ -122,6 +123,7 @@ mod instance; mod structural_impls; mod structural_match; mod sty; +mod diagnostics; // Data types @@ -552,50 +554,6 @@ impl<'tcx> Hash for TyS<'tcx> { } } -impl<'tcx> TyS<'tcx> { - pub fn is_primitive_ty(&self) -> bool { - match self.kind { - Bool | Char | Str | Int(_) | Uint(_) | Float(_) | - Infer(InferTy::IntVar(_)) | Infer(InferTy::FloatVar(_)) | - Infer(InferTy::FreshIntTy(_)) | Infer(InferTy::FreshFloatTy(_)) => true, - _ => false, - } - } - - pub fn is_simple_ty(&self) -> bool { - match self.kind { - Bool | Char | Str | Int(_) | Uint(_) | Float(_) | - Infer(InferTy::IntVar(_)) | Infer(InferTy::FloatVar(_)) | - Infer(InferTy::FreshIntTy(_)) | Infer(InferTy::FreshFloatTy(_)) => true, - Ref(_, x, _) | Array(x, _) | Slice(x) => x.peel_refs().is_simple_ty(), - Tuple(tys) if tys.is_empty() => true, - _ => false, - } - } - - pub fn is_simple_text(&self) -> bool { - match self.kind { - Adt(_, substs) => substs.types().next().is_none(), - Ref(_, ty, _) => ty.is_simple_text(), - _ if self.is_simple_ty() => true, - _ => false, - } - } - - pub fn is_suggestable(&self) -> bool { - match self.kind { - Opaque(..) | - FnDef(..) | - FnPtr(..) | - Dynamic(..) | - Closure(..) | - Infer(..) | - Projection(..) => false, - _ => true, - } - } -} - impl<'a, 'tcx> HashStable<StableHashingContext<'a>> for ty::TyS<'tcx> { fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { let ty::TyS { |
