From 209eb32796c6fd56d1b378690c807cf73ce54235 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 28 Feb 2020 15:27:52 +0100 Subject: Classify name takes const patterns into account --- crates/ra_ide_db/src/defs.rs | 27 ++++++++++++++++++++++++++- crates/ra_ide_db/src/imports_locator.rs | 3 ++- 2 files changed, 28 insertions(+), 2 deletions(-) (limited to 'crates/ra_ide_db') 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 { } } -pub fn classify_name(sema: &Semantics, name: &ast::Name) -> Option { +pub enum NameClass { + NameDefinition(NameDefinition), + /// `None` in `if let None = Some(82) {}` + ConstReference(NameDefinition), +} + +impl NameClass { + pub fn into_definition(self) -> Option { + match self { + NameClass::NameDefinition(it) => Some(it), + NameClass::ConstReference(_) => None, + } + } + + pub fn definition(self) -> NameDefinition { + match self { + NameClass::NameDefinition(it) | NameClass::ConstReference(it) => it, + } + } +} + +pub fn classify_name(sema: &Semantics, name: &ast::Name) -> Option { + classify_name_inner(sema, name).map(NameClass::NameDefinition) +} + +fn classify_name_inner(sema: &Semantics, name: &ast::Name) -> Option { let _p = profile("classify_name"); let parent = name.syntax().parent()?; 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> { } else { candidate_node }; - classify_name(&self.sema, &ast::Name::cast(candidate_name_node)?) + let name = ast::Name::cast(candidate_name_node)?; + classify_name(&self.sema, &name)?.into_definition() } } -- cgit v1.2.3