diff options
author | Aleksey Kladov <[email protected]> | 2019-11-09 12:34:00 +0000 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2019-11-09 12:34:00 +0000 |
commit | 6294fd5ec9c6946bdd91f1274956c573f9f2a136 (patch) | |
tree | 312ae071afe742011c1e396d63123729e31f9815 | |
parent | defc7ad772123a449f7cc384dd46d88c3a45fb53 (diff) |
Unfork struct and union ids
-rw-r--r-- | crates/ra_hir/src/adt.rs | 2 | ||||
-rw-r--r-- | crates/ra_hir/src/code_model.rs | 12 | ||||
-rw-r--r-- | crates/ra_hir/src/code_model/src.rs | 4 | ||||
-rw-r--r-- | crates/ra_hir/src/expr/scope.rs | 5 | ||||
-rw-r--r-- | crates/ra_hir/src/from_source.rs | 10 | ||||
-rw-r--r-- | crates/ra_hir/src/ty/lower.rs | 4 | ||||
-rw-r--r-- | crates/ra_hir_def/src/adt.rs | 16 | ||||
-rw-r--r-- | crates/ra_hir_def/src/db.rs | 12 | ||||
-rw-r--r-- | crates/ra_hir_def/src/lib.rs | 28 | ||||
-rw-r--r-- | crates/ra_hir_def/src/nameres/collector.rs | 11 |
10 files changed, 51 insertions, 53 deletions
diff --git a/crates/ra_hir/src/adt.rs b/crates/ra_hir/src/adt.rs index 0436d20b7..945f236c2 100644 --- a/crates/ra_hir/src/adt.rs +++ b/crates/ra_hir/src/adt.rs | |||
@@ -12,7 +12,7 @@ use crate::{ | |||
12 | 12 | ||
13 | impl Struct { | 13 | impl Struct { |
14 | pub(crate) fn variant_data(self, db: &impl DefDatabase) -> Arc<VariantData> { | 14 | pub(crate) fn variant_data(self, db: &impl DefDatabase) -> Arc<VariantData> { |
15 | db.struct_data(self.id).variant_data.clone() | 15 | db.struct_data(self.id.into()).variant_data.clone() |
16 | } | 16 | } |
17 | } | 17 | } |
18 | 18 | ||
diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 9d0db8024..e5bfad3ca 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs | |||
@@ -288,7 +288,7 @@ pub struct Struct { | |||
288 | 288 | ||
289 | impl Struct { | 289 | impl Struct { |
290 | pub fn module(self, db: &impl DefDatabase) -> Module { | 290 | pub fn module(self, db: &impl DefDatabase) -> Module { |
291 | Module { id: self.id.module(db) } | 291 | Module { id: self.id.0.module(db) } |
292 | } | 292 | } |
293 | 293 | ||
294 | pub fn krate(self, db: &impl DefDatabase) -> Option<Crate> { | 294 | pub fn krate(self, db: &impl DefDatabase) -> Option<Crate> { |
@@ -296,11 +296,11 @@ impl Struct { | |||
296 | } | 296 | } |
297 | 297 | ||
298 | pub fn name(self, db: &impl DefDatabase) -> Option<Name> { | 298 | pub fn name(self, db: &impl DefDatabase) -> Option<Name> { |
299 | db.struct_data(self.id).name.clone() | 299 | db.struct_data(self.id.into()).name.clone() |
300 | } | 300 | } |
301 | 301 | ||
302 | pub fn fields(self, db: &impl HirDatabase) -> Vec<StructField> { | 302 | pub fn fields(self, db: &impl HirDatabase) -> Vec<StructField> { |
303 | db.struct_data(self.id) | 303 | db.struct_data(self.id.into()) |
304 | .variant_data | 304 | .variant_data |
305 | .fields() | 305 | .fields() |
306 | .into_iter() | 306 | .into_iter() |
@@ -310,7 +310,7 @@ impl Struct { | |||
310 | } | 310 | } |
311 | 311 | ||
312 | pub fn field(self, db: &impl HirDatabase, name: &Name) -> Option<StructField> { | 312 | pub fn field(self, db: &impl HirDatabase, name: &Name) -> Option<StructField> { |
313 | db.struct_data(self.id) | 313 | db.struct_data(self.id.into()) |
314 | .variant_data | 314 | .variant_data |
315 | .fields() | 315 | .fields() |
316 | .into_iter() | 316 | .into_iter() |
@@ -346,11 +346,11 @@ pub struct Union { | |||
346 | 346 | ||
347 | impl Union { | 347 | impl Union { |
348 | pub fn name(self, db: &impl DefDatabase) -> Option<Name> { | 348 | pub fn name(self, db: &impl DefDatabase) -> Option<Name> { |
349 | db.union_data(self.id).name.clone() | 349 | db.struct_data(self.id.into()).name.clone() |
350 | } | 350 | } |
351 | 351 | ||
352 | pub fn module(self, db: &impl HirDatabase) -> Module { | 352 | pub fn module(self, db: &impl HirDatabase) -> Module { |
353 | Module { id: self.id.module(db) } | 353 | Module { id: self.id.0.module(db) } |
354 | } | 354 | } |
355 | 355 | ||
356 | pub fn ty(self, db: &impl HirDatabase) -> Ty { | 356 | pub fn ty(self, db: &impl HirDatabase) -> Ty { |
diff --git a/crates/ra_hir/src/code_model/src.rs b/crates/ra_hir/src/code_model/src.rs index 6d116ee75..247ae3e55 100644 --- a/crates/ra_hir/src/code_model/src.rs +++ b/crates/ra_hir/src/code_model/src.rs | |||
@@ -78,13 +78,13 @@ impl HasSource for StructField { | |||
78 | impl HasSource for Struct { | 78 | impl HasSource for Struct { |
79 | type Ast = ast::StructDef; | 79 | type Ast = ast::StructDef; |
80 | fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<ast::StructDef> { | 80 | fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<ast::StructDef> { |
81 | self.id.source(db) | 81 | self.id.0.source(db) |
82 | } | 82 | } |
83 | } | 83 | } |
84 | impl HasSource for Union { | 84 | impl HasSource for Union { |
85 | type Ast = ast::StructDef; | 85 | type Ast = ast::StructDef; |
86 | fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<ast::StructDef> { | 86 | fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<ast::StructDef> { |
87 | self.id.source(db) | 87 | self.id.0.source(db) |
88 | } | 88 | } |
89 | } | 89 | } |
90 | impl HasSource for Enum { | 90 | impl HasSource for Enum { |
diff --git a/crates/ra_hir/src/expr/scope.rs b/crates/ra_hir/src/expr/scope.rs index c14c2ab66..5a1eade2c 100644 --- a/crates/ra_hir/src/expr/scope.rs +++ b/crates/ra_hir/src/expr/scope.rs | |||
@@ -67,10 +67,7 @@ impl ExprScopes { | |||
67 | &self.scopes[scope].entries | 67 | &self.scopes[scope].entries |
68 | } | 68 | } |
69 | 69 | ||
70 | pub(crate) fn scope_chain<'a>( | 70 | pub(crate) fn scope_chain(&self, scope: Option<ScopeId>) -> impl Iterator<Item = ScopeId> + '_ { |
71 | &'a self, | ||
72 | scope: Option<ScopeId>, | ||
73 | ) -> impl Iterator<Item = ScopeId> + 'a { | ||
74 | std::iter::successors(scope, move |&scope| self.scopes[scope].parent) | 71 | std::iter::successors(scope, move |&scope| self.scopes[scope].parent) |
75 | } | 72 | } |
76 | 73 | ||
diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index 9899bdbbc..c95d2cdd0 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs | |||
@@ -1,5 +1,6 @@ | |||
1 | //! FIXME: write short doc here | 1 | //! FIXME: write short doc here |
2 | 2 | ||
3 | use hir_def::{StructId, StructOrUnionId, UnionId}; | ||
3 | use hir_expand::name::AsName; | 4 | use hir_expand::name::AsName; |
4 | use ra_syntax::ast::{self, AstNode, NameOwner}; | 5 | use ra_syntax::ast::{self, AstNode, NameOwner}; |
5 | 6 | ||
@@ -15,18 +16,19 @@ pub trait FromSource: Sized { | |||
15 | fn from_source(db: &(impl DefDatabase + AstDatabase), src: Source<Self::Ast>) -> Option<Self>; | 16 | fn from_source(db: &(impl DefDatabase + AstDatabase), src: Source<Self::Ast>) -> Option<Self>; |
16 | } | 17 | } |
17 | 18 | ||
19 | // FIXIME: these two impls are wrong, `ast::StructDef` might produce either a struct or a union | ||
18 | impl FromSource for Struct { | 20 | impl FromSource for Struct { |
19 | type Ast = ast::StructDef; | 21 | type Ast = ast::StructDef; |
20 | fn from_source(db: &(impl DefDatabase + AstDatabase), src: Source<Self::Ast>) -> Option<Self> { | 22 | fn from_source(db: &(impl DefDatabase + AstDatabase), src: Source<Self::Ast>) -> Option<Self> { |
21 | let id = from_source(db, src)?; | 23 | let id: StructOrUnionId = from_source(db, src)?; |
22 | Some(Struct { id }) | 24 | Some(Struct { id: StructId(id) }) |
23 | } | 25 | } |
24 | } | 26 | } |
25 | impl FromSource for Union { | 27 | impl FromSource for Union { |
26 | type Ast = ast::StructDef; | 28 | type Ast = ast::StructDef; |
27 | fn from_source(db: &(impl DefDatabase + AstDatabase), src: Source<Self::Ast>) -> Option<Self> { | 29 | fn from_source(db: &(impl DefDatabase + AstDatabase), src: Source<Self::Ast>) -> Option<Self> { |
28 | let id = from_source(db, src)?; | 30 | let id: StructOrUnionId = from_source(db, src)?; |
29 | Some(Union { id }) | 31 | Some(Union { id: UnionId(id) }) |
30 | } | 32 | } |
31 | } | 33 | } |
32 | impl FromSource for Enum { | 34 | impl FromSource for Enum { |
diff --git a/crates/ra_hir/src/ty/lower.rs b/crates/ra_hir/src/ty/lower.rs index d26b16cb2..1fed5025e 100644 --- a/crates/ra_hir/src/ty/lower.rs +++ b/crates/ra_hir/src/ty/lower.rs | |||
@@ -665,7 +665,7 @@ fn type_for_builtin(def: BuiltinType) -> Ty { | |||
665 | } | 665 | } |
666 | 666 | ||
667 | fn fn_sig_for_struct_constructor(db: &impl HirDatabase, def: Struct) -> FnSig { | 667 | fn fn_sig_for_struct_constructor(db: &impl HirDatabase, def: Struct) -> FnSig { |
668 | let struct_data = db.struct_data(def.id); | 668 | let struct_data = db.struct_data(def.id.into()); |
669 | let fields = match struct_data.variant_data.fields() { | 669 | let fields = match struct_data.variant_data.fields() { |
670 | Some(fields) => fields, | 670 | Some(fields) => fields, |
671 | None => panic!("fn_sig_for_struct_constructor called on unit struct"), | 671 | None => panic!("fn_sig_for_struct_constructor called on unit struct"), |
@@ -681,7 +681,7 @@ fn fn_sig_for_struct_constructor(db: &impl HirDatabase, def: Struct) -> FnSig { | |||
681 | 681 | ||
682 | /// Build the type of a tuple struct constructor. | 682 | /// Build the type of a tuple struct constructor. |
683 | fn type_for_struct_constructor(db: &impl HirDatabase, def: Struct) -> Ty { | 683 | fn type_for_struct_constructor(db: &impl HirDatabase, def: Struct) -> Ty { |
684 | let struct_data = db.struct_data(def.id); | 684 | let struct_data = db.struct_data(def.id.into()); |
685 | if struct_data.variant_data.fields().is_none() { | 685 | if struct_data.variant_data.fields().is_none() { |
686 | return type_for_adt(db, def); // Unit struct | 686 | return type_for_adt(db, def); // Unit struct |
687 | } | 687 | } |
diff --git a/crates/ra_hir_def/src/adt.rs b/crates/ra_hir_def/src/adt.rs index 8f41e55d2..a29c4d41e 100644 --- a/crates/ra_hir_def/src/adt.rs +++ b/crates/ra_hir_def/src/adt.rs | |||
@@ -8,7 +8,7 @@ use ra_syntax::ast::{self, NameOwner, TypeAscriptionOwner}; | |||
8 | 8 | ||
9 | use crate::{ | 9 | use crate::{ |
10 | db::DefDatabase2, type_ref::TypeRef, AstItemDef, EnumId, LocalEnumVariantId, | 10 | db::DefDatabase2, type_ref::TypeRef, AstItemDef, EnumId, LocalEnumVariantId, |
11 | LocalStructFieldId, StructId, UnionId, | 11 | LocalStructFieldId, StructOrUnionId, |
12 | }; | 12 | }; |
13 | 13 | ||
14 | /// Note that we use `StructData` for unions as well! | 14 | /// Note that we use `StructData` for unions as well! |
@@ -49,15 +49,11 @@ pub struct StructFieldData { | |||
49 | } | 49 | } |
50 | 50 | ||
51 | impl StructData { | 51 | impl StructData { |
52 | pub(crate) fn struct_data_query(db: &impl DefDatabase2, struct_: StructId) -> Arc<StructData> { | 52 | pub(crate) fn struct_data_query( |
53 | let src = struct_.source(db); | 53 | db: &impl DefDatabase2, |
54 | let name = src.ast.name().map(|n| n.as_name()); | 54 | id: StructOrUnionId, |
55 | let variant_data = VariantData::new(src.ast.kind()); | 55 | ) -> Arc<StructData> { |
56 | let variant_data = Arc::new(variant_data); | 56 | let src = id.source(db); |
57 | Arc::new(StructData { name, variant_data }) | ||
58 | } | ||
59 | pub(crate) fn union_data_query(db: &impl DefDatabase2, struct_: UnionId) -> Arc<StructData> { | ||
60 | let src = struct_.source(db); | ||
61 | let name = src.ast.name().map(|n| n.as_name()); | 57 | let name = src.ast.name().map(|n| n.as_name()); |
62 | let variant_data = VariantData::new(src.ast.kind()); | 58 | let variant_data = VariantData::new(src.ast.kind()); |
63 | let variant_data = Arc::new(variant_data); | 59 | let variant_data = Arc::new(variant_data); |
diff --git a/crates/ra_hir_def/src/db.rs b/crates/ra_hir_def/src/db.rs index a42348101..29cf71a59 100644 --- a/crates/ra_hir_def/src/db.rs +++ b/crates/ra_hir_def/src/db.rs | |||
@@ -11,7 +11,7 @@ use crate::{ | |||
11 | raw::{ImportSourceMap, RawItems}, | 11 | raw::{ImportSourceMap, RawItems}, |
12 | CrateDefMap, | 12 | CrateDefMap, |
13 | }, | 13 | }, |
14 | EnumId, StructId, UnionId, | 14 | EnumId, StructOrUnionId, |
15 | }; | 15 | }; |
16 | 16 | ||
17 | #[salsa::query_group(InternDatabaseStorage)] | 17 | #[salsa::query_group(InternDatabaseStorage)] |
@@ -19,9 +19,8 @@ pub trait InternDatabase: SourceDatabase { | |||
19 | #[salsa::interned] | 19 | #[salsa::interned] |
20 | fn intern_function(&self, loc: crate::ItemLoc<ast::FnDef>) -> crate::FunctionId; | 20 | fn intern_function(&self, loc: crate::ItemLoc<ast::FnDef>) -> crate::FunctionId; |
21 | #[salsa::interned] | 21 | #[salsa::interned] |
22 | fn intern_struct(&self, loc: crate::ItemLoc<ast::StructDef>) -> crate::StructId; | 22 | fn intern_struct_or_union(&self, loc: crate::ItemLoc<ast::StructDef>) |
23 | #[salsa::interned] | 23 | -> crate::StructOrUnionId; |
24 | fn intern_union(&self, loc: crate::ItemLoc<ast::StructDef>) -> crate::UnionId; | ||
25 | #[salsa::interned] | 24 | #[salsa::interned] |
26 | fn intern_enum(&self, loc: crate::ItemLoc<ast::EnumDef>) -> crate::EnumId; | 25 | fn intern_enum(&self, loc: crate::ItemLoc<ast::EnumDef>) -> crate::EnumId; |
27 | #[salsa::interned] | 26 | #[salsa::interned] |
@@ -49,10 +48,7 @@ pub trait DefDatabase2: InternDatabase + AstDatabase { | |||
49 | fn crate_def_map(&self, krate: CrateId) -> Arc<CrateDefMap>; | 48 | fn crate_def_map(&self, krate: CrateId) -> Arc<CrateDefMap>; |
50 | 49 | ||
51 | #[salsa::invoke(StructData::struct_data_query)] | 50 | #[salsa::invoke(StructData::struct_data_query)] |
52 | fn struct_data(&self, s: StructId) -> Arc<StructData>; | 51 | fn struct_data(&self, id: StructOrUnionId) -> Arc<StructData>; |
53 | |||
54 | #[salsa::invoke(StructData::union_data_query)] | ||
55 | fn union_data(&self, s: UnionId) -> Arc<StructData>; | ||
56 | 52 | ||
57 | #[salsa::invoke(EnumData::enum_data_query)] | 53 | #[salsa::invoke(EnumData::enum_data_query)] |
58 | fn enum_data(&self, e: EnumId) -> Arc<EnumData>; | 54 | fn enum_data(&self, e: EnumId) -> Arc<EnumData>; |
diff --git a/crates/ra_hir_def/src/lib.rs b/crates/ra_hir_def/src/lib.rs index 63ed2a098..239317efe 100644 --- a/crates/ra_hir_def/src/lib.rs +++ b/crates/ra_hir_def/src/lib.rs | |||
@@ -205,26 +205,30 @@ impl AstItemDef<ast::FnDef> for FunctionId { | |||
205 | } | 205 | } |
206 | 206 | ||
207 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | 207 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
208 | pub struct StructId(salsa::InternId); | 208 | pub struct StructOrUnionId(salsa::InternId); |
209 | impl_intern_key!(StructId); | 209 | impl_intern_key!(StructOrUnionId); |
210 | impl AstItemDef<ast::StructDef> for StructId { | 210 | impl AstItemDef<ast::StructDef> for StructOrUnionId { |
211 | fn intern(db: &impl InternDatabase, loc: ItemLoc<ast::StructDef>) -> Self { | 211 | fn intern(db: &impl InternDatabase, loc: ItemLoc<ast::StructDef>) -> Self { |
212 | db.intern_struct(loc) | 212 | db.intern_struct_or_union(loc) |
213 | } | 213 | } |
214 | fn lookup_intern(self, db: &impl InternDatabase) -> ItemLoc<ast::StructDef> { | 214 | fn lookup_intern(self, db: &impl InternDatabase) -> ItemLoc<ast::StructDef> { |
215 | db.lookup_intern_struct(self) | 215 | db.lookup_intern_struct_or_union(self) |
216 | } | 216 | } |
217 | } | 217 | } |
218 | 218 | ||
219 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | 219 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
220 | pub struct UnionId(salsa::InternId); | 220 | pub struct StructId(pub StructOrUnionId); |
221 | impl_intern_key!(UnionId); | 221 | impl From<StructId> for StructOrUnionId { |
222 | impl AstItemDef<ast::StructDef> for UnionId { | 222 | fn from(id: StructId) -> StructOrUnionId { |
223 | fn intern(db: &impl InternDatabase, loc: ItemLoc<ast::StructDef>) -> Self { | 223 | id.0 |
224 | db.intern_union(loc) | ||
225 | } | 224 | } |
226 | fn lookup_intern(self, db: &impl InternDatabase) -> ItemLoc<ast::StructDef> { | 225 | } |
227 | db.lookup_intern_union(self) | 226 | |
227 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | ||
228 | pub struct UnionId(pub StructOrUnionId); | ||
229 | impl From<UnionId> for StructOrUnionId { | ||
230 | fn from(id: UnionId) -> StructOrUnionId { | ||
231 | id.0 | ||
228 | } | 232 | } |
229 | } | 233 | } |
230 | 234 | ||
diff --git a/crates/ra_hir_def/src/nameres/collector.rs b/crates/ra_hir_def/src/nameres/collector.rs index aacd50df8..7e6083961 100644 --- a/crates/ra_hir_def/src/nameres/collector.rs +++ b/crates/ra_hir_def/src/nameres/collector.rs | |||
@@ -19,7 +19,8 @@ use crate::{ | |||
19 | }, | 19 | }, |
20 | path::{Path, PathKind}, | 20 | path::{Path, PathKind}, |
21 | AdtId, AstId, AstItemDef, ConstId, CrateModuleId, EnumId, EnumVariantId, FunctionId, | 21 | AdtId, AstId, AstItemDef, ConstId, CrateModuleId, EnumId, EnumVariantId, FunctionId, |
22 | LocationCtx, ModuleDefId, ModuleId, StaticId, StructId, TraitId, TypeAliasId, UnionId, | 22 | LocationCtx, ModuleDefId, ModuleId, StaticId, StructId, StructOrUnionId, TraitId, TypeAliasId, |
23 | UnionId, | ||
23 | }; | 24 | }; |
24 | 25 | ||
25 | pub(super) fn collect_defs(db: &impl DefDatabase2, mut def_map: CrateDefMap) -> CrateDefMap { | 26 | pub(super) fn collect_defs(db: &impl DefDatabase2, mut def_map: CrateDefMap) -> CrateDefMap { |
@@ -664,12 +665,14 @@ where | |||
664 | PerNs::values(FunctionId::from_ast_id(ctx, ast_id).into()) | 665 | PerNs::values(FunctionId::from_ast_id(ctx, ast_id).into()) |
665 | } | 666 | } |
666 | raw::DefKind::Struct(ast_id) => { | 667 | raw::DefKind::Struct(ast_id) => { |
667 | let s = StructId::from_ast_id(ctx, ast_id).into(); | 668 | let id = StructOrUnionId::from_ast_id(ctx, ast_id).into(); |
669 | let s = StructId(id).into(); | ||
668 | PerNs::both(s, s) | 670 | PerNs::both(s, s) |
669 | } | 671 | } |
670 | raw::DefKind::Union(ast_id) => { | 672 | raw::DefKind::Union(ast_id) => { |
671 | let s = UnionId::from_ast_id(ctx, ast_id).into(); | 673 | let id = StructOrUnionId::from_ast_id(ctx, ast_id).into(); |
672 | PerNs::both(s, s) | 674 | let u = UnionId(id).into(); |
675 | PerNs::both(u, u) | ||
673 | } | 676 | } |
674 | raw::DefKind::Enum(ast_id) => PerNs::types(EnumId::from_ast_id(ctx, ast_id).into()), | 677 | raw::DefKind::Enum(ast_id) => PerNs::types(EnumId::from_ast_id(ctx, ast_id).into()), |
675 | raw::DefKind::Const(ast_id) => PerNs::values(ConstId::from_ast_id(ctx, ast_id).into()), | 678 | raw::DefKind::Const(ast_id) => PerNs::values(ConstId::from_ast_id(ctx, ast_id).into()), |