From f62e8616c879255e70052ae35ce7f98bffedac11 Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Fri, 18 Sep 2020 23:40:11 +0300 Subject: Add imports in auto completion --- crates/assists/src/handlers/auto_import.rs | 3 ++- .../src/handlers/extract_struct_from_enum_variant.rs | 3 +-- .../src/handlers/replace_qualified_name_with_use.rs | 2 +- crates/assists/src/utils.rs | 3 +-- crates/assists/src/utils/insert_use.rs | 14 ++++++++------ 5 files changed, 13 insertions(+), 12 deletions(-) (limited to 'crates/assists/src') diff --git a/crates/assists/src/handlers/auto_import.rs b/crates/assists/src/handlers/auto_import.rs index 37dd61266..d665837a2 100644 --- a/crates/assists/src/handlers/auto_import.rs +++ b/crates/assists/src/handlers/auto_import.rs @@ -98,7 +98,8 @@ pub(crate) fn auto_import(acc: &mut Assists, ctx: &AssistContext) -> Option<()> let range = ctx.sema.original_range(import_assets.syntax_under_caret()).range; let group = import_group_message(import_assets.import_candidate()); - let scope = ImportScope::find_insert_use_container(import_assets.syntax_under_caret(), ctx)?; + let scope = + ImportScope::find_insert_use_container(import_assets.syntax_under_caret(), &ctx.sema)?; for (import, _) in proposed_imports { acc.add_group( &group, diff --git a/crates/assists/src/handlers/extract_struct_from_enum_variant.rs b/crates/assists/src/handlers/extract_struct_from_enum_variant.rs index 067afabf2..cac77c49b 100644 --- a/crates/assists/src/handlers/extract_struct_from_enum_variant.rs +++ b/crates/assists/src/handlers/extract_struct_from_enum_variant.rs @@ -143,8 +143,7 @@ fn insert_import( if let Some(mut mod_path) = mod_path { mod_path.segments.pop(); mod_path.segments.push(variant_hir_name.clone()); - let scope = ImportScope::find_insert_use_container(scope_node, ctx)?; - + let scope = ImportScope::find_insert_use_container(scope_node, &ctx.sema)?; *rewriter += insert_use(&scope, mod_path_to_ast(&mod_path), ctx.config.insert_use.merge); } Some(()) diff --git a/crates/assists/src/handlers/replace_qualified_name_with_use.rs b/crates/assists/src/handlers/replace_qualified_name_with_use.rs index d7e1d9580..a66db9ae3 100644 --- a/crates/assists/src/handlers/replace_qualified_name_with_use.rs +++ b/crates/assists/src/handlers/replace_qualified_name_with_use.rs @@ -34,7 +34,7 @@ pub(crate) fn replace_qualified_name_with_use( } let target = path.syntax().text_range(); - let scope = ImportScope::find_insert_use_container(path.syntax(), ctx)?; + let scope = ImportScope::find_insert_use_container(path.syntax(), &ctx.sema)?; let syntax = scope.as_syntax_node(); acc.add( AssistId("replace_qualified_name_with_use", AssistKind::RefactorRewrite), diff --git a/crates/assists/src/utils.rs b/crates/assists/src/utils.rs index 7bd338e99..caabc44de 100644 --- a/crates/assists/src/utils.rs +++ b/crates/assists/src/utils.rs @@ -21,8 +21,7 @@ use crate::{ ast_transform::{self, AstTransform, QualifyPaths, SubstituteTypeParams}, }; -pub use insert_use::MergeBehaviour; -pub(crate) use insert_use::{insert_use, ImportScope}; +pub use insert_use::{insert_use, ImportScope, MergeBehaviour}; pub fn mod_path_to_ast(path: &hir::ModPath) -> ast::Path { let mut segments = Vec::new(); diff --git a/crates/assists/src/utils/insert_use.rs b/crates/assists/src/utils/insert_use.rs index af3fc96b6..1aa727e11 100644 --- a/crates/assists/src/utils/insert_use.rs +++ b/crates/assists/src/utils/insert_use.rs @@ -1,6 +1,8 @@ //! Handle syntactic aspects of inserting a new `use`. use std::{cmp::Ordering, iter::successors}; +use hir::Semantics; +use ide_db::RootDatabase; use itertools::{EitherOrBoth, Itertools}; use syntax::{ algo::SyntaxRewriter, @@ -14,7 +16,7 @@ use syntax::{ use test_utils::mark; #[derive(Debug)] -pub(crate) enum ImportScope { +pub enum ImportScope { File(ast::SourceFile), Module(ast::ItemList), } @@ -31,14 +33,14 @@ impl ImportScope { } /// Determines the containing syntax node in which to insert a `use` statement affecting `position`. - pub(crate) fn find_insert_use_container( + pub fn find_insert_use_container( position: &SyntaxNode, - ctx: &crate::assist_context::AssistContext, + sema: &Semantics<'_, RootDatabase>, ) -> Option { - ctx.sema.ancestors_with_macros(position.clone()).find_map(Self::from) + sema.ancestors_with_macros(position.clone()).find_map(Self::from) } - pub(crate) fn as_syntax_node(&self) -> &SyntaxNode { + pub fn as_syntax_node(&self) -> &SyntaxNode { match self { ImportScope::File(file) => file.syntax(), ImportScope::Module(item_list) => item_list.syntax(), @@ -88,7 +90,7 @@ fn is_inner_comment(token: SyntaxToken) -> bool { } /// Insert an import path into the given file/node. A `merge` value of none indicates that no import merging is allowed to occur. -pub(crate) fn insert_use<'a>( +pub fn insert_use<'a>( scope: &ImportScope, path: ast::Path, merge: Option, -- cgit v1.2.3