diff options
Diffstat (limited to 'crates/ra_hir/src/code_model/src.rs')
-rw-r--r-- | crates/ra_hir/src/code_model/src.rs | 30 |
1 files changed, 7 insertions, 23 deletions
diff --git a/crates/ra_hir/src/code_model/src.rs b/crates/ra_hir/src/code_model/src.rs index fdae26906..5c7f61eef 100644 --- a/crates/ra_hir/src/code_model/src.rs +++ b/crates/ra_hir/src/code_model/src.rs | |||
@@ -1,9 +1,6 @@ | |||
1 | //! FIXME: write short doc here | 1 | //! FIXME: write short doc here |
2 | 2 | ||
3 | use ra_syntax::{ | 3 | use ra_syntax::ast::{self, AstNode}; |
4 | ast::{self, AstNode}, | ||
5 | SyntaxNode, | ||
6 | }; | ||
7 | 4 | ||
8 | use crate::{ | 5 | use crate::{ |
9 | db::{AstDatabase, DefDatabase, HirDatabase}, | 6 | db::{AstDatabase, DefDatabase, HirDatabase}, |
@@ -12,34 +9,21 @@ use crate::{ | |||
12 | ModuleSource, Static, Struct, StructField, Trait, TypeAlias, Union, | 9 | ModuleSource, Static, Struct, StructField, Trait, TypeAlias, Union, |
13 | }; | 10 | }; |
14 | 11 | ||
15 | #[derive(Debug, PartialEq, Eq, Clone, Copy)] | 12 | pub use hir_def::Source; |
16 | pub struct Source<T> { | ||
17 | pub file_id: HirFileId, | ||
18 | pub ast: T, | ||
19 | } | ||
20 | 13 | ||
21 | pub trait HasSource { | 14 | pub trait HasSource { |
22 | type Ast; | 15 | type Ast; |
23 | fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<Self::Ast>; | 16 | fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<Self::Ast>; |
24 | } | 17 | } |
25 | 18 | ||
26 | impl<T> Source<T> { | ||
27 | pub(crate) fn map<F: FnOnce(T) -> U, U>(self, f: F) -> Source<U> { | ||
28 | Source { file_id: self.file_id, ast: f(self.ast) } | ||
29 | } | ||
30 | pub(crate) fn file_syntax(&self, db: &impl AstDatabase) -> SyntaxNode { | ||
31 | db.parse_or_expand(self.file_id).expect("source created from invalid file") | ||
32 | } | ||
33 | } | ||
34 | |||
35 | /// NB: Module is !HasSource, because it has two source nodes at the same time: | 19 | /// NB: Module is !HasSource, because it has two source nodes at the same time: |
36 | /// definition and declaration. | 20 | /// definition and declaration. |
37 | impl Module { | 21 | impl Module { |
38 | /// Returns a node which defines this module. That is, a file or a `mod foo {}` with items. | 22 | /// Returns a node which defines this module. That is, a file or a `mod foo {}` with items. |
39 | pub fn definition_source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<ModuleSource> { | 23 | pub fn definition_source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<ModuleSource> { |
40 | let def_map = db.crate_def_map(self.krate); | 24 | let def_map = db.crate_def_map(self.krate()); |
41 | let decl_id = def_map[self.module_id].declaration; | 25 | let decl_id = def_map[self.id.module_id].declaration; |
42 | let file_id = def_map[self.module_id].definition; | 26 | let file_id = def_map[self.id.module_id].definition; |
43 | let ast = ModuleSource::new(db, file_id, decl_id); | 27 | let ast = ModuleSource::new(db, file_id, decl_id); |
44 | let file_id = file_id.map(HirFileId::from).unwrap_or_else(|| decl_id.unwrap().file_id()); | 28 | let file_id = file_id.map(HirFileId::from).unwrap_or_else(|| decl_id.unwrap().file_id()); |
45 | Source { file_id, ast } | 29 | Source { file_id, ast } |
@@ -51,8 +35,8 @@ impl Module { | |||
51 | self, | 35 | self, |
52 | db: &(impl DefDatabase + AstDatabase), | 36 | db: &(impl DefDatabase + AstDatabase), |
53 | ) -> Option<Source<ast::Module>> { | 37 | ) -> Option<Source<ast::Module>> { |
54 | let def_map = db.crate_def_map(self.krate); | 38 | let def_map = db.crate_def_map(self.krate()); |
55 | let decl = def_map[self.module_id].declaration?; | 39 | let decl = def_map[self.id.module_id].declaration?; |
56 | let ast = decl.to_node(db); | 40 | let ast = decl.to_node(db); |
57 | Some(Source { file_id: decl.file_id(), ast }) | 41 | Some(Source { file_id: decl.file_id(), ast }) |
58 | } | 42 | } |