diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2021-03-22 12:25:53 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2021-03-22 12:25:53 +0000 |
commit | e220d3d5079eaabf485d8966e1eb3bb90d181c23 (patch) | |
tree | 8b0164f450467187821da7c5b2f1974e6a17cc72 /crates | |
parent | 6f1f91cdcfc03e2a49cc66b76caff645f8b33d42 (diff) | |
parent | c4fd3f47f5b4f34476f8f085f2412a46aa0fd24f (diff) |
Merge #8139
8139: Align `Canonical` and `InEnvironment` with the Chalk versions r=flodiebold a=flodiebold
Co-authored-by: Florian Diebold <[email protected]>
Diffstat (limited to 'crates')
-rw-r--r-- | crates/hir/src/display.rs | 2 | ||||
-rw-r--r-- | crates/hir/src/lib.rs | 131 | ||||
-rw-r--r-- | crates/hir_ty/src/autoderef.rs | 51 | ||||
-rw-r--r-- | crates/hir_ty/src/infer.rs | 2 | ||||
-rw-r--r-- | crates/hir_ty/src/infer/coerce.rs | 6 | ||||
-rw-r--r-- | crates/hir_ty/src/infer/expr.rs | 16 | ||||
-rw-r--r-- | crates/hir_ty/src/infer/unify.rs | 51 | ||||
-rw-r--r-- | crates/hir_ty/src/lib.rs | 12 | ||||
-rw-r--r-- | crates/hir_ty/src/method_resolution.rs | 53 | ||||
-rw-r--r-- | crates/hir_ty/src/traits.rs | 17 | ||||
-rw-r--r-- | crates/hir_ty/src/traits/chalk/mapping.rs | 32 |
11 files changed, 194 insertions, 179 deletions
diff --git a/crates/hir/src/display.rs b/crates/hir/src/display.rs index 9f6d7be48..97a78ca25 100644 --- a/crates/hir/src/display.rs +++ b/crates/hir/src/display.rs | |||
@@ -217,7 +217,7 @@ impl HirDisplay for Variant { | |||
217 | 217 | ||
218 | impl HirDisplay for Type { | 218 | impl HirDisplay for Type { |
219 | fn hir_fmt(&self, f: &mut HirFormatter) -> Result<(), HirDisplayError> { | 219 | fn hir_fmt(&self, f: &mut HirFormatter) -> Result<(), HirDisplayError> { |
220 | self.ty.value.hir_fmt(f) | 220 | self.ty.hir_fmt(f) |
221 | } | 221 | } |
222 | } | 222 | } |
223 | 223 | ||
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index a325b6691..30b96d7e2 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs | |||
@@ -56,9 +56,9 @@ use hir_ty::{ | |||
56 | primitive::UintTy, | 56 | primitive::UintTy, |
57 | to_assoc_type_id, | 57 | to_assoc_type_id, |
58 | traits::{FnTrait, Solution, SolutionVariables}, | 58 | traits::{FnTrait, Solution, SolutionVariables}, |
59 | AliasEq, AliasTy, BoundVar, CallableDefId, CallableSig, Canonical, Cast, DebruijnIndex, | 59 | AliasEq, AliasTy, BoundVar, CallableDefId, CallableSig, Canonical, CanonicalVarKinds, Cast, |
60 | InEnvironment, Interner, ProjectionTy, QuantifiedWhereClause, Scalar, Substitution, Ty, | 60 | DebruijnIndex, InEnvironment, Interner, ProjectionTy, QuantifiedWhereClause, Scalar, |
61 | TyDefId, TyKind, TyVariableKind, WhereClause, | 61 | Substitution, TraitEnvironment, Ty, TyDefId, TyKind, TyVariableKind, WhereClause, |
62 | }; | 62 | }; |
63 | use itertools::Itertools; | 63 | use itertools::Itertools; |
64 | use rustc_hash::FxHashSet; | 64 | use rustc_hash::FxHashSet; |
@@ -851,13 +851,7 @@ impl Function { | |||
851 | .iter() | 851 | .iter() |
852 | .enumerate() | 852 | .enumerate() |
853 | .map(|(idx, type_ref)| { | 853 | .map(|(idx, type_ref)| { |
854 | let ty = Type { | 854 | let ty = Type { krate, env: environment.clone(), ty: ctx.lower_ty(type_ref) }; |
855 | krate, | ||
856 | ty: InEnvironment { | ||
857 | value: ctx.lower_ty(type_ref), | ||
858 | environment: environment.clone(), | ||
859 | }, | ||
860 | }; | ||
861 | Param { func: self, ty, idx } | 855 | Param { func: self, ty, idx } |
862 | }) | 856 | }) |
863 | .collect() | 857 | .collect() |
@@ -1540,8 +1534,8 @@ impl Impl { | |||
1540 | inherent.all_impls().chain(trait_.all_impls()).map(Self::from).collect() | 1534 | inherent.all_impls().chain(trait_.all_impls()).map(Self::from).collect() |
1541 | } | 1535 | } |
1542 | 1536 | ||
1543 | pub fn all_for_type(db: &dyn HirDatabase, Type { krate, ty }: Type) -> Vec<Impl> { | 1537 | pub fn all_for_type(db: &dyn HirDatabase, Type { krate, ty, .. }: Type) -> Vec<Impl> { |
1544 | let def_crates = match ty.value.def_crates(db, krate) { | 1538 | let def_crates = match ty.def_crates(db, krate) { |
1545 | Some(def_crates) => def_crates, | 1539 | Some(def_crates) => def_crates, |
1546 | None => return Vec::new(), | 1540 | None => return Vec::new(), |
1547 | }; | 1541 | }; |
@@ -1549,14 +1543,14 @@ impl Impl { | |||
1549 | let filter = |impl_def: &Impl| { | 1543 | let filter = |impl_def: &Impl| { |
1550 | let target_ty = impl_def.target_ty(db); | 1544 | let target_ty = impl_def.target_ty(db); |
1551 | let rref = target_ty.remove_ref(); | 1545 | let rref = target_ty.remove_ref(); |
1552 | ty.value.equals_ctor(rref.as_ref().map_or(&target_ty.ty.value, |it| &it.ty.value)) | 1546 | ty.equals_ctor(rref.as_ref().map_or(&target_ty.ty, |it| &it.ty)) |
1553 | }; | 1547 | }; |
1554 | 1548 | ||
1555 | let mut all = Vec::new(); | 1549 | let mut all = Vec::new(); |
1556 | def_crates.iter().for_each(|&id| { | 1550 | def_crates.iter().for_each(|&id| { |
1557 | all.extend(db.inherent_impls_in_crate(id).all_impls().map(Self::from).filter(filter)) | 1551 | all.extend(db.inherent_impls_in_crate(id).all_impls().map(Self::from).filter(filter)) |
1558 | }); | 1552 | }); |
1559 | let fp = TyFingerprint::for_impl(&ty.value); | 1553 | let fp = TyFingerprint::for_impl(&ty); |
1560 | for id in def_crates | 1554 | for id in def_crates |
1561 | .iter() | 1555 | .iter() |
1562 | .flat_map(|&id| Crate { id }.transitive_reverse_dependencies(db)) | 1556 | .flat_map(|&id| Crate { id }.transitive_reverse_dependencies(db)) |
@@ -1643,7 +1637,8 @@ impl Impl { | |||
1643 | #[derive(Clone, PartialEq, Eq, Debug)] | 1637 | #[derive(Clone, PartialEq, Eq, Debug)] |
1644 | pub struct Type { | 1638 | pub struct Type { |
1645 | krate: CrateId, | 1639 | krate: CrateId, |
1646 | ty: InEnvironment<Ty>, | 1640 | env: Arc<TraitEnvironment>, |
1641 | ty: Ty, | ||
1647 | } | 1642 | } |
1648 | 1643 | ||
1649 | impl Type { | 1644 | impl Type { |
@@ -1663,14 +1658,14 @@ impl Type { | |||
1663 | ) -> Type { | 1658 | ) -> Type { |
1664 | let environment = | 1659 | let environment = |
1665 | resolver.generic_def().map_or_else(Default::default, |d| db.trait_environment(d)); | 1660 | resolver.generic_def().map_or_else(Default::default, |d| db.trait_environment(d)); |
1666 | Type { krate, ty: InEnvironment { value: ty, environment } } | 1661 | Type { krate, env: environment, ty } |
1667 | } | 1662 | } |
1668 | 1663 | ||
1669 | fn new(db: &dyn HirDatabase, krate: CrateId, lexical_env: impl HasResolver, ty: Ty) -> Type { | 1664 | fn new(db: &dyn HirDatabase, krate: CrateId, lexical_env: impl HasResolver, ty: Ty) -> Type { |
1670 | let resolver = lexical_env.resolver(db.upcast()); | 1665 | let resolver = lexical_env.resolver(db.upcast()); |
1671 | let environment = | 1666 | let environment = |
1672 | resolver.generic_def().map_or_else(Default::default, |d| db.trait_environment(d)); | 1667 | resolver.generic_def().map_or_else(Default::default, |d| db.trait_environment(d)); |
1673 | Type { krate, ty: InEnvironment { value: ty, environment } } | 1668 | Type { krate, env: environment, ty } |
1674 | } | 1669 | } |
1675 | 1670 | ||
1676 | fn from_def( | 1671 | fn from_def( |
@@ -1684,29 +1679,29 @@ impl Type { | |||
1684 | } | 1679 | } |
1685 | 1680 | ||
1686 | pub fn is_unit(&self) -> bool { | 1681 | pub fn is_unit(&self) -> bool { |
1687 | matches!(self.ty.value.interned(&Interner), TyKind::Tuple(0, ..)) | 1682 | matches!(self.ty.interned(&Interner), TyKind::Tuple(0, ..)) |
1688 | } | 1683 | } |
1689 | pub fn is_bool(&self) -> bool { | 1684 | pub fn is_bool(&self) -> bool { |
1690 | matches!(self.ty.value.interned(&Interner), TyKind::Scalar(Scalar::Bool)) | 1685 | matches!(self.ty.interned(&Interner), TyKind::Scalar(Scalar::Bool)) |
1691 | } | 1686 | } |
1692 | 1687 | ||
1693 | pub fn is_mutable_reference(&self) -> bool { | 1688 | pub fn is_mutable_reference(&self) -> bool { |
1694 | matches!(self.ty.value.interned(&Interner), TyKind::Ref(hir_ty::Mutability::Mut, ..)) | 1689 | matches!(self.ty.interned(&Interner), TyKind::Ref(hir_ty::Mutability::Mut, ..)) |
1695 | } | 1690 | } |
1696 | 1691 | ||
1697 | pub fn is_usize(&self) -> bool { | 1692 | pub fn is_usize(&self) -> bool { |
1698 | matches!(self.ty.value.interned(&Interner), TyKind::Scalar(Scalar::Uint(UintTy::Usize))) | 1693 | matches!(self.ty.interned(&Interner), TyKind::Scalar(Scalar::Uint(UintTy::Usize))) |
1699 | } | 1694 | } |
1700 | 1695 | ||
1701 | pub fn remove_ref(&self) -> Option<Type> { | 1696 | pub fn remove_ref(&self) -> Option<Type> { |
1702 | match &self.ty.value.interned(&Interner) { | 1697 | match &self.ty.interned(&Interner) { |
1703 | TyKind::Ref(.., ty) => Some(self.derived(ty.clone())), | 1698 | TyKind::Ref(.., ty) => Some(self.derived(ty.clone())), |
1704 | _ => None, | 1699 | _ => None, |
1705 | } | 1700 | } |
1706 | } | 1701 | } |
1707 | 1702 | ||
1708 | pub fn is_unknown(&self) -> bool { | 1703 | pub fn is_unknown(&self) -> bool { |
1709 | self.ty.value.is_unknown() | 1704 | self.ty.is_unknown() |
1710 | } | 1705 | } |
1711 | 1706 | ||
1712 | /// Checks that particular type `ty` implements `std::future::Future`. | 1707 | /// Checks that particular type `ty` implements `std::future::Future`. |
@@ -1723,11 +1718,12 @@ impl Type { | |||
1723 | None => return false, | 1718 | None => return false, |
1724 | }; | 1719 | }; |
1725 | 1720 | ||
1726 | let canonical_ty = Canonical { value: self.ty.value.clone(), kinds: Arc::new([]) }; | 1721 | let canonical_ty = |
1722 | Canonical { value: self.ty.clone(), binders: CanonicalVarKinds::empty(&Interner) }; | ||
1727 | method_resolution::implements_trait( | 1723 | method_resolution::implements_trait( |
1728 | &canonical_ty, | 1724 | &canonical_ty, |
1729 | db, | 1725 | db, |
1730 | self.ty.environment.clone(), | 1726 | self.env.clone(), |
1731 | krate, | 1727 | krate, |
1732 | std_future_trait, | 1728 | std_future_trait, |
1733 | ) | 1729 | ) |
@@ -1745,11 +1741,12 @@ impl Type { | |||
1745 | None => return false, | 1741 | None => return false, |
1746 | }; | 1742 | }; |
1747 | 1743 | ||
1748 | let canonical_ty = Canonical { value: self.ty.value.clone(), kinds: Arc::new([]) }; | 1744 | let canonical_ty = |
1745 | Canonical { value: self.ty.clone(), binders: CanonicalVarKinds::empty(&Interner) }; | ||
1749 | method_resolution::implements_trait_unique( | 1746 | method_resolution::implements_trait_unique( |
1750 | &canonical_ty, | 1747 | &canonical_ty, |
1751 | db, | 1748 | db, |
1752 | self.ty.environment.clone(), | 1749 | self.env.clone(), |
1753 | krate, | 1750 | krate, |
1754 | fnonce_trait, | 1751 | fnonce_trait, |
1755 | ) | 1752 | ) |
@@ -1759,17 +1756,14 @@ impl Type { | |||
1759 | let trait_ref = hir_ty::TraitRef { | 1756 | let trait_ref = hir_ty::TraitRef { |
1760 | trait_id: hir_ty::to_chalk_trait_id(trait_.id), | 1757 | trait_id: hir_ty::to_chalk_trait_id(trait_.id), |
1761 | substitution: Substitution::build_for_def(db, trait_.id) | 1758 | substitution: Substitution::build_for_def(db, trait_.id) |
1762 | .push(self.ty.value.clone()) | 1759 | .push(self.ty.clone()) |
1763 | .fill(args.iter().map(|t| t.ty.value.clone())) | 1760 | .fill(args.iter().map(|t| t.ty.clone())) |
1764 | .build(), | 1761 | .build(), |
1765 | }; | 1762 | }; |
1766 | 1763 | ||
1767 | let goal = Canonical { | 1764 | let goal = Canonical { |
1768 | value: hir_ty::InEnvironment::new( | 1765 | value: hir_ty::InEnvironment::new(self.env.env.clone(), trait_ref.cast(&Interner)), |
1769 | self.ty.environment.clone(), | 1766 | binders: CanonicalVarKinds::empty(&Interner), |
1770 | trait_ref.cast(&Interner), | ||
1771 | ), | ||
1772 | kinds: Arc::new([]), | ||
1773 | }; | 1767 | }; |
1774 | 1768 | ||
1775 | db.trait_solve(self.krate, goal).is_some() | 1769 | db.trait_solve(self.krate, goal).is_some() |
@@ -1783,12 +1777,12 @@ impl Type { | |||
1783 | alias: TypeAlias, | 1777 | alias: TypeAlias, |
1784 | ) -> Option<Type> { | 1778 | ) -> Option<Type> { |
1785 | let subst = Substitution::build_for_def(db, trait_.id) | 1779 | let subst = Substitution::build_for_def(db, trait_.id) |
1786 | .push(self.ty.value.clone()) | 1780 | .push(self.ty.clone()) |
1787 | .fill(args.iter().map(|t| t.ty.value.clone())) | 1781 | .fill(args.iter().map(|t| t.ty.clone())) |
1788 | .build(); | 1782 | .build(); |
1789 | let goal = Canonical { | 1783 | let goal = Canonical::new( |
1790 | value: InEnvironment::new( | 1784 | InEnvironment::new( |
1791 | self.ty.environment.clone(), | 1785 | self.env.env.clone(), |
1792 | AliasEq { | 1786 | AliasEq { |
1793 | alias: AliasTy::Projection(ProjectionTy { | 1787 | alias: AliasTy::Projection(ProjectionTy { |
1794 | associated_ty_id: to_assoc_type_id(alias.id), | 1788 | associated_ty_id: to_assoc_type_id(alias.id), |
@@ -1799,8 +1793,8 @@ impl Type { | |||
1799 | } | 1793 | } |
1800 | .cast(&Interner), | 1794 | .cast(&Interner), |
1801 | ), | 1795 | ), |
1802 | kinds: Arc::new([TyVariableKind::General]), | 1796 | [TyVariableKind::General].iter().copied(), |
1803 | }; | 1797 | ); |
1804 | 1798 | ||
1805 | match db.trait_solve(self.krate, goal)? { | 1799 | match db.trait_solve(self.krate, goal)? { |
1806 | Solution::Unique(SolutionVariables(subst)) => { | 1800 | Solution::Unique(SolutionVariables(subst)) => { |
@@ -1820,22 +1814,22 @@ impl Type { | |||
1820 | } | 1814 | } |
1821 | 1815 | ||
1822 | pub fn as_callable(&self, db: &dyn HirDatabase) -> Option<Callable> { | 1816 | pub fn as_callable(&self, db: &dyn HirDatabase) -> Option<Callable> { |
1823 | let def = self.ty.value.callable_def(db); | 1817 | let def = self.ty.callable_def(db); |
1824 | 1818 | ||
1825 | let sig = self.ty.value.callable_sig(db)?; | 1819 | let sig = self.ty.callable_sig(db)?; |
1826 | Some(Callable { ty: self.clone(), sig, def, is_bound_method: false }) | 1820 | Some(Callable { ty: self.clone(), sig, def, is_bound_method: false }) |
1827 | } | 1821 | } |
1828 | 1822 | ||
1829 | pub fn is_closure(&self) -> bool { | 1823 | pub fn is_closure(&self) -> bool { |
1830 | matches!(&self.ty.value.interned(&Interner), TyKind::Closure { .. }) | 1824 | matches!(&self.ty.interned(&Interner), TyKind::Closure { .. }) |
1831 | } | 1825 | } |
1832 | 1826 | ||
1833 | pub fn is_fn(&self) -> bool { | 1827 | pub fn is_fn(&self) -> bool { |
1834 | matches!(&self.ty.value.interned(&Interner), TyKind::FnDef(..) | TyKind::Function { .. }) | 1828 | matches!(&self.ty.interned(&Interner), TyKind::FnDef(..) | TyKind::Function { .. }) |
1835 | } | 1829 | } |
1836 | 1830 | ||
1837 | pub fn is_packed(&self, db: &dyn HirDatabase) -> bool { | 1831 | pub fn is_packed(&self, db: &dyn HirDatabase) -> bool { |
1838 | let adt_id = match self.ty.value.interned(&Interner) { | 1832 | let adt_id = match self.ty.interned(&Interner) { |
1839 | &TyKind::Adt(hir_ty::AdtId(adt_id), ..) => adt_id, | 1833 | &TyKind::Adt(hir_ty::AdtId(adt_id), ..) => adt_id, |
1840 | _ => return false, | 1834 | _ => return false, |
1841 | }; | 1835 | }; |
@@ -1848,11 +1842,11 @@ impl Type { | |||
1848 | } | 1842 | } |
1849 | 1843 | ||
1850 | pub fn is_raw_ptr(&self) -> bool { | 1844 | pub fn is_raw_ptr(&self) -> bool { |
1851 | matches!(&self.ty.value.interned(&Interner), TyKind::Raw(..)) | 1845 | matches!(&self.ty.interned(&Interner), TyKind::Raw(..)) |
1852 | } | 1846 | } |
1853 | 1847 | ||
1854 | pub fn contains_unknown(&self) -> bool { | 1848 | pub fn contains_unknown(&self) -> bool { |
1855 | return go(&self.ty.value); | 1849 | return go(&self.ty); |
1856 | 1850 | ||
1857 | fn go(ty: &Ty) -> bool { | 1851 | fn go(ty: &Ty) -> bool { |
1858 | match ty.interned(&Interner) { | 1852 | match ty.interned(&Interner) { |
@@ -1884,7 +1878,7 @@ impl Type { | |||
1884 | } | 1878 | } |
1885 | 1879 | ||
1886 | pub fn fields(&self, db: &dyn HirDatabase) -> Vec<(Field, Type)> { | 1880 | pub fn fields(&self, db: &dyn HirDatabase) -> Vec<(Field, Type)> { |
1887 | let (variant_id, substs) = match self.ty.value.interned(&Interner) { | 1881 | let (variant_id, substs) = match self.ty.interned(&Interner) { |
1888 | &TyKind::Adt(hir_ty::AdtId(AdtId::StructId(s)), ref substs) => (s.into(), substs), | 1882 | &TyKind::Adt(hir_ty::AdtId(AdtId::StructId(s)), ref substs) => (s.into(), substs), |
1889 | &TyKind::Adt(hir_ty::AdtId(AdtId::UnionId(u)), ref substs) => (u.into(), substs), | 1883 | &TyKind::Adt(hir_ty::AdtId(AdtId::UnionId(u)), ref substs) => (u.into(), substs), |
1890 | _ => return Vec::new(), | 1884 | _ => return Vec::new(), |
@@ -1901,7 +1895,7 @@ impl Type { | |||
1901 | } | 1895 | } |
1902 | 1896 | ||
1903 | pub fn tuple_fields(&self, _db: &dyn HirDatabase) -> Vec<Type> { | 1897 | pub fn tuple_fields(&self, _db: &dyn HirDatabase) -> Vec<Type> { |
1904 | if let TyKind::Tuple(_, substs) = &self.ty.value.interned(&Interner) { | 1898 | if let TyKind::Tuple(_, substs) = &self.ty.interned(&Interner) { |
1905 | substs.iter().map(|ty| self.derived(ty.clone())).collect() | 1899 | substs.iter().map(|ty| self.derived(ty.clone())).collect() |
1906 | } else { | 1900 | } else { |
1907 | Vec::new() | 1901 | Vec::new() |
@@ -1911,9 +1905,10 @@ impl Type { | |||
1911 | pub fn autoderef<'a>(&'a self, db: &'a dyn HirDatabase) -> impl Iterator<Item = Type> + 'a { | 1905 | pub fn autoderef<'a>(&'a self, db: &'a dyn HirDatabase) -> impl Iterator<Item = Type> + 'a { |
1912 | // There should be no inference vars in types passed here | 1906 | // There should be no inference vars in types passed here |
1913 | // FIXME check that? | 1907 | // FIXME check that? |
1914 | let canonical = Canonical { value: self.ty.value.clone(), kinds: Arc::new([]) }; | 1908 | let canonical = |
1915 | let environment = self.ty.environment.clone(); | 1909 | Canonical { value: self.ty.clone(), binders: CanonicalVarKinds::empty(&Interner) }; |
1916 | let ty = InEnvironment { value: canonical, environment }; | 1910 | let environment = self.env.env.clone(); |
1911 | let ty = InEnvironment { goal: canonical, environment }; | ||
1917 | autoderef(db, Some(self.krate), ty) | 1912 | autoderef(db, Some(self.krate), ty) |
1918 | .map(|canonical| canonical.value) | 1913 | .map(|canonical| canonical.value) |
1919 | .map(move |ty| self.derived(ty)) | 1914 | .map(move |ty| self.derived(ty)) |
@@ -1927,10 +1922,10 @@ impl Type { | |||
1927 | krate: Crate, | 1922 | krate: Crate, |
1928 | mut callback: impl FnMut(AssocItem) -> Option<T>, | 1923 | mut callback: impl FnMut(AssocItem) -> Option<T>, |
1929 | ) -> Option<T> { | 1924 | ) -> Option<T> { |
1930 | for krate in self.ty.value.def_crates(db, krate.id)? { | 1925 | for krate in self.ty.def_crates(db, krate.id)? { |
1931 | let impls = db.inherent_impls_in_crate(krate); | 1926 | let impls = db.inherent_impls_in_crate(krate); |
1932 | 1927 | ||
1933 | for impl_def in impls.for_self_ty(&self.ty.value) { | 1928 | for impl_def in impls.for_self_ty(&self.ty) { |
1934 | for &item in db.impl_data(*impl_def).items.iter() { | 1929 | for &item in db.impl_data(*impl_def).items.iter() { |
1935 | if let Some(result) = callback(item.into()) { | 1930 | if let Some(result) = callback(item.into()) { |
1936 | return Some(result); | 1931 | return Some(result); |
@@ -1943,7 +1938,6 @@ impl Type { | |||
1943 | 1938 | ||
1944 | pub fn type_parameters(&self) -> impl Iterator<Item = Type> + '_ { | 1939 | pub fn type_parameters(&self) -> impl Iterator<Item = Type> + '_ { |
1945 | self.ty | 1940 | self.ty |
1946 | .value | ||
1947 | .strip_references() | 1941 | .strip_references() |
1948 | .substs() | 1942 | .substs() |
1949 | .into_iter() | 1943 | .into_iter() |
@@ -1962,9 +1956,10 @@ impl Type { | |||
1962 | // There should be no inference vars in types passed here | 1956 | // There should be no inference vars in types passed here |
1963 | // FIXME check that? | 1957 | // FIXME check that? |
1964 | // FIXME replace Unknown by bound vars here | 1958 | // FIXME replace Unknown by bound vars here |
1965 | let canonical = Canonical { value: self.ty.value.clone(), kinds: Arc::new([]) }; | 1959 | let canonical = |
1960 | Canonical { value: self.ty.clone(), binders: CanonicalVarKinds::empty(&Interner) }; | ||
1966 | 1961 | ||
1967 | let env = self.ty.environment.clone(); | 1962 | let env = self.env.clone(); |
1968 | let krate = krate.id; | 1963 | let krate = krate.id; |
1969 | 1964 | ||
1970 | method_resolution::iterate_method_candidates( | 1965 | method_resolution::iterate_method_candidates( |
@@ -1993,9 +1988,10 @@ impl Type { | |||
1993 | // There should be no inference vars in types passed here | 1988 | // There should be no inference vars in types passed here |
1994 | // FIXME check that? | 1989 | // FIXME check that? |
1995 | // FIXME replace Unknown by bound vars here | 1990 | // FIXME replace Unknown by bound vars here |
1996 | let canonical = Canonical { value: self.ty.value.clone(), kinds: Arc::new([]) }; | 1991 | let canonical = |
1992 | Canonical { value: self.ty.clone(), binders: CanonicalVarKinds::empty(&Interner) }; | ||
1997 | 1993 | ||
1998 | let env = self.ty.environment.clone(); | 1994 | let env = self.env.clone(); |
1999 | let krate = krate.id; | 1995 | let krate = krate.id; |
2000 | 1996 | ||
2001 | method_resolution::iterate_method_candidates( | 1997 | method_resolution::iterate_method_candidates( |
@@ -2011,16 +2007,16 @@ impl Type { | |||
2011 | } | 2007 | } |
2012 | 2008 | ||
2013 | pub fn as_adt(&self) -> Option<Adt> { | 2009 | pub fn as_adt(&self) -> Option<Adt> { |
2014 | let (adt, _subst) = self.ty.value.as_adt()?; | 2010 | let (adt, _subst) = self.ty.as_adt()?; |
2015 | Some(adt.into()) | 2011 | Some(adt.into()) |
2016 | } | 2012 | } |
2017 | 2013 | ||
2018 | pub fn as_dyn_trait(&self) -> Option<Trait> { | 2014 | pub fn as_dyn_trait(&self) -> Option<Trait> { |
2019 | self.ty.value.dyn_trait().map(Into::into) | 2015 | self.ty.dyn_trait().map(Into::into) |
2020 | } | 2016 | } |
2021 | 2017 | ||
2022 | pub fn as_impl_traits(&self, db: &dyn HirDatabase) -> Option<Vec<Trait>> { | 2018 | pub fn as_impl_traits(&self, db: &dyn HirDatabase) -> Option<Vec<Trait>> { |
2023 | self.ty.value.impl_trait_bounds(db).map(|it| { | 2019 | self.ty.impl_trait_bounds(db).map(|it| { |
2024 | it.into_iter() | 2020 | it.into_iter() |
2025 | .filter_map(|pred| match pred.skip_binders() { | 2021 | .filter_map(|pred| match pred.skip_binders() { |
2026 | hir_ty::WhereClause::Implemented(trait_ref) => { | 2022 | hir_ty::WhereClause::Implemented(trait_ref) => { |
@@ -2033,14 +2029,11 @@ impl Type { | |||
2033 | } | 2029 | } |
2034 | 2030 | ||
2035 | pub fn as_associated_type_parent_trait(&self, db: &dyn HirDatabase) -> Option<Trait> { | 2031 | pub fn as_associated_type_parent_trait(&self, db: &dyn HirDatabase) -> Option<Trait> { |
2036 | self.ty.value.associated_type_parent_trait(db).map(Into::into) | 2032 | self.ty.associated_type_parent_trait(db).map(Into::into) |
2037 | } | 2033 | } |
2038 | 2034 | ||
2039 | fn derived(&self, ty: Ty) -> Type { | 2035 | fn derived(&self, ty: Ty) -> Type { |
2040 | Type { | 2036 | Type { krate: self.krate, env: self.env.clone(), ty } |
2041 | krate: self.krate, | ||
2042 | ty: InEnvironment { value: ty, environment: self.ty.environment.clone() }, | ||
2043 | } | ||
2044 | } | 2037 | } |
2045 | 2038 | ||
2046 | pub fn walk(&self, db: &dyn HirDatabase, mut cb: impl FnMut(Type)) { | 2039 | pub fn walk(&self, db: &dyn HirDatabase, mut cb: impl FnMut(Type)) { |
@@ -2079,7 +2072,7 @@ impl Type { | |||
2079 | } | 2072 | } |
2080 | 2073 | ||
2081 | fn walk_type(db: &dyn HirDatabase, type_: &Type, cb: &mut impl FnMut(Type)) { | 2074 | fn walk_type(db: &dyn HirDatabase, type_: &Type, cb: &mut impl FnMut(Type)) { |
2082 | let ty = type_.ty.value.strip_references(); | 2075 | let ty = type_.ty.strip_references(); |
2083 | match ty.interned(&Interner) { | 2076 | match ty.interned(&Interner) { |
2084 | TyKind::Adt(..) => { | 2077 | TyKind::Adt(..) => { |
2085 | cb(type_.derived(ty.clone())); | 2078 | cb(type_.derived(ty.clone())); |
diff --git a/crates/hir_ty/src/autoderef.rs b/crates/hir_ty/src/autoderef.rs index 23ab042c1..dc5fc759a 100644 --- a/crates/hir_ty/src/autoderef.rs +++ b/crates/hir_ty/src/autoderef.rs | |||
@@ -16,8 +16,8 @@ use crate::{ | |||
16 | to_assoc_type_id, to_chalk_trait_id, | 16 | to_assoc_type_id, to_chalk_trait_id, |
17 | traits::{InEnvironment, Solution}, | 17 | traits::{InEnvironment, Solution}, |
18 | utils::generics, | 18 | utils::generics, |
19 | AliasEq, AliasTy, BoundVar, Canonical, DebruijnIndex, Interner, ProjectionTy, Substitution, | 19 | AliasEq, AliasTy, BoundVar, Canonical, CanonicalVarKinds, DebruijnIndex, Interner, |
20 | TraitRef, Ty, TyKind, | 20 | ProjectionTy, Substitution, TraitRef, Ty, TyKind, |
21 | }; | 21 | }; |
22 | 22 | ||
23 | const AUTODEREF_RECURSION_LIMIT: usize = 10; | 23 | const AUTODEREF_RECURSION_LIMIT: usize = 10; |
@@ -27,9 +27,9 @@ pub fn autoderef<'a>( | |||
27 | krate: Option<CrateId>, | 27 | krate: Option<CrateId>, |
28 | ty: InEnvironment<Canonical<Ty>>, | 28 | ty: InEnvironment<Canonical<Ty>>, |
29 | ) -> impl Iterator<Item = Canonical<Ty>> + 'a { | 29 | ) -> impl Iterator<Item = Canonical<Ty>> + 'a { |
30 | let InEnvironment { value: ty, environment } = ty; | 30 | let InEnvironment { goal: ty, environment } = ty; |
31 | successors(Some(ty), move |ty| { | 31 | successors(Some(ty), move |ty| { |
32 | deref(db, krate?, InEnvironment { value: ty, environment: environment.clone() }) | 32 | deref(db, krate?, InEnvironment { goal: ty, environment: environment.clone() }) |
33 | }) | 33 | }) |
34 | .take(AUTODEREF_RECURSION_LIMIT) | 34 | .take(AUTODEREF_RECURSION_LIMIT) |
35 | } | 35 | } |
@@ -39,8 +39,8 @@ pub(crate) fn deref( | |||
39 | krate: CrateId, | 39 | krate: CrateId, |
40 | ty: InEnvironment<&Canonical<Ty>>, | 40 | ty: InEnvironment<&Canonical<Ty>>, |
41 | ) -> Option<Canonical<Ty>> { | 41 | ) -> Option<Canonical<Ty>> { |
42 | if let Some(derefed) = ty.value.value.builtin_deref() { | 42 | if let Some(derefed) = ty.goal.value.builtin_deref() { |
43 | Some(Canonical { value: derefed, kinds: ty.value.kinds.clone() }) | 43 | Some(Canonical { value: derefed, binders: ty.goal.binders.clone() }) |
44 | } else { | 44 | } else { |
45 | deref_by_trait(db, krate, ty) | 45 | deref_by_trait(db, krate, ty) |
46 | } | 46 | } |
@@ -67,15 +67,15 @@ fn deref_by_trait( | |||
67 | // FIXME make the Canonical / bound var handling nicer | 67 | // FIXME make the Canonical / bound var handling nicer |
68 | 68 | ||
69 | let parameters = | 69 | let parameters = |
70 | Substitution::build_for_generics(&generic_params).push(ty.value.value.clone()).build(); | 70 | Substitution::build_for_generics(&generic_params).push(ty.goal.value.clone()).build(); |
71 | 71 | ||
72 | // Check that the type implements Deref at all | 72 | // Check that the type implements Deref at all |
73 | let trait_ref = | 73 | let trait_ref = |
74 | TraitRef { trait_id: to_chalk_trait_id(deref_trait), substitution: parameters.clone() }; | 74 | TraitRef { trait_id: to_chalk_trait_id(deref_trait), substitution: parameters.clone() }; |
75 | let implements_goal = Canonical { | 75 | let implements_goal = Canonical { |
76 | kinds: ty.value.kinds.clone(), | 76 | binders: ty.goal.binders.clone(), |
77 | value: InEnvironment { | 77 | value: InEnvironment { |
78 | value: trait_ref.cast(&Interner), | 78 | goal: trait_ref.cast(&Interner), |
79 | environment: ty.environment.clone(), | 79 | environment: ty.environment.clone(), |
80 | }, | 80 | }, |
81 | }; | 81 | }; |
@@ -89,18 +89,27 @@ fn deref_by_trait( | |||
89 | associated_ty_id: to_assoc_type_id(target), | 89 | associated_ty_id: to_assoc_type_id(target), |
90 | substitution: parameters, | 90 | substitution: parameters, |
91 | }), | 91 | }), |
92 | ty: TyKind::BoundVar(BoundVar::new(DebruijnIndex::INNERMOST, ty.value.kinds.len())) | 92 | ty: TyKind::BoundVar(BoundVar::new( |
93 | .intern(&Interner), | 93 | DebruijnIndex::INNERMOST, |
94 | ty.goal.binders.len(&Interner), | ||
95 | )) | ||
96 | .intern(&Interner), | ||
94 | }; | 97 | }; |
95 | 98 | ||
96 | let obligation = projection.cast(&Interner); | 99 | let obligation = projection.cast(&Interner); |
97 | 100 | ||
98 | let in_env = InEnvironment { value: obligation, environment: ty.environment }; | 101 | let in_env = InEnvironment { goal: obligation, environment: ty.environment }; |
99 | 102 | ||
100 | let canonical = Canonical::new( | 103 | let canonical = Canonical { |
101 | in_env, | 104 | value: in_env, |
102 | ty.value.kinds.iter().copied().chain(Some(chalk_ir::TyVariableKind::General)), | 105 | binders: CanonicalVarKinds::from_iter( |
103 | ); | 106 | &Interner, |
107 | ty.goal.binders.iter(&Interner).cloned().chain(Some(chalk_ir::WithKind::new( | ||
108 | chalk_ir::VariableKind::Ty(chalk_ir::TyVariableKind::General), | ||
109 | chalk_ir::UniverseIndex::ROOT, | ||
110 | ))), | ||
111 | ), | ||
112 | }; | ||
104 | 113 | ||
105 | let solution = db.trait_solve(krate, canonical)?; | 114 | let solution = db.trait_solve(krate, canonical)?; |
106 | 115 | ||
@@ -121,21 +130,21 @@ fn deref_by_trait( | |||
121 | // assumptions will be broken. We would need to properly introduce | 130 | // assumptions will be broken. We would need to properly introduce |
122 | // new variables in that case | 131 | // new variables in that case |
123 | 132 | ||
124 | for i in 1..vars.0.kinds.len() { | 133 | for i in 1..vars.0.binders.len(&Interner) { |
125 | if vars.0.value[i - 1].interned(&Interner) | 134 | if vars.0.value[i - 1].interned(&Interner) |
126 | != &TyKind::BoundVar(BoundVar::new(DebruijnIndex::INNERMOST, i - 1)) | 135 | != &TyKind::BoundVar(BoundVar::new(DebruijnIndex::INNERMOST, i - 1)) |
127 | { | 136 | { |
128 | warn!("complex solution for derefing {:?}: {:?}, ignoring", ty.value, solution); | 137 | warn!("complex solution for derefing {:?}: {:?}, ignoring", ty.goal, solution); |
129 | return None; | 138 | return None; |
130 | } | 139 | } |
131 | } | 140 | } |
132 | Some(Canonical { | 141 | Some(Canonical { |
133 | value: vars.0.value[vars.0.value.len() - 1].clone(), | 142 | value: vars.0.value[vars.0.value.len() - 1].clone(), |
134 | kinds: vars.0.kinds.clone(), | 143 | binders: vars.0.binders.clone(), |
135 | }) | 144 | }) |
136 | } | 145 | } |
137 | Solution::Ambig(_) => { | 146 | Solution::Ambig(_) => { |
138 | info!("Ambiguous solution for derefing {:?}: {:?}", ty.value, solution); | 147 | info!("Ambiguous solution for derefing {:?}: {:?}", ty.goal, solution); |
139 | None | 148 | None |
140 | } | 149 | } |
141 | } | 150 | } |
diff --git a/crates/hir_ty/src/infer.rs b/crates/hir_ty/src/infer.rs index b9e434c78..8f9cf7480 100644 --- a/crates/hir_ty/src/infer.rs +++ b/crates/hir_ty/src/infer.rs | |||
@@ -331,7 +331,7 @@ impl<'a> InferenceContext<'a> { | |||
331 | fn resolve_obligations_as_possible(&mut self) { | 331 | fn resolve_obligations_as_possible(&mut self) { |
332 | let obligations = mem::replace(&mut self.obligations, Vec::new()); | 332 | let obligations = mem::replace(&mut self.obligations, Vec::new()); |
333 | for obligation in obligations { | 333 | for obligation in obligations { |
334 | let in_env = InEnvironment::new(self.trait_env.clone(), obligation.clone()); | 334 | let in_env = InEnvironment::new(self.trait_env.env.clone(), obligation.clone()); |
335 | let canonicalized = self.canonicalizer().canonicalize_obligation(in_env); | 335 | let canonicalized = self.canonicalizer().canonicalize_obligation(in_env); |
336 | let solution = | 336 | let solution = |
337 | self.db.trait_solve(self.resolver.krate().unwrap(), canonicalized.value.clone()); | 337 | self.db.trait_solve(self.resolver.krate().unwrap(), canonicalized.value.clone()); |
diff --git a/crates/hir_ty/src/infer/coerce.rs b/crates/hir_ty/src/infer/coerce.rs index 07eb96573..9c62932b1 100644 --- a/crates/hir_ty/src/infer/coerce.rs +++ b/crates/hir_ty/src/infer/coerce.rs | |||
@@ -142,7 +142,7 @@ impl<'a> InferenceContext<'a> { | |||
142 | .build(); | 142 | .build(); |
143 | let trait_ref = | 143 | let trait_ref = |
144 | TraitRef { trait_id: to_chalk_trait_id(coerce_unsized_trait), substitution: substs }; | 144 | TraitRef { trait_id: to_chalk_trait_id(coerce_unsized_trait), substitution: substs }; |
145 | let goal = InEnvironment::new(self.trait_env.clone(), trait_ref.cast(&Interner)); | 145 | let goal = InEnvironment::new(self.trait_env.env.clone(), trait_ref.cast(&Interner)); |
146 | 146 | ||
147 | let canonicalizer = self.canonicalizer(); | 147 | let canonicalizer = self.canonicalizer(); |
148 | let canonicalized = canonicalizer.canonicalize_obligation(goal); | 148 | let canonicalized = canonicalizer.canonicalize_obligation(goal); |
@@ -170,8 +170,8 @@ impl<'a> InferenceContext<'a> { | |||
170 | self.db, | 170 | self.db, |
171 | self.resolver.krate(), | 171 | self.resolver.krate(), |
172 | InEnvironment { | 172 | InEnvironment { |
173 | value: canonicalized.value.clone(), | 173 | goal: canonicalized.value.clone(), |
174 | environment: self.trait_env.clone(), | 174 | environment: self.trait_env.env.clone(), |
175 | }, | 175 | }, |
176 | ) { | 176 | ) { |
177 | let derefed_ty = canonicalized.decanonicalize_ty(derefed_ty.value); | 177 | let derefed_ty = canonicalized.decanonicalize_ty(derefed_ty.value); |
diff --git a/crates/hir_ty/src/infer/expr.rs b/crates/hir_ty/src/infer/expr.rs index 05cbde4e3..19249973c 100644 --- a/crates/hir_ty/src/infer/expr.rs +++ b/crates/hir_ty/src/infer/expr.rs | |||
@@ -90,12 +90,12 @@ impl<'a> InferenceContext<'a> { | |||
90 | let substs = | 90 | let substs = |
91 | Substitution::build_for_generics(&generic_params).push(ty.clone()).push(arg_ty).build(); | 91 | Substitution::build_for_generics(&generic_params).push(ty.clone()).push(arg_ty).build(); |
92 | 92 | ||
93 | let trait_env = Arc::clone(&self.trait_env); | 93 | let trait_env = self.trait_env.env.clone(); |
94 | let implements_fn_trait: DomainGoal = | 94 | let implements_fn_trait: DomainGoal = |
95 | TraitRef { trait_id: to_chalk_trait_id(fn_once_trait), substitution: substs.clone() } | 95 | TraitRef { trait_id: to_chalk_trait_id(fn_once_trait), substitution: substs.clone() } |
96 | .cast(&Interner); | 96 | .cast(&Interner); |
97 | let goal = self.canonicalizer().canonicalize_obligation(InEnvironment { | 97 | let goal = self.canonicalizer().canonicalize_obligation(InEnvironment { |
98 | value: implements_fn_trait.clone(), | 98 | goal: implements_fn_trait.clone(), |
99 | environment: trait_env, | 99 | environment: trait_env, |
100 | }); | 100 | }); |
101 | if self.db.trait_solve(krate, goal.value).is_some() { | 101 | if self.db.trait_solve(krate, goal.value).is_some() { |
@@ -299,8 +299,8 @@ impl<'a> InferenceContext<'a> { | |||
299 | self.db, | 299 | self.db, |
300 | self.resolver.krate(), | 300 | self.resolver.krate(), |
301 | InEnvironment { | 301 | InEnvironment { |
302 | value: canonicalized.value.clone(), | 302 | goal: canonicalized.value.clone(), |
303 | environment: self.trait_env.clone(), | 303 | environment: self.trait_env.env.clone(), |
304 | }, | 304 | }, |
305 | ); | 305 | ); |
306 | let (param_tys, ret_ty): (Vec<Ty>, Ty) = derefs | 306 | let (param_tys, ret_ty): (Vec<Ty>, Ty) = derefs |
@@ -438,8 +438,8 @@ impl<'a> InferenceContext<'a> { | |||
438 | self.db, | 438 | self.db, |
439 | self.resolver.krate(), | 439 | self.resolver.krate(), |
440 | InEnvironment { | 440 | InEnvironment { |
441 | value: canonicalized.value.clone(), | 441 | goal: canonicalized.value.clone(), |
442 | environment: self.trait_env.clone(), | 442 | environment: self.trait_env.env.clone(), |
443 | }, | 443 | }, |
444 | ) | 444 | ) |
445 | .find_map(|derefed_ty| { | 445 | .find_map(|derefed_ty| { |
@@ -538,8 +538,8 @@ impl<'a> InferenceContext<'a> { | |||
538 | self.db, | 538 | self.db, |
539 | krate, | 539 | krate, |
540 | InEnvironment { | 540 | InEnvironment { |
541 | value: &canonicalized.value, | 541 | goal: &canonicalized.value, |
542 | environment: self.trait_env.clone(), | 542 | environment: self.trait_env.env.clone(), |
543 | }, | 543 | }, |
544 | ) { | 544 | ) { |
545 | Some(derefed_ty) => { | 545 | Some(derefed_ty) => { |
diff --git a/crates/hir_ty/src/infer/unify.rs b/crates/hir_ty/src/infer/unify.rs index 35b0a2059..75250a369 100644 --- a/crates/hir_ty/src/infer/unify.rs +++ b/crates/hir_ty/src/infer/unify.rs | |||
@@ -2,13 +2,13 @@ | |||
2 | 2 | ||
3 | use std::borrow::Cow; | 3 | use std::borrow::Cow; |
4 | 4 | ||
5 | use chalk_ir::{FloatTy, IntTy, TyVariableKind}; | 5 | use chalk_ir::{FloatTy, IntTy, TyVariableKind, UniverseIndex, VariableKind}; |
6 | use ena::unify::{InPlaceUnificationTable, NoError, UnifyKey, UnifyValue}; | 6 | use ena::unify::{InPlaceUnificationTable, NoError, UnifyKey, UnifyValue}; |
7 | 7 | ||
8 | use super::{DomainGoal, InferenceContext}; | 8 | use super::{DomainGoal, InferenceContext}; |
9 | use crate::{ | 9 | use crate::{ |
10 | AliasEq, AliasTy, BoundVar, Canonical, DebruijnIndex, FnPointer, InEnvironment, InferenceVar, | 10 | AliasEq, AliasTy, BoundVar, Canonical, CanonicalVarKinds, DebruijnIndex, FnPointer, |
11 | Interner, Scalar, Substitution, Ty, TyKind, TypeWalk, WhereClause, | 11 | InEnvironment, InferenceVar, Interner, Scalar, Substitution, Ty, TyKind, TypeWalk, WhereClause, |
12 | }; | 12 | }; |
13 | 13 | ||
14 | impl<'a> InferenceContext<'a> { | 14 | impl<'a> InferenceContext<'a> { |
@@ -76,8 +76,17 @@ impl<'a, 'b> Canonicalizer<'a, 'b> { | |||
76 | } | 76 | } |
77 | 77 | ||
78 | fn into_canonicalized<T>(self, result: T) -> Canonicalized<T> { | 78 | fn into_canonicalized<T>(self, result: T) -> Canonicalized<T> { |
79 | let kinds = self.free_vars.iter().map(|&(_, k)| k).collect(); | 79 | let kinds = self |
80 | Canonicalized { value: Canonical { value: result, kinds }, free_vars: self.free_vars } | 80 | .free_vars |
81 | .iter() | ||
82 | .map(|&(_, k)| chalk_ir::WithKind::new(VariableKind::Ty(k), UniverseIndex::ROOT)); | ||
83 | Canonicalized { | ||
84 | value: Canonical { | ||
85 | value: result, | ||
86 | binders: CanonicalVarKinds::from_iter(&Interner, kinds), | ||
87 | }, | ||
88 | free_vars: self.free_vars, | ||
89 | } | ||
81 | } | 90 | } |
82 | 91 | ||
83 | pub(crate) fn canonicalize_ty(mut self, ty: Ty) -> Canonicalized<Ty> { | 92 | pub(crate) fn canonicalize_ty(mut self, ty: Ty) -> Canonicalized<Ty> { |
@@ -89,15 +98,12 @@ impl<'a, 'b> Canonicalizer<'a, 'b> { | |||
89 | mut self, | 98 | mut self, |
90 | obligation: InEnvironment<DomainGoal>, | 99 | obligation: InEnvironment<DomainGoal>, |
91 | ) -> Canonicalized<InEnvironment<DomainGoal>> { | 100 | ) -> Canonicalized<InEnvironment<DomainGoal>> { |
92 | let result = match obligation.value { | 101 | let result = match obligation.goal { |
93 | DomainGoal::Holds(wc) => { | 102 | DomainGoal::Holds(wc) => { |
94 | DomainGoal::Holds(self.do_canonicalize(wc, DebruijnIndex::INNERMOST)) | 103 | DomainGoal::Holds(self.do_canonicalize(wc, DebruijnIndex::INNERMOST)) |
95 | } | 104 | } |
96 | }; | 105 | }; |
97 | self.into_canonicalized(InEnvironment { | 106 | self.into_canonicalized(InEnvironment { goal: result, environment: obligation.environment }) |
98 | value: result, | ||
99 | environment: obligation.environment, | ||
100 | }) | ||
101 | } | 107 | } |
102 | } | 108 | } |
103 | 109 | ||
@@ -125,12 +131,19 @@ impl<T> Canonicalized<T> { | |||
125 | // the solution may contain new variables, which we need to convert to new inference vars | 131 | // the solution may contain new variables, which we need to convert to new inference vars |
126 | let new_vars = Substitution( | 132 | let new_vars = Substitution( |
127 | solution | 133 | solution |
128 | .kinds | 134 | .binders |
129 | .iter() | 135 | .iter(&Interner) |
130 | .map(|k| match k { | 136 | .map(|k| match k.kind { |
131 | TyVariableKind::General => ctx.table.new_type_var(), | 137 | VariableKind::Ty(TyVariableKind::General) => ctx.table.new_type_var(), |
132 | TyVariableKind::Integer => ctx.table.new_integer_var(), | 138 | VariableKind::Ty(TyVariableKind::Integer) => ctx.table.new_integer_var(), |
133 | TyVariableKind::Float => ctx.table.new_float_var(), | 139 | VariableKind::Ty(TyVariableKind::Float) => ctx.table.new_float_var(), |
140 | // HACK: Chalk can sometimes return new lifetime variables. We | ||
141 | // want to just skip them, but to not mess up the indices of | ||
142 | // other variables, we'll just create a new type variable in | ||
143 | // their place instead. This should not matter (we never see the | ||
144 | // actual *uses* of the lifetime variable). | ||
145 | VariableKind::Lifetime => ctx.table.new_type_var(), | ||
146 | _ => panic!("const variable in solution"), | ||
134 | }) | 147 | }) |
135 | .collect(), | 148 | .collect(), |
136 | ); | 149 | ); |
@@ -147,8 +160,8 @@ impl<T> Canonicalized<T> { | |||
147 | pub(crate) fn unify(tys: &Canonical<(Ty, Ty)>) -> Option<Substitution> { | 160 | pub(crate) fn unify(tys: &Canonical<(Ty, Ty)>) -> Option<Substitution> { |
148 | let mut table = InferenceTable::new(); | 161 | let mut table = InferenceTable::new(); |
149 | let vars = Substitution( | 162 | let vars = Substitution( |
150 | tys.kinds | 163 | tys.binders |
151 | .iter() | 164 | .iter(&Interner) |
152 | // we always use type vars here because we want everything to | 165 | // we always use type vars here because we want everything to |
153 | // fallback to Unknown in the end (kind of hacky, as below) | 166 | // fallback to Unknown in the end (kind of hacky, as below) |
154 | .map(|_| table.new_type_var()) | 167 | .map(|_| table.new_type_var()) |
@@ -170,7 +183,7 @@ pub(crate) fn unify(tys: &Canonical<(Ty, Ty)>) -> Option<Substitution> { | |||
170 | } | 183 | } |
171 | } | 184 | } |
172 | Some( | 185 | Some( |
173 | Substitution::builder(tys.kinds.len()) | 186 | Substitution::builder(tys.binders.len(&Interner)) |
174 | .fill(vars.iter().map(|v| table.resolve_ty_completely(v.clone()))) | 187 | .fill(vars.iter().map(|v| table.resolve_ty_completely(v.clone()))) |
175 | .build(), | 188 | .build(), |
176 | ) | 189 | ) |
diff --git a/crates/hir_ty/src/lib.rs b/crates/hir_ty/src/lib.rs index 90b5b17e2..0f49dd39b 100644 --- a/crates/hir_ty/src/lib.rs +++ b/crates/hir_ty/src/lib.rs | |||
@@ -61,6 +61,8 @@ pub type ClosureId = chalk_ir::ClosureId<Interner>; | |||
61 | pub type OpaqueTyId = chalk_ir::OpaqueTyId<Interner>; | 61 | pub type OpaqueTyId = chalk_ir::OpaqueTyId<Interner>; |
62 | pub type PlaceholderIndex = chalk_ir::PlaceholderIndex; | 62 | pub type PlaceholderIndex = chalk_ir::PlaceholderIndex; |
63 | 63 | ||
64 | pub type CanonicalVarKinds = chalk_ir::CanonicalVarKinds<Interner>; | ||
65 | |||
64 | pub type ChalkTraitId = chalk_ir::TraitId<Interner>; | 66 | pub type ChalkTraitId = chalk_ir::TraitId<Interner>; |
65 | 67 | ||
66 | #[derive(Clone, PartialEq, Eq, Debug, Hash)] | 68 | #[derive(Clone, PartialEq, Eq, Debug, Hash)] |
@@ -662,12 +664,18 @@ impl QuantifiedWhereClauses { | |||
662 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] | 664 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] |
663 | pub struct Canonical<T> { | 665 | pub struct Canonical<T> { |
664 | pub value: T, | 666 | pub value: T, |
665 | pub kinds: Arc<[TyVariableKind]>, | 667 | pub binders: CanonicalVarKinds, |
666 | } | 668 | } |
667 | 669 | ||
668 | impl<T> Canonical<T> { | 670 | impl<T> Canonical<T> { |
669 | pub fn new(value: T, kinds: impl IntoIterator<Item = TyVariableKind>) -> Self { | 671 | pub fn new(value: T, kinds: impl IntoIterator<Item = TyVariableKind>) -> Self { |
670 | Self { value, kinds: kinds.into_iter().collect() } | 672 | let kinds = kinds.into_iter().map(|tk| { |
673 | chalk_ir::CanonicalVarKind::new( | ||
674 | chalk_ir::VariableKind::Ty(tk), | ||
675 | chalk_ir::UniverseIndex::ROOT, | ||
676 | ) | ||
677 | }); | ||
678 | Self { value, binders: chalk_ir::CanonicalVarKinds::from_iter(&Interner, kinds) } | ||
671 | } | 679 | } |
672 | } | 680 | } |
673 | 681 | ||
diff --git a/crates/hir_ty/src/method_resolution.rs b/crates/hir_ty/src/method_resolution.rs index da6bc2a4a..8e986ddde 100644 --- a/crates/hir_ty/src/method_resolution.rs +++ b/crates/hir_ty/src/method_resolution.rs | |||
@@ -6,7 +6,7 @@ use std::{iter, sync::Arc}; | |||
6 | 6 | ||
7 | use arrayvec::ArrayVec; | 7 | use arrayvec::ArrayVec; |
8 | use base_db::CrateId; | 8 | use base_db::CrateId; |
9 | use chalk_ir::{cast::Cast, Mutability}; | 9 | use chalk_ir::{cast::Cast, Mutability, UniverseIndex}; |
10 | use hir_def::{ | 10 | use hir_def::{ |
11 | lang_item::LangItemTarget, AssocContainerId, AssocItemId, FunctionId, GenericDefId, HasModule, | 11 | lang_item::LangItemTarget, AssocContainerId, AssocItemId, FunctionId, GenericDefId, HasModule, |
12 | ImplId, Lookup, ModuleId, TraitId, | 12 | ImplId, Lookup, ModuleId, TraitId, |
@@ -21,8 +21,9 @@ use crate::{ | |||
21 | primitive::{self, FloatTy, IntTy, UintTy}, | 21 | primitive::{self, FloatTy, IntTy, UintTy}, |
22 | to_chalk_trait_id, | 22 | to_chalk_trait_id, |
23 | utils::all_super_traits, | 23 | utils::all_super_traits, |
24 | AdtId, Canonical, DebruijnIndex, FnPointer, FnSig, ForeignDefId, InEnvironment, Interner, | 24 | AdtId, Canonical, CanonicalVarKinds, DebruijnIndex, FnPointer, FnSig, ForeignDefId, |
25 | Scalar, Substitution, TraitEnvironment, TraitRef, Ty, TyKind, TypeWalk, | 25 | InEnvironment, Interner, Scalar, Substitution, TraitEnvironment, TraitRef, Ty, TyKind, |
26 | TypeWalk, | ||
26 | }; | 27 | }; |
27 | 28 | ||
28 | /// This is used as a key for indexing impls. | 29 | /// This is used as a key for indexing impls. |
@@ -375,7 +376,7 @@ fn iterate_method_candidates_impl( | |||
375 | // Also note that when we've got a receiver like &S, even if the method we | 376 | // Also note that when we've got a receiver like &S, even if the method we |
376 | // find in the end takes &self, we still do the autoderef step (just as | 377 | // find in the end takes &self, we still do the autoderef step (just as |
377 | // rustc does an autoderef and then autoref again). | 378 | // rustc does an autoderef and then autoref again). |
378 | let ty = InEnvironment { value: ty.clone(), environment: env.clone() }; | 379 | let ty = InEnvironment { goal: ty.clone(), environment: env.env.clone() }; |
379 | 380 | ||
380 | // We have to be careful about the order we're looking at candidates | 381 | // We have to be careful about the order we're looking at candidates |
381 | // in here. Consider the case where we're resolving `x.clone()` | 382 | // in here. Consider the case where we're resolving `x.clone()` |
@@ -443,7 +444,7 @@ fn iterate_method_candidates_with_autoref( | |||
443 | return true; | 444 | return true; |
444 | } | 445 | } |
445 | let refed = Canonical { | 446 | let refed = Canonical { |
446 | kinds: deref_chain[0].kinds.clone(), | 447 | binders: deref_chain[0].binders.clone(), |
447 | value: TyKind::Ref(Mutability::Not, deref_chain[0].value.clone()).intern(&Interner), | 448 | value: TyKind::Ref(Mutability::Not, deref_chain[0].value.clone()).intern(&Interner), |
448 | }; | 449 | }; |
449 | if iterate_method_candidates_by_receiver( | 450 | if iterate_method_candidates_by_receiver( |
@@ -459,7 +460,7 @@ fn iterate_method_candidates_with_autoref( | |||
459 | return true; | 460 | return true; |
460 | } | 461 | } |
461 | let ref_muted = Canonical { | 462 | let ref_muted = Canonical { |
462 | kinds: deref_chain[0].kinds.clone(), | 463 | binders: deref_chain[0].binders.clone(), |
463 | value: TyKind::Ref(Mutability::Mut, deref_chain[0].value.clone()).intern(&Interner), | 464 | value: TyKind::Ref(Mutability::Mut, deref_chain[0].value.clone()).intern(&Interner), |
464 | }; | 465 | }; |
465 | if iterate_method_candidates_by_receiver( | 466 | if iterate_method_candidates_by_receiver( |
@@ -621,7 +622,7 @@ pub fn resolve_indexing_op( | |||
621 | krate: CrateId, | 622 | krate: CrateId, |
622 | index_trait: TraitId, | 623 | index_trait: TraitId, |
623 | ) -> Option<Canonical<Ty>> { | 624 | ) -> Option<Canonical<Ty>> { |
624 | let ty = InEnvironment { value: ty.clone(), environment: env.clone() }; | 625 | let ty = InEnvironment { goal: ty.clone(), environment: env.env.clone() }; |
625 | let deref_chain = autoderef_method_receiver(db, krate, ty); | 626 | let deref_chain = autoderef_method_receiver(db, krate, ty); |
626 | for ty in deref_chain { | 627 | for ty in deref_chain { |
627 | let goal = generic_implements_goal(db, env.clone(), index_trait, ty.clone()); | 628 | let goal = generic_implements_goal(db, env.clone(), index_trait, ty.clone()); |
@@ -677,19 +678,28 @@ pub(crate) fn inherent_impl_substs( | |||
677 | // we create a var for each type parameter of the impl; we need to keep in | 678 | // we create a var for each type parameter of the impl; we need to keep in |
678 | // mind here that `self_ty` might have vars of its own | 679 | // mind here that `self_ty` might have vars of its own |
679 | let vars = Substitution::build_for_def(db, impl_id) | 680 | let vars = Substitution::build_for_def(db, impl_id) |
680 | .fill_with_bound_vars(DebruijnIndex::INNERMOST, self_ty.kinds.len()) | 681 | .fill_with_bound_vars(DebruijnIndex::INNERMOST, self_ty.binders.len(&Interner)) |
681 | .build(); | 682 | .build(); |
682 | let self_ty_with_vars = db.impl_self_ty(impl_id).subst(&vars); | 683 | let self_ty_with_vars = db.impl_self_ty(impl_id).subst(&vars); |
683 | let mut kinds = self_ty.kinds.to_vec(); | 684 | let mut kinds = self_ty.binders.interned().to_vec(); |
684 | kinds.extend(iter::repeat(chalk_ir::TyVariableKind::General).take(vars.len())); | 685 | kinds.extend( |
685 | let tys = Canonical { kinds: kinds.into(), value: (self_ty_with_vars, self_ty.value.clone()) }; | 686 | iter::repeat(chalk_ir::WithKind::new( |
687 | chalk_ir::VariableKind::Ty(chalk_ir::TyVariableKind::General), | ||
688 | UniverseIndex::ROOT, | ||
689 | )) | ||
690 | .take(vars.len()), | ||
691 | ); | ||
692 | let tys = Canonical { | ||
693 | binders: CanonicalVarKinds::from_iter(&Interner, kinds), | ||
694 | value: (self_ty_with_vars, self_ty.value.clone()), | ||
695 | }; | ||
686 | let substs = super::infer::unify(&tys); | 696 | let substs = super::infer::unify(&tys); |
687 | // We only want the substs for the vars we added, not the ones from self_ty. | 697 | // We only want the substs for the vars we added, not the ones from self_ty. |
688 | // Also, if any of the vars we added are still in there, we replace them by | 698 | // Also, if any of the vars we added are still in there, we replace them by |
689 | // Unknown. I think this can only really happen if self_ty contained | 699 | // Unknown. I think this can only really happen if self_ty contained |
690 | // Unknown, and in that case we want the result to contain Unknown in those | 700 | // Unknown, and in that case we want the result to contain Unknown in those |
691 | // places again. | 701 | // places again. |
692 | substs.map(|s| fallback_bound_vars(s.suffix(vars.len()), self_ty.kinds.len())) | 702 | substs.map(|s| fallback_bound_vars(s.suffix(vars.len()), self_ty.binders.len(&Interner))) |
693 | } | 703 | } |
694 | 704 | ||
695 | /// This replaces any 'free' Bound vars in `s` (i.e. those with indices past | 705 | /// This replaces any 'free' Bound vars in `s` (i.e. those with indices past |
@@ -768,15 +778,24 @@ fn generic_implements_goal( | |||
768 | trait_: TraitId, | 778 | trait_: TraitId, |
769 | self_ty: Canonical<Ty>, | 779 | self_ty: Canonical<Ty>, |
770 | ) -> Canonical<InEnvironment<super::DomainGoal>> { | 780 | ) -> Canonical<InEnvironment<super::DomainGoal>> { |
771 | let mut kinds = self_ty.kinds.to_vec(); | 781 | let mut kinds = self_ty.binders.interned().to_vec(); |
772 | let substs = super::Substitution::build_for_def(db, trait_) | 782 | let substs = super::Substitution::build_for_def(db, trait_) |
773 | .push(self_ty.value) | 783 | .push(self_ty.value) |
774 | .fill_with_bound_vars(DebruijnIndex::INNERMOST, kinds.len()) | 784 | .fill_with_bound_vars(DebruijnIndex::INNERMOST, kinds.len()) |
775 | .build(); | 785 | .build(); |
776 | kinds.extend(iter::repeat(chalk_ir::TyVariableKind::General).take(substs.len() - 1)); | 786 | kinds.extend( |
787 | iter::repeat(chalk_ir::WithKind::new( | ||
788 | chalk_ir::VariableKind::Ty(chalk_ir::TyVariableKind::General), | ||
789 | UniverseIndex::ROOT, | ||
790 | )) | ||
791 | .take(substs.len() - 1), | ||
792 | ); | ||
777 | let trait_ref = TraitRef { trait_id: to_chalk_trait_id(trait_), substitution: substs }; | 793 | let trait_ref = TraitRef { trait_id: to_chalk_trait_id(trait_), substitution: substs }; |
778 | let obligation = trait_ref.cast(&Interner); | 794 | let obligation = trait_ref.cast(&Interner); |
779 | Canonical { kinds: kinds.into(), value: InEnvironment::new(env, obligation) } | 795 | Canonical { |
796 | binders: CanonicalVarKinds::from_iter(&Interner, kinds), | ||
797 | value: InEnvironment::new(env.env.clone(), obligation), | ||
798 | } | ||
780 | } | 799 | } |
781 | 800 | ||
782 | fn autoderef_method_receiver( | 801 | fn autoderef_method_receiver( |
@@ -789,9 +808,9 @@ fn autoderef_method_receiver( | |||
789 | if let Some(TyKind::Array(parameters)) = | 808 | if let Some(TyKind::Array(parameters)) = |
790 | deref_chain.last().map(|ty| ty.value.interned(&Interner)) | 809 | deref_chain.last().map(|ty| ty.value.interned(&Interner)) |
791 | { | 810 | { |
792 | let kinds = deref_chain.last().unwrap().kinds.clone(); | 811 | let kinds = deref_chain.last().unwrap().binders.clone(); |
793 | let unsized_ty = TyKind::Slice(parameters.clone()).intern(&Interner); | 812 | let unsized_ty = TyKind::Slice(parameters.clone()).intern(&Interner); |
794 | deref_chain.push(Canonical { value: unsized_ty, kinds }) | 813 | deref_chain.push(Canonical { value: unsized_ty, binders: kinds }) |
795 | } | 814 | } |
796 | deref_chain | 815 | deref_chain |
797 | } | 816 | } |
diff --git a/crates/hir_ty/src/traits.rs b/crates/hir_ty/src/traits.rs index 7dadd1ffb..ccee0e5ad 100644 --- a/crates/hir_ty/src/traits.rs +++ b/crates/hir_ty/src/traits.rs | |||
@@ -1,6 +1,5 @@ | |||
1 | //! Trait solving using Chalk. | 1 | //! Trait solving using Chalk. |
2 | use std::env::var; | 2 | use std::env::var; |
3 | use std::sync::Arc; | ||
4 | 3 | ||
5 | use base_db::CrateId; | 4 | use base_db::CrateId; |
6 | use chalk_ir::cast::Cast; | 5 | use chalk_ir::cast::Cast; |
@@ -44,7 +43,7 @@ pub struct TraitEnvironment { | |||
44 | // When we're using Chalk's Ty we can make this a BTreeMap since it's Ord, | 43 | // When we're using Chalk's Ty we can make this a BTreeMap since it's Ord, |
45 | // but for now it's too annoying... | 44 | // but for now it's too annoying... |
46 | pub(crate) traits_from_clauses: Vec<(Ty, TraitId)>, | 45 | pub(crate) traits_from_clauses: Vec<(Ty, TraitId)>, |
47 | pub(crate) env: chalk_ir::Environment<Interner>, | 46 | pub env: chalk_ir::Environment<Interner>, |
48 | } | 47 | } |
49 | 48 | ||
50 | impl TraitEnvironment { | 49 | impl TraitEnvironment { |
@@ -74,13 +73,13 @@ impl Default for TraitEnvironment { | |||
74 | /// Something (usually a goal), along with an environment. | 73 | /// Something (usually a goal), along with an environment. |
75 | #[derive(Clone, Debug, PartialEq, Eq, Hash)] | 74 | #[derive(Clone, Debug, PartialEq, Eq, Hash)] |
76 | pub struct InEnvironment<T> { | 75 | pub struct InEnvironment<T> { |
77 | pub environment: Arc<TraitEnvironment>, | 76 | pub environment: chalk_ir::Environment<Interner>, |
78 | pub value: T, | 77 | pub goal: T, |
79 | } | 78 | } |
80 | 79 | ||
81 | impl<T> InEnvironment<T> { | 80 | impl<T> InEnvironment<T> { |
82 | pub fn new(environment: Arc<TraitEnvironment>, value: T) -> InEnvironment<T> { | 81 | pub fn new(environment: chalk_ir::Environment<Interner>, value: T) -> InEnvironment<T> { |
83 | InEnvironment { environment, value } | 82 | InEnvironment { environment, goal: value } |
84 | } | 83 | } |
85 | } | 84 | } |
86 | 85 | ||
@@ -126,18 +125,18 @@ pub(crate) fn trait_solve_query( | |||
126 | krate: CrateId, | 125 | krate: CrateId, |
127 | goal: Canonical<InEnvironment<DomainGoal>>, | 126 | goal: Canonical<InEnvironment<DomainGoal>>, |
128 | ) -> Option<Solution> { | 127 | ) -> Option<Solution> { |
129 | let _p = profile::span("trait_solve_query").detail(|| match &goal.value.value { | 128 | let _p = profile::span("trait_solve_query").detail(|| match &goal.value.goal { |
130 | DomainGoal::Holds(WhereClause::Implemented(it)) => { | 129 | DomainGoal::Holds(WhereClause::Implemented(it)) => { |
131 | db.trait_data(it.hir_trait_id()).name.to_string() | 130 | db.trait_data(it.hir_trait_id()).name.to_string() |
132 | } | 131 | } |
133 | DomainGoal::Holds(WhereClause::AliasEq(_)) => "alias_eq".to_string(), | 132 | DomainGoal::Holds(WhereClause::AliasEq(_)) => "alias_eq".to_string(), |
134 | }); | 133 | }); |
135 | log::info!("trait_solve_query({})", goal.value.value.display(db)); | 134 | log::info!("trait_solve_query({})", goal.value.goal.display(db)); |
136 | 135 | ||
137 | if let DomainGoal::Holds(WhereClause::AliasEq(AliasEq { | 136 | if let DomainGoal::Holds(WhereClause::AliasEq(AliasEq { |
138 | alias: AliasTy::Projection(projection_ty), | 137 | alias: AliasTy::Projection(projection_ty), |
139 | .. | 138 | .. |
140 | })) = &goal.value.value | 139 | })) = &goal.value.goal |
141 | { | 140 | { |
142 | if let TyKind::BoundVar(_) = &projection_ty.substitution[0].interned(&Interner) { | 141 | if let TyKind::BoundVar(_) = &projection_ty.substitution[0].interned(&Interner) { |
143 | // Hack: don't ask Chalk to normalize with an unknown self type, it'll say that's impossible | 142 | // Hack: don't ask Chalk to normalize with an unknown self type, it'll say that's impossible |
diff --git a/crates/hir_ty/src/traits/chalk/mapping.rs b/crates/hir_ty/src/traits/chalk/mapping.rs index 7209dd14e..aef6b8a15 100644 --- a/crates/hir_ty/src/traits/chalk/mapping.rs +++ b/crates/hir_ty/src/traits/chalk/mapping.rs | |||
@@ -439,35 +439,12 @@ where | |||
439 | type Chalk = chalk_ir::Canonical<T::Chalk>; | 439 | type Chalk = chalk_ir::Canonical<T::Chalk>; |
440 | 440 | ||
441 | fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::Canonical<T::Chalk> { | 441 | fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::Canonical<T::Chalk> { |
442 | let kinds = self.kinds.iter().map(|&tk| { | ||
443 | chalk_ir::CanonicalVarKind::new( | ||
444 | chalk_ir::VariableKind::Ty(tk), | ||
445 | chalk_ir::UniverseIndex::ROOT, | ||
446 | ) | ||
447 | }); | ||
448 | let value = self.value.to_chalk(db); | 442 | let value = self.value.to_chalk(db); |
449 | chalk_ir::Canonical { | 443 | chalk_ir::Canonical { value, binders: self.binders } |
450 | value, | ||
451 | binders: chalk_ir::CanonicalVarKinds::from_iter(&Interner, kinds), | ||
452 | } | ||
453 | } | 444 | } |
454 | 445 | ||
455 | fn from_chalk(db: &dyn HirDatabase, canonical: chalk_ir::Canonical<T::Chalk>) -> Canonical<T> { | 446 | fn from_chalk(db: &dyn HirDatabase, canonical: chalk_ir::Canonical<T::Chalk>) -> Canonical<T> { |
456 | let kinds = canonical | 447 | Canonical { binders: canonical.binders, value: from_chalk(db, canonical.value) } |
457 | .binders | ||
458 | .iter(&Interner) | ||
459 | .map(|k| match k.kind { | ||
460 | chalk_ir::VariableKind::Ty(tk) => tk, | ||
461 | // HACK: Chalk can sometimes return new lifetime variables. We | ||
462 | // want to just skip them, but to not mess up the indices of | ||
463 | // other variables, we'll just create a new type variable in | ||
464 | // their place instead. This should not matter (we never see the | ||
465 | // actual *uses* of the lifetime variable). | ||
466 | chalk_ir::VariableKind::Lifetime => chalk_ir::TyVariableKind::General, | ||
467 | chalk_ir::VariableKind::Const(_) => panic!("unexpected const from Chalk"), | ||
468 | }) | ||
469 | .collect(); | ||
470 | Canonical { kinds, value: from_chalk(db, canonical.value) } | ||
471 | } | 448 | } |
472 | } | 449 | } |
473 | 450 | ||
@@ -478,10 +455,7 @@ where | |||
478 | type Chalk = chalk_ir::InEnvironment<T::Chalk>; | 455 | type Chalk = chalk_ir::InEnvironment<T::Chalk>; |
479 | 456 | ||
480 | fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::InEnvironment<T::Chalk> { | 457 | fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::InEnvironment<T::Chalk> { |
481 | chalk_ir::InEnvironment { | 458 | chalk_ir::InEnvironment { environment: self.environment, goal: self.goal.to_chalk(db) } |
482 | environment: self.environment.env.clone(), | ||
483 | goal: self.value.to_chalk(db), | ||
484 | } | ||
485 | } | 459 | } |
486 | 460 | ||
487 | fn from_chalk( | 461 | fn from_chalk( |