diff options
Diffstat (limited to 'crates/ra_hir/src')
-rw-r--r-- | crates/ra_hir/src/code_model.rs | 16 | ||||
-rw-r--r-- | crates/ra_hir/src/from_source.rs | 116 | ||||
-rw-r--r-- | crates/ra_hir/src/has_source.rs | 10 |
3 files changed, 61 insertions, 81 deletions
diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 117ca2fe3..c705d1630 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs | |||
@@ -11,7 +11,7 @@ use hir_def::{ | |||
11 | per_ns::PerNs, | 11 | per_ns::PerNs, |
12 | resolver::HasResolver, | 12 | resolver::HasResolver, |
13 | type_ref::{Mutability, TypeRef}, | 13 | type_ref::{Mutability, TypeRef}, |
14 | AdtId, AstItemDef, ConstId, ContainerId, DefWithBodyId, EnumId, FunctionId, HasModule, ImplId, | 14 | AdtId, ConstId, ContainerId, DefWithBodyId, EnumId, FunctionId, HasModule, ImplId, |
15 | LocalEnumVariantId, LocalImportId, LocalModuleId, LocalStructFieldId, Lookup, ModuleId, | 15 | LocalEnumVariantId, LocalImportId, LocalModuleId, LocalStructFieldId, Lookup, ModuleId, |
16 | StaticId, StructId, TraitId, TypeAliasId, TypeParamId, UnionId, | 16 | StaticId, StructId, TraitId, TypeAliasId, TypeParamId, UnionId, |
17 | }; | 17 | }; |
@@ -269,7 +269,7 @@ pub struct Struct { | |||
269 | 269 | ||
270 | impl Struct { | 270 | impl Struct { |
271 | pub fn module(self, db: &impl DefDatabase) -> Module { | 271 | pub fn module(self, db: &impl DefDatabase) -> Module { |
272 | Module { id: self.id.module(db) } | 272 | Module { id: self.id.lookup(db).container } |
273 | } | 273 | } |
274 | 274 | ||
275 | pub fn krate(self, db: &impl DefDatabase) -> Option<Crate> { | 275 | pub fn krate(self, db: &impl DefDatabase) -> Option<Crate> { |
@@ -290,7 +290,7 @@ impl Struct { | |||
290 | } | 290 | } |
291 | 291 | ||
292 | pub fn ty(self, db: &impl HirDatabase) -> Type { | 292 | pub fn ty(self, db: &impl HirDatabase) -> Type { |
293 | Type::from_def(db, self.id.module(db).krate, self.id) | 293 | Type::from_def(db, self.id.lookup(db).container.krate, self.id) |
294 | } | 294 | } |
295 | 295 | ||
296 | fn variant_data(self, db: &impl DefDatabase) -> Arc<VariantData> { | 296 | fn variant_data(self, db: &impl DefDatabase) -> Arc<VariantData> { |
@@ -309,11 +309,11 @@ impl Union { | |||
309 | } | 309 | } |
310 | 310 | ||
311 | pub fn module(self, db: &impl DefDatabase) -> Module { | 311 | pub fn module(self, db: &impl DefDatabase) -> Module { |
312 | Module { id: self.id.module(db) } | 312 | Module { id: self.id.lookup(db).container } |
313 | } | 313 | } |
314 | 314 | ||
315 | pub fn ty(self, db: &impl HirDatabase) -> Type { | 315 | pub fn ty(self, db: &impl HirDatabase) -> Type { |
316 | Type::from_def(db, self.id.module(db).krate, self.id) | 316 | Type::from_def(db, self.id.lookup(db).container.krate, self.id) |
317 | } | 317 | } |
318 | 318 | ||
319 | pub fn fields(self, db: &impl HirDatabase) -> Vec<StructField> { | 319 | pub fn fields(self, db: &impl HirDatabase) -> Vec<StructField> { |
@@ -337,7 +337,7 @@ pub struct Enum { | |||
337 | 337 | ||
338 | impl Enum { | 338 | impl Enum { |
339 | pub fn module(self, db: &impl DefDatabase) -> Module { | 339 | pub fn module(self, db: &impl DefDatabase) -> Module { |
340 | Module { id: self.id.module(db) } | 340 | Module { id: self.id.lookup(db).container } |
341 | } | 341 | } |
342 | 342 | ||
343 | pub fn krate(self, db: &impl DefDatabase) -> Option<Crate> { | 343 | pub fn krate(self, db: &impl DefDatabase) -> Option<Crate> { |
@@ -357,7 +357,7 @@ impl Enum { | |||
357 | } | 357 | } |
358 | 358 | ||
359 | pub fn ty(self, db: &impl HirDatabase) -> Type { | 359 | pub fn ty(self, db: &impl HirDatabase) -> Type { |
360 | Type::from_def(db, self.id.module(db).krate, self.id) | 360 | Type::from_def(db, self.id.lookup(db).container.krate, self.id) |
361 | } | 361 | } |
362 | } | 362 | } |
363 | 363 | ||
@@ -577,7 +577,7 @@ pub struct Trait { | |||
577 | 577 | ||
578 | impl Trait { | 578 | impl Trait { |
579 | pub fn module(self, db: &impl DefDatabase) -> Module { | 579 | pub fn module(self, db: &impl DefDatabase) -> Module { |
580 | Module { id: self.id.module(db) } | 580 | Module { id: self.id.lookup(db).container } |
581 | } | 581 | } |
582 | 582 | ||
583 | pub fn name(self, db: &impl DefDatabase) -> Name { | 583 | pub fn name(self, db: &impl DefDatabase) -> Name { |
diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index b35188a21..f7411c5cf 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs | |||
@@ -1,7 +1,7 @@ | |||
1 | //! FIXME: write short doc here | 1 | //! FIXME: write short doc here |
2 | use hir_def::{ | 2 | use hir_def::{ |
3 | child_by_source::ChildBySource, dyn_map::DynMap, keys, nameres::ModuleSource, AstItemDef, | 3 | child_by_source::ChildBySource, dyn_map::DynMap, keys, nameres::ModuleSource, EnumVariantId, |
4 | EnumVariantId, GenericDefId, LocationCtx, ModuleId, VariantId, | 4 | GenericDefId, ModuleId, VariantId, |
5 | }; | 5 | }; |
6 | use hir_expand::{name::AsName, AstId, MacroDefId, MacroDefKind}; | 6 | use hir_expand::{name::AsName, AstId, MacroDefId, MacroDefKind}; |
7 | use ra_syntax::{ | 7 | use ra_syntax::{ |
@@ -23,35 +23,43 @@ pub trait FromSource: Sized { | |||
23 | impl FromSource for Struct { | 23 | impl FromSource for Struct { |
24 | type Ast = ast::StructDef; | 24 | type Ast = ast::StructDef; |
25 | fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile<Self::Ast>) -> Option<Self> { | 25 | fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile<Self::Ast>) -> Option<Self> { |
26 | let id = from_source(db, src)?; | 26 | analyze_container(db, src.as_ref().map(|it| it.syntax()))[keys::STRUCT] |
27 | Some(Struct { id }) | 27 | .get(&src) |
28 | .copied() | ||
29 | .map(Struct::from) | ||
28 | } | 30 | } |
29 | } | 31 | } |
30 | impl FromSource for Union { | 32 | impl FromSource for Union { |
31 | type Ast = ast::UnionDef; | 33 | type Ast = ast::UnionDef; |
32 | fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile<Self::Ast>) -> Option<Self> { | 34 | fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile<Self::Ast>) -> Option<Self> { |
33 | let id = from_source(db, src)?; | 35 | analyze_container(db, src.as_ref().map(|it| it.syntax()))[keys::UNION] |
34 | Some(Union { id }) | 36 | .get(&src) |
37 | .copied() | ||
38 | .map(Union::from) | ||
35 | } | 39 | } |
36 | } | 40 | } |
37 | impl FromSource for Enum { | 41 | impl FromSource for Enum { |
38 | type Ast = ast::EnumDef; | 42 | type Ast = ast::EnumDef; |
39 | fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile<Self::Ast>) -> Option<Self> { | 43 | fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile<Self::Ast>) -> Option<Self> { |
40 | let id = from_source(db, src)?; | 44 | analyze_container(db, src.as_ref().map(|it| it.syntax()))[keys::ENUM] |
41 | Some(Enum { id }) | 45 | .get(&src) |
46 | .copied() | ||
47 | .map(Enum::from) | ||
42 | } | 48 | } |
43 | } | 49 | } |
44 | impl FromSource for Trait { | 50 | impl FromSource for Trait { |
45 | type Ast = ast::TraitDef; | 51 | type Ast = ast::TraitDef; |
46 | fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile<Self::Ast>) -> Option<Self> { | 52 | fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile<Self::Ast>) -> Option<Self> { |
47 | let id = from_source(db, src)?; | 53 | analyze_container(db, src.as_ref().map(|it| it.syntax()))[keys::TRAIT] |
48 | Some(Trait { id }) | 54 | .get(&src) |
55 | .copied() | ||
56 | .map(Trait::from) | ||
49 | } | 57 | } |
50 | } | 58 | } |
51 | impl FromSource for Function { | 59 | impl FromSource for Function { |
52 | type Ast = ast::FnDef; | 60 | type Ast = ast::FnDef; |
53 | fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile<Self::Ast>) -> Option<Self> { | 61 | fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile<Self::Ast>) -> Option<Self> { |
54 | Container::find(db, src.as_ref().map(|it| it.syntax()))?.child_by_source(db)[keys::FUNCTION] | 62 | analyze_container(db, src.as_ref().map(|it| it.syntax()))[keys::FUNCTION] |
55 | .get(&src) | 63 | .get(&src) |
56 | .copied() | 64 | .copied() |
57 | .map(Function::from) | 65 | .map(Function::from) |
@@ -61,7 +69,7 @@ impl FromSource for Function { | |||
61 | impl FromSource for Const { | 69 | impl FromSource for Const { |
62 | type Ast = ast::ConstDef; | 70 | type Ast = ast::ConstDef; |
63 | fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile<Self::Ast>) -> Option<Self> { | 71 | fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile<Self::Ast>) -> Option<Self> { |
64 | Container::find(db, src.as_ref().map(|it| it.syntax()))?.child_by_source(db)[keys::CONST] | 72 | analyze_container(db, src.as_ref().map(|it| it.syntax()))[keys::CONST] |
65 | .get(&src) | 73 | .get(&src) |
66 | .copied() | 74 | .copied() |
67 | .map(Const::from) | 75 | .map(Const::from) |
@@ -70,7 +78,7 @@ impl FromSource for Const { | |||
70 | impl FromSource for Static { | 78 | impl FromSource for Static { |
71 | type Ast = ast::StaticDef; | 79 | type Ast = ast::StaticDef; |
72 | fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile<Self::Ast>) -> Option<Self> { | 80 | fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile<Self::Ast>) -> Option<Self> { |
73 | Container::find(db, src.as_ref().map(|it| it.syntax()))?.child_by_source(db)[keys::STATIC] | 81 | analyze_container(db, src.as_ref().map(|it| it.syntax()))[keys::STATIC] |
74 | .get(&src) | 82 | .get(&src) |
75 | .copied() | 83 | .copied() |
76 | .map(Static::from) | 84 | .map(Static::from) |
@@ -80,8 +88,7 @@ impl FromSource for Static { | |||
80 | impl FromSource for TypeAlias { | 88 | impl FromSource for TypeAlias { |
81 | type Ast = ast::TypeAliasDef; | 89 | type Ast = ast::TypeAliasDef; |
82 | fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile<Self::Ast>) -> Option<Self> { | 90 | fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile<Self::Ast>) -> Option<Self> { |
83 | Container::find(db, src.as_ref().map(|it| it.syntax()))?.child_by_source(db) | 91 | analyze_container(db, src.as_ref().map(|it| it.syntax()))[keys::TYPE_ALIAS] |
84 | [keys::TYPE_ALIAS] | ||
85 | .get(&src) | 92 | .get(&src) |
86 | .copied() | 93 | .copied() |
87 | .map(TypeAlias::from) | 94 | .map(TypeAlias::from) |
@@ -107,10 +114,10 @@ impl FromSource for MacroDef { | |||
107 | impl FromSource for ImplBlock { | 114 | impl FromSource for ImplBlock { |
108 | type Ast = ast::ImplBlock; | 115 | type Ast = ast::ImplBlock; |
109 | fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile<Self::Ast>) -> Option<Self> { | 116 | fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile<Self::Ast>) -> Option<Self> { |
110 | // XXX: use `.parent()` to avoid finding ourselves | 117 | analyze_container(db, src.as_ref().map(|it| it.syntax()))[keys::IMPL] |
111 | let parent = src.value.syntax().parent()?; | 118 | .get(&src) |
112 | let container = Container::find(db, src.with_value(parent).as_ref())?; | 119 | .copied() |
113 | container.child_by_source(db)[keys::IMPL].get(&src).copied().map(ImplBlock::from) | 120 | .map(ImplBlock::from) |
114 | } | 121 | } |
115 | } | 122 | } |
116 | 123 | ||
@@ -247,57 +254,30 @@ impl Module { | |||
247 | } | 254 | } |
248 | } | 255 | } |
249 | 256 | ||
250 | fn from_source<N, DEF>(db: &(impl DefDatabase + AstDatabase), src: InFile<N>) -> Option<DEF> | 257 | fn analyze_container(db: &impl DefDatabase, src: InFile<&SyntaxNode>) -> DynMap { |
251 | where | 258 | _analyze_container(db, src).unwrap_or_default() |
252 | N: AstNode, | ||
253 | DEF: AstItemDef<N>, | ||
254 | { | ||
255 | let module_src = ModuleSource::from_child_node(db, src.as_ref().map(|it| it.syntax())); | ||
256 | let module = Module::from_definition(db, InFile::new(src.file_id, module_src))?; | ||
257 | let ctx = LocationCtx::new(db, module.id, src.file_id); | ||
258 | let items = db.ast_id_map(src.file_id); | ||
259 | let item_id = items.ast_id(&src.value); | ||
260 | Some(DEF::from_ast_id(ctx, item_id)) | ||
261 | } | ||
262 | |||
263 | enum Container { | ||
264 | Trait(Trait), | ||
265 | ImplBlock(ImplBlock), | ||
266 | Module(Module), | ||
267 | } | 259 | } |
268 | 260 | ||
269 | impl Container { | 261 | fn _analyze_container(db: &impl DefDatabase, src: InFile<&SyntaxNode>) -> Option<DynMap> { |
270 | fn find(db: &impl DefDatabase, src: InFile<&SyntaxNode>) -> Option<Container> { | 262 | // FIXME: this doesn't try to handle nested declarations |
271 | // FIXME: this doesn't try to handle nested declarations | 263 | for container in src.value.ancestors().skip(1) { |
272 | for container in src.value.ancestors() { | 264 | let res = match_ast! { |
273 | let res = match_ast! { | 265 | match container { |
274 | match container { | 266 | ast::TraitDef(it) => { |
275 | ast::TraitDef(it) => { | 267 | let c = Trait::from_source(db, src.with_value(it))?; |
276 | let c = Trait::from_source(db, src.with_value(it))?; | 268 | c.id.child_by_source(db) |
277 | Container::Trait(c) | 269 | }, |
278 | }, | 270 | ast::ImplBlock(it) => { |
279 | ast::ImplBlock(it) => { | 271 | let c = ImplBlock::from_source(db, src.with_value(it))?; |
280 | let c = ImplBlock::from_source(db, src.with_value(it))?; | 272 | c.id.child_by_source(db) |
281 | Container::ImplBlock(c) | 273 | }, |
282 | }, | 274 | _ => { continue }, |
283 | _ => { continue }, | 275 | } |
284 | } | 276 | }; |
285 | }; | 277 | return Some(res); |
286 | return Some(res); | ||
287 | } | ||
288 | |||
289 | let module_source = ModuleSource::from_child_node(db, src); | ||
290 | let c = Module::from_definition(db, src.with_value(module_source))?; | ||
291 | Some(Container::Module(c)) | ||
292 | } | 278 | } |
293 | } | ||
294 | 279 | ||
295 | impl ChildBySource for Container { | 280 | let module_source = ModuleSource::from_child_node(db, src); |
296 | fn child_by_source(&self, db: &impl DefDatabase) -> DynMap { | 281 | let c = Module::from_definition(db, src.with_value(module_source))?; |
297 | match self { | 282 | Some(c.id.child_by_source(db)) |
298 | Container::Trait(it) => it.id.child_by_source(db), | ||
299 | Container::ImplBlock(it) => it.id.child_by_source(db), | ||
300 | Container::Module(it) => it.id.child_by_source(db), | ||
301 | } | ||
302 | } | ||
303 | } | 283 | } |
diff --git a/crates/ra_hir/src/has_source.rs b/crates/ra_hir/src/has_source.rs index a888fe995..72afecf26 100644 --- a/crates/ra_hir/src/has_source.rs +++ b/crates/ra_hir/src/has_source.rs | |||
@@ -4,7 +4,7 @@ use either::Either; | |||
4 | use hir_def::{ | 4 | use hir_def::{ |
5 | nameres::ModuleSource, | 5 | nameres::ModuleSource, |
6 | src::{HasChildSource, HasSource as _}, | 6 | src::{HasChildSource, HasSource as _}, |
7 | AstItemDef, Lookup, VariantId, | 7 | Lookup, VariantId, |
8 | }; | 8 | }; |
9 | use ra_syntax::ast; | 9 | use ra_syntax::ast; |
10 | 10 | ||
@@ -51,19 +51,19 @@ impl HasSource for StructField { | |||
51 | impl HasSource for Struct { | 51 | impl HasSource for Struct { |
52 | type Ast = ast::StructDef; | 52 | type Ast = ast::StructDef; |
53 | fn source(self, db: &impl DefDatabase) -> InFile<ast::StructDef> { | 53 | fn source(self, db: &impl DefDatabase) -> InFile<ast::StructDef> { |
54 | self.id.source(db) | 54 | self.id.lookup(db).source(db) |
55 | } | 55 | } |
56 | } | 56 | } |
57 | impl HasSource for Union { | 57 | impl HasSource for Union { |
58 | type Ast = ast::UnionDef; | 58 | type Ast = ast::UnionDef; |
59 | fn source(self, db: &impl DefDatabase) -> InFile<ast::UnionDef> { | 59 | fn source(self, db: &impl DefDatabase) -> InFile<ast::UnionDef> { |
60 | self.id.source(db) | 60 | self.id.lookup(db).source(db) |
61 | } | 61 | } |
62 | } | 62 | } |
63 | impl HasSource for Enum { | 63 | impl HasSource for Enum { |
64 | type Ast = ast::EnumDef; | 64 | type Ast = ast::EnumDef; |
65 | fn source(self, db: &impl DefDatabase) -> InFile<ast::EnumDef> { | 65 | fn source(self, db: &impl DefDatabase) -> InFile<ast::EnumDef> { |
66 | self.id.source(db) | 66 | self.id.lookup(db).source(db) |
67 | } | 67 | } |
68 | } | 68 | } |
69 | impl HasSource for EnumVariant { | 69 | impl HasSource for EnumVariant { |
@@ -93,7 +93,7 @@ impl HasSource for Static { | |||
93 | impl HasSource for Trait { | 93 | impl HasSource for Trait { |
94 | type Ast = ast::TraitDef; | 94 | type Ast = ast::TraitDef; |
95 | fn source(self, db: &impl DefDatabase) -> InFile<ast::TraitDef> { | 95 | fn source(self, db: &impl DefDatabase) -> InFile<ast::TraitDef> { |
96 | self.id.source(db) | 96 | self.id.lookup(db).source(db) |
97 | } | 97 | } |
98 | } | 98 | } |
99 | impl HasSource for TypeAlias { | 99 | impl HasSource for TypeAlias { |