diff options
Diffstat (limited to 'crates')
-rw-r--r-- | crates/ra_ide/src/goto_definition.rs | 13 | ||||
-rw-r--r-- | crates/ra_ide/src/hover.rs | 6 | ||||
-rw-r--r-- | crates/ra_ide/src/references.rs | 2 | ||||
-rw-r--r-- | crates/ra_ide/src/syntax_highlighting.rs | 16 | ||||
-rw-r--r-- | crates/ra_ide_db/src/defs.rs | 27 | ||||
-rw-r--r-- | crates/ra_ide_db/src/imports_locator.rs | 3 |
6 files changed, 44 insertions, 23 deletions
diff --git a/crates/ra_ide/src/goto_definition.rs b/crates/ra_ide/src/goto_definition.rs index 6053c1bb6..621ab982c 100644 --- a/crates/ra_ide/src/goto_definition.rs +++ b/crates/ra_ide/src/goto_definition.rs | |||
@@ -30,7 +30,9 @@ pub(crate) fn goto_definition( | |||
30 | reference_definition(&sema, &name_ref).to_vec() | 30 | reference_definition(&sema, &name_ref).to_vec() |
31 | }, | 31 | }, |
32 | ast::Name(name) => { | 32 | 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] | ||
34 | }, | 36 | }, |
35 | _ => return None, | 37 | _ => return None, |
36 | } | 38 | } |
@@ -88,15 +90,6 @@ pub(crate) fn reference_definition( | |||
88 | Approximate(navs) | 90 | Approximate(navs) |
89 | } | 91 | } |
90 | 92 | ||
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 | |||
100 | #[cfg(test)] | 93 | #[cfg(test)] |
101 | mod tests { | 94 | mod tests { |
102 | use test_utils::{assert_eq_text, covers}; | 95 | use test_utils::{assert_eq_text, covers}; |
diff --git a/crates/ra_ide/src/hover.rs b/crates/ra_ide/src/hover.rs index 7ba4bfcac..1e4fcdefb 100644 --- a/crates/ra_ide/src/hover.rs +++ b/crates/ra_ide/src/hover.rs | |||
@@ -156,7 +156,7 @@ pub(crate) fn hover(db: &RootDatabase, position: FilePosition) -> Option<RangeIn | |||
156 | classify_name_ref(&sema, &name_ref).map(|d| (name_ref.syntax().clone(), d)) | 156 | classify_name_ref(&sema, &name_ref).map(|d| (name_ref.syntax().clone(), d)) |
157 | }, | 157 | }, |
158 | ast::Name(name) => { | 158 | 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())) |
160 | }, | 160 | }, |
161 | _ => None, | 161 | _ => None, |
162 | } | 162 | } |
@@ -761,13 +761,13 @@ fn func(foo: i32) { if true { <|>foo; }; } | |||
761 | fn test_hover_through_literal_string_in_builtin_macro() { | 761 | fn test_hover_through_literal_string_in_builtin_macro() { |
762 | check_hover_no_result( | 762 | check_hover_no_result( |
763 | r#" | 763 | r#" |
764 | //- /lib.rs | 764 | //- /lib.rs |
765 | #[rustc_builtin_macro] | 765 | #[rustc_builtin_macro] |
766 | macro_rules! assert { | 766 | macro_rules! assert { |
767 | ($cond:expr) => {{ /* compiler built-in */ }}; | 767 | ($cond:expr) => {{ /* compiler built-in */ }}; |
768 | ($cond:expr,) => {{ /* compiler built-in */ }}; | 768 | ($cond:expr,) => {{ /* compiler built-in */ }}; |
769 | ($cond:expr, $($arg:tt)+) => {{ /* compiler built-in */ }}; | 769 | ($cond:expr, $($arg:tt)+) => {{ /* compiler built-in */ }}; |
770 | } | 770 | } |
771 | 771 | ||
772 | fn foo() { | 772 | fn foo() { |
773 | assert!("hel<|>lo"); | 773 | assert!("hel<|>lo"); |
diff --git a/crates/ra_ide/src/references.rs b/crates/ra_ide/src/references.rs index baa8a4d29..f763013ae 100644 --- a/crates/ra_ide/src/references.rs +++ b/crates/ra_ide/src/references.rs | |||
@@ -155,7 +155,7 @@ fn find_name( | |||
155 | opt_name: Option<ast::Name>, | 155 | opt_name: Option<ast::Name>, |
156 | ) -> Option<RangeInfo<(String, NameDefinition)>> { | 156 | ) -> Option<RangeInfo<(String, NameDefinition)>> { |
157 | if let Some(name) = opt_name { | 157 | if let Some(name) = opt_name { |
158 | let def = classify_name(sema, &name)?; | 158 | let def = classify_name(sema, &name)?.definition(); |
159 | let range = name.syntax().text_range(); | 159 | let range = name.syntax().text_range(); |
160 | return Some(RangeInfo::new(range, (name.text().to_string(), def))); | 160 | return Some(RangeInfo::new(range, (name.text().to_string(), def))); |
161 | } | 161 | } |
diff --git a/crates/ra_ide/src/syntax_highlighting.rs b/crates/ra_ide/src/syntax_highlighting.rs index c0f7c1c9f..6312bcb83 100644 --- a/crates/ra_ide/src/syntax_highlighting.rs +++ b/crates/ra_ide/src/syntax_highlighting.rs | |||
@@ -7,7 +7,7 @@ mod tests; | |||
7 | 7 | ||
8 | use hir::{Name, Semantics}; | 8 | use hir::{Name, Semantics}; |
9 | use ra_ide_db::{ | 9 | use ra_ide_db::{ |
10 | defs::{classify_name, NameDefinition}, | 10 | defs::{classify_name, NameClass, NameDefinition}, |
11 | RootDatabase, | 11 | RootDatabase, |
12 | }; | 12 | }; |
13 | use ra_prof::profile; | 13 | use ra_prof::profile; |
@@ -169,7 +169,7 @@ fn highlight_element( | |||
169 | let name = element.into_node().and_then(ast::Name::cast).unwrap(); | 169 | let name = element.into_node().and_then(ast::Name::cast).unwrap(); |
170 | let name_kind = classify_name(sema, &name); | 170 | let name_kind = classify_name(sema, &name); |
171 | 171 | ||
172 | if let Some(NameDefinition::Local(local)) = &name_kind { | 172 | if let Some(NameClass::NameDefinition(NameDefinition::Local(local))) = &name_kind { |
173 | if let Some(name) = local.name(db) { | 173 | if let Some(name) = local.name(db) { |
174 | let shadow_count = bindings_shadow_count.entry(name.clone()).or_default(); | 174 | let shadow_count = bindings_shadow_count.entry(name.clone()).or_default(); |
175 | *shadow_count += 1; | 175 | *shadow_count += 1; |
@@ -177,11 +177,13 @@ fn highlight_element( | |||
177 | } | 177 | } |
178 | }; | 178 | }; |
179 | 179 | ||
180 | let h = match name_kind { | 180 | match name_kind { |
181 | Some(name_kind) => highlight_name(db, name_kind), | 181 | Some(NameClass::NameDefinition(def)) => { |
182 | None => highlight_name_by_syntax(name), | 182 | highlight_name(db, def) | HighlightModifier::Definition |
183 | }; | 183 | } |
184 | h | HighlightModifier::Definition | 184 | Some(NameClass::ConstReference(def)) => highlight_name(db, def), |
185 | None => highlight_name_by_syntax(name) | HighlightModifier::Definition, | ||
186 | } | ||
185 | } | 187 | } |
186 | 188 | ||
187 | // Highlight references like the definitions they resolve to | 189 | // Highlight references like the definitions they resolve to |
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 | } |