Skip to content

Commit 209eb32

Browse files
committed
Classify name takes const patterns into account
1 parent 9ef6359 commit 209eb32

File tree

6 files changed

+44
-23
lines changed

6 files changed

+44
-23
lines changed

crates/ra_ide/src/goto_definition.rs

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ pub(crate) fn goto_definition(
3030
reference_definition(&sema, &name_ref).to_vec()
3131
},
3232
ast::Name(name) => {
33-
name_definition(&sema, &name)?
33+
let def = classify_name(&sema, &name)?.definition();
34+
let nav = def.try_to_nav(sema.db)?;
35+
vec![nav]
3436
},
3537
_ => return None,
3638
}
@@ -88,15 +90,6 @@ pub(crate) fn reference_definition(
8890
Approximate(navs)
8991
}
9092

91-
fn name_definition(
92-
sema: &Semantics<RootDatabase>,
93-
name: &ast::Name,
94-
) -> Option<Vec<NavigationTarget>> {
95-
let def = classify_name(sema, name)?;
96-
let nav = def.try_to_nav(sema.db)?;
97-
Some(vec![nav])
98-
}
99-
10093
#[cfg(test)]
10194
mod tests {
10295
use test_utils::{assert_eq_text, covers};

crates/ra_ide/src/hover.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ pub(crate) fn hover(db: &RootDatabase, position: FilePosition) -> Option<RangeIn
156156
classify_name_ref(&sema, &name_ref).map(|d| (name_ref.syntax().clone(), d))
157157
},
158158
ast::Name(name) => {
159-
classify_name(&sema, &name).map(|d| (name.syntax().clone(), d))
159+
classify_name(&sema, &name).map(|d| (name.syntax().clone(), d.definition()))
160160
},
161161
_ => None,
162162
}
@@ -761,13 +761,13 @@ fn func(foo: i32) { if true { <|>foo; }; }
761761
fn test_hover_through_literal_string_in_builtin_macro() {
762762
check_hover_no_result(
763763
r#"
764-
//- /lib.rs
764+
//- /lib.rs
765765
#[rustc_builtin_macro]
766766
macro_rules! assert {
767767
($cond:expr) => {{ /* compiler built-in */ }};
768768
($cond:expr,) => {{ /* compiler built-in */ }};
769769
($cond:expr, $($arg:tt)+) => {{ /* compiler built-in */ }};
770-
}
770+
}
771771
772772
fn foo() {
773773
assert!("hel<|>lo");

crates/ra_ide/src/references.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ fn find_name(
155155
opt_name: Option<ast::Name>,
156156
) -> Option<RangeInfo<(String, NameDefinition)>> {
157157
if let Some(name) = opt_name {
158-
let def = classify_name(sema, &name)?;
158+
let def = classify_name(sema, &name)?.definition();
159159
let range = name.syntax().text_range();
160160
return Some(RangeInfo::new(range, (name.text().to_string(), def)));
161161
}

crates/ra_ide/src/syntax_highlighting.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ mod tests;
77

88
use hir::{Name, Semantics};
99
use ra_ide_db::{
10-
defs::{classify_name, NameDefinition},
10+
defs::{classify_name, NameClass, NameDefinition},
1111
RootDatabase,
1212
};
1313
use ra_prof::profile;
@@ -169,19 +169,21 @@ fn highlight_element(
169169
let name = element.into_node().and_then(ast::Name::cast).unwrap();
170170
let name_kind = classify_name(sema, &name);
171171

172-
if let Some(NameDefinition::Local(local)) = &name_kind {
172+
if let Some(NameClass::NameDefinition(NameDefinition::Local(local))) = &name_kind {
173173
if let Some(name) = local.name(db) {
174174
let shadow_count = bindings_shadow_count.entry(name.clone()).or_default();
175175
*shadow_count += 1;
176176
binding_hash = Some(calc_binding_hash(&name, *shadow_count))
177177
}
178178
};
179179

180-
let h = match name_kind {
181-
Some(name_kind) => highlight_name(db, name_kind),
182-
None => highlight_name_by_syntax(name),
183-
};
184-
h | HighlightModifier::Definition
180+
match name_kind {
181+
Some(NameClass::NameDefinition(def)) => {
182+
highlight_name(db, def) | HighlightModifier::Definition
183+
}
184+
Some(NameClass::ConstReference(def)) => highlight_name(db, def),
185+
None => highlight_name_by_syntax(name) | HighlightModifier::Definition,
186+
}
185187
}
186188

187189
// Highlight references like the definitions they resolve to

crates/ra_ide_db/src/defs.rs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,32 @@ impl NameDefinition {
6868
}
6969
}
7070

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> {
7297
let _p = profile("classify_name");
7398
let parent = name.syntax().parent()?;
7499

crates/ra_ide_db/src/imports_locator.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ impl<'a> ImportsLocator<'a> {
5959
} else {
6060
candidate_node
6161
};
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()
6364
}
6465
}

0 commit comments

Comments
 (0)