diff options
Diffstat (limited to 'crates/ra_ide_db')
-rw-r--r-- | crates/ra_ide_db/src/defs.rs | 27 | ||||
-rw-r--r-- | crates/ra_ide_db/src/imports_locator.rs | 3 |
2 files changed, 28 insertions, 2 deletions
diff --git a/crates/ra_ide_db/src/defs.rs b/crates/ra_ide_db/src/defs.rs index 484755158..3079d1197 100644 --- a/crates/ra_ide_db/src/defs.rs +++ b/crates/ra_ide_db/src/defs.rs | |||
@@ -68,7 +68,32 @@ impl NameDefinition { | |||
68 | } | 68 | } |
69 | } | 69 | } |
70 | 70 | ||
71 | pub fn classify_name(sema: &Semantics<RootDatabase>, name: &ast::Name) -> Option<NameDefinition> { | 71 | pub enum NameClass { |
72 | NameDefinition(NameDefinition), | ||
73 | /// `None` in `if let None = Some(82) {}` | ||
74 | ConstReference(NameDefinition), | ||
75 | } | ||
76 | |||
77 | impl NameClass { | ||
78 | pub fn into_definition(self) -> Option<NameDefinition> { | ||
79 | match self { | ||
80 | NameClass::NameDefinition(it) => Some(it), | ||
81 | NameClass::ConstReference(_) => None, | ||
82 | } | ||
83 | } | ||
84 | |||
85 | pub fn definition(self) -> NameDefinition { | ||
86 | match self { | ||
87 | NameClass::NameDefinition(it) | NameClass::ConstReference(it) => it, | ||
88 | } | ||
89 | } | ||
90 | } | ||
91 | |||
92 | pub fn classify_name(sema: &Semantics<RootDatabase>, name: &ast::Name) -> Option<NameClass> { | ||
93 | classify_name_inner(sema, name).map(NameClass::NameDefinition) | ||
94 | } | ||
95 | |||
96 | fn classify_name_inner(sema: &Semantics<RootDatabase>, name: &ast::Name) -> Option<NameDefinition> { | ||
72 | let _p = profile("classify_name"); | 97 | let _p = profile("classify_name"); |
73 | let parent = name.syntax().parent()?; | 98 | let parent = name.syntax().parent()?; |
74 | 99 | ||
diff --git a/crates/ra_ide_db/src/imports_locator.rs b/crates/ra_ide_db/src/imports_locator.rs index e590d2a5c..e5fc3c470 100644 --- a/crates/ra_ide_db/src/imports_locator.rs +++ b/crates/ra_ide_db/src/imports_locator.rs | |||
@@ -59,6 +59,7 @@ impl<'a> ImportsLocator<'a> { | |||
59 | } else { | 59 | } else { |
60 | candidate_node | 60 | candidate_node |
61 | }; | 61 | }; |
62 | classify_name(&self.sema, &ast::Name::cast(candidate_name_node)?) | 62 | let name = ast::Name::cast(candidate_name_node)?; |
63 | classify_name(&self.sema, &name)?.into_definition() | ||
63 | } | 64 | } |
64 | } | 65 | } |