diff options
Diffstat (limited to 'crates/hir_ty/src/traits')
-rw-r--r-- | crates/hir_ty/src/traits/chalk.rs | 43 | ||||
-rw-r--r-- | crates/hir_ty/src/traits/chalk/mapping.rs | 14 |
2 files changed, 22 insertions, 35 deletions
diff --git a/crates/hir_ty/src/traits/chalk.rs b/crates/hir_ty/src/traits/chalk.rs index fcdcc2b4d..e2a54fd92 100644 --- a/crates/hir_ty/src/traits/chalk.rs +++ b/crates/hir_ty/src/traits/chalk.rs | |||
@@ -17,16 +17,14 @@ use super::ChalkContext; | |||
17 | use crate::{ | 17 | use crate::{ |
18 | db::HirDatabase, | 18 | db::HirDatabase, |
19 | display::HirDisplay, | 19 | display::HirDisplay, |
20 | from_assoc_type_id, | 20 | from_assoc_type_id, make_only_type_binders, |
21 | method_resolution::{TyFingerprint, ALL_FLOAT_FPS, ALL_INT_FPS}, | 21 | method_resolution::{TyFingerprint, ALL_FLOAT_FPS, ALL_INT_FPS}, |
22 | to_assoc_type_id, to_chalk_trait_id, | 22 | to_assoc_type_id, to_chalk_trait_id, |
23 | utils::generics, | 23 | utils::generics, |
24 | AliasEq, AliasTy, BoundVar, CallableDefId, DebruijnIndex, FnDefId, ProjectionTy, Substitution, | 24 | AliasEq, AliasTy, BoundVar, CallableDefId, DebruijnIndex, FnDefId, ProjectionTy, Substitution, |
25 | TraitRef, TraitRefExt, Ty, TyBuilder, TyExt, TyKind, WhereClause, | 25 | TraitRef, TraitRefExt, Ty, TyBuilder, TyExt, TyKind, WhereClause, |
26 | }; | 26 | }; |
27 | use mapping::{ | 27 | use mapping::{convert_where_clauses, generic_predicate_to_inline_bound, TypeAliasAsValue}; |
28 | convert_where_clauses, generic_predicate_to_inline_bound, make_binders, TypeAliasAsValue, | ||
29 | }; | ||
30 | 28 | ||
31 | pub use self::interner::Interner; | 29 | pub use self::interner::Interner; |
32 | pub(crate) use self::interner::*; | 30 | pub(crate) use self::interner::*; |
@@ -187,8 +185,11 @@ impl<'a> chalk_solve::RustIrDatabase<Interner> for ChalkContext<'a> { | |||
187 | let (datas, binders) = (*datas).as_ref().into_value_and_skipped_binders(); | 185 | let (datas, binders) = (*datas).as_ref().into_value_and_skipped_binders(); |
188 | let data = &datas.impl_traits[idx as usize]; | 186 | let data = &datas.impl_traits[idx as usize]; |
189 | let bound = OpaqueTyDatumBound { | 187 | let bound = OpaqueTyDatumBound { |
190 | bounds: make_binders(data.bounds.skip_binders().iter().cloned().collect(), 1), | 188 | bounds: make_only_type_binders( |
191 | where_clauses: make_binders(vec![], 0), | 189 | 1, |
190 | data.bounds.skip_binders().iter().cloned().collect(), | ||
191 | ), | ||
192 | where_clauses: make_only_type_binders(0, vec![]), | ||
192 | }; | 193 | }; |
193 | chalk_ir::Binders::new(binders, bound) | 194 | chalk_ir::Binders::new(binders, bound) |
194 | } | 195 | } |
@@ -236,25 +237,25 @@ impl<'a> chalk_solve::RustIrDatabase<Interner> for ChalkContext<'a> { | |||
236 | .intern(&Interner), | 237 | .intern(&Interner), |
237 | }); | 238 | }); |
238 | let bound = OpaqueTyDatumBound { | 239 | let bound = OpaqueTyDatumBound { |
239 | bounds: make_binders( | 240 | bounds: make_only_type_binders( |
241 | 1, | ||
240 | vec![ | 242 | vec![ |
241 | crate::wrap_empty_binders(impl_bound), | 243 | crate::wrap_empty_binders(impl_bound), |
242 | crate::wrap_empty_binders(proj_bound), | 244 | crate::wrap_empty_binders(proj_bound), |
243 | ], | 245 | ], |
244 | 1, | ||
245 | ), | 246 | ), |
246 | where_clauses: make_binders(vec![], 0), | 247 | where_clauses: make_only_type_binders(0, vec![]), |
247 | }; | 248 | }; |
248 | // The opaque type has 1 parameter. | 249 | // The opaque type has 1 parameter. |
249 | make_binders(bound, 1) | 250 | make_only_type_binders(1, bound) |
250 | } else { | 251 | } else { |
251 | // If failed to find Symbol’s value as variable is void: Future::Output, return empty bounds as fallback. | 252 | // If failed to find Symbol’s value as variable is void: Future::Output, return empty bounds as fallback. |
252 | let bound = OpaqueTyDatumBound { | 253 | let bound = OpaqueTyDatumBound { |
253 | bounds: make_binders(vec![], 0), | 254 | bounds: make_only_type_binders(0, vec![]), |
254 | where_clauses: make_binders(vec![], 0), | 255 | where_clauses: make_only_type_binders(0, vec![]), |
255 | }; | 256 | }; |
256 | // The opaque type has 1 parameter. | 257 | // The opaque type has 1 parameter. |
257 | make_binders(bound, 1) | 258 | make_only_type_binders(1, bound) |
258 | } | 259 | } |
259 | } | 260 | } |
260 | }; | 261 | }; |
@@ -291,7 +292,7 @@ impl<'a> chalk_solve::RustIrDatabase<Interner> for ChalkContext<'a> { | |||
291 | argument_types: sig.params().iter().cloned().collect(), | 292 | argument_types: sig.params().iter().cloned().collect(), |
292 | return_type: sig.ret().clone(), | 293 | return_type: sig.ret().clone(), |
293 | }; | 294 | }; |
294 | make_binders(io.shifted_in(&Interner), 0) | 295 | make_only_type_binders(0, io.shifted_in(&Interner)) |
295 | } | 296 | } |
296 | fn closure_upvars( | 297 | fn closure_upvars( |
297 | &self, | 298 | &self, |
@@ -299,7 +300,7 @@ impl<'a> chalk_solve::RustIrDatabase<Interner> for ChalkContext<'a> { | |||
299 | _substs: &chalk_ir::Substitution<Interner>, | 300 | _substs: &chalk_ir::Substitution<Interner>, |
300 | ) -> chalk_ir::Binders<chalk_ir::Ty<Interner>> { | 301 | ) -> chalk_ir::Binders<chalk_ir::Ty<Interner>> { |
301 | let ty = TyBuilder::unit(); | 302 | let ty = TyBuilder::unit(); |
302 | make_binders(ty, 0) | 303 | make_only_type_binders(0, ty) |
303 | } | 304 | } |
304 | fn closure_fn_substitution( | 305 | fn closure_fn_substitution( |
305 | &self, | 306 | &self, |
@@ -404,7 +405,7 @@ pub(crate) fn associated_ty_data_query( | |||
404 | trait_id: to_chalk_trait_id(trait_), | 405 | trait_id: to_chalk_trait_id(trait_), |
405 | id, | 406 | id, |
406 | name: type_alias, | 407 | name: type_alias, |
407 | binders: make_binders(bound_data, generic_params.len()), | 408 | binders: make_only_type_binders(generic_params.len(), bound_data), |
408 | }; | 409 | }; |
409 | Arc::new(datum) | 410 | Arc::new(datum) |
410 | } | 411 | } |
@@ -437,7 +438,7 @@ pub(crate) fn trait_datum_query( | |||
437 | lang_attr(db.upcast(), trait_).and_then(|name| well_known_trait_from_lang_attr(&name)); | 438 | lang_attr(db.upcast(), trait_).and_then(|name| well_known_trait_from_lang_attr(&name)); |
438 | let trait_datum = TraitDatum { | 439 | let trait_datum = TraitDatum { |
439 | id: trait_id, | 440 | id: trait_id, |
440 | binders: make_binders(trait_datum_bound, bound_vars.len(&Interner)), | 441 | binders: make_only_type_binders(bound_vars.len(&Interner), trait_datum_bound), |
441 | flags, | 442 | flags, |
442 | associated_ty_ids, | 443 | associated_ty_ids, |
443 | well_known, | 444 | well_known, |
@@ -506,7 +507,7 @@ pub(crate) fn struct_datum_query( | |||
506 | // FIXME set ADT kind | 507 | // FIXME set ADT kind |
507 | kind: rust_ir::AdtKind::Struct, | 508 | kind: rust_ir::AdtKind::Struct, |
508 | id: struct_id, | 509 | id: struct_id, |
509 | binders: make_binders(struct_datum_bound, num_params), | 510 | binders: make_only_type_binders(num_params, struct_datum_bound), |
510 | flags, | 511 | flags, |
511 | }; | 512 | }; |
512 | Arc::new(struct_datum) | 513 | Arc::new(struct_datum) |
@@ -575,7 +576,7 @@ fn impl_def_datum( | |||
575 | .collect(); | 576 | .collect(); |
576 | debug!("impl_datum: {:?}", impl_datum_bound); | 577 | debug!("impl_datum: {:?}", impl_datum_bound); |
577 | let impl_datum = ImplDatum { | 578 | let impl_datum = ImplDatum { |
578 | binders: make_binders(impl_datum_bound, bound_vars.len(&Interner)), | 579 | binders: make_only_type_binders(bound_vars.len(&Interner), impl_datum_bound), |
579 | impl_type, | 580 | impl_type, |
580 | polarity, | 581 | polarity, |
581 | associated_ty_value_ids, | 582 | associated_ty_value_ids, |
@@ -635,13 +636,13 @@ pub(crate) fn fn_def_datum_query( | |||
635 | let where_clauses = convert_where_clauses(db, callable_def.into(), &bound_vars); | 636 | let where_clauses = convert_where_clauses(db, callable_def.into(), &bound_vars); |
636 | let bound = rust_ir::FnDefDatumBound { | 637 | let bound = rust_ir::FnDefDatumBound { |
637 | // Note: Chalk doesn't actually use this information yet as far as I am aware, but we provide it anyway | 638 | // Note: Chalk doesn't actually use this information yet as far as I am aware, but we provide it anyway |
638 | inputs_and_output: make_binders( | 639 | inputs_and_output: make_only_type_binders( |
640 | 0, | ||
639 | rust_ir::FnDefInputsAndOutputDatum { | 641 | rust_ir::FnDefInputsAndOutputDatum { |
640 | argument_types: sig.params().iter().cloned().collect(), | 642 | argument_types: sig.params().iter().cloned().collect(), |
641 | return_type: sig.ret().clone(), | 643 | return_type: sig.ret().clone(), |
642 | } | 644 | } |
643 | .shifted_in(&Interner), | 645 | .shifted_in(&Interner), |
644 | 0, | ||
645 | ), | 646 | ), |
646 | where_clauses, | 647 | where_clauses, |
647 | }; | 648 | }; |
diff --git a/crates/hir_ty/src/traits/chalk/mapping.rs b/crates/hir_ty/src/traits/chalk/mapping.rs index 54783b58c..4abc0fbf2 100644 --- a/crates/hir_ty/src/traits/chalk/mapping.rs +++ b/crates/hir_ty/src/traits/chalk/mapping.rs | |||
@@ -71,20 +71,6 @@ impl ToChalk for TypeAliasAsValue { | |||
71 | } | 71 | } |
72 | } | 72 | } |
73 | 73 | ||
74 | pub(super) fn make_binders<T>(value: T, num_vars: usize) -> chalk_ir::Binders<T> | ||
75 | where | ||
76 | T: HasInterner<Interner = Interner>, | ||
77 | { | ||
78 | chalk_ir::Binders::new( | ||
79 | chalk_ir::VariableKinds::from_iter( | ||
80 | &Interner, | ||
81 | std::iter::repeat(chalk_ir::VariableKind::Ty(chalk_ir::TyVariableKind::General)) | ||
82 | .take(num_vars), | ||
83 | ), | ||
84 | value, | ||
85 | ) | ||
86 | } | ||
87 | |||
88 | pub(super) fn convert_where_clauses( | 74 | pub(super) fn convert_where_clauses( |
89 | db: &dyn HirDatabase, | 75 | db: &dyn HirDatabase, |
90 | def: GenericDefId, | 76 | def: GenericDefId, |