|
2 | 2 | pub(crate) mod insert_use; |
3 | 3 | pub(crate) mod import_assets; |
4 | 4 |
|
5 | | -use std::{iter, ops}; |
| 5 | +use std::ops; |
6 | 6 |
|
7 | | -use hir::{Adt, Crate, Enum, Module, ScopeDef, Semantics, Trait, Type}; |
| 7 | +use hir::{Crate, Enum, Module, ScopeDef, Semantics, Trait}; |
8 | 8 | use ide_db::RootDatabase; |
9 | 9 | use itertools::Itertools; |
10 | | -use rustc_hash::FxHashSet; |
11 | 10 | use syntax::{ |
12 | | - ast::{self, make, ArgListOwner, NameOwner}, |
| 11 | + ast::{self, make, ArgListOwner}, |
13 | 12 | AstNode, Direction, |
14 | 13 | SyntaxKind::*, |
15 | 14 | SyntaxNode, TextSize, T, |
@@ -115,72 +114,6 @@ pub(crate) fn render_snippet(_cap: SnippetCap, node: &SyntaxNode, cursor: Cursor |
115 | 114 | } |
116 | 115 | } |
117 | 116 |
|
118 | | -pub fn get_missing_assoc_items( |
119 | | - sema: &Semantics<RootDatabase>, |
120 | | - impl_def: &ast::Impl, |
121 | | -) -> Vec<hir::AssocItem> { |
122 | | - // Names must be unique between constants and functions. However, type aliases |
123 | | - // may share the same name as a function or constant. |
124 | | - let mut impl_fns_consts = FxHashSet::default(); |
125 | | - let mut impl_type = FxHashSet::default(); |
126 | | - |
127 | | - if let Some(item_list) = impl_def.assoc_item_list() { |
128 | | - for item in item_list.assoc_items() { |
129 | | - match item { |
130 | | - ast::AssocItem::Fn(f) => { |
131 | | - if let Some(n) = f.name() { |
132 | | - impl_fns_consts.insert(n.syntax().to_string()); |
133 | | - } |
134 | | - } |
135 | | - |
136 | | - ast::AssocItem::TypeAlias(t) => { |
137 | | - if let Some(n) = t.name() { |
138 | | - impl_type.insert(n.syntax().to_string()); |
139 | | - } |
140 | | - } |
141 | | - |
142 | | - ast::AssocItem::Const(c) => { |
143 | | - if let Some(n) = c.name() { |
144 | | - impl_fns_consts.insert(n.syntax().to_string()); |
145 | | - } |
146 | | - } |
147 | | - ast::AssocItem::MacroCall(_) => (), |
148 | | - } |
149 | | - } |
150 | | - } |
151 | | - |
152 | | - resolve_target_trait(sema, impl_def).map_or(vec![], |target_trait| { |
153 | | - target_trait |
154 | | - .items(sema.db) |
155 | | - .iter() |
156 | | - .filter(|i| match i { |
157 | | - hir::AssocItem::Function(f) => { |
158 | | - !impl_fns_consts.contains(&f.name(sema.db).to_string()) |
159 | | - } |
160 | | - hir::AssocItem::TypeAlias(t) => !impl_type.contains(&t.name(sema.db).to_string()), |
161 | | - hir::AssocItem::Const(c) => c |
162 | | - .name(sema.db) |
163 | | - .map(|n| !impl_fns_consts.contains(&n.to_string())) |
164 | | - .unwrap_or_default(), |
165 | | - }) |
166 | | - .cloned() |
167 | | - .collect() |
168 | | - }) |
169 | | -} |
170 | | - |
171 | | -pub(crate) fn resolve_target_trait( |
172 | | - sema: &Semantics<RootDatabase>, |
173 | | - impl_def: &ast::Impl, |
174 | | -) -> Option<hir::Trait> { |
175 | | - let ast_path = |
176 | | - impl_def.trait_().map(|it| it.syntax().clone()).and_then(ast::PathType::cast)?.path()?; |
177 | | - |
178 | | - match sema.resolve_path(&ast_path) { |
179 | | - Some(hir::PathResolution::Def(hir::ModuleDef::Trait(def))) => Some(def), |
180 | | - _ => None, |
181 | | - } |
182 | | -} |
183 | | - |
184 | 117 | pub(crate) fn vis_offset(node: &SyntaxNode) -> TextSize { |
185 | 118 | node.children_with_tokens() |
186 | 119 | .find(|it| !matches!(it.kind(), WHITESPACE | COMMENT | ATTR)) |
@@ -223,54 +156,6 @@ fn invert_special_case(expr: &ast::Expr) -> Option<ast::Expr> { |
223 | 156 | } |
224 | 157 | } |
225 | 158 |
|
226 | | -#[derive(Clone, Copy)] |
227 | | -pub enum TryEnum { |
228 | | - Result, |
229 | | - Option, |
230 | | -} |
231 | | - |
232 | | -impl TryEnum { |
233 | | - const ALL: [TryEnum; 2] = [TryEnum::Option, TryEnum::Result]; |
234 | | - |
235 | | - pub fn from_ty(sema: &Semantics<RootDatabase>, ty: &Type) -> Option<TryEnum> { |
236 | | - let enum_ = match ty.as_adt() { |
237 | | - Some(Adt::Enum(it)) => it, |
238 | | - _ => return None, |
239 | | - }; |
240 | | - TryEnum::ALL.iter().find_map(|&var| { |
241 | | - if &enum_.name(sema.db).to_string() == var.type_name() { |
242 | | - return Some(var); |
243 | | - } |
244 | | - None |
245 | | - }) |
246 | | - } |
247 | | - |
248 | | - pub(crate) fn happy_case(self) -> &'static str { |
249 | | - match self { |
250 | | - TryEnum::Result => "Ok", |
251 | | - TryEnum::Option => "Some", |
252 | | - } |
253 | | - } |
254 | | - |
255 | | - pub(crate) fn sad_pattern(self) -> ast::Pat { |
256 | | - match self { |
257 | | - TryEnum::Result => make::tuple_struct_pat( |
258 | | - make::path_unqualified(make::path_segment(make::name_ref("Err"))), |
259 | | - iter::once(make::wildcard_pat().into()), |
260 | | - ) |
261 | | - .into(), |
262 | | - TryEnum::Option => make::ident_pat(make::name("None")).into(), |
263 | | - } |
264 | | - } |
265 | | - |
266 | | - fn type_name(self) -> &'static str { |
267 | | - match self { |
268 | | - TryEnum::Result => "Result", |
269 | | - TryEnum::Option => "Option", |
270 | | - } |
271 | | - } |
272 | | -} |
273 | | - |
274 | 159 | /// Helps with finding well-know things inside the standard library. This is |
275 | 160 | /// somewhat similar to the known paths infra inside hir, but it different; We |
276 | 161 | /// want to make sure that IDE specific paths don't become interesting inside |
|
0 commit comments