aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/semantics/source_to_def.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/semantics/source_to_def.rs')
-rw-r--r--crates/ra_hir/src/semantics/source_to_def.rs81
1 files changed, 40 insertions, 41 deletions
diff --git a/crates/ra_hir/src/semantics/source_to_def.rs b/crates/ra_hir/src/semantics/source_to_def.rs
index 8af64fdc1..d1994e2e7 100644
--- a/crates/ra_hir/src/semantics/source_to_def.rs
+++ b/crates/ra_hir/src/semantics/source_to_def.rs
@@ -16,6 +16,7 @@ use ra_syntax::{
16 match_ast, AstNode, SyntaxNode, 16 match_ast, AstNode, SyntaxNode,
17}; 17};
18use rustc_hash::FxHashMap; 18use rustc_hash::FxHashMap;
19use stdx::impl_from;
19 20
20use crate::{db::HirDatabase, InFile, MacroDefId}; 21use crate::{db::HirDatabase, InFile, MacroDefId};
21 22
@@ -64,53 +65,44 @@ impl SourceToDefCtx<'_, '_> {
64 Some(ModuleId { krate: parent_module.krate, local_id: child_id }) 65 Some(ModuleId { krate: parent_module.krate, local_id: child_id })
65 } 66 }
66 67
67 pub(super) fn trait_to_def(&mut self, src: InFile<ast::TraitDef>) -> Option<TraitId> { 68 pub(super) fn trait_to_def(&mut self, src: InFile<ast::Trait>) -> Option<TraitId> {
68 self.to_def(src, keys::TRAIT) 69 self.to_def(src, keys::TRAIT)
69 } 70 }
70 pub(super) fn impl_to_def(&mut self, src: InFile<ast::ImplDef>) -> Option<ImplId> { 71 pub(super) fn impl_to_def(&mut self, src: InFile<ast::Impl>) -> Option<ImplId> {
71 self.to_def(src, keys::IMPL) 72 self.to_def(src, keys::IMPL)
72 } 73 }
73 pub(super) fn fn_to_def(&mut self, src: InFile<ast::FnDef>) -> Option<FunctionId> { 74 pub(super) fn fn_to_def(&mut self, src: InFile<ast::Fn>) -> Option<FunctionId> {
74 self.to_def(src, keys::FUNCTION) 75 self.to_def(src, keys::FUNCTION)
75 } 76 }
76 pub(super) fn struct_to_def(&mut self, src: InFile<ast::StructDef>) -> Option<StructId> { 77 pub(super) fn struct_to_def(&mut self, src: InFile<ast::Struct>) -> Option<StructId> {
77 self.to_def(src, keys::STRUCT) 78 self.to_def(src, keys::STRUCT)
78 } 79 }
79 pub(super) fn enum_to_def(&mut self, src: InFile<ast::EnumDef>) -> Option<EnumId> { 80 pub(super) fn enum_to_def(&mut self, src: InFile<ast::Enum>) -> Option<EnumId> {
80 self.to_def(src, keys::ENUM) 81 self.to_def(src, keys::ENUM)
81 } 82 }
82 pub(super) fn union_to_def(&mut self, src: InFile<ast::UnionDef>) -> Option<UnionId> { 83 pub(super) fn union_to_def(&mut self, src: InFile<ast::Union>) -> Option<UnionId> {
83 self.to_def(src, keys::UNION) 84 self.to_def(src, keys::UNION)
84 } 85 }
85 pub(super) fn static_to_def(&mut self, src: InFile<ast::StaticDef>) -> Option<StaticId> { 86 pub(super) fn static_to_def(&mut self, src: InFile<ast::Static>) -> Option<StaticId> {
86 self.to_def(src, keys::STATIC) 87 self.to_def(src, keys::STATIC)
87 } 88 }
88 pub(super) fn const_to_def(&mut self, src: InFile<ast::ConstDef>) -> Option<ConstId> { 89 pub(super) fn const_to_def(&mut self, src: InFile<ast::Const>) -> Option<ConstId> {
89 self.to_def(src, keys::CONST) 90 self.to_def(src, keys::CONST)
90 } 91 }
91 pub(super) fn type_alias_to_def( 92 pub(super) fn type_alias_to_def(&mut self, src: InFile<ast::TypeAlias>) -> Option<TypeAliasId> {
92 &mut self,
93 src: InFile<ast::TypeAliasDef>,
94 ) -> Option<TypeAliasId> {
95 self.to_def(src, keys::TYPE_ALIAS) 93 self.to_def(src, keys::TYPE_ALIAS)
96 } 94 }
97 pub(super) fn record_field_to_def( 95 pub(super) fn record_field_to_def(&mut self, src: InFile<ast::RecordField>) -> Option<FieldId> {
98 &mut self,
99 src: InFile<ast::RecordFieldDef>,
100 ) -> Option<FieldId> {
101 self.to_def(src, keys::RECORD_FIELD) 96 self.to_def(src, keys::RECORD_FIELD)
102 } 97 }
103 pub(super) fn tuple_field_to_def( 98 pub(super) fn tuple_field_to_def(&mut self, src: InFile<ast::TupleField>) -> Option<FieldId> {
104 &mut self,
105 src: InFile<ast::TupleFieldDef>,
106 ) -> Option<FieldId> {
107 self.to_def(src, keys::TUPLE_FIELD) 99 self.to_def(src, keys::TUPLE_FIELD)
108 } 100 }
109 pub(super) fn enum_variant_to_def( 101 pub(super) fn enum_variant_to_def(
110 &mut self, 102 &mut self,
111 src: InFile<ast::EnumVariant>, 103 src: InFile<ast::Variant>,
112 ) -> Option<EnumVariantId> { 104 ) -> Option<EnumVariantId> {
113 self.to_def(src, keys::ENUM_VARIANT) 105 self.to_def(src, keys::VARIANT)
114 } 106 }
115 pub(super) fn bind_pat_to_def( 107 pub(super) fn bind_pat_to_def(
116 &mut self, 108 &mut self,
@@ -162,38 +154,42 @@ impl SourceToDefCtx<'_, '_> {
162 let def = self.module_to_def(container.with_value(it))?; 154 let def = self.module_to_def(container.with_value(it))?;
163 def.into() 155 def.into()
164 }, 156 },
165 ast::TraitDef(it) => { 157 ast::Trait(it) => {
166 let def = self.trait_to_def(container.with_value(it))?; 158 let def = self.trait_to_def(container.with_value(it))?;
167 def.into() 159 def.into()
168 }, 160 },
169 ast::ImplDef(it) => { 161 ast::Impl(it) => {
170 let def = self.impl_to_def(container.with_value(it))?; 162 let def = self.impl_to_def(container.with_value(it))?;
171 def.into() 163 def.into()
172 }, 164 },
173 ast::FnDef(it) => { 165 ast::Fn(it) => {
174 let def = self.fn_to_def(container.with_value(it))?; 166 let def = self.fn_to_def(container.with_value(it))?;
175 DefWithBodyId::from(def).into() 167 DefWithBodyId::from(def).into()
176 }, 168 },
177 ast::StructDef(it) => { 169 ast::Struct(it) => {
178 let def = self.struct_to_def(container.with_value(it))?; 170 let def = self.struct_to_def(container.with_value(it))?;
179 VariantId::from(def).into() 171 VariantId::from(def).into()
180 }, 172 },
181 ast::EnumDef(it) => { 173 ast::Enum(it) => {
182 let def = self.enum_to_def(container.with_value(it))?; 174 let def = self.enum_to_def(container.with_value(it))?;
183 def.into() 175 def.into()
184 }, 176 },
185 ast::UnionDef(it) => { 177 ast::Union(it) => {
186 let def = self.union_to_def(container.with_value(it))?; 178 let def = self.union_to_def(container.with_value(it))?;
187 VariantId::from(def).into() 179 VariantId::from(def).into()
188 }, 180 },
189 ast::StaticDef(it) => { 181 ast::Static(it) => {
190 let def = self.static_to_def(container.with_value(it))?; 182 let def = self.static_to_def(container.with_value(it))?;
191 DefWithBodyId::from(def).into() 183 DefWithBodyId::from(def).into()
192 }, 184 },
193 ast::ConstDef(it) => { 185 ast::Const(it) => {
194 let def = self.const_to_def(container.with_value(it))?; 186 let def = self.const_to_def(container.with_value(it))?;
195 DefWithBodyId::from(def).into() 187 DefWithBodyId::from(def).into()
196 }, 188 },
189 ast::TypeAlias(it) => {
190 let def = self.type_alias_to_def(container.with_value(it))?;
191 def.into()
192 },
197 _ => continue, 193 _ => continue,
198 } 194 }
199 }; 195 };
@@ -208,12 +204,12 @@ impl SourceToDefCtx<'_, '_> {
208 for container in src.cloned().ancestors_with_macros(self.db.upcast()).skip(1) { 204 for container in src.cloned().ancestors_with_macros(self.db.upcast()).skip(1) {
209 let res: GenericDefId = match_ast! { 205 let res: GenericDefId = match_ast! {
210 match (container.value) { 206 match (container.value) {
211 ast::FnDef(it) => self.fn_to_def(container.with_value(it))?.into(), 207 ast::Fn(it) => self.fn_to_def(container.with_value(it))?.into(),
212 ast::StructDef(it) => self.struct_to_def(container.with_value(it))?.into(), 208 ast::Struct(it) => self.struct_to_def(container.with_value(it))?.into(),
213 ast::EnumDef(it) => self.enum_to_def(container.with_value(it))?.into(), 209 ast::Enum(it) => self.enum_to_def(container.with_value(it))?.into(),
214 ast::TraitDef(it) => self.trait_to_def(container.with_value(it))?.into(), 210 ast::Trait(it) => self.trait_to_def(container.with_value(it))?.into(),
215 ast::TypeAliasDef(it) => self.type_alias_to_def(container.with_value(it))?.into(), 211 ast::TypeAlias(it) => self.type_alias_to_def(container.with_value(it))?.into(),
216 ast::ImplDef(it) => self.impl_to_def(container.with_value(it))?.into(), 212 ast::Impl(it) => self.impl_to_def(container.with_value(it))?.into(),
217 _ => continue, 213 _ => continue,
218 } 214 }
219 }; 215 };
@@ -226,9 +222,9 @@ impl SourceToDefCtx<'_, '_> {
226 for container in src.cloned().ancestors_with_macros(self.db.upcast()).skip(1) { 222 for container in src.cloned().ancestors_with_macros(self.db.upcast()).skip(1) {
227 let res: DefWithBodyId = match_ast! { 223 let res: DefWithBodyId = match_ast! {
228 match (container.value) { 224 match (container.value) {
229 ast::ConstDef(it) => self.const_to_def(container.with_value(it))?.into(), 225 ast::Const(it) => self.const_to_def(container.with_value(it))?.into(),
230 ast::StaticDef(it) => self.static_to_def(container.with_value(it))?.into(), 226 ast::Static(it) => self.static_to_def(container.with_value(it))?.into(),
231 ast::FnDef(it) => self.fn_to_def(container.with_value(it))?.into(), 227 ast::Fn(it) => self.fn_to_def(container.with_value(it))?.into(),
232 _ => continue, 228 _ => continue,
233 } 229 }
234 }; 230 };
@@ -246,19 +242,21 @@ pub(crate) enum ChildContainer {
246 ImplId(ImplId), 242 ImplId(ImplId),
247 EnumId(EnumId), 243 EnumId(EnumId),
248 VariantId(VariantId), 244 VariantId(VariantId),
245 TypeAliasId(TypeAliasId),
249 /// XXX: this might be the same def as, for example an `EnumId`. However, 246 /// XXX: this might be the same def as, for example an `EnumId`. However,
250 /// here the children generic parameters, and not, eg enum variants. 247 /// here the children generic parameters, and not, eg enum variants.
251 GenericDefId(GenericDefId), 248 GenericDefId(GenericDefId),
252} 249}
253impl_froms! { 250impl_from! {
254 ChildContainer:
255 DefWithBodyId, 251 DefWithBodyId,
256 ModuleId, 252 ModuleId,
257 TraitId, 253 TraitId,
258 ImplId, 254 ImplId,
259 EnumId, 255 EnumId,
260 VariantId, 256 VariantId,
257 TypeAliasId,
261 GenericDefId 258 GenericDefId
259 for ChildContainer
262} 260}
263 261
264impl ChildContainer { 262impl ChildContainer {
@@ -271,6 +269,7 @@ impl ChildContainer {
271 ChildContainer::ImplId(it) => it.child_by_source(db), 269 ChildContainer::ImplId(it) => it.child_by_source(db),
272 ChildContainer::EnumId(it) => it.child_by_source(db), 270 ChildContainer::EnumId(it) => it.child_by_source(db),
273 ChildContainer::VariantId(it) => it.child_by_source(db), 271 ChildContainer::VariantId(it) => it.child_by_source(db),
272 ChildContainer::TypeAliasId(_) => DynMap::default(),
274 ChildContainer::GenericDefId(it) => it.child_by_source(db), 273 ChildContainer::GenericDefId(it) => it.child_by_source(db),
275 } 274 }
276 } 275 }