aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/ty/traits/chalk.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/ty/traits/chalk.rs')
-rw-r--r--crates/ra_hir/src/ty/traits/chalk.rs61
1 files changed, 35 insertions, 26 deletions
diff --git a/crates/ra_hir/src/ty/traits/chalk.rs b/crates/ra_hir/src/ty/traits/chalk.rs
index 2642a54bf..00aaf65d9 100644
--- a/crates/ra_hir/src/ty/traits/chalk.rs
+++ b/crates/ra_hir/src/ty/traits/chalk.rs
@@ -126,8 +126,7 @@ impl ToChalk for Substs {
126 chalk_ir::Parameter(chalk_ir::ParameterKind::Ty(ty)) => from_chalk(db, ty), 126 chalk_ir::Parameter(chalk_ir::ParameterKind::Ty(ty)) => from_chalk(db, ty),
127 chalk_ir::Parameter(chalk_ir::ParameterKind::Lifetime(_)) => unimplemented!(), 127 chalk_ir::Parameter(chalk_ir::ParameterKind::Lifetime(_)) => unimplemented!(),
128 }) 128 })
129 .collect::<Vec<_>>() 129 .collect();
130 .into();
131 Substs(tys) 130 Substs(tys)
132 } 131 }
133} 132}
@@ -491,15 +490,16 @@ pub(crate) fn trait_datum_query(
491 }, 490 },
492 associated_ty_ids: Vec::new(), 491 associated_ty_ids: Vec::new(),
493 where_clauses: Vec::new(), 492 where_clauses: Vec::new(),
494 flags: chalk_rust_ir::TraitFlags {
495 non_enumerable: true,
496 auto: false,
497 marker: false,
498 upstream: true,
499 fundamental: false,
500 },
501 }; 493 };
502 return Arc::new(TraitDatum { binders: make_binders(trait_datum_bound, 1) }); 494
495 let flags = chalk_rust_ir::TraitFlags {
496 auto: false,
497 marker: false,
498 upstream: true,
499 fundamental: false,
500 non_enumerable: true,
501 };
502 return Arc::new(TraitDatum { binders: make_binders(trait_datum_bound, 1), flags });
503 } 503 }
504 let trait_: Trait = from_chalk(db, trait_id); 504 let trait_: Trait = from_chalk(db, trait_id);
505 debug!("trait {:?} = {:?}", trait_id, trait_.name(db)); 505 debug!("trait {:?} = {:?}", trait_id, trait_.name(db));
@@ -525,8 +525,9 @@ pub(crate) fn trait_datum_query(
525 .map(|type_alias| type_alias.to_chalk(db)) 525 .map(|type_alias| type_alias.to_chalk(db))
526 .collect(); 526 .collect();
527 let trait_datum_bound = 527 let trait_datum_bound =
528 chalk_rust_ir::TraitDatumBound { trait_ref, where_clauses, flags, associated_ty_ids }; 528 chalk_rust_ir::TraitDatumBound { trait_ref, where_clauses, associated_ty_ids };
529 let trait_datum = TraitDatum { binders: make_binders(trait_datum_bound, bound_vars.len()) }; 529 let trait_datum =
530 TraitDatum { binders: make_binders(trait_datum_bound, bound_vars.len()), flags };
530 Arc::new(trait_datum) 531 Arc::new(trait_datum)
531} 532}
532 533
@@ -632,18 +633,20 @@ fn impl_block_datum(
632 }) 633 })
633 .collect(); 634 .collect();
634 635
635 let impl_datum_bound = chalk_rust_ir::ImplDatumBound { 636 let polarity = if negative {
636 trait_ref: if negative { 637 chalk_rust_ir::Polarity::Negative
637 chalk_rust_ir::PolarizedTraitRef::Negative(trait_ref) 638 } else {
638 } else { 639 chalk_rust_ir::Polarity::Positive
639 chalk_rust_ir::PolarizedTraitRef::Positive(trait_ref)
640 },
641 where_clauses,
642 associated_ty_values,
643 impl_type,
644 }; 640 };
641
642 let impl_datum_bound =
643 chalk_rust_ir::ImplDatumBound { trait_ref, where_clauses, associated_ty_values };
645 debug!("impl_datum: {:?}", impl_datum_bound); 644 debug!("impl_datum: {:?}", impl_datum_bound);
646 let impl_datum = ImplDatum { binders: make_binders(impl_datum_bound, bound_vars.len()) }; 645 let impl_datum = ImplDatum {
646 binders: make_binders(impl_datum_bound, bound_vars.len()),
647 impl_type,
648 polarity,
649 };
647 Arc::new(impl_datum) 650 Arc::new(impl_datum)
648} 651}
649 652
@@ -653,12 +656,15 @@ fn invalid_impl_datum() -> Arc<ImplDatum> {
653 parameters: vec![chalk_ir::Ty::BoundVar(0).cast()], 656 parameters: vec![chalk_ir::Ty::BoundVar(0).cast()],
654 }; 657 };
655 let impl_datum_bound = chalk_rust_ir::ImplDatumBound { 658 let impl_datum_bound = chalk_rust_ir::ImplDatumBound {
656 trait_ref: chalk_rust_ir::PolarizedTraitRef::Positive(trait_ref), 659 trait_ref,
657 where_clauses: Vec::new(), 660 where_clauses: Vec::new(),
658 associated_ty_values: Vec::new(), 661 associated_ty_values: Vec::new(),
662 };
663 let impl_datum = ImplDatum {
664 binders: make_binders(impl_datum_bound, 1),
659 impl_type: chalk_rust_ir::ImplType::External, 665 impl_type: chalk_rust_ir::ImplType::External,
666 polarity: chalk_rust_ir::Polarity::Positive,
660 }; 667 };
661 let impl_datum = ImplDatum { binders: make_binders(impl_datum_bound, 1) };
662 Arc::new(impl_datum) 668 Arc::new(impl_datum)
663} 669}
664 670
@@ -713,12 +719,15 @@ fn closure_fn_trait_impl_datum(
713 let impl_type = chalk_rust_ir::ImplType::External; 719 let impl_type = chalk_rust_ir::ImplType::External;
714 720
715 let impl_datum_bound = chalk_rust_ir::ImplDatumBound { 721 let impl_datum_bound = chalk_rust_ir::ImplDatumBound {
716 trait_ref: chalk_rust_ir::PolarizedTraitRef::Positive(trait_ref.to_chalk(db)), 722 trait_ref: trait_ref.to_chalk(db),
717 where_clauses: Vec::new(), 723 where_clauses: Vec::new(),
718 associated_ty_values: vec![output_ty_value], 724 associated_ty_values: vec![output_ty_value],
725 };
726 let impl_datum = ImplDatum {
727 binders: make_binders(impl_datum_bound, num_args as usize + 1),
719 impl_type, 728 impl_type,
729 polarity: chalk_rust_ir::Polarity::Positive,
720 }; 730 };
721 let impl_datum = ImplDatum { binders: make_binders(impl_datum_bound, num_args as usize + 1) };
722 Some(Arc::new(impl_datum)) 731 Some(Arc::new(impl_datum))
723} 732}
724 733