about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPaweł Palenica <pawelpalenica11@gmail.com>2021-10-21 23:41:43 -0700
committerPaweł Palenica <pawelpalenica11@gmail.com>2021-10-21 23:42:14 -0700
commitbfc86f64c3f1498ce0939ab75e301a20cb03b36b (patch)
tree5ecb956f6186b77568c8bd18dc9c4a66a97a6465
parent91988f46b7618c89652632f7052265e5d2b5cae5 (diff)
downloadrust-bfc86f64c3f1498ce0939ab75e301a20cb03b36b.tar.gz
rust-bfc86f64c3f1498ce0939ab75e301a20cb03b36b.zip
apply code review suggestions
-rw-r--r--crates/ide_assists/src/handlers/qualify_method_call.rs55
-rw-r--r--crates/ide_assists/src/handlers/qualify_path.rs3
2 files changed, 51 insertions, 7 deletions
diff --git a/crates/ide_assists/src/handlers/qualify_method_call.rs b/crates/ide_assists/src/handlers/qualify_method_call.rs
index 132996234fa..43878879edf 100644
--- a/crates/ide_assists/src/handlers/qualify_method_call.rs
+++ b/crates/ide_assists/src/handlers/qualify_method_call.rs
@@ -12,7 +12,7 @@ use crate::{
 
 // Assist: qualify_method_call
 //
-// If the name is resolvable, provides fully qualified path for it.
+// Replaces the method call with a qualified function call.
 //
 // ```
 // struct Foo;
@@ -36,8 +36,10 @@ use crate::{
 // }
 // ```
 pub(crate) fn qualify_method_call(acc: &mut Assists, ctx: &AssistContext) -> Option<()> {
-    let call: ast::MethodCallExpr = ctx.find_node_at_offset()?;
-    let fn_name = &call.name_ref()?;
+    let name: ast::NameRef = ctx.find_node_at_offset()?;
+    let call = name.syntax().parent().and_then(ast::MethodCallExpr::cast)?;
+
+    let ident = name.ident_token()?;
 
     let range = call.syntax().text_range();
     let resolved_call = ctx.sema.resolve_method_call(&call)?;
@@ -52,7 +54,7 @@ pub(crate) fn qualify_method_call(acc: &mut Assists, ctx: &AssistContext) -> Opt
 
     acc.add(
         AssistId("qualify_method_call", AssistKind::RefactorInline),
-        format!("Qualify call `{}`", fn_name),
+        format!("Qualify `{}` method call", ident.text()),
         range,
         |builder| {
             qualify_candidate.qualify(
@@ -68,7 +70,7 @@ pub(crate) fn qualify_method_call(acc: &mut Assists, ctx: &AssistContext) -> Opt
 #[cfg(test)]
 mod tests {
     use super::*;
-    use crate::tests::check_assist;
+    use crate::tests::{check_assist, check_assist_not_applicable};
 
     #[test]
     fn struct_method() {
@@ -483,4 +485,47 @@ fn main() {
 "#,
         );
     }
+
+    #[test]
+    fn struct_method_over_stuct_instance() {
+        check_assist_not_applicable(
+            qualify_method_call,
+            r#"
+struct Foo;
+impl Foo {
+    fn foo(&self) {}
+}
+
+fn main() {
+    let foo = Foo {};
+    f$0oo.foo()
+}
+"#,
+        );
+    }
+
+    #[test]
+    fn trait_method_over_stuct_instance() {
+        check_assist_not_applicable(
+            qualify_method_call,
+            r#"
+mod test_mod {
+    pub trait TestTrait {
+        fn test_method(&self);
+    }
+    pub struct TestStruct {}
+    impl TestTrait for TestStruct {
+        fn test_method(&self) {}
+    }
+}
+
+use test_mod::*;
+
+fn main() {
+    let test_struct = test_mod::TestStruct {};
+    tes$0t_struct.test_method()
+}
+"#,
+        );
+    }
 }
diff --git a/crates/ide_assists/src/handlers/qualify_path.rs b/crates/ide_assists/src/handlers/qualify_path.rs
index 1f2a115b296..29f2c785bc2 100644
--- a/crates/ide_assists/src/handlers/qualify_path.rs
+++ b/crates/ide_assists/src/handlers/qualify_path.rs
@@ -171,8 +171,7 @@ impl QualifyCandidate<'_> {
         let trait_method_name = mcall_expr.name_ref()?;
         let trait_ = item_as_trait(db, item)?;
         let method = find_trait_method(db, trait_, &trait_method_name)?;
-        Self::qualify_fn_call(db, mcall_expr, replacer, import, &method);
-        Some(())
+        Self::qualify_fn_call(db, mcall_expr, replacer, import, &method)
     }
 }