diff options
Diffstat (limited to 'crates/ra_hir/src/code_model')
-rw-r--r-- | crates/ra_hir/src/code_model/src.rs | 41 |
1 files changed, 22 insertions, 19 deletions
diff --git a/crates/ra_hir/src/code_model/src.rs b/crates/ra_hir/src/code_model/src.rs index bf3ee0834..2cf210349 100644 --- a/crates/ra_hir/src/code_model/src.rs +++ b/crates/ra_hir/src/code_model/src.rs | |||
@@ -1,6 +1,9 @@ | |||
1 | //! FIXME: write short doc here | 1 | //! FIXME: write short doc here |
2 | 2 | ||
3 | use hir_def::{AstItemDef, HasChildSource, HasSource as _, Lookup, VariantId}; | 3 | use hir_def::{ |
4 | src::{HasChildSource, HasSource as _}, | ||
5 | AstItemDef, Lookup, VariantId, | ||
6 | }; | ||
4 | use hir_expand::either::Either; | 7 | use hir_expand::either::Either; |
5 | use ra_syntax::ast; | 8 | use ra_syntax::ast; |
6 | 9 | ||
@@ -9,18 +12,18 @@ use crate::{ | |||
9 | Module, ModuleSource, Static, Struct, StructField, Trait, TypeAlias, Union, | 12 | Module, ModuleSource, Static, Struct, StructField, Trait, TypeAlias, Union, |
10 | }; | 13 | }; |
11 | 14 | ||
12 | pub use hir_expand::Source; | 15 | pub use hir_expand::InFile; |
13 | 16 | ||
14 | pub trait HasSource { | 17 | pub trait HasSource { |
15 | type Ast; | 18 | type Ast; |
16 | fn source(self, db: &impl DefDatabase) -> Source<Self::Ast>; | 19 | fn source(self, db: &impl DefDatabase) -> InFile<Self::Ast>; |
17 | } | 20 | } |
18 | 21 | ||
19 | /// NB: Module is !HasSource, because it has two source nodes at the same time: | 22 | /// NB: Module is !HasSource, because it has two source nodes at the same time: |
20 | /// definition and declaration. | 23 | /// definition and declaration. |
21 | impl Module { | 24 | impl Module { |
22 | /// Returns a node which defines this module. That is, a file or a `mod foo {}` with items. | 25 | /// Returns a node which defines this module. That is, a file or a `mod foo {}` with items. |
23 | pub fn definition_source(self, db: &impl DefDatabase) -> Source<ModuleSource> { | 26 | pub fn definition_source(self, db: &impl DefDatabase) -> InFile<ModuleSource> { |
24 | let def_map = db.crate_def_map(self.id.krate); | 27 | let def_map = db.crate_def_map(self.id.krate); |
25 | let src = def_map[self.id.local_id].definition_source(db); | 28 | let src = def_map[self.id.local_id].definition_source(db); |
26 | src.map(|it| match it { | 29 | src.map(|it| match it { |
@@ -31,7 +34,7 @@ impl Module { | |||
31 | 34 | ||
32 | /// Returns a node which declares this module, either a `mod foo;` or a `mod foo {}`. | 35 | /// Returns a node which declares this module, either a `mod foo;` or a `mod foo {}`. |
33 | /// `None` for the crate root. | 36 | /// `None` for the crate root. |
34 | pub fn declaration_source(self, db: &impl DefDatabase) -> Option<Source<ast::Module>> { | 37 | pub fn declaration_source(self, db: &impl DefDatabase) -> Option<InFile<ast::Module>> { |
35 | let def_map = db.crate_def_map(self.id.krate); | 38 | let def_map = db.crate_def_map(self.id.krate); |
36 | def_map[self.id.local_id].declaration_source(db) | 39 | def_map[self.id.local_id].declaration_source(db) |
37 | } | 40 | } |
@@ -39,7 +42,7 @@ impl Module { | |||
39 | 42 | ||
40 | impl HasSource for StructField { | 43 | impl HasSource for StructField { |
41 | type Ast = FieldSource; | 44 | type Ast = FieldSource; |
42 | fn source(self, db: &impl DefDatabase) -> Source<FieldSource> { | 45 | fn source(self, db: &impl DefDatabase) -> InFile<FieldSource> { |
43 | let var = VariantId::from(self.parent); | 46 | let var = VariantId::from(self.parent); |
44 | let src = var.child_source(db); | 47 | let src = var.child_source(db); |
45 | src.map(|it| match it[self.id].clone() { | 48 | src.map(|it| match it[self.id].clone() { |
@@ -50,67 +53,67 @@ impl HasSource for StructField { | |||
50 | } | 53 | } |
51 | impl HasSource for Struct { | 54 | impl HasSource for Struct { |
52 | type Ast = ast::StructDef; | 55 | type Ast = ast::StructDef; |
53 | fn source(self, db: &impl DefDatabase) -> Source<ast::StructDef> { | 56 | fn source(self, db: &impl DefDatabase) -> InFile<ast::StructDef> { |
54 | self.id.source(db) | 57 | self.id.source(db) |
55 | } | 58 | } |
56 | } | 59 | } |
57 | impl HasSource for Union { | 60 | impl HasSource for Union { |
58 | type Ast = ast::UnionDef; | 61 | type Ast = ast::UnionDef; |
59 | fn source(self, db: &impl DefDatabase) -> Source<ast::UnionDef> { | 62 | fn source(self, db: &impl DefDatabase) -> InFile<ast::UnionDef> { |
60 | self.id.source(db) | 63 | self.id.source(db) |
61 | } | 64 | } |
62 | } | 65 | } |
63 | impl HasSource for Enum { | 66 | impl HasSource for Enum { |
64 | type Ast = ast::EnumDef; | 67 | type Ast = ast::EnumDef; |
65 | fn source(self, db: &impl DefDatabase) -> Source<ast::EnumDef> { | 68 | fn source(self, db: &impl DefDatabase) -> InFile<ast::EnumDef> { |
66 | self.id.source(db) | 69 | self.id.source(db) |
67 | } | 70 | } |
68 | } | 71 | } |
69 | impl HasSource for EnumVariant { | 72 | impl HasSource for EnumVariant { |
70 | type Ast = ast::EnumVariant; | 73 | type Ast = ast::EnumVariant; |
71 | fn source(self, db: &impl DefDatabase) -> Source<ast::EnumVariant> { | 74 | fn source(self, db: &impl DefDatabase) -> InFile<ast::EnumVariant> { |
72 | self.parent.id.child_source(db).map(|map| map[self.id].clone()) | 75 | self.parent.id.child_source(db).map(|map| map[self.id].clone()) |
73 | } | 76 | } |
74 | } | 77 | } |
75 | impl HasSource for Function { | 78 | impl HasSource for Function { |
76 | type Ast = ast::FnDef; | 79 | type Ast = ast::FnDef; |
77 | fn source(self, db: &impl DefDatabase) -> Source<ast::FnDef> { | 80 | fn source(self, db: &impl DefDatabase) -> InFile<ast::FnDef> { |
78 | self.id.lookup(db).source(db) | 81 | self.id.lookup(db).source(db) |
79 | } | 82 | } |
80 | } | 83 | } |
81 | impl HasSource for Const { | 84 | impl HasSource for Const { |
82 | type Ast = ast::ConstDef; | 85 | type Ast = ast::ConstDef; |
83 | fn source(self, db: &impl DefDatabase) -> Source<ast::ConstDef> { | 86 | fn source(self, db: &impl DefDatabase) -> InFile<ast::ConstDef> { |
84 | self.id.lookup(db).source(db) | 87 | self.id.lookup(db).source(db) |
85 | } | 88 | } |
86 | } | 89 | } |
87 | impl HasSource for Static { | 90 | impl HasSource for Static { |
88 | type Ast = ast::StaticDef; | 91 | type Ast = ast::StaticDef; |
89 | fn source(self, db: &impl DefDatabase) -> Source<ast::StaticDef> { | 92 | fn source(self, db: &impl DefDatabase) -> InFile<ast::StaticDef> { |
90 | self.id.lookup(db).source(db) | 93 | self.id.lookup(db).source(db) |
91 | } | 94 | } |
92 | } | 95 | } |
93 | impl HasSource for Trait { | 96 | impl HasSource for Trait { |
94 | type Ast = ast::TraitDef; | 97 | type Ast = ast::TraitDef; |
95 | fn source(self, db: &impl DefDatabase) -> Source<ast::TraitDef> { | 98 | fn source(self, db: &impl DefDatabase) -> InFile<ast::TraitDef> { |
96 | self.id.source(db) | 99 | self.id.source(db) |
97 | } | 100 | } |
98 | } | 101 | } |
99 | impl HasSource for TypeAlias { | 102 | impl HasSource for TypeAlias { |
100 | type Ast = ast::TypeAliasDef; | 103 | type Ast = ast::TypeAliasDef; |
101 | fn source(self, db: &impl DefDatabase) -> Source<ast::TypeAliasDef> { | 104 | fn source(self, db: &impl DefDatabase) -> InFile<ast::TypeAliasDef> { |
102 | self.id.lookup(db).source(db) | 105 | self.id.lookup(db).source(db) |
103 | } | 106 | } |
104 | } | 107 | } |
105 | impl HasSource for MacroDef { | 108 | impl HasSource for MacroDef { |
106 | type Ast = ast::MacroCall; | 109 | type Ast = ast::MacroCall; |
107 | fn source(self, db: &impl DefDatabase) -> Source<ast::MacroCall> { | 110 | fn source(self, db: &impl DefDatabase) -> InFile<ast::MacroCall> { |
108 | Source { file_id: self.id.ast_id.file_id(), value: self.id.ast_id.to_node(db) } | 111 | InFile { file_id: self.id.ast_id.file_id, value: self.id.ast_id.to_node(db) } |
109 | } | 112 | } |
110 | } | 113 | } |
111 | impl HasSource for ImplBlock { | 114 | impl HasSource for ImplBlock { |
112 | type Ast = ast::ImplBlock; | 115 | type Ast = ast::ImplBlock; |
113 | fn source(self, db: &impl DefDatabase) -> Source<ast::ImplBlock> { | 116 | fn source(self, db: &impl DefDatabase) -> InFile<ast::ImplBlock> { |
114 | self.id.source(db) | 117 | self.id.source(db) |
115 | } | 118 | } |
116 | } | 119 | } |
@@ -118,7 +121,7 @@ impl HasSource for Import { | |||
118 | type Ast = Either<ast::UseTree, ast::ExternCrateItem>; | 121 | type Ast = Either<ast::UseTree, ast::ExternCrateItem>; |
119 | 122 | ||
120 | /// Returns the syntax of the last path segment corresponding to this import | 123 | /// Returns the syntax of the last path segment corresponding to this import |
121 | fn source(self, db: &impl DefDatabase) -> Source<Self::Ast> { | 124 | fn source(self, db: &impl DefDatabase) -> InFile<Self::Ast> { |
122 | let src = self.parent.definition_source(db); | 125 | let src = self.parent.definition_source(db); |
123 | let (_, source_map) = db.raw_items_with_source_map(src.file_id); | 126 | let (_, source_map) = db.raw_items_with_source_map(src.file_id); |
124 | let root = db.parse_or_expand(src.file_id).unwrap(); | 127 | let root = db.parse_or_expand(src.file_id).unwrap(); |