diff options
Diffstat (limited to 'crates/ra_hir/src/code_model.rs')
-rw-r--r-- | crates/ra_hir/src/code_model.rs | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index b32aa145e..ae6ef7606 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs | |||
@@ -6,16 +6,17 @@ pub(crate) mod docs; | |||
6 | use std::sync::Arc; | 6 | use std::sync::Arc; |
7 | 7 | ||
8 | use hir_def::{ | 8 | use hir_def::{ |
9 | adt::VariantData, | ||
9 | builtin_type::BuiltinType, | 10 | builtin_type::BuiltinType, |
10 | type_ref::{Mutability, TypeRef}, | 11 | type_ref::{Mutability, TypeRef}, |
11 | CrateModuleId, LocalEnumVariantId, ModuleId, | 12 | CrateModuleId, LocalEnumVariantId, LocalStructFieldId, ModuleId, |
12 | }; | 13 | }; |
13 | use hir_expand::name::{self, AsName}; | 14 | use hir_expand::name::{self, AsName}; |
14 | use ra_db::{CrateId, Edition}; | 15 | use ra_db::{CrateId, Edition}; |
15 | use ra_syntax::ast::{self, NameOwner, TypeAscriptionOwner}; | 16 | use ra_syntax::ast::{self, NameOwner, TypeAscriptionOwner}; |
16 | 17 | ||
17 | use crate::{ | 18 | use crate::{ |
18 | adt::{StructFieldId, VariantDef}, | 19 | adt::VariantDef, |
19 | db::{AstDatabase, DefDatabase, HirDatabase}, | 20 | db::{AstDatabase, DefDatabase, HirDatabase}, |
20 | diagnostics::DiagnosticSink, | 21 | diagnostics::DiagnosticSink, |
21 | expr::{validation::ExprValidator, Body, BodySourceMap}, | 22 | expr::{validation::ExprValidator, Body, BodySourceMap}, |
@@ -250,7 +251,7 @@ impl Module { | |||
250 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | 251 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
251 | pub struct StructField { | 252 | pub struct StructField { |
252 | pub(crate) parent: VariantDef, | 253 | pub(crate) parent: VariantDef, |
253 | pub(crate) id: StructFieldId, | 254 | pub(crate) id: LocalStructFieldId, |
254 | } | 255 | } |
255 | 256 | ||
256 | #[derive(Debug, PartialEq, Eq)] | 257 | #[derive(Debug, PartialEq, Eq)] |
@@ -288,11 +289,11 @@ impl Struct { | |||
288 | } | 289 | } |
289 | 290 | ||
290 | pub fn name(self, db: &impl DefDatabase) -> Option<Name> { | 291 | pub fn name(self, db: &impl DefDatabase) -> Option<Name> { |
291 | db.struct_data(self).name.clone() | 292 | db.struct_data(self.id).name.clone() |
292 | } | 293 | } |
293 | 294 | ||
294 | pub fn fields(self, db: &impl HirDatabase) -> Vec<StructField> { | 295 | pub fn fields(self, db: &impl HirDatabase) -> Vec<StructField> { |
295 | db.struct_data(self) | 296 | db.struct_data(self.id) |
296 | .variant_data | 297 | .variant_data |
297 | .fields() | 298 | .fields() |
298 | .into_iter() | 299 | .into_iter() |
@@ -302,7 +303,7 @@ impl Struct { | |||
302 | } | 303 | } |
303 | 304 | ||
304 | pub fn field(self, db: &impl HirDatabase, name: &Name) -> Option<StructField> { | 305 | pub fn field(self, db: &impl HirDatabase, name: &Name) -> Option<StructField> { |
305 | db.struct_data(self) | 306 | db.struct_data(self.id) |
306 | .variant_data | 307 | .variant_data |
307 | .fields() | 308 | .fields() |
308 | .into_iter() | 309 | .into_iter() |
@@ -338,7 +339,7 @@ pub struct Union { | |||
338 | 339 | ||
339 | impl Union { | 340 | impl Union { |
340 | pub fn name(self, db: &impl DefDatabase) -> Option<Name> { | 341 | pub fn name(self, db: &impl DefDatabase) -> Option<Name> { |
341 | db.struct_data(Struct { id: self.id }).name.clone() | 342 | db.struct_data(self.id).name.clone() |
342 | } | 343 | } |
343 | 344 | ||
344 | pub fn module(self, db: &impl HirDatabase) -> Module { | 345 | pub fn module(self, db: &impl HirDatabase) -> Module { |
@@ -376,15 +377,19 @@ impl Enum { | |||
376 | } | 377 | } |
377 | 378 | ||
378 | pub fn name(self, db: &impl DefDatabase) -> Option<Name> { | 379 | pub fn name(self, db: &impl DefDatabase) -> Option<Name> { |
379 | db.enum_data(self).name.clone() | 380 | db.enum_data(self.id).name.clone() |
380 | } | 381 | } |
381 | 382 | ||
382 | pub fn variants(self, db: &impl DefDatabase) -> Vec<EnumVariant> { | 383 | pub fn variants(self, db: &impl DefDatabase) -> Vec<EnumVariant> { |
383 | db.enum_data(self).variants.iter().map(|(id, _)| EnumVariant { parent: self, id }).collect() | 384 | db.enum_data(self.id) |
385 | .variants | ||
386 | .iter() | ||
387 | .map(|(id, _)| EnumVariant { parent: self, id }) | ||
388 | .collect() | ||
384 | } | 389 | } |
385 | 390 | ||
386 | pub fn variant(self, db: &impl DefDatabase, name: &Name) -> Option<EnumVariant> { | 391 | pub fn variant(self, db: &impl DefDatabase, name: &Name) -> Option<EnumVariant> { |
387 | db.enum_data(self) | 392 | db.enum_data(self.id) |
388 | .variants | 393 | .variants |
389 | .iter() | 394 | .iter() |
390 | .find(|(_id, data)| data.name.as_ref() == Some(name)) | 395 | .find(|(_id, data)| data.name.as_ref() == Some(name)) |
@@ -422,7 +427,7 @@ impl EnumVariant { | |||
422 | } | 427 | } |
423 | 428 | ||
424 | pub fn name(self, db: &impl DefDatabase) -> Option<Name> { | 429 | pub fn name(self, db: &impl DefDatabase) -> Option<Name> { |
425 | db.enum_data(self.parent).variants[self.id].name.clone() | 430 | db.enum_data(self.parent.id).variants[self.id].name.clone() |
426 | } | 431 | } |
427 | 432 | ||
428 | pub fn fields(self, db: &impl HirDatabase) -> Vec<StructField> { | 433 | pub fn fields(self, db: &impl HirDatabase) -> Vec<StructField> { |
@@ -442,6 +447,10 @@ impl EnumVariant { | |||
442 | .find(|(_id, data)| data.name == *name) | 447 | .find(|(_id, data)| data.name == *name) |
443 | .map(|(id, _)| StructField { parent: self.into(), id }) | 448 | .map(|(id, _)| StructField { parent: self.into(), id }) |
444 | } | 449 | } |
450 | |||
451 | pub(crate) fn variant_data(self, db: &impl DefDatabase) -> Arc<VariantData> { | ||
452 | db.enum_data(self.parent.id).variants[self.id].variant_data.clone() | ||
453 | } | ||
445 | } | 454 | } |
446 | 455 | ||
447 | /// A Data Type | 456 | /// A Data Type |