hir/
from_id.rs

1//! Utility module for converting between hir_def ids and code_model wrappers.
2//!
3//! It's unclear if we need this long-term, but it's definitely useful while we
4//! are splitting the hir.
5
6use hir_def::{
7    AdtId, AssocItemId, BuiltinDeriveImplId, DefWithBodyId, EnumVariantId, ExpressionStoreOwnerId,
8    FieldId, FunctionId, GenericDefId, GenericParamId, ImplId, ModuleDefId, VariantId,
9    hir::{BindingId, LabelId},
10};
11use hir_ty::next_solver::AnyImplId;
12
13use crate::{
14    Adt, AnyFunctionId, AssocItem, BuiltinType, DefWithBody, EnumVariant, ExpressionStoreOwner,
15    Field, Function, GenericDef, GenericParam, Impl, ItemInNs, Label, Local, ModuleDef, Variant,
16};
17
18macro_rules! from_id {
19    ($(($id:path, $ty:path)),* $(,)?) => {$(
20        impl From<$id> for $ty {
21            fn from(id: $id) -> $ty {
22                $ty { id }
23            }
24        }
25        impl From<$ty> for $id {
26            fn from(ty: $ty) -> $id {
27                ty.id
28            }
29        }
30    )*}
31}
32
33from_id![
34    (base_db::Crate, crate::Crate),
35    (hir_def::ModuleId, crate::Module),
36    (hir_def::StructId, crate::Struct),
37    (hir_def::UnionId, crate::Union),
38    (hir_def::EnumId, crate::Enum),
39    (hir_def::TypeAliasId, crate::TypeAlias),
40    (hir_def::TraitId, crate::Trait),
41    (hir_def::StaticId, crate::Static),
42    (hir_def::ConstId, crate::Const),
43    (crate::AnyFunctionId, crate::Function),
44    (hir_ty::next_solver::AnyImplId, crate::Impl),
45    (hir_def::TypeOrConstParamId, crate::TypeOrConstParam),
46    (hir_def::TypeParamId, crate::TypeParam),
47    (hir_def::ConstParamId, crate::ConstParam),
48    (hir_def::LifetimeParamId, crate::LifetimeParam),
49    (hir_def::MacroId, crate::Macro),
50    (hir_def::ExternCrateId, crate::ExternCrateDecl),
51    (hir_def::ExternBlockId, crate::ExternBlock),
52];
53
54impl From<AdtId> for Adt {
55    fn from(id: AdtId) -> Self {
56        match id {
57            AdtId::StructId(it) => Adt::Struct(it.into()),
58            AdtId::UnionId(it) => Adt::Union(it.into()),
59            AdtId::EnumId(it) => Adt::Enum(it.into()),
60        }
61    }
62}
63
64impl From<Adt> for AdtId {
65    fn from(id: Adt) -> Self {
66        match id {
67            Adt::Struct(it) => AdtId::StructId(it.id),
68            Adt::Union(it) => AdtId::UnionId(it.id),
69            Adt::Enum(it) => AdtId::EnumId(it.id),
70        }
71    }
72}
73
74impl From<VariantId> for Variant {
75    fn from(v: VariantId) -> Self {
76        match v {
77            VariantId::EnumVariantId(it) => Variant::EnumVariant(it.into()),
78            VariantId::StructId(it) => Variant::Struct(it.into()),
79            VariantId::UnionId(it) => Variant::Union(it.into()),
80        }
81    }
82}
83impl From<GenericParamId> for GenericParam {
84    fn from(id: GenericParamId) -> Self {
85        match id {
86            GenericParamId::TypeParamId(it) => GenericParam::TypeParam(it.into()),
87            GenericParamId::ConstParamId(it) => GenericParam::ConstParam(it.into()),
88            GenericParamId::LifetimeParamId(it) => GenericParam::LifetimeParam(it.into()),
89        }
90    }
91}
92
93impl From<GenericParam> for GenericParamId {
94    fn from(id: GenericParam) -> Self {
95        match id {
96            GenericParam::LifetimeParam(it) => GenericParamId::LifetimeParamId(it.id),
97            GenericParam::ConstParam(it) => GenericParamId::ConstParamId(it.id),
98            GenericParam::TypeParam(it) => GenericParamId::TypeParamId(it.id),
99        }
100    }
101}
102
103impl From<EnumVariantId> for EnumVariant {
104    fn from(id: EnumVariantId) -> Self {
105        EnumVariant { id }
106    }
107}
108
109impl From<EnumVariant> for EnumVariantId {
110    fn from(def: EnumVariant) -> Self {
111        def.id
112    }
113}
114
115impl From<ModuleDefId> for ModuleDef {
116    fn from(id: ModuleDefId) -> Self {
117        match id {
118            ModuleDefId::ModuleId(it) => ModuleDef::Module(it.into()),
119            ModuleDefId::FunctionId(it) => ModuleDef::Function(it.into()),
120            ModuleDefId::AdtId(it) => ModuleDef::Adt(it.into()),
121            ModuleDefId::EnumVariantId(it) => ModuleDef::EnumVariant(it.into()),
122            ModuleDefId::ConstId(it) => ModuleDef::Const(it.into()),
123            ModuleDefId::StaticId(it) => ModuleDef::Static(it.into()),
124            ModuleDefId::TraitId(it) => ModuleDef::Trait(it.into()),
125            ModuleDefId::TypeAliasId(it) => ModuleDef::TypeAlias(it.into()),
126            ModuleDefId::BuiltinType(it) => ModuleDef::BuiltinType(it.into()),
127            ModuleDefId::MacroId(it) => ModuleDef::Macro(it.into()),
128        }
129    }
130}
131
132impl TryFrom<ModuleDef> for ModuleDefId {
133    type Error = ();
134    fn try_from(id: ModuleDef) -> Result<Self, Self::Error> {
135        Ok(match id {
136            ModuleDef::Module(it) => ModuleDefId::ModuleId(it.into()),
137            ModuleDef::Function(it) => match it.id {
138                AnyFunctionId::FunctionId(it) => it.into(),
139                AnyFunctionId::BuiltinDeriveImplMethod { .. } => return Err(()),
140            },
141            ModuleDef::Adt(it) => ModuleDefId::AdtId(it.into()),
142            ModuleDef::EnumVariant(it) => ModuleDefId::EnumVariantId(it.into()),
143            ModuleDef::Const(it) => ModuleDefId::ConstId(it.into()),
144            ModuleDef::Static(it) => ModuleDefId::StaticId(it.into()),
145            ModuleDef::Trait(it) => ModuleDefId::TraitId(it.into()),
146            ModuleDef::TypeAlias(it) => ModuleDefId::TypeAliasId(it.into()),
147            ModuleDef::BuiltinType(it) => ModuleDefId::BuiltinType(it.into()),
148            ModuleDef::Macro(it) => ModuleDefId::MacroId(it.into()),
149        })
150    }
151}
152
153impl TryFrom<DefWithBody> for DefWithBodyId {
154    type Error = ();
155    fn try_from(def: DefWithBody) -> Result<Self, ()> {
156        Ok(match def {
157            DefWithBody::Function(it) => match it.id {
158                AnyFunctionId::FunctionId(it) => it.into(),
159                AnyFunctionId::BuiltinDeriveImplMethod { .. } => return Err(()),
160            },
161            DefWithBody::Static(it) => DefWithBodyId::StaticId(it.id),
162            DefWithBody::Const(it) => DefWithBodyId::ConstId(it.id),
163            DefWithBody::EnumVariant(it) => DefWithBodyId::VariantId(it.into()),
164        })
165    }
166}
167
168impl From<DefWithBodyId> for DefWithBody {
169    fn from(def: DefWithBodyId) -> Self {
170        match def {
171            DefWithBodyId::FunctionId(it) => DefWithBody::Function(it.into()),
172            DefWithBodyId::StaticId(it) => DefWithBody::Static(it.into()),
173            DefWithBodyId::ConstId(it) => DefWithBody::Const(it.into()),
174            DefWithBodyId::VariantId(it) => DefWithBody::EnumVariant(it.into()),
175        }
176    }
177}
178
179impl From<AssocItemId> for AssocItem {
180    fn from(def: AssocItemId) -> Self {
181        match def {
182            AssocItemId::FunctionId(it) => AssocItem::Function(it.into()),
183            AssocItemId::TypeAliasId(it) => AssocItem::TypeAlias(it.into()),
184            AssocItemId::ConstId(it) => AssocItem::Const(it.into()),
185        }
186    }
187}
188
189impl TryFrom<GenericDef> for GenericDefId {
190    type Error = ();
191
192    fn try_from(def: GenericDef) -> Result<Self, Self::Error> {
193        def.id().ok_or(())
194    }
195}
196
197impl From<GenericDefId> for GenericDef {
198    fn from(def: GenericDefId) -> Self {
199        match def {
200            GenericDefId::FunctionId(it) => GenericDef::Function(it.into()),
201            GenericDefId::AdtId(it) => GenericDef::Adt(it.into()),
202            GenericDefId::TraitId(it) => GenericDef::Trait(it.into()),
203            GenericDefId::TypeAliasId(it) => GenericDef::TypeAlias(it.into()),
204            GenericDefId::ImplId(it) => GenericDef::Impl(it.into()),
205            GenericDefId::ConstId(it) => GenericDef::Const(it.into()),
206            GenericDefId::StaticId(it) => GenericDef::Static(it.into()),
207        }
208    }
209}
210
211impl From<Adt> for GenericDefId {
212    fn from(id: Adt) -> Self {
213        match id {
214            Adt::Struct(it) => it.id.into(),
215            Adt::Union(it) => it.id.into(),
216            Adt::Enum(it) => it.id.into(),
217        }
218    }
219}
220
221impl From<Variant> for VariantId {
222    fn from(def: Variant) -> Self {
223        match def {
224            Variant::Struct(it) => VariantId::StructId(it.id),
225            Variant::EnumVariant(it) => VariantId::EnumVariantId(it.into()),
226            Variant::Union(it) => VariantId::UnionId(it.id),
227        }
228    }
229}
230
231impl From<Field> for FieldId {
232    fn from(def: Field) -> Self {
233        FieldId { parent: def.parent.into(), local_id: def.id }
234    }
235}
236
237impl From<FieldId> for Field {
238    fn from(def: FieldId) -> Self {
239        Field { parent: def.parent.into(), id: def.local_id }
240    }
241}
242
243impl TryFrom<AssocItem> for GenericDefId {
244    type Error = ();
245    fn try_from(item: AssocItem) -> Result<Self, Self::Error> {
246        Ok(match item {
247            AssocItem::Function(f) => match f.id {
248                AnyFunctionId::FunctionId(it) => it.into(),
249                AnyFunctionId::BuiltinDeriveImplMethod { .. } => return Err(()),
250            },
251            AssocItem::Const(c) => c.id.into(),
252            AssocItem::TypeAlias(t) => t.id.into(),
253        })
254    }
255}
256
257impl From<(ExpressionStoreOwnerId, BindingId)> for Local {
258    fn from((parent, binding_id): (ExpressionStoreOwnerId, BindingId)) -> Self {
259        Local { parent, binding_id }
260    }
261}
262impl From<(DefWithBodyId, BindingId)> for Local {
263    fn from((parent, binding_id): (DefWithBodyId, BindingId)) -> Self {
264        Local { parent: parent.into(), binding_id }
265    }
266}
267
268impl From<(ExpressionStoreOwnerId, LabelId)> for Label {
269    fn from((parent, label_id): (ExpressionStoreOwnerId, LabelId)) -> Self {
270        Label { parent, label_id }
271    }
272}
273
274impl From<hir_def::item_scope::ItemInNs> for ItemInNs {
275    fn from(it: hir_def::item_scope::ItemInNs) -> Self {
276        match it {
277            hir_def::item_scope::ItemInNs::Types(it) => ItemInNs::Types(it.into()),
278            hir_def::item_scope::ItemInNs::Values(it) => ItemInNs::Values(it.into()),
279            hir_def::item_scope::ItemInNs::Macros(it) => ItemInNs::Macros(it.into()),
280        }
281    }
282}
283
284impl TryFrom<ItemInNs> for hir_def::item_scope::ItemInNs {
285    type Error = ();
286    fn try_from(it: ItemInNs) -> Result<Self, Self::Error> {
287        Ok(match it {
288            ItemInNs::Types(it) => Self::Types(it.try_into()?),
289            ItemInNs::Values(it) => Self::Values(it.try_into()?),
290            ItemInNs::Macros(it) => Self::Macros(it.into()),
291        })
292    }
293}
294
295impl From<hir_def::builtin_type::BuiltinType> for BuiltinType {
296    fn from(inner: hir_def::builtin_type::BuiltinType) -> Self {
297        Self { inner }
298    }
299}
300
301impl From<BuiltinType> for hir_def::builtin_type::BuiltinType {
302    fn from(it: BuiltinType) -> Self {
303        it.inner
304    }
305}
306
307impl From<hir_def::ImplId> for crate::Impl {
308    fn from(value: hir_def::ImplId) -> Self {
309        crate::Impl { id: AnyImplId::ImplId(value) }
310    }
311}
312
313impl From<BuiltinDeriveImplId> for crate::Impl {
314    fn from(value: BuiltinDeriveImplId) -> Self {
315        crate::Impl { id: AnyImplId::BuiltinDeriveImplId(value) }
316    }
317}
318
319impl From<hir_def::FunctionId> for crate::Function {
320    fn from(value: hir_def::FunctionId) -> Self {
321        crate::Function { id: AnyFunctionId::FunctionId(value) }
322    }
323}
324
325impl TryFrom<ExpressionStoreOwner> for ExpressionStoreOwnerId {
326    type Error = ();
327
328    fn try_from(v: ExpressionStoreOwner) -> Result<Self, Self::Error> {
329        match v {
330            ExpressionStoreOwner::Signature(generic_def_id) => {
331                Ok(Self::Signature(generic_def_id.try_into()?))
332            }
333            ExpressionStoreOwner::Body(def_with_body_id) => {
334                Ok(Self::Body(def_with_body_id.try_into()?))
335            }
336            ExpressionStoreOwner::VariantFields(variant_id) => {
337                Ok(Self::VariantFields(variant_id.into()))
338            }
339        }
340    }
341}
342
343impl TryFrom<Function> for FunctionId {
344    type Error = ();
345
346    fn try_from(v: Function) -> Result<Self, Self::Error> {
347        match v.id {
348            AnyFunctionId::FunctionId(id) => Ok(id),
349            _ => Err(()),
350        }
351    }
352}
353
354impl TryFrom<Impl> for ImplId {
355    type Error = ();
356
357    fn try_from(v: Impl) -> Result<Self, Self::Error> {
358        match v.id {
359            AnyImplId::ImplId(id) => Ok(id),
360            _ => Err(()),
361        }
362    }
363}