From 8d3d509af77756758cea14cc4939d099b4f95993 Mon Sep 17 00:00:00 2001
From: Igor Aleksanov <popzxc@yandex.ru>
Date: Sat, 24 Oct 2020 10:47:23 +0300
Subject: Remove dependency on 'assists' from 'completion' crate

---
 .../src/handlers/add_missing_impl_members.rs       |   3 +-
 .../src/handlers/replace_if_let_with_match.rs      |   6 +-
 .../src/handlers/replace_let_with_if_let.rs        |   3 +-
 .../src/handlers/replace_unwrap_with_match.rs      |   3 +-
 crates/assists/src/utils.rs                        | 121 +--------------------
 5 files changed, 11 insertions(+), 125 deletions(-)

(limited to 'crates/assists/src')

diff --git a/crates/assists/src/handlers/add_missing_impl_members.rs b/crates/assists/src/handlers/add_missing_impl_members.rs
index 4c400f287..b82fb30ad 100644
--- a/crates/assists/src/handlers/add_missing_impl_members.rs
+++ b/crates/assists/src/handlers/add_missing_impl_members.rs
@@ -1,4 +1,5 @@
 use hir::HasSource;
+use ide_db::traits::{get_missing_assoc_items, resolve_target_trait};
 use syntax::{
     ast::{
         self,
@@ -11,7 +12,7 @@ use syntax::{
 use crate::{
     assist_context::{AssistContext, Assists},
     ast_transform::{self, AstTransform, QualifyPaths, SubstituteTypeParams},
-    utils::{get_missing_assoc_items, render_snippet, resolve_target_trait, Cursor},
+    utils::{render_snippet, Cursor},
     AssistId, AssistKind,
 };
 
diff --git a/crates/assists/src/handlers/replace_if_let_with_match.rs b/crates/assists/src/handlers/replace_if_let_with_match.rs
index 79097621e..9a49c48c1 100644
--- a/crates/assists/src/handlers/replace_if_let_with_match.rs
+++ b/crates/assists/src/handlers/replace_if_let_with_match.rs
@@ -7,10 +7,8 @@ use syntax::{
     AstNode,
 };
 
-use crate::{
-    utils::{unwrap_trivial_block, TryEnum},
-    AssistContext, AssistId, AssistKind, Assists,
-};
+use crate::{utils::unwrap_trivial_block, AssistContext, AssistId, AssistKind, Assists};
+use ide_db::ty_filter::TryEnum;
 
 // Assist: replace_if_let_with_match
 //
diff --git a/crates/assists/src/handlers/replace_let_with_if_let.rs b/crates/assists/src/handlers/replace_let_with_if_let.rs
index ed6d0c29b..a5bcbda24 100644
--- a/crates/assists/src/handlers/replace_let_with_if_let.rs
+++ b/crates/assists/src/handlers/replace_let_with_if_let.rs
@@ -9,7 +9,8 @@ use syntax::{
     AstNode, T,
 };
 
-use crate::{utils::TryEnum, AssistContext, AssistId, AssistKind, Assists};
+use crate::{AssistContext, AssistId, AssistKind, Assists};
+use ide_db::ty_filter::TryEnum;
 
 // Assist: replace_let_with_if_let
 //
diff --git a/crates/assists/src/handlers/replace_unwrap_with_match.rs b/crates/assists/src/handlers/replace_unwrap_with_match.rs
index 4043c219c..f547066f0 100644
--- a/crates/assists/src/handlers/replace_unwrap_with_match.rs
+++ b/crates/assists/src/handlers/replace_unwrap_with_match.rs
@@ -10,9 +10,10 @@ use syntax::{
 };
 
 use crate::{
-    utils::{render_snippet, Cursor, TryEnum},
+    utils::{render_snippet, Cursor},
     AssistContext, AssistId, AssistKind, Assists,
 };
+use ide_db::ty_filter::TryEnum;
 
 // Assist: replace_unwrap_with_match
 //
diff --git a/crates/assists/src/utils.rs b/crates/assists/src/utils.rs
index 1a6b48b45..56f925ee6 100644
--- a/crates/assists/src/utils.rs
+++ b/crates/assists/src/utils.rs
@@ -2,14 +2,13 @@
 pub(crate) mod insert_use;
 pub(crate) mod import_assets;
 
-use std::{iter, ops};
+use std::ops;
 
-use hir::{Adt, Crate, Enum, Module, ScopeDef, Semantics, Trait, Type};
+use hir::{Crate, Enum, Module, ScopeDef, Semantics, Trait};
 use ide_db::RootDatabase;
 use itertools::Itertools;
-use rustc_hash::FxHashSet;
 use syntax::{
-    ast::{self, make, ArgListOwner, NameOwner},
+    ast::{self, make, ArgListOwner},
     AstNode, Direction,
     SyntaxKind::*,
     SyntaxNode, TextSize, T,
@@ -115,72 +114,6 @@ pub(crate) fn render_snippet(_cap: SnippetCap, node: &SyntaxNode, cursor: Cursor
     }
 }
 
-pub fn get_missing_assoc_items(
-    sema: &Semantics<RootDatabase>,
-    impl_def: &ast::Impl,
-) -> Vec<hir::AssocItem> {
-    // Names must be unique between constants and functions. However, type aliases
-    // may share the same name as a function or constant.
-    let mut impl_fns_consts = FxHashSet::default();
-    let mut impl_type = FxHashSet::default();
-
-    if let Some(item_list) = impl_def.assoc_item_list() {
-        for item in item_list.assoc_items() {
-            match item {
-                ast::AssocItem::Fn(f) => {
-                    if let Some(n) = f.name() {
-                        impl_fns_consts.insert(n.syntax().to_string());
-                    }
-                }
-
-                ast::AssocItem::TypeAlias(t) => {
-                    if let Some(n) = t.name() {
-                        impl_type.insert(n.syntax().to_string());
-                    }
-                }
-
-                ast::AssocItem::Const(c) => {
-                    if let Some(n) = c.name() {
-                        impl_fns_consts.insert(n.syntax().to_string());
-                    }
-                }
-                ast::AssocItem::MacroCall(_) => (),
-            }
-        }
-    }
-
-    resolve_target_trait(sema, impl_def).map_or(vec![], |target_trait| {
-        target_trait
-            .items(sema.db)
-            .iter()
-            .filter(|i| match i {
-                hir::AssocItem::Function(f) => {
-                    !impl_fns_consts.contains(&f.name(sema.db).to_string())
-                }
-                hir::AssocItem::TypeAlias(t) => !impl_type.contains(&t.name(sema.db).to_string()),
-                hir::AssocItem::Const(c) => c
-                    .name(sema.db)
-                    .map(|n| !impl_fns_consts.contains(&n.to_string()))
-                    .unwrap_or_default(),
-            })
-            .cloned()
-            .collect()
-    })
-}
-
-pub(crate) fn resolve_target_trait(
-    sema: &Semantics<RootDatabase>,
-    impl_def: &ast::Impl,
-) -> Option<hir::Trait> {
-    let ast_path =
-        impl_def.trait_().map(|it| it.syntax().clone()).and_then(ast::PathType::cast)?.path()?;
-
-    match sema.resolve_path(&ast_path) {
-        Some(hir::PathResolution::Def(hir::ModuleDef::Trait(def))) => Some(def),
-        _ => None,
-    }
-}
-
 pub(crate) fn vis_offset(node: &SyntaxNode) -> TextSize {
     node.children_with_tokens()
         .find(|it| !matches!(it.kind(), WHITESPACE | COMMENT | ATTR))
@@ -223,54 +156,6 @@ fn invert_special_case(expr: &ast::Expr) -> Option<ast::Expr> {
     }
 }
 
-#[derive(Clone, Copy)]
-pub enum TryEnum {
-    Result,
-    Option,
-}
-
-impl TryEnum {
-    const ALL: [TryEnum; 2] = [TryEnum::Option, TryEnum::Result];
-
-    pub fn from_ty(sema: &Semantics<RootDatabase>, ty: &Type) -> Option<TryEnum> {
-        let enum_ = match ty.as_adt() {
-            Some(Adt::Enum(it)) => it,
-            _ => return None,
-        };
-        TryEnum::ALL.iter().find_map(|&var| {
-            if &enum_.name(sema.db).to_string() == var.type_name() {
-                return Some(var);
-            }
-            None
-        })
-    }
-
-    pub(crate) fn happy_case(self) -> &'static str {
-        match self {
-            TryEnum::Result => "Ok",
-            TryEnum::Option => "Some",
-        }
-    }
-
-    pub(crate) fn sad_pattern(self) -> ast::Pat {
-        match self {
-            TryEnum::Result => make::tuple_struct_pat(
-                make::path_unqualified(make::path_segment(make::name_ref("Err"))),
-                iter::once(make::wildcard_pat().into()),
-            )
-            .into(),
-            TryEnum::Option => make::ident_pat(make::name("None")).into(),
-        }
-    }
-
-    fn type_name(self) -> &'static str {
-        match self {
-            TryEnum::Result => "Result",
-            TryEnum::Option => "Option",
-        }
-    }
-}
-
 /// Helps with finding well-know things inside the standard library. This is
 /// somewhat similar to the known paths infra inside hir, but it different; We
 /// want to make sure that IDE specific paths don't become interesting inside
-- 
cgit v1.2.3


From 19cce08662222f012a0f50ff73afd4fdd34ca683 Mon Sep 17 00:00:00 2001
From: Igor Aleksanov <popzxc@yandex.ru>
Date: Sat, 24 Oct 2020 11:39:57 +0300
Subject: Re-export base_db from ide_db

---
 crates/assists/src/assist_context.rs                            | 2 +-
 crates/assists/src/handlers/extract_struct_from_enum_variant.rs | 2 +-
 crates/assists/src/handlers/fix_visibility.rs                   | 2 +-
 crates/assists/src/handlers/generate_function.rs                | 2 +-
 crates/assists/src/lib.rs                                       | 2 +-
 crates/assists/src/tests.rs                                     | 2 +-
 6 files changed, 6 insertions(+), 6 deletions(-)

(limited to 'crates/assists/src')

diff --git a/crates/assists/src/assist_context.rs b/crates/assists/src/assist_context.rs
index bf520069e..d11fee196 100644
--- a/crates/assists/src/assist_context.rs
+++ b/crates/assists/src/assist_context.rs
@@ -3,8 +3,8 @@
 use std::mem;
 
 use algo::find_covering_element;
-use base_db::{FileId, FileRange};
 use hir::Semantics;
+use ide_db::base_db::{FileId, FileRange};
 use ide_db::{
     label::Label,
     source_change::{SourceChange, SourceFileEdit},
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 7f4f80b23..48433feb9 100644
--- a/crates/assists/src/handlers/extract_struct_from_enum_variant.rs
+++ b/crates/assists/src/handlers/extract_struct_from_enum_variant.rs
@@ -1,5 +1,5 @@
-use base_db::FileId;
 use hir::{EnumVariant, Module, ModuleDef, Name};
+use ide_db::base_db::FileId;
 use ide_db::{defs::Definition, search::Reference, RootDatabase};
 use itertools::Itertools;
 use rustc_hash::FxHashSet;
diff --git a/crates/assists/src/handlers/fix_visibility.rs b/crates/assists/src/handlers/fix_visibility.rs
index 66f74150c..c86720787 100644
--- a/crates/assists/src/handlers/fix_visibility.rs
+++ b/crates/assists/src/handlers/fix_visibility.rs
@@ -1,5 +1,5 @@
-use base_db::FileId;
 use hir::{db::HirDatabase, HasSource, HasVisibility, PathResolution};
+use ide_db::base_db::FileId;
 use syntax::{
     ast::{self, VisibilityOwner},
     AstNode, TextRange, TextSize,
diff --git a/crates/assists/src/handlers/generate_function.rs b/crates/assists/src/handlers/generate_function.rs
index d23f4293b..758188a42 100644
--- a/crates/assists/src/handlers/generate_function.rs
+++ b/crates/assists/src/handlers/generate_function.rs
@@ -1,5 +1,5 @@
-use base_db::FileId;
 use hir::HirDisplay;
+use ide_db::base_db::FileId;
 use rustc_hash::{FxHashMap, FxHashSet};
 use syntax::{
     ast::{
diff --git a/crates/assists/src/lib.rs b/crates/assists/src/lib.rs
index 8a664f654..70a651e10 100644
--- a/crates/assists/src/lib.rs
+++ b/crates/assists/src/lib.rs
@@ -17,8 +17,8 @@ mod tests;
 pub mod utils;
 pub mod ast_transform;
 
-use base_db::FileRange;
 use hir::Semantics;
+use ide_db::base_db::FileRange;
 use ide_db::{label::Label, source_change::SourceChange, RootDatabase};
 use syntax::TextRange;
 
diff --git a/crates/assists/src/tests.rs b/crates/assists/src/tests.rs
index 2b687decf..849d85e76 100644
--- a/crates/assists/src/tests.rs
+++ b/crates/assists/src/tests.rs
@@ -1,7 +1,7 @@
 mod generated;
 
-use base_db::{fixture::WithFixture, FileId, FileRange, SourceDatabaseExt};
 use hir::Semantics;
+use ide_db::base_db::{fixture::WithFixture, FileId, FileRange, SourceDatabaseExt};
 use ide_db::RootDatabase;
 use syntax::TextRange;
 use test_utils::{assert_eq_text, extract_offset, extract_range};
-- 
cgit v1.2.3