diff options
Diffstat (limited to 'crates/ra_hir_def/src/src.rs')
-rw-r--r-- | crates/ra_hir_def/src/src.rs | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/crates/ra_hir_def/src/src.rs b/crates/ra_hir_def/src/src.rs new file mode 100644 index 000000000..499375b80 --- /dev/null +++ b/crates/ra_hir_def/src/src.rs | |||
@@ -0,0 +1,36 @@ | |||
1 | //! Utilities for mapping between hir IDs and the surface syntax. | ||
2 | |||
3 | use hir_expand::InFile; | ||
4 | use ra_arena::map::ArenaMap; | ||
5 | use ra_syntax::AstNode; | ||
6 | |||
7 | use crate::{db::DefDatabase, AssocItemLoc, ItemLoc}; | ||
8 | |||
9 | pub trait HasSource { | ||
10 | type Value; | ||
11 | fn source(&self, db: &impl DefDatabase) -> InFile<Self::Value>; | ||
12 | } | ||
13 | |||
14 | impl<N: AstNode> HasSource for AssocItemLoc<N> { | ||
15 | type Value = N; | ||
16 | |||
17 | fn source(&self, db: &impl DefDatabase) -> InFile<N> { | ||
18 | let node = self.ast_id.to_node(db); | ||
19 | InFile::new(self.ast_id.file_id, node) | ||
20 | } | ||
21 | } | ||
22 | |||
23 | impl<N: AstNode> HasSource for ItemLoc<N> { | ||
24 | type Value = N; | ||
25 | |||
26 | fn source(&self, db: &impl DefDatabase) -> InFile<N> { | ||
27 | let node = self.ast_id.to_node(db); | ||
28 | InFile::new(self.ast_id.file_id, node) | ||
29 | } | ||
30 | } | ||
31 | |||
32 | pub trait HasChildSource { | ||
33 | type ChildId; | ||
34 | type Value; | ||
35 | fn child_source(&self, db: &impl DefDatabase) -> InFile<ArenaMap<Self::ChildId, Self::Value>>; | ||
36 | } | ||