1 //! Utility module for converting between hir_def ids and code_model wrappers.
3 //! It's unclear if we need this long-term, but it's definitely useful while we
4 //! are splitting the hir.
7 expr::{LabelId, PatId},
8 AdtId, AssocItemId, DefWithBodyId, EnumVariantId, FieldId, GenericDefId, GenericParamId,
9 ModuleDefId, VariantId,
13 Adt, AssocItem, BuiltinType, DefWithBody, Field, GenericDef, GenericParam, ItemInNs, Label,
14 Local, ModuleDef, Variant, VariantDef,
17 macro_rules! from_id {
18 ($(($id:path, $ty:path)),*) => {$(
19 impl From<$id> for $ty {
20 fn from(id: $id) -> $ty {
24 impl From<$ty> for $id {
25 fn from(ty: $ty) -> $id {
33 (base_db::CrateId, crate::Crate),
34 (hir_def::ModuleId, crate::Module),
35 (hir_def::StructId, crate::Struct),
36 (hir_def::UnionId, crate::Union),
37 (hir_def::EnumId, crate::Enum),
38 (hir_def::TypeAliasId, crate::TypeAlias),
39 (hir_def::TraitId, crate::Trait),
40 (hir_def::StaticId, crate::Static),
41 (hir_def::ConstId, crate::Const),
42 (hir_def::FunctionId, crate::Function),
43 (hir_def::ImplId, crate::Impl),
44 (hir_def::TypeOrConstParamId, crate::TypeOrConstParam),
45 (hir_def::TypeParamId, crate::TypeParam),
46 (hir_def::ConstParamId, crate::ConstParam),
47 (hir_def::LifetimeParamId, crate::LifetimeParam),
48 (hir_def::MacroId, crate::Macro)
51 impl From<AdtId> for Adt {
52 fn from(id: AdtId) -> Self {
54 AdtId::StructId(it) => Adt::Struct(it.into()),
55 AdtId::UnionId(it) => Adt::Union(it.into()),
56 AdtId::EnumId(it) => Adt::Enum(it.into()),
61 impl From<Adt> for AdtId {
62 fn from(id: Adt) -> Self {
64 Adt::Struct(it) => AdtId::StructId(it.id),
65 Adt::Union(it) => AdtId::UnionId(it.id),
66 Adt::Enum(it) => AdtId::EnumId(it.id),
71 impl From<GenericParamId> for GenericParam {
72 fn from(id: GenericParamId) -> Self {
74 GenericParamId::TypeParamId(it) => GenericParam::TypeParam(it.into()),
75 GenericParamId::ConstParamId(it) => GenericParam::ConstParam(it.into()),
76 GenericParamId::LifetimeParamId(it) => GenericParam::LifetimeParam(it.into()),
81 impl From<GenericParam> for GenericParamId {
82 fn from(id: GenericParam) -> Self {
84 GenericParam::LifetimeParam(it) => GenericParamId::LifetimeParamId(it.id),
85 GenericParam::ConstParam(it) => GenericParamId::ConstParamId(it.id),
86 GenericParam::TypeParam(it) => GenericParamId::TypeParamId(it.id),
91 impl From<EnumVariantId> for Variant {
92 fn from(id: EnumVariantId) -> Self {
93 Variant { parent: id.parent.into(), id: id.local_id }
97 impl From<Variant> for EnumVariantId {
98 fn from(def: Variant) -> Self {
99 EnumVariantId { parent: def.parent.id, local_id: def.id }
103 impl From<ModuleDefId> for ModuleDef {
104 fn from(id: ModuleDefId) -> Self {
106 ModuleDefId::ModuleId(it) => ModuleDef::Module(it.into()),
107 ModuleDefId::FunctionId(it) => ModuleDef::Function(it.into()),
108 ModuleDefId::AdtId(it) => ModuleDef::Adt(it.into()),
109 ModuleDefId::EnumVariantId(it) => ModuleDef::Variant(it.into()),
110 ModuleDefId::ConstId(it) => ModuleDef::Const(it.into()),
111 ModuleDefId::StaticId(it) => ModuleDef::Static(it.into()),
112 ModuleDefId::TraitId(it) => ModuleDef::Trait(it.into()),
113 ModuleDefId::TypeAliasId(it) => ModuleDef::TypeAlias(it.into()),
114 ModuleDefId::BuiltinType(it) => ModuleDef::BuiltinType(it.into()),
115 ModuleDefId::MacroId(it) => ModuleDef::Macro(it.into()),
120 impl From<ModuleDef> for ModuleDefId {
121 fn from(id: ModuleDef) -> Self {
123 ModuleDef::Module(it) => ModuleDefId::ModuleId(it.into()),
124 ModuleDef::Function(it) => ModuleDefId::FunctionId(it.into()),
125 ModuleDef::Adt(it) => ModuleDefId::AdtId(it.into()),
126 ModuleDef::Variant(it) => ModuleDefId::EnumVariantId(it.into()),
127 ModuleDef::Const(it) => ModuleDefId::ConstId(it.into()),
128 ModuleDef::Static(it) => ModuleDefId::StaticId(it.into()),
129 ModuleDef::Trait(it) => ModuleDefId::TraitId(it.into()),
130 ModuleDef::TypeAlias(it) => ModuleDefId::TypeAliasId(it.into()),
131 ModuleDef::BuiltinType(it) => ModuleDefId::BuiltinType(it.into()),
132 ModuleDef::Macro(it) => ModuleDefId::MacroId(it.into()),
137 impl From<DefWithBody> for DefWithBodyId {
138 fn from(def: DefWithBody) -> Self {
140 DefWithBody::Function(it) => DefWithBodyId::FunctionId(it.id),
141 DefWithBody::Static(it) => DefWithBodyId::StaticId(it.id),
142 DefWithBody::Const(it) => DefWithBodyId::ConstId(it.id),
147 impl From<DefWithBodyId> for DefWithBody {
148 fn from(def: DefWithBodyId) -> Self {
150 DefWithBodyId::FunctionId(it) => DefWithBody::Function(it.into()),
151 DefWithBodyId::StaticId(it) => DefWithBody::Static(it.into()),
152 DefWithBodyId::ConstId(it) => DefWithBody::Const(it.into()),
157 impl From<AssocItemId> for AssocItem {
158 fn from(def: AssocItemId) -> Self {
160 AssocItemId::FunctionId(it) => AssocItem::Function(it.into()),
161 AssocItemId::TypeAliasId(it) => AssocItem::TypeAlias(it.into()),
162 AssocItemId::ConstId(it) => AssocItem::Const(it.into()),
167 impl From<GenericDef> for GenericDefId {
168 fn from(def: GenericDef) -> Self {
170 GenericDef::Function(it) => GenericDefId::FunctionId(it.id),
171 GenericDef::Adt(it) => GenericDefId::AdtId(it.into()),
172 GenericDef::Trait(it) => GenericDefId::TraitId(it.id),
173 GenericDef::TypeAlias(it) => GenericDefId::TypeAliasId(it.id),
174 GenericDef::Impl(it) => GenericDefId::ImplId(it.id),
175 GenericDef::Variant(it) => {
176 GenericDefId::EnumVariantId(EnumVariantId { parent: it.parent.id, local_id: it.id })
178 GenericDef::Const(it) => GenericDefId::ConstId(it.id),
183 impl From<GenericDefId> for GenericDef {
184 fn from(def: GenericDefId) -> Self {
186 GenericDefId::FunctionId(it) => GenericDef::Function(it.into()),
187 GenericDefId::AdtId(it) => GenericDef::Adt(it.into()),
188 GenericDefId::TraitId(it) => GenericDef::Trait(it.into()),
189 GenericDefId::TypeAliasId(it) => GenericDef::TypeAlias(it.into()),
190 GenericDefId::ImplId(it) => GenericDef::Impl(it.into()),
191 GenericDefId::EnumVariantId(it) => {
192 GenericDef::Variant(Variant { parent: it.parent.into(), id: it.local_id })
194 GenericDefId::ConstId(it) => GenericDef::Const(it.into()),
199 impl From<Adt> for GenericDefId {
200 fn from(id: Adt) -> Self {
202 Adt::Struct(it) => it.id.into(),
203 Adt::Union(it) => it.id.into(),
204 Adt::Enum(it) => it.id.into(),
209 impl From<VariantId> for VariantDef {
210 fn from(def: VariantId) -> Self {
212 VariantId::StructId(it) => VariantDef::Struct(it.into()),
213 VariantId::EnumVariantId(it) => VariantDef::Variant(it.into()),
214 VariantId::UnionId(it) => VariantDef::Union(it.into()),
219 impl From<VariantDef> for VariantId {
220 fn from(def: VariantDef) -> Self {
222 VariantDef::Struct(it) => VariantId::StructId(it.id),
223 VariantDef::Variant(it) => VariantId::EnumVariantId(it.into()),
224 VariantDef::Union(it) => VariantId::UnionId(it.id),
229 impl From<Field> for FieldId {
230 fn from(def: Field) -> Self {
231 FieldId { parent: def.parent.into(), local_id: def.id }
235 impl From<FieldId> for Field {
236 fn from(def: FieldId) -> Self {
237 Field { parent: def.parent.into(), id: def.local_id }
241 impl From<AssocItem> for GenericDefId {
242 fn from(item: AssocItem) -> Self {
244 AssocItem::Function(f) => f.id.into(),
245 AssocItem::Const(c) => c.id.into(),
246 AssocItem::TypeAlias(t) => t.id.into(),
251 impl From<(DefWithBodyId, PatId)> for Local {
252 fn from((parent, pat_id): (DefWithBodyId, PatId)) -> Self {
253 Local { parent, pat_id }
257 impl From<(DefWithBodyId, LabelId)> for Label {
258 fn from((parent, label_id): (DefWithBodyId, LabelId)) -> Self {
259 Label { parent, label_id }
263 impl From<hir_def::item_scope::ItemInNs> for ItemInNs {
264 fn from(it: hir_def::item_scope::ItemInNs) -> Self {
266 hir_def::item_scope::ItemInNs::Types(it) => ItemInNs::Types(it.into()),
267 hir_def::item_scope::ItemInNs::Values(it) => ItemInNs::Values(it.into()),
268 hir_def::item_scope::ItemInNs::Macros(it) => ItemInNs::Macros(it.into()),
273 impl From<ItemInNs> for hir_def::item_scope::ItemInNs {
274 fn from(it: ItemInNs) -> Self {
276 ItemInNs::Types(it) => Self::Types(it.into()),
277 ItemInNs::Values(it) => Self::Values(it.into()),
278 ItemInNs::Macros(it) => Self::Macros(it.into()),
283 impl From<hir_def::builtin_type::BuiltinType> for BuiltinType {
284 fn from(inner: hir_def::builtin_type::BuiltinType) -> Self {
289 impl From<BuiltinType> for hir_def::builtin_type::BuiltinType {
290 fn from(it: BuiltinType) -> Self {