diff options
-rw-r--r-- | crates/ra_hir_def/src/item_tree.rs | 165 |
1 files changed, 60 insertions, 105 deletions
diff --git a/crates/ra_hir_def/src/item_tree.rs b/crates/ra_hir_def/src/item_tree.rs index 6eb0c1b91..5beb11df7 100644 --- a/crates/ra_hir_def/src/item_tree.rs +++ b/crates/ra_hir_def/src/item_tree.rs | |||
@@ -223,71 +223,75 @@ impl<N: ItemTreeNode> fmt::Debug for FileItemTreeId<N> { | |||
223 | 223 | ||
224 | pub type ItemTreeId<N> = InFile<FileItemTreeId<N>>; | 224 | pub type ItemTreeId<N> = InFile<FileItemTreeId<N>>; |
225 | 225 | ||
226 | macro_rules! nodes { | 226 | macro_rules! mod_items { |
227 | ( $($node:ident in $fld:ident),+ $(,)? ) => { $( | 227 | ( $( $typ:ident in $fld:ident -> $ast:ty ),+ $(,)? ) => { |
228 | impl ItemTreeNode for $node { | 228 | #[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)] |
229 | fn lookup(tree: &ItemTree, index: Idx<Self>) -> &Self { | 229 | pub enum ModItem { |
230 | &tree.$fld[index] | 230 | $( |
231 | $typ(FileItemTreeId<$typ>), | ||
232 | )+ | ||
233 | } | ||
234 | |||
235 | $( | ||
236 | impl From<FileItemTreeId<$typ>> for ModItem { | ||
237 | fn from(id: FileItemTreeId<$typ>) -> ModItem { | ||
238 | ModItem::$typ(id) | ||
239 | } | ||
231 | } | 240 | } |
241 | )+ | ||
242 | |||
243 | $( | ||
244 | impl ItemTreeNode for $typ { | ||
245 | fn lookup(tree: &ItemTree, index: Idx<Self>) -> &Self { | ||
246 | &tree.$fld[index] | ||
247 | } | ||
232 | 248 | ||
249 | fn id_from_mod_item(mod_item: ModItem) -> Option<FileItemTreeId<Self>> { | ||
250 | if let ModItem::$typ(id) = mod_item { | ||
251 | Some(id) | ||
252 | } else { | ||
253 | None | ||
254 | } | ||
255 | } | ||
233 | 256 | ||
234 | fn id_from_mod_item(mod_item: ModItem) -> Option<FileItemTreeId<Self>> { | 257 | fn id_to_mod_item(id: FileItemTreeId<Self>) -> ModItem { |
235 | if let ModItem::$node(id) = mod_item { | 258 | ModItem::$typ(id) |
236 | Some(id) | ||
237 | } else { | ||
238 | None | ||
239 | } | 259 | } |
240 | } | 260 | } |
241 | 261 | ||
242 | fn id_to_mod_item(id: FileItemTreeId<Self>) -> ModItem { | 262 | impl ItemTreeSource for $typ { |
243 | ModItem::$node(id) | 263 | type Source = $ast; |
264 | |||
265 | fn ast_id(&self) -> FileAstId<Self::Source> { | ||
266 | self.ast_id | ||
267 | } | ||
244 | } | 268 | } |
245 | } | 269 | |
246 | )+ }; | 270 | impl Index<Idx<$typ>> for ItemTree { |
247 | } | 271 | type Output = $typ; |
248 | 272 | ||
249 | nodes!( | 273 | fn index(&self, index: Idx<$typ>) -> &Self::Output { |
250 | Import in imports, | 274 | &self.$fld[index] |
251 | ExternCrate in extern_crates, | 275 | } |
252 | Function in functions, | ||
253 | Struct in structs, | ||
254 | Union in unions, | ||
255 | Enum in enums, | ||
256 | Const in consts, | ||
257 | Static in statics, | ||
258 | Trait in traits, | ||
259 | Impl in impls, | ||
260 | TypeAlias in type_aliases, | ||
261 | Mod in mods, | ||
262 | MacroCall in macro_calls, | ||
263 | ); | ||
264 | |||
265 | macro_rules! source { | ||
266 | ( $($node:ident -> $ast:path),+ $(,)? ) => { $( | ||
267 | impl ItemTreeSource for $node { | ||
268 | type Source = $ast; | ||
269 | |||
270 | fn ast_id(&self) -> FileAstId<Self::Source> { | ||
271 | self.ast_id | ||
272 | } | 276 | } |
273 | } | 277 | )+ |
274 | )+ }; | 278 | }; |
275 | } | 279 | } |
276 | 280 | ||
277 | source! { | 281 | mod_items! { |
278 | Import -> ast::UseItem, | 282 | Import in imports -> ast::UseItem, |
279 | ExternCrate -> ast::ExternCrateItem, | 283 | ExternCrate in extern_crates -> ast::ExternCrateItem, |
280 | Function -> ast::FnDef, | 284 | Function in functions -> ast::FnDef, |
281 | Struct -> ast::StructDef, | 285 | Struct in structs -> ast::StructDef, |
282 | Union -> ast::UnionDef, | 286 | Union in unions -> ast::UnionDef, |
283 | Enum -> ast::EnumDef, | 287 | Enum in enums -> ast::EnumDef, |
284 | Const -> ast::ConstDef, | 288 | Const in consts -> ast::ConstDef, |
285 | Static -> ast::StaticDef, | 289 | Static in statics -> ast::StaticDef, |
286 | Trait -> ast::TraitDef, | 290 | Trait in traits -> ast::TraitDef, |
287 | Impl -> ast::ImplDef, | 291 | Impl in impls -> ast::ImplDef, |
288 | TypeAlias -> ast::TypeAliasDef, | 292 | TypeAlias in type_aliases -> ast::TypeAliasDef, |
289 | Mod -> ast::Module, | 293 | Mod in mods -> ast::Module, |
290 | MacroCall -> ast::MacroCall, | 294 | MacroCall in macro_calls -> ast::MacroCall, |
291 | } | 295 | } |
292 | 296 | ||
293 | macro_rules! impl_index { | 297 | macro_rules! impl_index { |
@@ -304,23 +308,7 @@ macro_rules! impl_index { | |||
304 | }; | 308 | }; |
305 | } | 309 | } |
306 | 310 | ||
307 | impl_index!( | 311 | impl_index!(fields: Field, variants: Variant, exprs: Expr); |
308 | imports: Import, | ||
309 | functions: Function, | ||
310 | structs: Struct, | ||
311 | fields: Field, | ||
312 | unions: Union, | ||
313 | enums: Enum, | ||
314 | variants: Variant, | ||
315 | consts: Const, | ||
316 | statics: Static, | ||
317 | traits: Trait, | ||
318 | impls: Impl, | ||
319 | type_aliases: TypeAlias, | ||
320 | mods: Mod, | ||
321 | macro_calls: MacroCall, | ||
322 | exprs: Expr, | ||
323 | ); | ||
324 | 312 | ||
325 | impl<N: ItemTreeNode> Index<FileItemTreeId<N>> for ItemTree { | 313 | impl<N: ItemTreeNode> Index<FileItemTreeId<N>> for ItemTree { |
326 | type Output = N; | 314 | type Output = N; |
@@ -500,23 +488,6 @@ macro_rules! impl_froms { | |||
500 | } | 488 | } |
501 | } | 489 | } |
502 | 490 | ||
503 | #[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)] | ||
504 | pub enum ModItem { | ||
505 | Import(FileItemTreeId<Import>), | ||
506 | ExternCrate(FileItemTreeId<ExternCrate>), | ||
507 | Function(FileItemTreeId<Function>), | ||
508 | Struct(FileItemTreeId<Struct>), | ||
509 | Union(FileItemTreeId<Union>), | ||
510 | Enum(FileItemTreeId<Enum>), | ||
511 | Const(FileItemTreeId<Const>), | ||
512 | Static(FileItemTreeId<Static>), | ||
513 | Trait(FileItemTreeId<Trait>), | ||
514 | Impl(FileItemTreeId<Impl>), | ||
515 | TypeAlias(FileItemTreeId<TypeAlias>), | ||
516 | Mod(FileItemTreeId<Mod>), | ||
517 | MacroCall(FileItemTreeId<MacroCall>), | ||
518 | } | ||
519 | |||
520 | impl ModItem { | 491 | impl ModItem { |
521 | pub fn as_assoc_item(&self) -> Option<AssocItem> { | 492 | pub fn as_assoc_item(&self) -> Option<AssocItem> { |
522 | match self { | 493 | match self { |
@@ -541,22 +512,6 @@ impl ModItem { | |||
541 | } | 512 | } |
542 | } | 513 | } |
543 | 514 | ||
544 | impl_froms!(ModItem { | ||
545 | Import(FileItemTreeId<Import>), | ||
546 | ExternCrate(FileItemTreeId<ExternCrate>), | ||
547 | Function(FileItemTreeId<Function>), | ||
548 | Struct(FileItemTreeId<Struct>), | ||
549 | Union(FileItemTreeId<Union>), | ||
550 | Enum(FileItemTreeId<Enum>), | ||
551 | Const(FileItemTreeId<Const>), | ||
552 | Static(FileItemTreeId<Static>), | ||
553 | Trait(FileItemTreeId<Trait>), | ||
554 | Impl(FileItemTreeId<Impl>), | ||
555 | TypeAlias(FileItemTreeId<TypeAlias>), | ||
556 | Mod(FileItemTreeId<Mod>), | ||
557 | MacroCall(FileItemTreeId<MacroCall>), | ||
558 | }); | ||
559 | |||
560 | #[derive(Debug, Copy, Clone, Eq, PartialEq)] | 515 | #[derive(Debug, Copy, Clone, Eq, PartialEq)] |
561 | pub enum AssocItem { | 516 | pub enum AssocItem { |
562 | Function(FileItemTreeId<Function>), | 517 | Function(FileItemTreeId<Function>), |