aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/code_model
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2019-11-22 20:12:07 +0000
committerGitHub <[email protected]>2019-11-22 20:12:07 +0000
commit81bfbd26bef1a63ccbeba33430e6b07a53c8e7d9 (patch)
tree908faccf9e77fcb1d2804da3289ebc4d026ce339 /crates/ra_hir/src/code_model
parent5b19202e00fffe62a1a9c07f4b974f0affdd0c66 (diff)
parent0f415dd4b30289117fe76d071293e9bdd3556336 (diff)
Merge #2363
2363: More principled sources for enums and fields r=matklad a=matklad Co-authored-by: Aleksey Kladov <[email protected]>
Diffstat (limited to 'crates/ra_hir/src/code_model')
-rw-r--r--crates/ra_hir/src/code_model/src.rs50
1 files changed, 9 insertions, 41 deletions
diff --git a/crates/ra_hir/src/code_model/src.rs b/crates/ra_hir/src/code_model/src.rs
index fc466c1f0..a45c062bf 100644
--- a/crates/ra_hir/src/code_model/src.rs
+++ b/crates/ra_hir/src/code_model/src.rs
@@ -1,13 +1,13 @@
1//! FIXME: write short doc here 1//! FIXME: write short doc here
2 2
3use hir_def::{HasSource as _, Lookup}; 3use hir_def::{HasChildSource, HasSource as _, Lookup, VariantId};
4use ra_syntax::ast::{self, AstNode}; 4use ra_syntax::ast::{self, AstNode};
5 5
6use crate::{ 6use crate::{
7 db::{AstDatabase, DefDatabase, HirDatabase}, 7 db::{AstDatabase, DefDatabase, HirDatabase},
8 ids::AstItemDef, 8 ids::AstItemDef,
9 Const, Either, Enum, EnumVariant, FieldSource, Function, HasBody, HirFileId, MacroDef, Module, 9 Const, Either, Enum, EnumVariant, FieldSource, Function, HasBody, HirFileId, MacroDef, Module,
10 ModuleSource, Static, Struct, StructField, Trait, TypeAlias, Union, VariantDef, 10 ModuleSource, Static, Struct, StructField, Trait, TypeAlias, Union,
11}; 11};
12 12
13pub use hir_expand::Source; 13pub use hir_expand::Source;
@@ -46,33 +46,12 @@ impl Module {
46impl HasSource for StructField { 46impl HasSource for StructField {
47 type Ast = FieldSource; 47 type Ast = FieldSource;
48 fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<FieldSource> { 48 fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<FieldSource> {
49 let var_data = self.parent.variant_data(db); 49 let var = VariantId::from(self.parent);
50 let fields = var_data.fields().unwrap(); 50 let src = var.child_source(db);
51 let ss; 51 src.map(|it| match it[self.id].clone() {
52 let es; 52 Either::A(it) => FieldSource::Pos(it),
53 let (file_id, struct_kind) = match self.parent { 53 Either::B(it) => FieldSource::Named(it),
54 VariantDef::Struct(s) => { 54 })
55 ss = s.source(db);
56 (ss.file_id, ss.value.kind())
57 }
58 VariantDef::EnumVariant(e) => {
59 es = e.source(db);
60 (es.file_id, es.value.kind())
61 }
62 };
63
64 let field_sources = match struct_kind {
65 ast::StructKind::Tuple(fl) => fl.fields().map(|it| FieldSource::Pos(it)).collect(),
66 ast::StructKind::Record(fl) => fl.fields().map(|it| FieldSource::Named(it)).collect(),
67 ast::StructKind::Unit => Vec::new(),
68 };
69 let value = field_sources
70 .into_iter()
71 .zip(fields.iter())
72 .find(|(_syntax, (id, _))| *id == self.id)
73 .unwrap()
74 .0;
75 Source { file_id, value }
76 } 55 }
77} 56}
78impl HasSource for Struct { 57impl HasSource for Struct {
@@ -96,18 +75,7 @@ impl HasSource for Enum {
96impl HasSource for EnumVariant { 75impl HasSource for EnumVariant {
97 type Ast = ast::EnumVariant; 76 type Ast = ast::EnumVariant;
98 fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<ast::EnumVariant> { 77 fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<ast::EnumVariant> {
99 let enum_data = db.enum_data(self.parent.id); 78 self.parent.id.child_source(db).map(|map| map[self.id].clone())
100 let src = self.parent.id.source(db);
101 let value = src
102 .value
103 .variant_list()
104 .into_iter()
105 .flat_map(|it| it.variants())
106 .zip(enum_data.variants.iter())
107 .find(|(_syntax, (id, _))| *id == self.id)
108 .unwrap()
109 .0;
110 Source { file_id: src.file_id, value }
111 } 79 }
112} 80}
113impl HasSource for Function { 81impl HasSource for Function {