diff options
author | Marcus Klaas de Vries <[email protected]> | 2019-01-10 01:07:42 +0000 |
---|---|---|
committer | Marcus Klaas de Vries <[email protected]> | 2019-01-10 13:43:01 +0000 |
commit | e78286c8e88d31045d354320a1d29bbd75405027 (patch) | |
tree | ed4c6f986b6ede2bbafa19a66dd81f5be2d0371c | |
parent | 978de5cf8bfd2ff82696fc8d5369b41e147431c3 (diff) |
Save variant names in EnumData to reduce needless queries
We already have their names when anyway, and when in all (current)
situations where we're interested in an Enum's variants, we want
their names.
-rw-r--r-- | crates/ra_hir/src/adt.rs | 29 | ||||
-rw-r--r-- | crates/ra_hir/src/code_model_api.rs | 2 | ||||
-rw-r--r-- | crates/ra_hir/src/code_model_impl/module.rs | 18 | ||||
-rw-r--r-- | crates/ra_ide_api/src/completion/complete_path.rs | 15 |
4 files changed, 25 insertions, 39 deletions
diff --git a/crates/ra_hir/src/adt.rs b/crates/ra_hir/src/adt.rs index f1b98cdd7..bcb705c24 100644 --- a/crates/ra_hir/src/adt.rs +++ b/crates/ra_hir/src/adt.rs | |||
@@ -7,13 +7,9 @@ use ra_syntax::{ | |||
7 | }; | 7 | }; |
8 | 8 | ||
9 | use crate::{ | 9 | use crate::{ |
10 | <<<<<<< HEAD | ||
11 | DefId, Name, AsName, Struct, Enum, HirDatabase, DefKind, | ||
12 | ======= | ||
13 | DefId, DefLoc, Name, AsName, Struct, Enum, EnumVariant, | 10 | DefId, DefLoc, Name, AsName, Struct, Enum, EnumVariant, |
14 | VariantData, StructField, HirDatabase, DefKind, | 11 | HirDatabase, DefKind, |
15 | SourceItemId, | 12 | SourceItemId, |
16 | >>>>>>> 95ac72a3... Implement type inference for enum variants | ||
17 | type_ref::TypeRef, | 13 | type_ref::TypeRef, |
18 | }; | 14 | }; |
19 | 15 | ||
@@ -79,13 +75,11 @@ fn get_def_id( | |||
79 | #[derive(Debug, Clone, PartialEq, Eq)] | 75 | #[derive(Debug, Clone, PartialEq, Eq)] |
80 | pub struct EnumData { | 76 | pub struct EnumData { |
81 | pub(crate) name: Option<Name>, | 77 | pub(crate) name: Option<Name>, |
82 | // TODO: keep track of names also since we already have them? | 78 | pub(crate) variants: Vec<(Name, EnumVariant)>, |
83 | // then we won't need additional db lookups | ||
84 | pub(crate) variants: Option<Vec<EnumVariant>>, | ||
85 | } | 79 | } |
86 | 80 | ||
87 | impl EnumData { | 81 | impl EnumData { |
88 | fn new(enum_def: &ast::EnumDef, variants: Option<Vec<EnumVariant>>) -> Self { | 82 | fn new(enum_def: &ast::EnumDef, variants: Vec<(Name, EnumVariant)>) -> Self { |
89 | let name = enum_def.name().map(|n| n.as_name()); | 83 | let name = enum_def.name().map(|n| n.as_name()); |
90 | EnumData { name, variants } | 84 | EnumData { name, variants } |
91 | } | 85 | } |
@@ -98,14 +92,21 @@ impl EnumData { | |||
98 | assert!(def_loc.kind == DefKind::Enum); | 92 | assert!(def_loc.kind == DefKind::Enum); |
99 | let syntax = db.file_item(def_loc.source_item_id); | 93 | let syntax = db.file_item(def_loc.source_item_id); |
100 | let enum_def = ast::EnumDef::cast(&syntax).expect("enum def should point to EnumDef node"); | 94 | let enum_def = ast::EnumDef::cast(&syntax).expect("enum def should point to EnumDef node"); |
101 | let variants = enum_def.variant_list().map(|vl| { | 95 | let variants = if let Some(vl) = enum_def.variant_list() { |
102 | vl.variants() | 96 | vl.variants() |
103 | .map(|ev| { | 97 | .filter_map(|variant_def| { |
104 | let def_id = get_def_id(db, &def_loc, ev.syntax(), DefKind::EnumVariant); | 98 | let name = variant_def.name().map(|n| n.as_name()); |
105 | EnumVariant::new(def_id) | 99 | |
100 | name.map(|n| { | ||
101 | let def_id = | ||
102 | get_def_id(db, &def_loc, variant_def.syntax(), DefKind::EnumVariant); | ||
103 | (n, EnumVariant::new(def_id)) | ||
104 | }) | ||
106 | }) | 105 | }) |
107 | .collect() | 106 | .collect() |
108 | }); | 107 | } else { |
108 | Vec::new() | ||
109 | }; | ||
109 | Ok(Arc::new(EnumData::new(enum_def, variants))) | 110 | Ok(Arc::new(EnumData::new(enum_def, variants))) |
110 | } | 111 | } |
111 | } | 112 | } |
diff --git a/crates/ra_hir/src/code_model_api.rs b/crates/ra_hir/src/code_model_api.rs index c7d1bf0a6..725bc7d80 100644 --- a/crates/ra_hir/src/code_model_api.rs +++ b/crates/ra_hir/src/code_model_api.rs | |||
@@ -201,7 +201,7 @@ impl Enum { | |||
201 | Ok(db.enum_data(self.def_id)?.name.clone()) | 201 | Ok(db.enum_data(self.def_id)?.name.clone()) |
202 | } | 202 | } |
203 | 203 | ||
204 | pub fn variants(&self, db: &impl HirDatabase) -> Cancelable<Option<Vec<EnumVariant>>> { | 204 | pub fn variants(&self, db: &impl HirDatabase) -> Cancelable<Vec<(Name, EnumVariant)>> { |
205 | Ok(db.enum_data(self.def_id)?.variants.clone()) | 205 | Ok(db.enum_data(self.def_id)?.variants.clone()) |
206 | } | 206 | } |
207 | } | 207 | } |
diff --git a/crates/ra_hir/src/code_model_impl/module.rs b/crates/ra_hir/src/code_model_impl/module.rs index d7d62e863..878dc37c8 100644 --- a/crates/ra_hir/src/code_model_impl/module.rs +++ b/crates/ra_hir/src/code_model_impl/module.rs | |||
@@ -142,20 +142,10 @@ impl Module { | |||
142 | Def::Enum(e) => { | 142 | Def::Enum(e) => { |
143 | if segments.len() == idx + 1 { | 143 | if segments.len() == idx + 1 { |
144 | // enum variant | 144 | // enum variant |
145 | let matching_variant = e.variants(db)?.map(|variants| { | 145 | let matching_variant = |
146 | variants | 146 | e.variants(db)?.into_iter().find(|(n, _variant)| n == name); |
147 | .into_iter() | 147 | |
148 | // FIXME: replace by match lol | 148 | if let Some((_n, variant)) = matching_variant { |
149 | .find(|variant| { | ||
150 | variant | ||
151 | .name(db) | ||
152 | .map(|o| o.map(|ref n| n == name)) | ||
153 | .unwrap_or(Some(false)) | ||
154 | .unwrap_or(false) | ||
155 | }) | ||
156 | }); | ||
157 | |||
158 | if let Some(Some(variant)) = matching_variant { | ||
159 | return Ok(PerNs::both(variant.def_id(), e.def_id())); | 149 | return Ok(PerNs::both(variant.def_id(), e.def_id())); |
160 | } else { | 150 | } else { |
161 | return Ok(PerNs::none()); | 151 | return Ok(PerNs::none()); |
diff --git a/crates/ra_ide_api/src/completion/complete_path.rs b/crates/ra_ide_api/src/completion/complete_path.rs index 6a55670d1..9bfec88d0 100644 --- a/crates/ra_ide_api/src/completion/complete_path.rs +++ b/crates/ra_ide_api/src/completion/complete_path.rs | |||
@@ -23,17 +23,12 @@ pub(super) fn complete_path(acc: &mut Completions, ctx: &CompletionContext) -> C | |||
23 | } | 23 | } |
24 | hir::Def::Enum(e) => { | 24 | hir::Def::Enum(e) => { |
25 | e.variants(ctx.db)? | 25 | e.variants(ctx.db)? |
26 | .unwrap_or(vec![]) | ||
27 | .into_iter() | 26 | .into_iter() |
28 | .for_each(|variant| { | 27 | .for_each(|(variant_name, _variant)| { |
29 | let variant_name = variant.name(ctx.db); | 28 | CompletionItem::new(CompletionKind::Reference, variant_name.to_string()) |
30 | 29 | .kind(CompletionItemKind::EnumVariant) | |
31 | if let Ok(Some(name)) = variant_name { | 30 | .add_to(acc) |
32 | CompletionItem::new(CompletionKind::Reference, name.to_string()) | 31 | }); |
33 | .kind(CompletionItemKind::EnumVariant) | ||
34 | .add_to(acc) | ||
35 | } | ||
36 | }) | ||
37 | } | 32 | } |
38 | _ => return Ok(()), | 33 | _ => return Ok(()), |
39 | }; | 34 | }; |