hir_ty/next_solver/
def_id.rs

1//! Definition of `SolverDefId`
2
3use hir_def::{
4    AdtId, ConstId, EnumId, EnumVariantId, FunctionId, GenericDefId, ImplId, StaticId, StructId,
5    TraitId, TypeAliasId, UnionId,
6};
7use rustc_type_ir::inherent;
8use stdx::impl_from;
9
10use crate::db::{InternedClosureId, InternedCoroutineId, InternedOpaqueTyId};
11
12use super::DbInterner;
13
14#[derive(Debug, PartialOrd, Ord, Clone, Copy, PartialEq, Eq, Hash, salsa::Supertype)]
15pub enum Ctor {
16    Struct(StructId),
17    Enum(EnumVariantId),
18}
19
20#[derive(Debug, PartialOrd, Ord, Clone, Copy, PartialEq, Eq, Hash, salsa::Supertype)]
21pub enum SolverDefId {
22    AdtId(AdtId),
23    ConstId(ConstId),
24    FunctionId(FunctionId),
25    ImplId(ImplId),
26    StaticId(StaticId),
27    TraitId(TraitId),
28    TypeAliasId(TypeAliasId),
29    InternedClosureId(InternedClosureId),
30    InternedCoroutineId(InternedCoroutineId),
31    InternedOpaqueTyId(InternedOpaqueTyId),
32    Ctor(Ctor),
33}
34
35impl_from!(
36    AdtId(StructId, EnumId, UnionId),
37    ConstId,
38    FunctionId,
39    ImplId,
40    StaticId,
41    TraitId,
42    TypeAliasId,
43    InternedClosureId,
44    InternedCoroutineId,
45    InternedOpaqueTyId
46    for SolverDefId
47);
48
49impl From<GenericDefId> for SolverDefId {
50    fn from(value: GenericDefId) -> Self {
51        match value {
52            GenericDefId::AdtId(adt_id) => SolverDefId::AdtId(adt_id),
53            GenericDefId::ConstId(const_id) => SolverDefId::ConstId(const_id),
54            GenericDefId::FunctionId(function_id) => SolverDefId::FunctionId(function_id),
55            GenericDefId::ImplId(impl_id) => SolverDefId::ImplId(impl_id),
56            GenericDefId::StaticId(static_id) => SolverDefId::StaticId(static_id),
57            GenericDefId::TraitId(trait_id) => SolverDefId::TraitId(trait_id),
58            GenericDefId::TypeAliasId(type_alias_id) => SolverDefId::TypeAliasId(type_alias_id),
59        }
60    }
61}
62
63impl TryFrom<SolverDefId> for GenericDefId {
64    type Error = SolverDefId;
65
66    fn try_from(value: SolverDefId) -> Result<Self, Self::Error> {
67        Ok(match value {
68            SolverDefId::AdtId(adt_id) => GenericDefId::AdtId(adt_id),
69            SolverDefId::ConstId(const_id) => GenericDefId::ConstId(const_id),
70            SolverDefId::FunctionId(function_id) => GenericDefId::FunctionId(function_id),
71            SolverDefId::ImplId(impl_id) => GenericDefId::ImplId(impl_id),
72            SolverDefId::StaticId(static_id) => GenericDefId::StaticId(static_id),
73            SolverDefId::TraitId(trait_id) => GenericDefId::TraitId(trait_id),
74            SolverDefId::TypeAliasId(type_alias_id) => GenericDefId::TypeAliasId(type_alias_id),
75            SolverDefId::InternedClosureId(_) => return Err(value),
76            SolverDefId::InternedCoroutineId(_) => return Err(value),
77            SolverDefId::InternedOpaqueTyId(_) => return Err(value),
78            SolverDefId::Ctor(_) => return Err(value),
79        })
80    }
81}
82
83impl<'db> inherent::DefId<DbInterner<'db>> for SolverDefId {
84    fn as_local(self) -> Option<SolverDefId> {
85        Some(self)
86    }
87    fn is_local(self) -> bool {
88        true
89    }
90}