From f42648e3058f99ae15917cb9ee4bc1a131fcc05c Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 11 Jul 2021 14:55:24 +0300 Subject: [PATCH 1/6] internal: remove needless distinction between a carte and its root mod --- crates/ide/src/syntax_highlighting/highlight.rs | 1 - .../test_data/highlight_extern_crate.html | 4 ++-- crates/ide_assists/src/handlers/add_turbo_fish.rs | 2 +- crates/ide_db/src/defs.rs | 9 ++++----- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/crates/ide/src/syntax_highlighting/highlight.rs b/crates/ide/src/syntax_highlighting/highlight.rs index e9b8eb407c5..ab48e5ad289 100644 --- a/crates/ide/src/syntax_highlighting/highlight.rs +++ b/crates/ide/src/syntax_highlighting/highlight.rs @@ -111,7 +111,6 @@ pub(super) fn element( } }; let h = match name_class { - NameRefClass::ExternCrate(_) => SymbolKind::Module.into(), NameRefClass::Definition(def) => { if let Definition::Local(local) = &def { if let Some(name) = local.name(db) { diff --git a/crates/ide/src/syntax_highlighting/test_data/highlight_extern_crate.html b/crates/ide/src/syntax_highlighting/test_data/highlight_extern_crate.html index 13f589cc0e2..957fe2f8656 100644 --- a/crates/ide/src/syntax_highlighting/test_data/highlight_extern_crate.html +++ b/crates/ide/src/syntax_highlighting/test_data/highlight_extern_crate.html @@ -38,6 +38,6 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd .unresolved_reference { color: #FC5555; text-decoration: wavy underline; } -
extern crate std;
-extern crate alloc as abc;
+
extern crate std;
+extern crate alloc as abc;
 
\ No newline at end of file diff --git a/crates/ide_assists/src/handlers/add_turbo_fish.rs b/crates/ide_assists/src/handlers/add_turbo_fish.rs index e4bb61c4e1c..d08111a90da 100644 --- a/crates/ide_assists/src/handlers/add_turbo_fish.rs +++ b/crates/ide_assists/src/handlers/add_turbo_fish.rs @@ -41,7 +41,7 @@ pub(crate) fn add_turbo_fish(acc: &mut Assists, ctx: &AssistContext) -> Option<( let name_ref = ast::NameRef::cast(ident.parent()?)?; let def = match NameRefClass::classify(&ctx.sema, &name_ref)? { NameRefClass::Definition(def) => def, - NameRefClass::ExternCrate(_) | NameRefClass::FieldShorthand { .. } => return None, + NameRefClass::FieldShorthand { .. } => return None, }; let fun = match def { Definition::ModuleDef(hir::ModuleDef::Function(it)) => it, diff --git a/crates/ide_db/src/defs.rs b/crates/ide_db/src/defs.rs index 4c7313f2f6d..60bf11a4e35 100644 --- a/crates/ide_db/src/defs.rs +++ b/crates/ide_db/src/defs.rs @@ -303,16 +303,14 @@ impl NameClass { /// reference to point to two different defs. #[derive(Debug)] pub enum NameRefClass { - ExternCrate(Crate), Definition(Definition), FieldShorthand { local_ref: Local, field_ref: Definition }, } impl NameRefClass { /// `Definition`, which this name refers to. - pub fn referenced(self, db: &dyn HirDatabase) -> Definition { + pub fn referenced(self, _db: &dyn HirDatabase) -> Definition { match self { - NameRefClass::ExternCrate(krate) => Definition::ModuleDef(krate.root_module(db).into()), NameRefClass::Definition(def) => def, NameRefClass::FieldShorthand { local_ref, field_ref: _ } => { // FIXME: this is inherently ambiguous -- this name refers to @@ -428,8 +426,9 @@ impl NameRefClass { } let extern_crate = ast::ExternCrate::cast(parent)?; - let resolved = sema.resolve_extern_crate(&extern_crate)?; - Some(NameRefClass::ExternCrate(resolved)) + let krate = sema.resolve_extern_crate(&extern_crate)?; + let root_module = krate.root_module(sema.db); + Some(NameRefClass::Definition(Definition::ModuleDef(root_module.into()))) } pub fn classify_lifetime( From 5021f10660823f22b3b965348007afec79711e19 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 11 Jul 2021 15:05:16 +0300 Subject: [PATCH 2/6] internal: add a test for broken refactor --- .../src/handlers/remove_unused_param.rs | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/crates/ide_assists/src/handlers/remove_unused_param.rs b/crates/ide_assists/src/handlers/remove_unused_param.rs index fabfe7e93df..3cb2a1b6e31 100644 --- a/crates/ide_assists/src/handlers/remove_unused_param.rs +++ b/crates/ide_assists/src/handlers/remove_unused_param.rs @@ -310,6 +310,36 @@ use super::foo; fn bar() { let _ = foo(1); } +"#, + ) + } + + #[test] + fn remove_method_param() { + // FIXME: This is completely wrong: + // * method call expressions are not handled + // * assoc function syntax removes the wrong argument. + check_assist( + remove_unused_param, + r#" +struct S; +impl S { fn f(&self, $0_unused: i32) {} } +fn main() { + S.f(92); + S.f(); + S.f(92, 92); + S::f(&S, 92); +} +"#, + r#" +struct S; +impl S { fn f(&self) {} } +fn main() { + S.f(92); + S.f(); + S.f(92, 92); + S::f(92); +} "#, ) } From 1171dc74e0b8c06289d4cd628cc67368820cbbec Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 11 Jul 2021 15:07:32 +0300 Subject: [PATCH 3/6] internal: remove unused param --- crates/ide/src/doc_links.rs | 2 +- crates/ide/src/goto_declaration.rs | 2 +- crates/ide/src/goto_definition.rs | 2 +- crates/ide/src/goto_implementation.rs | 2 +- crates/ide/src/hover.rs | 4 ++-- crates/ide/src/references.rs | 6 ++---- crates/ide/src/rename.rs | 4 ++-- crates/ide_assists/src/handlers/extract_function.rs | 2 +- crates/ide_db/src/defs.rs | 4 ++-- 9 files changed, 13 insertions(+), 15 deletions(-) diff --git a/crates/ide/src/doc_links.rs b/crates/ide/src/doc_links.rs index dfab8d313ad..f199d599d58 100644 --- a/crates/ide/src/doc_links.rs +++ b/crates/ide/src/doc_links.rs @@ -112,7 +112,7 @@ pub(crate) fn external_docs( let node = token.parent()?; let definition = match_ast! { match node { - ast::NameRef(name_ref) => NameRefClass::classify(&sema, &name_ref).map(|d| d.referenced(sema.db))?, + ast::NameRef(name_ref) => NameRefClass::classify(&sema, &name_ref).map(|d| d.referenced())?, ast::Name(name) => NameClass::classify(&sema, &name).map(|d| d.referenced_or_defined(sema.db))?, _ => return None, } diff --git a/crates/ide/src/goto_declaration.rs b/crates/ide/src/goto_declaration.rs index e390616365f..a9557ea5eff 100644 --- a/crates/ide/src/goto_declaration.rs +++ b/crates/ide/src/goto_declaration.rs @@ -25,7 +25,7 @@ pub(crate) fn goto_declaration( match parent { ast::NameRef(name_ref) => { let name_kind = NameRefClass::classify(&sema, &name_ref)?; - name_kind.referenced(sema.db) + name_kind.referenced() }, ast::Name(name) => { NameClass::classify(&sema, &name)?.referenced_or_defined(sema.db) diff --git a/crates/ide/src/goto_definition.rs b/crates/ide/src/goto_definition.rs index 0887af2ae33..d0f7d8de89d 100644 --- a/crates/ide/src/goto_definition.rs +++ b/crates/ide/src/goto_definition.rs @@ -140,7 +140,7 @@ pub(crate) fn reference_definition( |lifetime| NameRefClass::classify_lifetime(sema, lifetime), |name_ref| NameRefClass::classify(sema, name_ref), )?; - let def = name_kind.referenced(sema.db); + let def = name_kind.referenced(); def.try_to_nav(sema.db) } diff --git a/crates/ide/src/goto_implementation.rs b/crates/ide/src/goto_implementation.rs index 07686017d0c..c1f37e9ed02 100644 --- a/crates/ide/src/goto_implementation.rs +++ b/crates/ide/src/goto_implementation.rs @@ -32,7 +32,7 @@ pub(crate) fn goto_implementation( NameClass::classify(&sema, name).map(|class| class.referenced_or_defined(sema.db)) } ast::NameLike::NameRef(name_ref) => { - NameRefClass::classify(&sema, name_ref).map(|class| class.referenced(sema.db)) + NameRefClass::classify(&sema, name_ref).map(|class| class.referenced()) } ast::NameLike::Lifetime(_) => None, }?; diff --git a/crates/ide/src/hover.rs b/crates/ide/src/hover.rs index a5aeda9dd48..2cce43b41a9 100644 --- a/crates/ide/src/hover.rs +++ b/crates/ide/src/hover.rs @@ -101,10 +101,10 @@ pub(crate) fn hover( def => def.defined(db), }), ast::NameRef(name_ref) => { - NameRefClass::classify(&sema, &name_ref).map(|d| d.referenced(db)) + NameRefClass::classify(&sema, &name_ref).map(|d| d.referenced()) }, ast::Lifetime(lifetime) => NameClass::classify_lifetime(&sema, &lifetime).map_or_else( - || NameRefClass::classify_lifetime(&sema, &lifetime).map(|d| d.referenced(db)), + || NameRefClass::classify_lifetime(&sema, &lifetime).map(|d| d.referenced()), |d| d.defined(db), ), diff --git a/crates/ide/src/references.rs b/crates/ide/src/references.rs index dfeee777d69..9d0b5f8f06e 100644 --- a/crates/ide/src/references.rs +++ b/crates/ide/src/references.rs @@ -116,14 +116,12 @@ pub(crate) fn find_def( offset: TextSize, ) -> Option { let def = match sema.find_node_at_offset_with_descend(syntax, offset)? { - ast::NameLike::NameRef(name_ref) => { - NameRefClass::classify(sema, &name_ref)?.referenced(sema.db) - } + ast::NameLike::NameRef(name_ref) => NameRefClass::classify(sema, &name_ref)?.referenced(), ast::NameLike::Name(name) => { NameClass::classify(sema, &name)?.referenced_or_defined(sema.db) } ast::NameLike::Lifetime(lifetime) => NameRefClass::classify_lifetime(sema, &lifetime) - .map(|class| class.referenced(sema.db)) + .map(|class| class.referenced()) .or_else(|| { NameClass::classify_lifetime(sema, &lifetime) .map(|class| class.referenced_or_defined(sema.db)) diff --git a/crates/ide/src/rename.rs b/crates/ide/src/rename.rs index 7342ef4fcf4..a1a03e775ea 100644 --- a/crates/ide/src/rename.rs +++ b/crates/ide/src/rename.rs @@ -112,7 +112,7 @@ fn find_definition( } ast::NameLike::NameRef(name_ref) => { if let Some(def) = - NameRefClass::classify(sema, &name_ref).map(|class| class.referenced(sema.db)) + NameRefClass::classify(sema, &name_ref).map(|class| class.referenced()) { // if the name differs from the definitions name it has to be an alias if def.name(sema.db).map_or(false, |it| it.to_string() != name_ref.text()) { @@ -124,7 +124,7 @@ fn find_definition( } } ast::NameLike::Lifetime(lifetime) => NameRefClass::classify_lifetime(sema, &lifetime) - .map(|class| NameRefClass::referenced(class, sema.db)) + .map(|class| class.referenced()) .or_else(|| { NameClass::classify_lifetime(sema, &lifetime) .map(|it| it.referenced_or_defined(sema.db)) diff --git a/crates/ide_assists/src/handlers/extract_function.rs b/crates/ide_assists/src/handlers/extract_function.rs index 14dea0989f8..eb6f7a7e6c5 100644 --- a/crates/ide_assists/src/handlers/extract_function.rs +++ b/crates/ide_assists/src/handlers/extract_function.rs @@ -638,7 +638,7 @@ fn vars_used_in_body(ctx: &AssistContext, body: &FunctionBody) -> Vec { body.descendants() .filter_map(ast::NameRef::cast) .filter_map(|name_ref| NameRefClass::classify(&ctx.sema, &name_ref)) - .map(|name_kind| name_kind.referenced(ctx.db())) + .map(|name_kind| name_kind.referenced()) .filter_map(|definition| match definition { Definition::Local(local) => Some(local), _ => None, diff --git a/crates/ide_db/src/defs.rs b/crates/ide_db/src/defs.rs index 60bf11a4e35..2f944c53e3b 100644 --- a/crates/ide_db/src/defs.rs +++ b/crates/ide_db/src/defs.rs @@ -186,7 +186,7 @@ impl NameClass { }) .and_then(|name_ref| NameRefClass::classify(sema, &name_ref))?; - Some(NameClass::Definition(name_ref_class.referenced(sema.db))) + Some(NameClass::Definition(name_ref_class.referenced())) } else { let extern_crate = it.syntax().parent().and_then(ast::ExternCrate::cast)?; let resolved = sema.resolve_extern_crate(&extern_crate)?; @@ -309,7 +309,7 @@ pub enum NameRefClass { impl NameRefClass { /// `Definition`, which this name refers to. - pub fn referenced(self, _db: &dyn HirDatabase) -> Definition { + pub fn referenced(self) -> Definition { match self { NameRefClass::Definition(def) => def, NameRefClass::FieldShorthand { local_ref, field_ref: _ } => { From dbf11b16da95d72e220ff11f57bd97ece3611361 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 11 Jul 2021 15:13:42 +0300 Subject: [PATCH 4/6] typo --- crates/ide_db/src/defs.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/ide_db/src/defs.rs b/crates/ide_db/src/defs.rs index 2f944c53e3b..7e480bd34cb 100644 --- a/crates/ide_db/src/defs.rs +++ b/crates/ide_db/src/defs.rs @@ -101,8 +101,8 @@ impl Definition { /// scope. That is, that, by just looking at the syntactical category, we can /// unambiguously define the semantic category. /// -/// Sadly, that's not 100% true, there are special cases. To make sure that call -/// the code handles all the special cases correctly via exhaustive matching, we +/// Sadly, that's not 100% true, there are special cases. To make sure that +/// callers handle all the special cases correctly via exhaustive matching, we /// add a [`NameClass`] enum which lists all of them! /// /// A model special case is `None` constant in pattern. From 7bae9c9187cc3394729a3d985bd6b0a89a99ed36 Mon Sep 17 00:00:00 2001 From: mahdi-frms Date: Sun, 11 Jul 2021 16:28:02 +0430 Subject: [PATCH 5/6] add 'for' postfix completion --- .../ide_completion/src/completions/postfix.rs | 17 ++++++++++++++++- crates/ide_db/src/helpers.rs | 4 ++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/crates/ide_completion/src/completions/postfix.rs b/crates/ide_completion/src/completions/postfix.rs index aaa346eeae9..4871698b243 100644 --- a/crates/ide_completion/src/completions/postfix.rs +++ b/crates/ide_completion/src/completions/postfix.rs @@ -2,7 +2,10 @@ mod format_like; -use ide_db::{helpers::SnippetCap, ty_filter::TryEnum}; +use ide_db::{ + helpers::{FamousDefs, SnippetCap}, + ty_filter::TryEnum, +}; use syntax::{ ast::{self, AstNode, AstToken}, SyntaxKind::{BLOCK_EXPR, EXPR_STMT}, @@ -110,6 +113,18 @@ pub(crate) fn complete_postfix(acc: &mut Completions, ctx: &CompletionContext) { .add_to(acc); postfix_snippet(ctx, cap, dot_receiver, "not", "!expr", &format!("!{}", receiver_text)) .add_to(acc); + } else if let Some(trait_) = FamousDefs(&ctx.sema, ctx.krate).core_iter_IntoIterator() { + if receiver_ty.impls_trait(ctx.db, trait_, &[]) { + postfix_snippet( + ctx, + cap, + dot_receiver, + "for", + "for ele in expr {}", + &format!("for ele in {} {{\n $0\n}}", receiver_text), + ) + .add_to(acc); + } } postfix_snippet(ctx, cap, dot_receiver, "ref", "&expr", &format!("&{}", receiver_text)) diff --git a/crates/ide_db/src/helpers.rs b/crates/ide_db/src/helpers.rs index e8cdcbf3fa5..c71b6d64798 100644 --- a/crates/ide_db/src/helpers.rs +++ b/crates/ide_db/src/helpers.rs @@ -134,6 +134,10 @@ impl FamousDefs<'_, '_> { self.find_trait("core:iter:traits:iterator:Iterator") } + pub fn core_iter_IntoIterator(&self) -> Option { + self.find_trait("core:iter:traits:collect:IntoIterator") + } + pub fn core_iter(&self) -> Option { self.find_module("core:iter") } From bbb053532e7b678982e9a3f33a64732a963a54fb Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 11 Jul 2021 15:48:49 +0300 Subject: [PATCH 6/6] internal: remove one more needless extern crate --- crates/ide/src/doc_links.rs | 2 +- crates/ide/src/goto_declaration.rs | 2 +- crates/ide/src/goto_definition.rs | 4 ++-- crates/ide/src/goto_implementation.rs | 2 +- crates/ide/src/hover.rs | 4 ++-- crates/ide/src/references.rs | 8 +++----- crates/ide/src/rename.rs | 5 ++--- crates/ide/src/syntax_highlighting/highlight.rs | 1 - .../test_data/highlight_extern_crate.html | 2 +- crates/ide_db/src/defs.rs | 16 +++++++--------- crates/ide_db/src/items_locator.rs | 2 +- .../src/handlers/incorrect_case.rs | 2 +- 12 files changed, 22 insertions(+), 28 deletions(-) diff --git a/crates/ide/src/doc_links.rs b/crates/ide/src/doc_links.rs index f199d599d58..1c0380943ea 100644 --- a/crates/ide/src/doc_links.rs +++ b/crates/ide/src/doc_links.rs @@ -113,7 +113,7 @@ pub(crate) fn external_docs( let definition = match_ast! { match node { ast::NameRef(name_ref) => NameRefClass::classify(&sema, &name_ref).map(|d| d.referenced())?, - ast::Name(name) => NameClass::classify(&sema, &name).map(|d| d.referenced_or_defined(sema.db))?, + ast::Name(name) => NameClass::classify(&sema, &name).map(|d| d.referenced_or_defined())?, _ => return None, } }; diff --git a/crates/ide/src/goto_declaration.rs b/crates/ide/src/goto_declaration.rs index a9557ea5eff..4f6b5e61868 100644 --- a/crates/ide/src/goto_declaration.rs +++ b/crates/ide/src/goto_declaration.rs @@ -28,7 +28,7 @@ pub(crate) fn goto_declaration( name_kind.referenced() }, ast::Name(name) => { - NameClass::classify(&sema, &name)?.referenced_or_defined(sema.db) + NameClass::classify(&sema, &name)?.referenced_or_defined() }, _ => return None, } diff --git a/crates/ide/src/goto_definition.rs b/crates/ide/src/goto_definition.rs index d0f7d8de89d..d1ad6db2fdd 100644 --- a/crates/ide/src/goto_definition.rs +++ b/crates/ide/src/goto_definition.rs @@ -60,12 +60,12 @@ pub(crate) fn goto_definition( reference_definition(&sema, Either::Right(&name_ref)) }, ast::Name(name) => { - let def = NameClass::classify(&sema, &name)?.referenced_or_defined(sema.db); + let def = NameClass::classify(&sema, &name)?.referenced_or_defined(); try_find_trait_item_definition(sema.db, &def) .or_else(|| def.try_to_nav(sema.db)) }, ast::Lifetime(lt) => if let Some(name_class) = NameClass::classify_lifetime(&sema, <) { - let def = name_class.referenced_or_defined(sema.db); + let def = name_class.referenced_or_defined(); def.try_to_nav(sema.db) } else { reference_definition(&sema, Either::Left(<)) diff --git a/crates/ide/src/goto_implementation.rs b/crates/ide/src/goto_implementation.rs index c1f37e9ed02..636642cfe70 100644 --- a/crates/ide/src/goto_implementation.rs +++ b/crates/ide/src/goto_implementation.rs @@ -29,7 +29,7 @@ pub(crate) fn goto_implementation( let node = sema.find_node_at_offset_with_descend(&syntax, position.offset)?; let def = match &node { ast::NameLike::Name(name) => { - NameClass::classify(&sema, name).map(|class| class.referenced_or_defined(sema.db)) + NameClass::classify(&sema, name).map(|class| class.referenced_or_defined()) } ast::NameLike::NameRef(name_ref) => { NameRefClass::classify(&sema, name_ref).map(|class| class.referenced()) diff --git a/crates/ide/src/hover.rs b/crates/ide/src/hover.rs index 2cce43b41a9..743aa183f78 100644 --- a/crates/ide/src/hover.rs +++ b/crates/ide/src/hover.rs @@ -98,14 +98,14 @@ pub(crate) fn hover( // field pattern shorthands to their definition ast::Name(name) => NameClass::classify(&sema, &name).and_then(|class| match class { NameClass::ConstReference(def) => Some(def), - def => def.defined(db), + def => def.defined(), }), ast::NameRef(name_ref) => { NameRefClass::classify(&sema, &name_ref).map(|d| d.referenced()) }, ast::Lifetime(lifetime) => NameClass::classify_lifetime(&sema, &lifetime).map_or_else( || NameRefClass::classify_lifetime(&sema, &lifetime).map(|d| d.referenced()), - |d| d.defined(db), + |d| d.defined(), ), _ => { diff --git a/crates/ide/src/references.rs b/crates/ide/src/references.rs index 9d0b5f8f06e..fbe79741b39 100644 --- a/crates/ide/src/references.rs +++ b/crates/ide/src/references.rs @@ -58,7 +58,7 @@ pub(crate) fn find_all_refs( let (def, is_literal_search) = if let Some(name) = get_name_of_item_declaration(&syntax, position) { - (NameClass::classify(sema, &name)?.referenced_or_defined(sema.db), true) + (NameClass::classify(sema, &name)?.referenced_or_defined(), true) } else { (find_def(sema, &syntax, position.offset)?, false) }; @@ -117,14 +117,12 @@ pub(crate) fn find_def( ) -> Option { let def = match sema.find_node_at_offset_with_descend(syntax, offset)? { ast::NameLike::NameRef(name_ref) => NameRefClass::classify(sema, &name_ref)?.referenced(), - ast::NameLike::Name(name) => { - NameClass::classify(sema, &name)?.referenced_or_defined(sema.db) - } + ast::NameLike::Name(name) => NameClass::classify(sema, &name)?.referenced_or_defined(), ast::NameLike::Lifetime(lifetime) => NameRefClass::classify_lifetime(sema, &lifetime) .map(|class| class.referenced()) .or_else(|| { NameClass::classify_lifetime(sema, &lifetime) - .map(|class| class.referenced_or_defined(sema.db)) + .map(|class| class.referenced_or_defined()) })?, }; Some(def) diff --git a/crates/ide/src/rename.rs b/crates/ide/src/rename.rs index a1a03e775ea..9047d0fb32d 100644 --- a/crates/ide/src/rename.rs +++ b/crates/ide/src/rename.rs @@ -108,7 +108,7 @@ fn find_definition( bail!("Renaming aliases is currently unsupported") } ast::NameLike::Name(name) => { - NameClass::classify(sema, &name).map(|class| class.referenced_or_defined(sema.db)) + NameClass::classify(sema, &name).map(|class| class.referenced_or_defined()) } ast::NameLike::NameRef(name_ref) => { if let Some(def) = @@ -126,8 +126,7 @@ fn find_definition( ast::NameLike::Lifetime(lifetime) => NameRefClass::classify_lifetime(sema, &lifetime) .map(|class| class.referenced()) .or_else(|| { - NameClass::classify_lifetime(sema, &lifetime) - .map(|it| it.referenced_or_defined(sema.db)) + NameClass::classify_lifetime(sema, &lifetime).map(|it| it.referenced_or_defined()) }), } .ok_or_else(|| format_err!("No references found at position"))?; diff --git a/crates/ide/src/syntax_highlighting/highlight.rs b/crates/ide/src/syntax_highlighting/highlight.rs index ab48e5ad289..e16fe644d5f 100644 --- a/crates/ide/src/syntax_highlighting/highlight.rs +++ b/crates/ide/src/syntax_highlighting/highlight.rs @@ -46,7 +46,6 @@ pub(super) fn element( }; match name_kind { - Some(NameClass::ExternCrate(_)) => SymbolKind::Module.into(), Some(NameClass::Definition(def)) => { let mut h = highlight_def(db, krate, def) | HlMod::Definition; if let Definition::ModuleDef(hir::ModuleDef::Trait(trait_)) = &def { diff --git a/crates/ide/src/syntax_highlighting/test_data/highlight_extern_crate.html b/crates/ide/src/syntax_highlighting/test_data/highlight_extern_crate.html index 957fe2f8656..76d80886d11 100644 --- a/crates/ide/src/syntax_highlighting/test_data/highlight_extern_crate.html +++ b/crates/ide/src/syntax_highlighting/test_data/highlight_extern_crate.html @@ -39,5 +39,5 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd .unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
extern crate std;
-extern crate alloc as abc;
+extern crate alloc as abc;
 
\ No newline at end of file diff --git a/crates/ide_db/src/defs.rs b/crates/ide_db/src/defs.rs index 7e480bd34cb..eeae0553498 100644 --- a/crates/ide_db/src/defs.rs +++ b/crates/ide_db/src/defs.rs @@ -6,8 +6,8 @@ // FIXME: this badly needs rename/rewrite (matklad, 2020-02-06). use hir::{ - db::HirDatabase, Crate, Field, GenericParam, HasVisibility, Impl, Label, Local, MacroDef, - Module, ModuleDef, Name, PathResolution, Semantics, Visibility, + Field, GenericParam, HasVisibility, Impl, Label, Local, MacroDef, Module, ModuleDef, Name, + PathResolution, Semantics, Visibility, }; use syntax::{ ast::{self, AstNode, PathSegmentKind}, @@ -108,7 +108,6 @@ impl Definition { /// A model special case is `None` constant in pattern. #[derive(Debug)] pub enum NameClass { - ExternCrate(Crate), Definition(Definition), /// `None` in `if let None = Some(82) {}`. /// Syntactically, it is a name, but semantically it is a reference. @@ -124,9 +123,8 @@ pub enum NameClass { impl NameClass { /// `Definition` defined by this name. - pub fn defined(self, db: &dyn HirDatabase) -> Option { + pub fn defined(self) -> Option { let res = match self { - NameClass::ExternCrate(krate) => Definition::ModuleDef(krate.root_module(db).into()), NameClass::Definition(it) => it, NameClass::ConstReference(_) => return None, NameClass::PatFieldShorthand { local_def, field_ref: _ } => { @@ -137,9 +135,8 @@ impl NameClass { } /// `Definition` referenced or defined by this name. - pub fn referenced_or_defined(self, db: &dyn HirDatabase) -> Definition { + pub fn referenced_or_defined(self) -> Definition { match self { - NameClass::ExternCrate(krate) => Definition::ModuleDef(krate.root_module(db).into()), NameClass::Definition(it) | NameClass::ConstReference(it) => it, NameClass::PatFieldShorthand { local_def: _, field_ref } => field_ref, } @@ -189,8 +186,9 @@ impl NameClass { Some(NameClass::Definition(name_ref_class.referenced())) } else { let extern_crate = it.syntax().parent().and_then(ast::ExternCrate::cast)?; - let resolved = sema.resolve_extern_crate(&extern_crate)?; - Some(NameClass::ExternCrate(resolved)) + let krate = sema.resolve_extern_crate(&extern_crate)?; + let root_module = krate.root_module(sema.db); + Some(NameClass::Definition(Definition::ModuleDef(root_module.into()))) } }, ast::IdentPat(it) => { diff --git a/crates/ide_db/src/items_locator.rs b/crates/ide_db/src/items_locator.rs index ef796b6f776..39aa47fc903 100644 --- a/crates/ide_db/src/items_locator.rs +++ b/crates/ide_db/src/items_locator.rs @@ -142,7 +142,7 @@ fn get_name_definition( candidate_node }; let name = ast::Name::cast(candidate_name_node)?; - NameClass::classify(sema, &name)?.defined(sema.db) + NameClass::classify(sema, &name)?.defined() } fn is_assoc_item(item: ItemInNs, db: &RootDatabase) -> bool { diff --git a/crates/ide_diagnostics/src/handlers/incorrect_case.rs b/crates/ide_diagnostics/src/handlers/incorrect_case.rs index 68f25f28425..e2bbabd53c8 100644 --- a/crates/ide_diagnostics/src/handlers/incorrect_case.rs +++ b/crates/ide_diagnostics/src/handlers/incorrect_case.rs @@ -29,7 +29,7 @@ pub(crate) fn incorrect_case(ctx: &DiagnosticsContext<'_>, d: &hir::IncorrectCas fn fixes(ctx: &DiagnosticsContext<'_>, d: &hir::IncorrectCase) -> Option> { let root = ctx.sema.db.parse_or_expand(d.file)?; let name_node = d.ident.to_node(&root); - let def = NameClass::classify(&ctx.sema, &name_node)?.defined(ctx.sema.db)?; + let def = NameClass::classify(&ctx.sema, &name_node)?.defined()?; let name_node = InFile::new(d.file, name_node.syntax()); let frange = name_node.original_file_range(ctx.sema.db);