diff options
author | Aleksey Kladov <[email protected]> | 2021-06-22 19:22:36 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2021-06-22 19:26:07 +0100 |
commit | 7be2d2f008595114e19aad0aa0608ddedfe3edf7 (patch) | |
tree | 61b75baa49f6b88c24fbda5f44ac734fed1f7d98 /crates/ide_db/src | |
parent | 9239943b84ec2bd687c4c80d2c3a0df4f8caf31c (diff) |
internal: remove one more accidentally quadratic code-path
Definition::visibility was implemented in a rather roundabout way -- by
asking the parent module about the effective visibility.
This is problematic for a couple of reasons:
* first, it doesn't work for local items
* second, asking module about visibility of a child is a linear
operation (that's a problem in itself, tracked in #9378)
Instead, lets ask the declared visibility directly, we have all the code
for it, and need only to actually us it.
Diffstat (limited to 'crates/ide_db/src')
-rw-r--r-- | crates/ide_db/src/defs.rs | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/crates/ide_db/src/defs.rs b/crates/ide_db/src/defs.rs index a54f2c323..fddd1fc2d 100644 --- a/crates/ide_db/src/defs.rs +++ b/crates/ide_db/src/defs.rs | |||
@@ -43,13 +43,29 @@ impl Definition { | |||
43 | 43 | ||
44 | pub fn visibility(&self, db: &RootDatabase) -> Option<Visibility> { | 44 | pub fn visibility(&self, db: &RootDatabase) -> Option<Visibility> { |
45 | match self { | 45 | match self { |
46 | Definition::Macro(_) => None, | ||
47 | Definition::Field(sf) => Some(sf.visibility(db)), | 46 | Definition::Field(sf) => Some(sf.visibility(db)), |
48 | Definition::ModuleDef(def) => def.definition_visibility(db), | 47 | Definition::ModuleDef(def) => match def { |
49 | Definition::SelfType(_) => None, | 48 | ModuleDef::Module(it) => { |
50 | Definition::Local(_) => None, | 49 | // FIXME: should work like other cases here. |
51 | Definition::GenericParam(_) => None, | 50 | let parent = it.parent(db)?; |
52 | Definition::Label(_) => None, | 51 | parent.visibility_of(db, def) |
52 | } | ||
53 | ModuleDef::Function(it) => Some(it.visibility(db)), | ||
54 | ModuleDef::Adt(it) => Some(it.visibility(db)), | ||
55 | ModuleDef::Const(it) => Some(it.visibility(db)), | ||
56 | ModuleDef::Static(it) => Some(it.visibility(db)), | ||
57 | ModuleDef::Trait(it) => Some(it.visibility(db)), | ||
58 | ModuleDef::TypeAlias(it) => Some(it.visibility(db)), | ||
59 | // NB: Variants don't have their own visibility, and just inherit | ||
60 | // one from the parent. Not sure if that's the right thing to do. | ||
61 | ModuleDef::Variant(it) => Some(it.parent_enum(db).visibility(db)), | ||
62 | ModuleDef::BuiltinType(_) => None, | ||
63 | }, | ||
64 | Definition::Macro(_) | ||
65 | | Definition::SelfType(_) | ||
66 | | Definition::Local(_) | ||
67 | | Definition::GenericParam(_) | ||
68 | | Definition::Label(_) => None, | ||
53 | } | 69 | } |
54 | } | 70 | } |
55 | 71 | ||