Unnamed repository; edit this file 'description' to name the repository.
| -rw-r--r-- | crates/hir-ty/src/lower.rs | 8 | ||||
| -rw-r--r-- | crates/hir-ty/src/next_solver/def_id.rs | 11 | ||||
| -rw-r--r-- | crates/hir-ty/src/next_solver/generics.rs | 8 | ||||
| -rw-r--r-- | crates/hir-ty/src/tests/traits.rs | 12 |
4 files changed, 27 insertions, 12 deletions
diff --git a/crates/hir-ty/src/lower.rs b/crates/hir-ty/src/lower.rs index e251fa84ed..ccc3356686 100644 --- a/crates/hir-ty/src/lower.rs +++ b/crates/hir-ty/src/lower.rs @@ -1673,9 +1673,10 @@ fn type_for_struct_constructor<'db>( FieldsShape::Unit => Some(type_for_adt(db, def.into())), FieldsShape::Tuple => { let interner = DbInterner::new_no_crate(db); + let def = CallableDefId::StructId(def); Some(EarlyBinder::bind(Ty::new_fn_def( interner, - CallableDefId::StructId(def).into(), + def.into(), GenericArgs::identity_for_item(interner, def.into()), ))) } @@ -1693,10 +1694,11 @@ fn type_for_enum_variant_constructor<'db>( FieldsShape::Unit => Some(type_for_adt(db, def.loc(db).parent.into())), FieldsShape::Tuple => { let interner = DbInterner::new_no_crate(db); + let def = CallableDefId::EnumVariantId(def); Some(EarlyBinder::bind(Ty::new_fn_def( interner, - CallableDefId::EnumVariantId(def).into(), - GenericArgs::identity_for_item(interner, def.loc(db).parent.into()), + def.into(), + GenericArgs::identity_for_item(interner, def.into()), ))) } } diff --git a/crates/hir-ty/src/next_solver/def_id.rs b/crates/hir-ty/src/next_solver/def_id.rs index 63337b297d..ce66dbc77c 100644 --- a/crates/hir-ty/src/next_solver/def_id.rs +++ b/crates/hir-ty/src/next_solver/def_id.rs @@ -165,6 +165,17 @@ impl From<GeneralConstId> for SolverDefId { } } +impl From<CallableDefId> for SolverDefId { + #[inline] + fn from(value: CallableDefId) -> Self { + match value { + CallableDefId::FunctionId(id) => id.into(), + CallableDefId::StructId(id) => id.into(), + CallableDefId::EnumVariantId(id) => id.into(), + } + } +} + impl From<DefWithBodyId> for SolverDefId { #[inline] fn from(value: DefWithBodyId) -> Self { diff --git a/crates/hir-ty/src/next_solver/generics.rs b/crates/hir-ty/src/next_solver/generics.rs index 49dbbcb06b..9ae9a66674 100644 --- a/crates/hir-ty/src/next_solver/generics.rs +++ b/crates/hir-ty/src/next_solver/generics.rs @@ -7,9 +7,7 @@ use hir_def::{ use crate::db::HirDatabase; -use super::SolverDefId; - -use super::DbInterner; +use super::{Ctor, DbInterner, SolverDefId}; pub(crate) fn generics(interner: DbInterner<'_>, def: SolverDefId) -> Generics<'_> { let db = interner.db; @@ -24,6 +22,10 @@ pub(crate) fn generics(interner: DbInterner<'_>, def: SolverDefId) -> Generics<' (_, SolverDefId::BuiltinDeriveImplId(id)) => { return crate::builtin_derive::generics_of(interner, id); } + (_, SolverDefId::EnumVariantId(id) | SolverDefId::Ctor(Ctor::Enum(id))) => { + (id.loc(db).parent.into(), false) + } + (_, SolverDefId::Ctor(Ctor::Struct(id))) => (id.into(), false), (_, SolverDefId::AnonConstId(id)) => { let loc = id.loc(db); let generic_def = loc.owner.generic_def(db); diff --git a/crates/hir-ty/src/tests/traits.rs b/crates/hir-ty/src/tests/traits.rs index 6e61fcaa5d..04cdedad9d 100644 --- a/crates/hir-ty/src/tests/traits.rs +++ b/crates/hir-ty/src/tests/traits.rs @@ -2241,13 +2241,13 @@ fn tuple_struct_constructor_as_fn_trait() { check_types( r#" //- minicore: fn -struct S(u32, u64); +struct S<T, U>(T, U); -fn takes_fn<F: Fn(u32, u64) -> S>(f: F) -> S { f(1, 2) } +fn takes_fn<F: Fn(u32, u64) -> S<u32, u64>>(f: F) -> S<u32, u64> { f(1, 2) } fn test() { takes_fn(S); - //^^^^^^^^^^^ S + //^^^^^^^^^^^ S<u32, u64> } "#, ); @@ -2258,13 +2258,13 @@ fn enum_variant_constructor_as_fn_trait() { check_types( r#" //- minicore: fn -enum E { A(u32) } +enum E<T> { A(T) } -fn takes_fn<F: Fn(u32) -> E>(f: F) -> E { f(1) } +fn takes_fn<F: Fn(u32) -> E<u32>>(f: F) -> E<u32> { f(1) } fn test() { takes_fn(E::A); - //^^^^^^^^^^^^^^ E + //^^^^^^^^^^^^^^ E<u32> } "#, ); |