diff options
author | Seivan Heidari <[email protected]> | 2019-12-23 14:35:31 +0000 |
---|---|---|
committer | Seivan Heidari <[email protected]> | 2019-12-23 14:35:31 +0000 |
commit | b21d9337d9200e2cfdc90b386591c72c302dc03e (patch) | |
tree | f81f5c08f821115cee26fa4d3ceaae88c7807fd5 /crates/ra_hir_def/src/adt.rs | |
parent | 18a0937585b836ec5ed054b9ae48e0156ab6d9ef (diff) | |
parent | ce07a2daa9e53aa86a769f8641b14c2878444fbc (diff) |
Merge branch 'master' into feature/themes
Diffstat (limited to 'crates/ra_hir_def/src/adt.rs')
-rw-r--r-- | crates/ra_hir_def/src/adt.rs | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/crates/ra_hir_def/src/adt.rs b/crates/ra_hir_def/src/adt.rs index 3666529b0..d9ea693e3 100644 --- a/crates/ra_hir_def/src/adt.rs +++ b/crates/ra_hir_def/src/adt.rs | |||
@@ -2,17 +2,18 @@ | |||
2 | 2 | ||
3 | use std::sync::Arc; | 3 | use std::sync::Arc; |
4 | 4 | ||
5 | use either::Either; | ||
5 | use hir_expand::{ | 6 | use hir_expand::{ |
6 | either::Either, | ||
7 | name::{AsName, Name}, | 7 | name::{AsName, Name}, |
8 | Source, | 8 | InFile, |
9 | }; | 9 | }; |
10 | use ra_arena::{map::ArenaMap, Arena}; | 10 | use ra_arena::{map::ArenaMap, Arena}; |
11 | use ra_prof::profile; | ||
11 | use ra_syntax::ast::{self, NameOwner, TypeAscriptionOwner}; | 12 | use ra_syntax::ast::{self, NameOwner, TypeAscriptionOwner}; |
12 | 13 | ||
13 | use crate::{ | 14 | use crate::{ |
14 | db::DefDatabase, trace::Trace, type_ref::TypeRef, AstItemDef, EnumId, HasChildSource, | 15 | db::DefDatabase, src::HasChildSource, src::HasSource, trace::Trace, type_ref::TypeRef, EnumId, |
15 | LocalEnumVariantId, LocalStructFieldId, StructId, UnionId, VariantId, | 16 | LocalEnumVariantId, LocalStructFieldId, Lookup, StructId, UnionId, VariantId, |
16 | }; | 17 | }; |
17 | 18 | ||
18 | /// Note that we use `StructData` for unions as well! | 19 | /// Note that we use `StructData` for unions as well! |
@@ -50,14 +51,14 @@ pub struct StructFieldData { | |||
50 | 51 | ||
51 | impl StructData { | 52 | impl StructData { |
52 | pub(crate) fn struct_data_query(db: &impl DefDatabase, id: StructId) -> Arc<StructData> { | 53 | pub(crate) fn struct_data_query(db: &impl DefDatabase, id: StructId) -> Arc<StructData> { |
53 | let src = id.source(db); | 54 | let src = id.lookup(db).source(db); |
54 | let name = src.value.name().map_or_else(Name::missing, |n| n.as_name()); | 55 | let name = src.value.name().map_or_else(Name::missing, |n| n.as_name()); |
55 | let variant_data = VariantData::new(src.value.kind()); | 56 | let variant_data = VariantData::new(src.value.kind()); |
56 | let variant_data = Arc::new(variant_data); | 57 | let variant_data = Arc::new(variant_data); |
57 | Arc::new(StructData { name, variant_data }) | 58 | Arc::new(StructData { name, variant_data }) |
58 | } | 59 | } |
59 | pub(crate) fn union_data_query(db: &impl DefDatabase, id: UnionId) -> Arc<StructData> { | 60 | pub(crate) fn union_data_query(db: &impl DefDatabase, id: UnionId) -> Arc<StructData> { |
60 | let src = id.source(db); | 61 | let src = id.lookup(db).source(db); |
61 | let name = src.value.name().map_or_else(Name::missing, |n| n.as_name()); | 62 | let name = src.value.name().map_or_else(Name::missing, |n| n.as_name()); |
62 | let variant_data = VariantData::new( | 63 | let variant_data = VariantData::new( |
63 | src.value | 64 | src.value |
@@ -72,7 +73,8 @@ impl StructData { | |||
72 | 73 | ||
73 | impl EnumData { | 74 | impl EnumData { |
74 | pub(crate) fn enum_data_query(db: &impl DefDatabase, e: EnumId) -> Arc<EnumData> { | 75 | pub(crate) fn enum_data_query(db: &impl DefDatabase, e: EnumId) -> Arc<EnumData> { |
75 | let src = e.source(db); | 76 | let _p = profile("enum_data_query"); |
77 | let src = e.lookup(db).source(db); | ||
76 | let name = src.value.name().map_or_else(Name::missing, |n| n.as_name()); | 78 | let name = src.value.name().map_or_else(Name::missing, |n| n.as_name()); |
77 | let mut trace = Trace::new_for_arena(); | 79 | let mut trace = Trace::new_for_arena(); |
78 | lower_enum(&mut trace, &src.value); | 80 | lower_enum(&mut trace, &src.value); |
@@ -88,8 +90,8 @@ impl EnumData { | |||
88 | impl HasChildSource for EnumId { | 90 | impl HasChildSource for EnumId { |
89 | type ChildId = LocalEnumVariantId; | 91 | type ChildId = LocalEnumVariantId; |
90 | type Value = ast::EnumVariant; | 92 | type Value = ast::EnumVariant; |
91 | fn child_source(&self, db: &impl DefDatabase) -> Source<ArenaMap<Self::ChildId, Self::Value>> { | 93 | fn child_source(&self, db: &impl DefDatabase) -> InFile<ArenaMap<Self::ChildId, Self::Value>> { |
92 | let src = self.source(db); | 94 | let src = self.lookup(db).source(db); |
93 | let mut trace = Trace::new_for_map(); | 95 | let mut trace = Trace::new_for_map(); |
94 | lower_enum(&mut trace, &src.value); | 96 | lower_enum(&mut trace, &src.value); |
95 | src.with_value(trace.into_map()) | 97 | src.with_value(trace.into_map()) |
@@ -145,7 +147,7 @@ impl HasChildSource for VariantId { | |||
145 | type ChildId = LocalStructFieldId; | 147 | type ChildId = LocalStructFieldId; |
146 | type Value = Either<ast::TupleFieldDef, ast::RecordFieldDef>; | 148 | type Value = Either<ast::TupleFieldDef, ast::RecordFieldDef>; |
147 | 149 | ||
148 | fn child_source(&self, db: &impl DefDatabase) -> Source<ArenaMap<Self::ChildId, Self::Value>> { | 150 | fn child_source(&self, db: &impl DefDatabase) -> InFile<ArenaMap<Self::ChildId, Self::Value>> { |
149 | let src = match self { | 151 | let src = match self { |
150 | VariantId::EnumVariantId(it) => { | 152 | VariantId::EnumVariantId(it) => { |
151 | // I don't really like the fact that we call into parent source | 153 | // I don't really like the fact that we call into parent source |
@@ -153,8 +155,8 @@ impl HasChildSource for VariantId { | |||
153 | let src = it.parent.child_source(db); | 155 | let src = it.parent.child_source(db); |
154 | src.map(|map| map[it.local_id].kind()) | 156 | src.map(|map| map[it.local_id].kind()) |
155 | } | 157 | } |
156 | VariantId::StructId(it) => it.source(db).map(|it| it.kind()), | 158 | VariantId::StructId(it) => it.lookup(db).source(db).map(|it| it.kind()), |
157 | VariantId::UnionId(it) => it.source(db).map(|it| { | 159 | VariantId::UnionId(it) => it.lookup(db).source(db).map(|it| { |
158 | it.record_field_def_list() | 160 | it.record_field_def_list() |
159 | .map(ast::StructKind::Record) | 161 | .map(ast::StructKind::Record) |
160 | .unwrap_or(ast::StructKind::Unit) | 162 | .unwrap_or(ast::StructKind::Unit) |
@@ -184,7 +186,7 @@ fn lower_struct( | |||
184 | ast::StructKind::Tuple(fl) => { | 186 | ast::StructKind::Tuple(fl) => { |
185 | for (i, fd) in fl.fields().enumerate() { | 187 | for (i, fd) in fl.fields().enumerate() { |
186 | trace.alloc( | 188 | trace.alloc( |
187 | || Either::A(fd.clone()), | 189 | || Either::Left(fd.clone()), |
188 | || StructFieldData { | 190 | || StructFieldData { |
189 | name: Name::new_tuple_field(i), | 191 | name: Name::new_tuple_field(i), |
190 | type_ref: TypeRef::from_ast_opt(fd.type_ref()), | 192 | type_ref: TypeRef::from_ast_opt(fd.type_ref()), |
@@ -196,7 +198,7 @@ fn lower_struct( | |||
196 | ast::StructKind::Record(fl) => { | 198 | ast::StructKind::Record(fl) => { |
197 | for fd in fl.fields() { | 199 | for fd in fl.fields() { |
198 | trace.alloc( | 200 | trace.alloc( |
199 | || Either::B(fd.clone()), | 201 | || Either::Right(fd.clone()), |
200 | || StructFieldData { | 202 | || StructFieldData { |
201 | name: fd.name().map(|n| n.as_name()).unwrap_or_else(Name::missing), | 203 | name: fd.name().map(|n| n.as_name()).unwrap_or_else(Name::missing), |
202 | type_ref: TypeRef::from_ast_opt(fd.ascribed_type()), | 204 | type_ref: TypeRef::from_ast_opt(fd.ascribed_type()), |