diff options
Diffstat (limited to 'crates/ra_hir_ty/src/lib.rs')
-rw-r--r-- | crates/ra_hir_ty/src/lib.rs | 41 |
1 files changed, 36 insertions, 5 deletions
diff --git a/crates/ra_hir_ty/src/lib.rs b/crates/ra_hir_ty/src/lib.rs index 3ad913e55..7310ef10d 100644 --- a/crates/ra_hir_ty/src/lib.rs +++ b/crates/ra_hir_ty/src/lib.rs | |||
@@ -44,8 +44,8 @@ use std::sync::Arc; | |||
44 | use std::{fmt, iter, mem}; | 44 | use std::{fmt, iter, mem}; |
45 | 45 | ||
46 | use hir_def::{ | 46 | use hir_def::{ |
47 | expr::ExprId, type_ref::Mutability, AdtId, ContainerId, DefWithBodyId, GenericDefId, HasModule, | 47 | expr::ExprId, type_ref::Mutability, AdtId, AssocContainerId, DefWithBodyId, GenericDefId, |
48 | Lookup, TraitId, TypeAliasId, | 48 | HasModule, Lookup, TraitId, TypeAliasId, |
49 | }; | 49 | }; |
50 | use hir_expand::name::Name; | 50 | use hir_expand::name::Name; |
51 | use ra_db::{impl_intern_key, salsa, CrateId}; | 51 | use ra_db::{impl_intern_key, salsa, CrateId}; |
@@ -251,7 +251,7 @@ impl ProjectionTy { | |||
251 | 251 | ||
252 | fn trait_(&self, db: &impl HirDatabase) -> TraitId { | 252 | fn trait_(&self, db: &impl HirDatabase) -> TraitId { |
253 | match self.associated_ty.lookup(db).container { | 253 | match self.associated_ty.lookup(db).container { |
254 | ContainerId::TraitId(it) => it, | 254 | AssocContainerId::TraitId(it) => it, |
255 | _ => panic!("projection ty without parent trait"), | 255 | _ => panic!("projection ty without parent trait"), |
256 | } | 256 | } |
257 | } | 257 | } |
@@ -906,13 +906,44 @@ impl HirDisplay for ApplicationTy { | |||
906 | write!(f, "{}", name)?; | 906 | write!(f, "{}", name)?; |
907 | if self.parameters.len() > 0 { | 907 | if self.parameters.len() > 0 { |
908 | write!(f, "<")?; | 908 | write!(f, "<")?; |
909 | f.write_joined(&*self.parameters.0, ", ")?; | 909 | |
910 | let mut non_default_parameters = Vec::with_capacity(self.parameters.len()); | ||
911 | let parameters_to_write = if f.should_display_default_types() { | ||
912 | self.parameters.0.as_ref() | ||
913 | } else { | ||
914 | match self | ||
915 | .ctor | ||
916 | .as_generic_def() | ||
917 | .map(|generic_def_id| f.db.generic_defaults(generic_def_id)) | ||
918 | .filter(|defaults| !defaults.is_empty()) | ||
919 | { | ||
920 | Option::None => self.parameters.0.as_ref(), | ||
921 | Option::Some(default_parameters) => { | ||
922 | for (i, parameter) in self.parameters.into_iter().enumerate() { | ||
923 | match (parameter, default_parameters.get(i)) { | ||
924 | (&Ty::Unknown, _) | (_, None) => { | ||
925 | non_default_parameters.push(parameter.clone()) | ||
926 | } | ||
927 | (_, Some(default_parameter)) | ||
928 | if parameter != default_parameter => | ||
929 | { | ||
930 | non_default_parameters.push(parameter.clone()) | ||
931 | } | ||
932 | _ => (), | ||
933 | } | ||
934 | } | ||
935 | &non_default_parameters | ||
936 | } | ||
937 | } | ||
938 | }; | ||
939 | |||
940 | f.write_joined(parameters_to_write, ", ")?; | ||
910 | write!(f, ">")?; | 941 | write!(f, ">")?; |
911 | } | 942 | } |
912 | } | 943 | } |
913 | TypeCtor::AssociatedType(type_alias) => { | 944 | TypeCtor::AssociatedType(type_alias) => { |
914 | let trait_ = match type_alias.lookup(f.db).container { | 945 | let trait_ = match type_alias.lookup(f.db).container { |
915 | ContainerId::TraitId(it) => it, | 946 | AssocContainerId::TraitId(it) => it, |
916 | _ => panic!("not an associated type"), | 947 | _ => panic!("not an associated type"), |
917 | }; | 948 | }; |
918 | let trait_name = f.db.trait_data(trait_).name.clone(); | 949 | let trait_name = f.db.trait_data(trait_).name.clone(); |