diff options
Diffstat (limited to 'crates/hir_ty/src/lower.rs')
-rw-r--r-- | crates/hir_ty/src/lower.rs | 80 |
1 files changed, 40 insertions, 40 deletions
diff --git a/crates/hir_ty/src/lower.rs b/crates/hir_ty/src/lower.rs index 99b0ecf3b..ca06c9fe2 100644 --- a/crates/hir_ty/src/lower.rs +++ b/crates/hir_ty/src/lower.rs | |||
@@ -31,9 +31,9 @@ use crate::{ | |||
31 | all_super_trait_refs, associated_type_by_name_including_super_traits, generics, | 31 | all_super_trait_refs, associated_type_by_name_including_super_traits, generics, |
32 | make_mut_slice, variant_data, | 32 | make_mut_slice, variant_data, |
33 | }, | 33 | }, |
34 | Binders, BoundVar, DebruijnIndex, FnSig, GenericPredicate, OpaqueTy, OpaqueTyId, PolyFnSig, | 34 | AliasTy, Binders, BoundVar, CallableSig, DebruijnIndex, FnPointer, FnSig, GenericPredicate, |
35 | ProjectionPredicate, ProjectionTy, ReturnTypeImplTrait, ReturnTypeImplTraits, Substs, | 35 | OpaqueTy, OpaqueTyId, PolyFnSig, ProjectionPredicate, ProjectionTy, ReturnTypeImplTrait, |
36 | TraitEnvironment, TraitRef, Ty, TypeCtor, TypeWalk, | 36 | ReturnTypeImplTraits, Substs, TraitEnvironment, TraitRef, Ty, TypeWalk, |
37 | }; | 37 | }; |
38 | 38 | ||
39 | #[derive(Debug)] | 39 | #[derive(Debug)] |
@@ -145,13 +145,10 @@ impl Ty { | |||
145 | pub fn from_hir_ext(ctx: &TyLoweringContext<'_>, type_ref: &TypeRef) -> (Self, Option<TypeNs>) { | 145 | pub fn from_hir_ext(ctx: &TyLoweringContext<'_>, type_ref: &TypeRef) -> (Self, Option<TypeNs>) { |
146 | let mut res = None; | 146 | let mut res = None; |
147 | let ty = match type_ref { | 147 | let ty = match type_ref { |
148 | TypeRef::Never => Ty::simple(TypeCtor::Never), | 148 | TypeRef::Never => Ty::Never, |
149 | TypeRef::Tuple(inner) => { | 149 | TypeRef::Tuple(inner) => { |
150 | let inner_tys: Arc<[Ty]> = inner.iter().map(|tr| Ty::from_hir(ctx, tr)).collect(); | 150 | let inner_tys: Arc<[Ty]> = inner.iter().map(|tr| Ty::from_hir(ctx, tr)).collect(); |
151 | Ty::apply( | 151 | Ty::Tuple(inner_tys.len(), Substs(inner_tys)) |
152 | TypeCtor::Tuple { cardinality: inner_tys.len() as u16 }, | ||
153 | Substs(inner_tys), | ||
154 | ) | ||
155 | } | 152 | } |
156 | TypeRef::Path(path) => { | 153 | TypeRef::Path(path) => { |
157 | let (ty, res_) = Ty::from_hir_path(ctx, path); | 154 | let (ty, res_) = Ty::from_hir_path(ctx, path); |
@@ -160,30 +157,31 @@ impl Ty { | |||
160 | } | 157 | } |
161 | TypeRef::RawPtr(inner, mutability) => { | 158 | TypeRef::RawPtr(inner, mutability) => { |
162 | let inner_ty = Ty::from_hir(ctx, inner); | 159 | let inner_ty = Ty::from_hir(ctx, inner); |
163 | Ty::apply_one(TypeCtor::RawPtr(*mutability), inner_ty) | 160 | Ty::Raw(*mutability, Substs::single(inner_ty)) |
164 | } | 161 | } |
165 | TypeRef::Array(inner) => { | 162 | TypeRef::Array(inner) => { |
166 | let inner_ty = Ty::from_hir(ctx, inner); | 163 | let inner_ty = Ty::from_hir(ctx, inner); |
167 | Ty::apply_one(TypeCtor::Array, inner_ty) | 164 | Ty::Array(Substs::single(inner_ty)) |
168 | } | 165 | } |
169 | TypeRef::Slice(inner) => { | 166 | TypeRef::Slice(inner) => { |
170 | let inner_ty = Ty::from_hir(ctx, inner); | 167 | let inner_ty = Ty::from_hir(ctx, inner); |
171 | Ty::apply_one(TypeCtor::Slice, inner_ty) | 168 | Ty::Slice(Substs::single(inner_ty)) |
172 | } | 169 | } |
173 | TypeRef::Reference(inner, _, mutability) => { | 170 | TypeRef::Reference(inner, _, mutability) => { |
174 | let inner_ty = Ty::from_hir(ctx, inner); | 171 | let inner_ty = Ty::from_hir(ctx, inner); |
175 | Ty::apply_one(TypeCtor::Ref(*mutability), inner_ty) | 172 | Ty::Ref(*mutability, Substs::single(inner_ty)) |
176 | } | 173 | } |
177 | TypeRef::Placeholder => Ty::Unknown, | 174 | TypeRef::Placeholder => Ty::Unknown, |
178 | TypeRef::Fn(params, is_varargs) => { | 175 | TypeRef::Fn(params, is_varargs) => { |
179 | let sig = Substs(params.iter().map(|tr| Ty::from_hir(ctx, tr)).collect()); | 176 | let substs = Substs(params.iter().map(|tr| Ty::from_hir(ctx, tr)).collect()); |
180 | Ty::apply( | 177 | Ty::Function(FnPointer { |
181 | TypeCtor::FnPtr { num_args: sig.len() as u16 - 1, is_varargs: *is_varargs }, | 178 | num_args: substs.len() - 1, |
182 | sig, | 179 | sig: FnSig { variadic: *is_varargs }, |
183 | ) | 180 | substs, |
181 | }) | ||
184 | } | 182 | } |
185 | TypeRef::DynTrait(bounds) => { | 183 | TypeRef::DynTrait(bounds) => { |
186 | let self_ty = Ty::Bound(BoundVar::new(DebruijnIndex::INNERMOST, 0)); | 184 | let self_ty = Ty::BoundVar(BoundVar::new(DebruijnIndex::INNERMOST, 0)); |
187 | let predicates = ctx.with_shifted_in(DebruijnIndex::ONE, |ctx| { | 185 | let predicates = ctx.with_shifted_in(DebruijnIndex::ONE, |ctx| { |
188 | bounds | 186 | bounds |
189 | .iter() | 187 | .iter() |
@@ -227,7 +225,10 @@ impl Ty { | |||
227 | let impl_trait_id = OpaqueTyId::ReturnTypeImplTrait(func, idx); | 225 | let impl_trait_id = OpaqueTyId::ReturnTypeImplTrait(func, idx); |
228 | let generics = generics(ctx.db.upcast(), func.into()); | 226 | let generics = generics(ctx.db.upcast(), func.into()); |
229 | let parameters = Substs::bound_vars(&generics, ctx.in_binders); | 227 | let parameters = Substs::bound_vars(&generics, ctx.in_binders); |
230 | Ty::Opaque(OpaqueTy { opaque_ty_id: impl_trait_id, parameters }) | 228 | Ty::Alias(AliasTy::Opaque(OpaqueTy { |
229 | opaque_ty_id: impl_trait_id, | ||
230 | parameters, | ||
231 | })) | ||
231 | } | 232 | } |
232 | ImplTraitLoweringMode::Param => { | 233 | ImplTraitLoweringMode::Param => { |
233 | let idx = ctx.impl_trait_counter.get(); | 234 | let idx = ctx.impl_trait_counter.get(); |
@@ -258,7 +259,7 @@ impl Ty { | |||
258 | } else { | 259 | } else { |
259 | (0, 0, 0, 0) | 260 | (0, 0, 0, 0) |
260 | }; | 261 | }; |
261 | Ty::Bound(BoundVar::new( | 262 | Ty::BoundVar(BoundVar::new( |
262 | ctx.in_binders, | 263 | ctx.in_binders, |
263 | idx as usize + parent_params + self_params + list_params, | 264 | idx as usize + parent_params + self_params + list_params, |
264 | )) | 265 | )) |
@@ -330,7 +331,7 @@ impl Ty { | |||
330 | TypeNs::TraitId(trait_) => { | 331 | TypeNs::TraitId(trait_) => { |
331 | // if this is a bare dyn Trait, we'll directly put the required ^0 for the self type in there | 332 | // if this is a bare dyn Trait, we'll directly put the required ^0 for the self type in there |
332 | let self_ty = if remaining_segments.len() == 0 { | 333 | let self_ty = if remaining_segments.len() == 0 { |
333 | Some(Ty::Bound(BoundVar::new(DebruijnIndex::INNERMOST, 0))) | 334 | Some(Ty::BoundVar(BoundVar::new(DebruijnIndex::INNERMOST, 0))) |
334 | } else { | 335 | } else { |
335 | None | 336 | None |
336 | }; | 337 | }; |
@@ -346,10 +347,10 @@ impl Ty { | |||
346 | match found { | 347 | match found { |
347 | Some((super_trait_ref, associated_ty)) => { | 348 | Some((super_trait_ref, associated_ty)) => { |
348 | // FIXME handle type parameters on the segment | 349 | // FIXME handle type parameters on the segment |
349 | Ty::Projection(ProjectionTy { | 350 | Ty::Alias(AliasTy::Projection(ProjectionTy { |
350 | associated_ty, | 351 | associated_ty, |
351 | parameters: super_trait_ref.substs, | 352 | parameters: super_trait_ref.substs, |
352 | }) | 353 | })) |
353 | } | 354 | } |
354 | None => { | 355 | None => { |
355 | // FIXME: report error (associated type not found) | 356 | // FIXME: report error (associated type not found) |
@@ -373,7 +374,7 @@ impl Ty { | |||
373 | TypeParamLoweringMode::Placeholder => Ty::Placeholder(param_id), | 374 | TypeParamLoweringMode::Placeholder => Ty::Placeholder(param_id), |
374 | TypeParamLoweringMode::Variable => { | 375 | TypeParamLoweringMode::Variable => { |
375 | let idx = generics.param_idx(param_id).expect("matching generics"); | 376 | let idx = generics.param_idx(param_id).expect("matching generics"); |
376 | Ty::Bound(BoundVar::new(ctx.in_binders, idx)) | 377 | Ty::BoundVar(BoundVar::new(ctx.in_binders, idx)) |
377 | } | 378 | } |
378 | } | 379 | } |
379 | } | 380 | } |
@@ -414,7 +415,6 @@ impl Ty { | |||
414 | // FIXME: report error | 415 | // FIXME: report error |
415 | TypeNs::EnumVariantId(_) => return (Ty::Unknown, None), | 416 | TypeNs::EnumVariantId(_) => return (Ty::Unknown, None), |
416 | }; | 417 | }; |
417 | |||
418 | Ty::from_type_relative_path(ctx, ty, Some(resolution), remaining_segments) | 418 | Ty::from_type_relative_path(ctx, ty, Some(resolution), remaining_segments) |
419 | } | 419 | } |
420 | 420 | ||
@@ -472,10 +472,10 @@ impl Ty { | |||
472 | // associated_type_shorthand_candidates does not do that | 472 | // associated_type_shorthand_candidates does not do that |
473 | let substs = substs.shift_bound_vars(ctx.in_binders); | 473 | let substs = substs.shift_bound_vars(ctx.in_binders); |
474 | // FIXME handle type parameters on the segment | 474 | // FIXME handle type parameters on the segment |
475 | return Some(Ty::Projection(ProjectionTy { | 475 | return Some(Ty::Alias(AliasTy::Projection(ProjectionTy { |
476 | associated_ty, | 476 | associated_ty, |
477 | parameters: substs, | 477 | parameters: substs, |
478 | })); | 478 | }))); |
479 | } | 479 | } |
480 | 480 | ||
481 | None | 481 | None |
@@ -676,7 +676,7 @@ impl GenericPredicate { | |||
676 | TypeParamLoweringMode::Placeholder => Ty::Placeholder(param_id), | 676 | TypeParamLoweringMode::Placeholder => Ty::Placeholder(param_id), |
677 | TypeParamLoweringMode::Variable => { | 677 | TypeParamLoweringMode::Variable => { |
678 | let idx = generics.param_idx(param_id).expect("matching generics"); | 678 | let idx = generics.param_idx(param_id).expect("matching generics"); |
679 | Ty::Bound(BoundVar::new(DebruijnIndex::INNERMOST, idx)) | 679 | Ty::BoundVar(BoundVar::new(DebruijnIndex::INNERMOST, idx)) |
680 | } | 680 | } |
681 | } | 681 | } |
682 | } | 682 | } |
@@ -750,7 +750,7 @@ fn assoc_type_bindings_from_type_bound<'a>( | |||
750 | preds.extend(GenericPredicate::from_type_bound( | 750 | preds.extend(GenericPredicate::from_type_bound( |
751 | ctx, | 751 | ctx, |
752 | bound, | 752 | bound, |
753 | Ty::Projection(projection_ty.clone()), | 753 | Ty::Alias(AliasTy::Projection(projection_ty.clone())), |
754 | )); | 754 | )); |
755 | } | 755 | } |
756 | preds | 756 | preds |
@@ -760,7 +760,7 @@ fn assoc_type_bindings_from_type_bound<'a>( | |||
760 | impl ReturnTypeImplTrait { | 760 | impl ReturnTypeImplTrait { |
761 | fn from_hir(ctx: &TyLoweringContext, bounds: &[TypeBound]) -> Self { | 761 | fn from_hir(ctx: &TyLoweringContext, bounds: &[TypeBound]) -> Self { |
762 | mark::hit!(lower_rpit); | 762 | mark::hit!(lower_rpit); |
763 | let self_ty = Ty::Bound(BoundVar::new(DebruijnIndex::INNERMOST, 0)); | 763 | let self_ty = Ty::BoundVar(BoundVar::new(DebruijnIndex::INNERMOST, 0)); |
764 | let predicates = ctx.with_shifted_in(DebruijnIndex::ONE, |ctx| { | 764 | let predicates = ctx.with_shifted_in(DebruijnIndex::ONE, |ctx| { |
765 | bounds | 765 | bounds |
766 | .iter() | 766 | .iter() |
@@ -984,7 +984,7 @@ pub(crate) fn generic_defaults_query( | |||
984 | // Each default can only refer to previous parameters. | 984 | // Each default can only refer to previous parameters. |
985 | ty.walk_mut_binders( | 985 | ty.walk_mut_binders( |
986 | &mut |ty, binders| match ty { | 986 | &mut |ty, binders| match ty { |
987 | Ty::Bound(BoundVar { debruijn, index }) if *debruijn == binders => { | 987 | Ty::BoundVar(BoundVar { debruijn, index }) if *debruijn == binders => { |
988 | if *index >= idx { | 988 | if *index >= idx { |
989 | // type variable default referring to parameter coming | 989 | // type variable default referring to parameter coming |
990 | // after it. This is forbidden (FIXME: report | 990 | // after it. This is forbidden (FIXME: report |
@@ -1017,7 +1017,7 @@ fn fn_sig_for_fn(db: &dyn HirDatabase, def: FunctionId) -> PolyFnSig { | |||
1017 | let ret = Ty::from_hir(&ctx_ret, &data.ret_type); | 1017 | let ret = Ty::from_hir(&ctx_ret, &data.ret_type); |
1018 | let generics = generics(db.upcast(), def.into()); | 1018 | let generics = generics(db.upcast(), def.into()); |
1019 | let num_binders = generics.len(); | 1019 | let num_binders = generics.len(); |
1020 | Binders::new(num_binders, FnSig::from_params_and_return(params, ret, data.is_varargs)) | 1020 | Binders::new(num_binders, CallableSig::from_params_and_return(params, ret, data.is_varargs)) |
1021 | } | 1021 | } |
1022 | 1022 | ||
1023 | /// Build the declared type of a function. This should not need to look at the | 1023 | /// Build the declared type of a function. This should not need to look at the |
@@ -1025,7 +1025,7 @@ fn fn_sig_for_fn(db: &dyn HirDatabase, def: FunctionId) -> PolyFnSig { | |||
1025 | fn type_for_fn(db: &dyn HirDatabase, def: FunctionId) -> Binders<Ty> { | 1025 | fn type_for_fn(db: &dyn HirDatabase, def: FunctionId) -> Binders<Ty> { |
1026 | let generics = generics(db.upcast(), def.into()); | 1026 | let generics = generics(db.upcast(), def.into()); |
1027 | let substs = Substs::bound_vars(&generics, DebruijnIndex::INNERMOST); | 1027 | let substs = Substs::bound_vars(&generics, DebruijnIndex::INNERMOST); |
1028 | Binders::new(substs.len(), Ty::apply(TypeCtor::FnDef(def.into()), substs)) | 1028 | Binders::new(substs.len(), Ty::FnDef(def.into(), substs)) |
1029 | } | 1029 | } |
1030 | 1030 | ||
1031 | /// Build the declared type of a const. | 1031 | /// Build the declared type of a const. |
@@ -1057,7 +1057,7 @@ fn fn_sig_for_struct_constructor(db: &dyn HirDatabase, def: StructId) -> PolyFnS | |||
1057 | let params = | 1057 | let params = |
1058 | fields.iter().map(|(_, field)| Ty::from_hir(&ctx, &field.type_ref)).collect::<Vec<_>>(); | 1058 | fields.iter().map(|(_, field)| Ty::from_hir(&ctx, &field.type_ref)).collect::<Vec<_>>(); |
1059 | let ret = type_for_adt(db, def.into()); | 1059 | let ret = type_for_adt(db, def.into()); |
1060 | Binders::new(ret.num_binders, FnSig::from_params_and_return(params, ret.value, false)) | 1060 | Binders::new(ret.num_binders, CallableSig::from_params_and_return(params, ret.value, false)) |
1061 | } | 1061 | } |
1062 | 1062 | ||
1063 | /// Build the type of a tuple struct constructor. | 1063 | /// Build the type of a tuple struct constructor. |
@@ -1068,7 +1068,7 @@ fn type_for_struct_constructor(db: &dyn HirDatabase, def: StructId) -> Binders<T | |||
1068 | } | 1068 | } |
1069 | let generics = generics(db.upcast(), def.into()); | 1069 | let generics = generics(db.upcast(), def.into()); |
1070 | let substs = Substs::bound_vars(&generics, DebruijnIndex::INNERMOST); | 1070 | let substs = Substs::bound_vars(&generics, DebruijnIndex::INNERMOST); |
1071 | Binders::new(substs.len(), Ty::apply(TypeCtor::FnDef(def.into()), substs)) | 1071 | Binders::new(substs.len(), Ty::FnDef(def.into(), substs)) |
1072 | } | 1072 | } |
1073 | 1073 | ||
1074 | fn fn_sig_for_enum_variant_constructor(db: &dyn HirDatabase, def: EnumVariantId) -> PolyFnSig { | 1074 | fn fn_sig_for_enum_variant_constructor(db: &dyn HirDatabase, def: EnumVariantId) -> PolyFnSig { |
@@ -1081,7 +1081,7 @@ fn fn_sig_for_enum_variant_constructor(db: &dyn HirDatabase, def: EnumVariantId) | |||
1081 | let params = | 1081 | let params = |
1082 | fields.iter().map(|(_, field)| Ty::from_hir(&ctx, &field.type_ref)).collect::<Vec<_>>(); | 1082 | fields.iter().map(|(_, field)| Ty::from_hir(&ctx, &field.type_ref)).collect::<Vec<_>>(); |
1083 | let ret = type_for_adt(db, def.parent.into()); | 1083 | let ret = type_for_adt(db, def.parent.into()); |
1084 | Binders::new(ret.num_binders, FnSig::from_params_and_return(params, ret.value, false)) | 1084 | Binders::new(ret.num_binders, CallableSig::from_params_and_return(params, ret.value, false)) |
1085 | } | 1085 | } |
1086 | 1086 | ||
1087 | /// Build the type of a tuple enum variant constructor. | 1087 | /// Build the type of a tuple enum variant constructor. |
@@ -1093,13 +1093,13 @@ fn type_for_enum_variant_constructor(db: &dyn HirDatabase, def: EnumVariantId) - | |||
1093 | } | 1093 | } |
1094 | let generics = generics(db.upcast(), def.parent.into()); | 1094 | let generics = generics(db.upcast(), def.parent.into()); |
1095 | let substs = Substs::bound_vars(&generics, DebruijnIndex::INNERMOST); | 1095 | let substs = Substs::bound_vars(&generics, DebruijnIndex::INNERMOST); |
1096 | Binders::new(substs.len(), Ty::apply(TypeCtor::FnDef(def.into()), substs)) | 1096 | Binders::new(substs.len(), Ty::FnDef(def.into(), substs)) |
1097 | } | 1097 | } |
1098 | 1098 | ||
1099 | fn type_for_adt(db: &dyn HirDatabase, adt: AdtId) -> Binders<Ty> { | 1099 | fn type_for_adt(db: &dyn HirDatabase, adt: AdtId) -> Binders<Ty> { |
1100 | let generics = generics(db.upcast(), adt.into()); | 1100 | let generics = generics(db.upcast(), adt.into()); |
1101 | let substs = Substs::bound_vars(&generics, DebruijnIndex::INNERMOST); | 1101 | let substs = Substs::bound_vars(&generics, DebruijnIndex::INNERMOST); |
1102 | Binders::new(substs.len(), Ty::apply(TypeCtor::Adt(adt), substs)) | 1102 | Binders::new(substs.len(), Ty::Adt(adt, substs)) |
1103 | } | 1103 | } |
1104 | 1104 | ||
1105 | fn type_for_type_alias(db: &dyn HirDatabase, t: TypeAliasId) -> Binders<Ty> { | 1105 | fn type_for_type_alias(db: &dyn HirDatabase, t: TypeAliasId) -> Binders<Ty> { |
@@ -1107,10 +1107,10 @@ fn type_for_type_alias(db: &dyn HirDatabase, t: TypeAliasId) -> Binders<Ty> { | |||
1107 | let resolver = t.resolver(db.upcast()); | 1107 | let resolver = t.resolver(db.upcast()); |
1108 | let ctx = | 1108 | let ctx = |
1109 | TyLoweringContext::new(db, &resolver).with_type_param_mode(TypeParamLoweringMode::Variable); | 1109 | TyLoweringContext::new(db, &resolver).with_type_param_mode(TypeParamLoweringMode::Variable); |
1110 | let substs = Substs::bound_vars(&generics, DebruijnIndex::INNERMOST); | ||
1111 | if db.type_alias_data(t).is_extern { | 1110 | if db.type_alias_data(t).is_extern { |
1112 | Binders::new(substs.len(), Ty::apply(TypeCtor::ForeignType(t), substs)) | 1111 | Binders::new(0, Ty::ForeignType(t)) |
1113 | } else { | 1112 | } else { |
1113 | let substs = Substs::bound_vars(&generics, DebruijnIndex::INNERMOST); | ||
1114 | let type_ref = &db.type_alias_data(t).type_ref; | 1114 | let type_ref = &db.type_alias_data(t).type_ref; |
1115 | let inner = Ty::from_hir(&ctx, type_ref.as_ref().unwrap_or(&TypeRef::Error)); | 1115 | let inner = Ty::from_hir(&ctx, type_ref.as_ref().unwrap_or(&TypeRef::Error)); |
1116 | Binders::new(substs.len(), inner) | 1116 | Binders::new(substs.len(), inner) |