|
1 |
| -use hir::{ItemInNs, ModuleDef}; |
2 |
| -use ide_db::{ |
3 |
| - assists::{AssistId, AssistKind}, |
4 |
| - imports::import_assets::item_for_path_search, |
5 |
| -}; |
| 1 | +use hir::{db::HirDatabase, AsAssocItem, AssocItem, AssocItemContainer, ItemInNs, ModuleDef}; |
| 2 | +use ide_db::assists::{AssistId, AssistKind}; |
6 | 3 | use syntax::{ast, AstNode};
|
7 | 4 |
|
8 | 5 | use crate::{
|
@@ -67,6 +64,33 @@ pub(crate) fn qualify_method_call(acc: &mut Assists, ctx: &AssistContext) -> Opt
|
67 | 64 | Some(())
|
68 | 65 | }
|
69 | 66 |
|
| 67 | +fn item_for_path_search(db: &dyn HirDatabase, item: ItemInNs) -> Option<ItemInNs> { |
| 68 | + Some(match item { |
| 69 | + ItemInNs::Types(_) | ItemInNs::Values(_) => match item_as_assoc(db, item) { |
| 70 | + Some(assoc_item) => match assoc_item.container(db) { |
| 71 | + AssocItemContainer::Trait(trait_) => ItemInNs::from(ModuleDef::from(trait_)), |
| 72 | + AssocItemContainer::Impl(impl_) => { |
| 73 | + let impled_trait = if matches!(assoc_item, AssocItem::Function(..)) { |
| 74 | + impl_.trait_(db) |
| 75 | + } else { |
| 76 | + None |
| 77 | + }; |
| 78 | + match impled_trait { |
| 79 | + None => ItemInNs::from(ModuleDef::from(impl_.self_ty(db).as_adt()?)), |
| 80 | + Some(t) => ItemInNs::from(ModuleDef::from(t)), |
| 81 | + } |
| 82 | + } |
| 83 | + }, |
| 84 | + None => item, |
| 85 | + }, |
| 86 | + ItemInNs::Macros(_) => item, |
| 87 | + }) |
| 88 | +} |
| 89 | + |
| 90 | +fn item_as_assoc(db: &dyn HirDatabase, item: ItemInNs) -> Option<AssocItem> { |
| 91 | + item.as_module_def().and_then(|module_def| module_def.as_assoc_item(db)) |
| 92 | +} |
| 93 | + |
70 | 94 | #[cfg(test)]
|
71 | 95 | mod tests {
|
72 | 96 | use super::*;
|
@@ -281,7 +305,7 @@ use test_mod::*;
|
281 | 305 |
|
282 | 306 | fn main() {
|
283 | 307 | let test_struct = test_mod::TestStruct {};
|
284 |
| - TestStruct::test_method(&test_struct) |
| 308 | + TestTrait::test_method(&test_struct) |
285 | 309 | }
|
286 | 310 | "#,
|
287 | 311 | );
|
@@ -324,7 +348,7 @@ use test_mod::*;
|
324 | 348 |
|
325 | 349 | fn main() {
|
326 | 350 | let test_struct = test_mod::TestStruct {};
|
327 |
| - TestStruct::test_method(&test_struct, 12, 32u) |
| 351 | + TestTrait::test_method(&test_struct, 12, 32u) |
328 | 352 | }
|
329 | 353 | "#,
|
330 | 354 | );
|
@@ -367,7 +391,7 @@ use test_mod::*;
|
367 | 391 |
|
368 | 392 | fn main() {
|
369 | 393 | let test_struct = test_mod::TestStruct {};
|
370 |
| - TestStruct::test_method(test_struct, 12, 32u) |
| 394 | + TestTrait::test_method(test_struct, 12, 32u) |
371 | 395 | }
|
372 | 396 | "#,
|
373 | 397 | );
|
@@ -410,7 +434,7 @@ use test_mod::*;
|
410 | 434 |
|
411 | 435 | fn main() {
|
412 | 436 | let test_struct = test_mod::TestStruct {};
|
413 |
| - TestStruct::test_method(&mut test_struct, 12, 32u) |
| 437 | + TestTrait::test_method(&mut test_struct, 12, 32u) |
414 | 438 | }
|
415 | 439 | "#,
|
416 | 440 | );
|
@@ -480,7 +504,7 @@ use test_mod::*;
|
480 | 504 |
|
481 | 505 | fn main() {
|
482 | 506 | let test_struct = TestStruct {};
|
483 |
| - TestStruct::test_method::<()>(&test_struct) |
| 507 | + TestTrait::test_method::<()>(&test_struct) |
484 | 508 | }
|
485 | 509 | "#,
|
486 | 510 | );
|
|
0 commit comments