Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/hir-ty/src/lower.rs8
-rw-r--r--crates/hir-ty/src/next_solver/def_id.rs11
-rw-r--r--crates/hir-ty/src/next_solver/generics.rs8
-rw-r--r--crates/hir-ty/src/tests/traits.rs12
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>
}
"#,
);