aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_ty/src/traits/builtin.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir_ty/src/traits/builtin.rs')
-rw-r--r--crates/ra_hir_ty/src/traits/builtin.rs36
1 files changed, 16 insertions, 20 deletions
diff --git a/crates/ra_hir_ty/src/traits/builtin.rs b/crates/ra_hir_ty/src/traits/builtin.rs
index 03f9b4e27..73e3c5c78 100644
--- a/crates/ra_hir_ty/src/traits/builtin.rs
+++ b/crates/ra_hir_ty/src/traits/builtin.rs
@@ -26,7 +26,7 @@ pub(super) struct BuiltinImplAssocTyValueData {
26} 26}
27 27
28pub(super) fn get_builtin_impls( 28pub(super) fn get_builtin_impls(
29 db: &impl HirDatabase, 29 db: &dyn HirDatabase,
30 krate: CrateId, 30 krate: CrateId,
31 ty: &Ty, 31 ty: &Ty,
32 // The first argument for the trait, if present 32 // The first argument for the trait, if present
@@ -59,7 +59,7 @@ pub(super) fn get_builtin_impls(
59} 59}
60 60
61fn get_builtin_unsize_impls( 61fn get_builtin_unsize_impls(
62 db: &impl HirDatabase, 62 db: &dyn HirDatabase,
63 krate: CrateId, 63 krate: CrateId,
64 ty: &Ty, 64 ty: &Ty,
65 // The first argument for the trait, if present 65 // The first argument for the trait, if present
@@ -79,7 +79,7 @@ fn get_builtin_unsize_impls(
79 // FIXME what about more complicated dyn tys with marker traits? 79 // FIXME what about more complicated dyn tys with marker traits?
80 if let Some(trait_ref) = ty.dyn_trait_ref() { 80 if let Some(trait_ref) = ty.dyn_trait_ref() {
81 if trait_ref.trait_ != target_trait.trait_ { 81 if trait_ref.trait_ != target_trait.trait_ {
82 let super_traits = all_super_traits(db, trait_ref.trait_); 82 let super_traits = all_super_traits(db.upcast(), trait_ref.trait_);
83 if super_traits.contains(&target_trait.trait_) { 83 if super_traits.contains(&target_trait.trait_) {
84 callback(Impl::UnsizeToSuperTraitObject(UnsizeToSuperTraitObjectData { 84 callback(Impl::UnsizeToSuperTraitObject(UnsizeToSuperTraitObjectData {
85 trait_: trait_ref.trait_, 85 trait_: trait_ref.trait_,
@@ -94,7 +94,7 @@ fn get_builtin_unsize_impls(
94 } 94 }
95} 95}
96 96
97pub(super) fn impl_datum(db: &impl HirDatabase, krate: CrateId, impl_: Impl) -> BuiltinImplData { 97pub(super) fn impl_datum(db: &dyn HirDatabase, krate: CrateId, impl_: Impl) -> BuiltinImplData {
98 match impl_ { 98 match impl_ {
99 Impl::ImplDef(_) => unreachable!(), 99 Impl::ImplDef(_) => unreachable!(),
100 Impl::ClosureFnTraitImpl(data) => closure_fn_trait_impl_datum(db, krate, data), 100 Impl::ClosureFnTraitImpl(data) => closure_fn_trait_impl_datum(db, krate, data),
@@ -107,7 +107,7 @@ pub(super) fn impl_datum(db: &impl HirDatabase, krate: CrateId, impl_: Impl) ->
107} 107}
108 108
109pub(super) fn associated_ty_value( 109pub(super) fn associated_ty_value(
110 db: &impl HirDatabase, 110 db: &dyn HirDatabase,
111 krate: CrateId, 111 krate: CrateId,
112 data: AssocTyValue, 112 data: AssocTyValue,
113) -> BuiltinImplAssocTyValueData { 113) -> BuiltinImplAssocTyValueData {
@@ -122,7 +122,7 @@ pub(super) fn associated_ty_value(
122// Closure Fn trait impls 122// Closure Fn trait impls
123 123
124fn check_closure_fn_trait_impl_prerequisites( 124fn check_closure_fn_trait_impl_prerequisites(
125 db: &impl HirDatabase, 125 db: &dyn HirDatabase,
126 krate: CrateId, 126 krate: CrateId,
127 data: super::ClosureFnTraitImplData, 127 data: super::ClosureFnTraitImplData,
128) -> bool { 128) -> bool {
@@ -143,7 +143,7 @@ fn check_closure_fn_trait_impl_prerequisites(
143} 143}
144 144
145fn closure_fn_trait_impl_datum( 145fn closure_fn_trait_impl_datum(
146 db: &impl HirDatabase, 146 db: &dyn HirDatabase,
147 krate: CrateId, 147 krate: CrateId,
148 data: super::ClosureFnTraitImplData, 148 data: super::ClosureFnTraitImplData,
149) -> BuiltinImplData { 149) -> BuiltinImplData {
@@ -189,7 +189,7 @@ fn closure_fn_trait_impl_datum(
189} 189}
190 190
191fn closure_fn_trait_output_assoc_ty_value( 191fn closure_fn_trait_output_assoc_ty_value(
192 db: &impl HirDatabase, 192 db: &dyn HirDatabase,
193 krate: CrateId, 193 krate: CrateId,
194 data: super::ClosureFnTraitImplData, 194 data: super::ClosureFnTraitImplData,
195) -> BuiltinImplAssocTyValueData { 195) -> BuiltinImplAssocTyValueData {
@@ -223,17 +223,17 @@ fn closure_fn_trait_output_assoc_ty_value(
223 223
224// Array unsizing 224// Array unsizing
225 225
226fn check_unsize_impl_prerequisites(db: &impl HirDatabase, krate: CrateId) -> bool { 226fn check_unsize_impl_prerequisites(db: &dyn HirDatabase, krate: CrateId) -> bool {
227 // the Unsize trait needs to exist and have two type parameters (Self and T) 227 // the Unsize trait needs to exist and have two type parameters (Self and T)
228 let unsize_trait = match get_unsize_trait(db, krate) { 228 let unsize_trait = match get_unsize_trait(db, krate) {
229 Some(t) => t, 229 Some(t) => t,
230 None => return false, 230 None => return false,
231 }; 231 };
232 let generic_params = generics(db, unsize_trait.into()); 232 let generic_params = generics(db.upcast(), unsize_trait.into());
233 generic_params.len() == 2 233 generic_params.len() == 2
234} 234}
235 235
236fn array_unsize_impl_datum(db: &impl HirDatabase, krate: CrateId) -> BuiltinImplData { 236fn array_unsize_impl_datum(db: &dyn HirDatabase, krate: CrateId) -> BuiltinImplData {
237 // impl<T> Unsize<[T]> for [T; _] 237 // impl<T> Unsize<[T]> for [T; _]
238 // (this can be a single impl because we don't distinguish array sizes currently) 238 // (this can be a single impl because we don't distinguish array sizes currently)
239 239
@@ -260,7 +260,7 @@ fn array_unsize_impl_datum(db: &impl HirDatabase, krate: CrateId) -> BuiltinImpl
260// Trait object unsizing 260// Trait object unsizing
261 261
262fn trait_object_unsize_impl_datum( 262fn trait_object_unsize_impl_datum(
263 db: &impl HirDatabase, 263 db: &dyn HirDatabase,
264 krate: CrateId, 264 krate: CrateId,
265 trait_: TraitId, 265 trait_: TraitId,
266) -> BuiltinImplData { 266) -> BuiltinImplData {
@@ -295,7 +295,7 @@ fn trait_object_unsize_impl_datum(
295} 295}
296 296
297fn super_trait_object_unsize_impl_datum( 297fn super_trait_object_unsize_impl_datum(
298 db: &impl HirDatabase, 298 db: &dyn HirDatabase,
299 krate: CrateId, 299 krate: CrateId,
300 data: UnsizeToSuperTraitObjectData, 300 data: UnsizeToSuperTraitObjectData,
301) -> BuiltinImplData { 301) -> BuiltinImplData {
@@ -313,7 +313,7 @@ fn super_trait_object_unsize_impl_datum(
313 let self_bounds = vec![GenericPredicate::Implemented(self_trait_ref.clone())]; 313 let self_bounds = vec![GenericPredicate::Implemented(self_trait_ref.clone())];
314 314
315 // we need to go from our trait to the super trait, substituting type parameters 315 // we need to go from our trait to the super trait, substituting type parameters
316 let path = crate::utils::find_super_trait_path(db, data.trait_, data.super_trait); 316 let path = crate::utils::find_super_trait_path(db.upcast(), data.trait_, data.super_trait);
317 317
318 let mut current_trait_ref = self_trait_ref; 318 let mut current_trait_ref = self_trait_ref;
319 for t in path.into_iter().skip(1) { 319 for t in path.into_iter().skip(1) {
@@ -344,11 +344,7 @@ fn super_trait_object_unsize_impl_datum(
344 BuiltinImplData { num_vars, trait_ref, where_clauses: Vec::new(), assoc_ty_values: Vec::new() } 344 BuiltinImplData { num_vars, trait_ref, where_clauses: Vec::new(), assoc_ty_values: Vec::new() }
345} 345}
346 346
347fn get_fn_trait( 347fn get_fn_trait(db: &dyn HirDatabase, krate: CrateId, fn_trait: super::FnTrait) -> Option<TraitId> {
348 db: &impl HirDatabase,
349 krate: CrateId,
350 fn_trait: super::FnTrait,
351) -> Option<TraitId> {
352 let target = db.lang_item(krate, fn_trait.lang_item_name().into())?; 348 let target = db.lang_item(krate, fn_trait.lang_item_name().into())?;
353 match target { 349 match target {
354 LangItemTarget::TraitId(t) => Some(t), 350 LangItemTarget::TraitId(t) => Some(t),
@@ -356,7 +352,7 @@ fn get_fn_trait(
356 } 352 }
357} 353}
358 354
359fn get_unsize_trait(db: &impl HirDatabase, krate: CrateId) -> Option<TraitId> { 355fn get_unsize_trait(db: &dyn HirDatabase, krate: CrateId) -> Option<TraitId> {
360 let target = db.lang_item(krate, "unsize".into())?; 356 let target = db.lang_item(krate, "unsize".into())?;
361 match target { 357 match target {
362 LangItemTarget::TraitId(t) => Some(t), 358 LangItemTarget::TraitId(t) => Some(t),