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 definitelly useful while we
4 //! are splitting the hir.
7 expr::{LabelId, PatId},
9 AdtId, AssocItemId, DefWithBodyId, EnumVariantId, FieldId, GenericDefId, ModuleDefId,
14 Adt, AssocItem, DefWithBody, Field, GenericDef, Label, Local, MacroDef, ModuleDef, Variant,
18 macro_rules! from_id {
19 ($(($id:path, $ty:path)),*) => {$(
20 impl From<$id> for $ty {
21 fn from(id: $id) -> $ty {
25 impl From<$ty> for $id {
26 fn from(ty: $ty) -> $id {
34 (base_db::CrateId, 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 (hir_def::FunctionId, crate::Function),
44 (hir_def::ImplId, crate::Impl),
45 (hir_def::TypeParamId, crate::TypeParam),
46 (hir_def::LifetimeParamId, crate::LifetimeParam),
47 (hir_expand::MacroDefId, crate::MacroDef)
50 impl From<AdtId> for Adt {
51 fn from(id: AdtId) -> Self {
53 AdtId::StructId(it) => Adt::Struct(it.into()),
54 AdtId::UnionId(it) => Adt::Union(it.into()),
55 AdtId::EnumId(it) => Adt::Enum(it.into()),
60 impl From<Adt> for AdtId {
61 fn from(id: Adt) -> Self {
63 Adt::Struct(it) => AdtId::StructId(it.id),
64 Adt::Union(it) => AdtId::UnionId(it.id),
65 Adt::Enum(it) => AdtId::EnumId(it.id),
70 impl From<EnumVariantId> for Variant {
71 fn from(id: EnumVariantId) -> Self {
72 Variant { parent: id.parent.into(), id: id.local_id }
76 impl From<Variant> for EnumVariantId {
77 fn from(def: Variant) -> Self {
78 EnumVariantId { parent: def.parent.id, local_id: def.id }
82 impl From<ModuleDefId> for ModuleDef {
83 fn from(id: ModuleDefId) -> Self {
85 ModuleDefId::ModuleId(it) => ModuleDef::Module(it.into()),
86 ModuleDefId::FunctionId(it) => ModuleDef::Function(it.into()),
87 ModuleDefId::AdtId(it) => ModuleDef::Adt(it.into()),
88 ModuleDefId::EnumVariantId(it) => ModuleDef::Variant(it.into()),
89 ModuleDefId::ConstId(it) => ModuleDef::Const(it.into()),
90 ModuleDefId::StaticId(it) => ModuleDef::Static(it.into()),
91 ModuleDefId::TraitId(it) => ModuleDef::Trait(it.into()),
92 ModuleDefId::TypeAliasId(it) => ModuleDef::TypeAlias(it.into()),
93 ModuleDefId::BuiltinType(it) => ModuleDef::BuiltinType(it),
98 impl From<ModuleDef> for ModuleDefId {
99 fn from(id: ModuleDef) -> Self {
101 ModuleDef::Module(it) => ModuleDefId::ModuleId(it.into()),
102 ModuleDef::Function(it) => ModuleDefId::FunctionId(it.into()),
103 ModuleDef::Adt(it) => ModuleDefId::AdtId(it.into()),
104 ModuleDef::Variant(it) => ModuleDefId::EnumVariantId(it.into()),
105 ModuleDef::Const(it) => ModuleDefId::ConstId(it.into()),
106 ModuleDef::Static(it) => ModuleDefId::StaticId(it.into()),
107 ModuleDef::Trait(it) => ModuleDefId::TraitId(it.into()),
108 ModuleDef::TypeAlias(it) => ModuleDefId::TypeAliasId(it.into()),
109 ModuleDef::BuiltinType(it) => ModuleDefId::BuiltinType(it),
114 impl From<DefWithBody> for DefWithBodyId {
115 fn from(def: DefWithBody) -> Self {
117 DefWithBody::Function(it) => DefWithBodyId::FunctionId(it.id),
118 DefWithBody::Static(it) => DefWithBodyId::StaticId(it.id),
119 DefWithBody::Const(it) => DefWithBodyId::ConstId(it.id),
124 impl From<DefWithBodyId> for DefWithBody {
125 fn from(def: DefWithBodyId) -> Self {
127 DefWithBodyId::FunctionId(it) => DefWithBody::Function(it.into()),
128 DefWithBodyId::StaticId(it) => DefWithBody::Static(it.into()),
129 DefWithBodyId::ConstId(it) => DefWithBody::Const(it.into()),
134 impl From<AssocItemId> for AssocItem {
135 fn from(def: AssocItemId) -> Self {
137 AssocItemId::FunctionId(it) => AssocItem::Function(it.into()),
138 AssocItemId::TypeAliasId(it) => AssocItem::TypeAlias(it.into()),
139 AssocItemId::ConstId(it) => AssocItem::Const(it.into()),
144 impl From<GenericDef> for GenericDefId {
145 fn from(def: GenericDef) -> Self {
147 GenericDef::Function(it) => GenericDefId::FunctionId(it.id),
148 GenericDef::Adt(it) => GenericDefId::AdtId(it.into()),
149 GenericDef::Trait(it) => GenericDefId::TraitId(it.id),
150 GenericDef::TypeAlias(it) => GenericDefId::TypeAliasId(it.id),
151 GenericDef::Impl(it) => GenericDefId::ImplId(it.id),
152 GenericDef::Variant(it) => {
153 GenericDefId::EnumVariantId(EnumVariantId { parent: it.parent.id, local_id: it.id })
155 GenericDef::Const(it) => GenericDefId::ConstId(it.id),
160 impl From<GenericDefId> for GenericDef {
161 fn from(def: GenericDefId) -> Self {
163 GenericDefId::FunctionId(it) => GenericDef::Function(it.into()),
164 GenericDefId::AdtId(it) => GenericDef::Adt(it.into()),
165 GenericDefId::TraitId(it) => GenericDef::Trait(it.into()),
166 GenericDefId::TypeAliasId(it) => GenericDef::TypeAlias(it.into()),
167 GenericDefId::ImplId(it) => GenericDef::Impl(it.into()),
168 GenericDefId::EnumVariantId(it) => {
169 GenericDef::Variant(Variant { parent: it.parent.into(), id: it.local_id })
171 GenericDefId::ConstId(it) => GenericDef::Const(it.into()),
176 impl From<Adt> for GenericDefId {
177 fn from(id: Adt) -> Self {
179 Adt::Struct(it) => it.id.into(),
180 Adt::Union(it) => it.id.into(),
181 Adt::Enum(it) => it.id.into(),
186 impl From<VariantId> for VariantDef {
187 fn from(def: VariantId) -> Self {
189 VariantId::StructId(it) => VariantDef::Struct(it.into()),
190 VariantId::EnumVariantId(it) => VariantDef::Variant(it.into()),
191 VariantId::UnionId(it) => VariantDef::Union(it.into()),
196 impl From<VariantDef> for VariantId {
197 fn from(def: VariantDef) -> Self {
199 VariantDef::Struct(it) => VariantId::StructId(it.id),
200 VariantDef::Variant(it) => VariantId::EnumVariantId(it.into()),
201 VariantDef::Union(it) => VariantId::UnionId(it.id),
206 impl From<Field> for FieldId {
207 fn from(def: Field) -> Self {
208 FieldId { parent: def.parent.into(), local_id: def.id }
212 impl From<FieldId> for Field {
213 fn from(def: FieldId) -> Self {
214 Field { parent: def.parent.into(), id: def.local_id }
218 impl From<AssocItem> for GenericDefId {
219 fn from(item: AssocItem) -> Self {
221 AssocItem::Function(f) => f.id.into(),
222 AssocItem::Const(c) => c.id.into(),
223 AssocItem::TypeAlias(t) => t.id.into(),
228 impl From<(DefWithBodyId, PatId)> for Local {
229 fn from((parent, pat_id): (DefWithBodyId, PatId)) -> Self {
230 Local { parent, pat_id }
234 impl From<(DefWithBodyId, LabelId)> for Label {
235 fn from((parent, label_id): (DefWithBodyId, LabelId)) -> Self {
236 Label { parent, label_id }
240 impl From<MacroDef> for ItemInNs {
241 fn from(macro_def: MacroDef) -> Self {
242 ItemInNs::Macros(macro_def.into())
246 impl From<ModuleDef> for ItemInNs {
247 fn from(module_def: ModuleDef) -> Self {
249 ModuleDef::Static(_) | ModuleDef::Const(_) | ModuleDef::Function(_) => {
250 ItemInNs::Values(module_def.into())
252 _ => ItemInNs::Types(module_def.into()),