]> git.lizzy.rs Git - rust.git/commitdiff
Don't show signature help after closing bracket
authoriDawer <ilnur.iskhakov.oss@outlook.com>
Fri, 29 Apr 2022 18:26:54 +0000 (23:26 +0500)
committeriDawer <ilnur.iskhakov.oss@outlook.com>
Fri, 29 Apr 2022 18:26:54 +0000 (23:26 +0500)
crates/ide/src/signature_help.rs

index 50187c933d3aa7b3125f505ca807671aac46644a..57b0305fb352d0503baa05a7814e03760871edf1 100644 (file)
@@ -8,7 +8,7 @@
 use syntax::{
     algo,
     ast::{self, HasArgList},
-    AstNode, Direction, SyntaxToken, TextRange, TextSize,
+    match_ast, AstNode, Direction, SyntaxToken, TextRange, TextSize,
 };
 
 use crate::RootDatabase;
@@ -66,12 +66,26 @@ pub(crate) fn signature_help(db: &RootDatabase, position: FilePosition) -> Optio
         .and_then(|tok| algo::skip_trivia_token(tok, Direction::Prev))?;
     let token = sema.descend_into_macros_single(token);
 
-    if let Some(help) = signature_help_for_call(&sema, &token) {
-        return Some(help);
-    }
-
-    if let Some(help) = signature_help_for_generics(&sema, &token) {
-        return Some(help);
+    for node in token.ancestors() {
+        match_ast! {
+            match node {
+                ast::ArgList(arg_list) => {
+                    let cursor_outside = arg_list.r_paren_token().as_ref() == Some(&token);
+                    if cursor_outside {
+                        return None;
+                    }
+                    return signature_help_for_call(&sema, token);
+                },
+                ast::GenericArgList(garg_list) => {
+                    let cursor_outside = garg_list.r_angle_token().as_ref() == Some(&token);
+                    if cursor_outside {
+                        return None;
+                    }
+                    return signature_help_for_generics(&sema, token);
+                },
+                _ => (),
+            }
+        }
     }
 
     None
@@ -79,7 +93,7 @@ pub(crate) fn signature_help(db: &RootDatabase, position: FilePosition) -> Optio
 
 fn signature_help_for_call(
     sema: &Semantics<RootDatabase>,
-    token: &SyntaxToken,
+    token: SyntaxToken,
 ) -> Option<SignatureHelp> {
     // Find the calling expression and its NameRef
     let mut node = token.parent()?;
@@ -104,7 +118,7 @@ fn signature_help_for_call(
         node = node.parent()?;
     };
 
-    let (callable, active_parameter) = callable_for_node(sema, &calling_node, token)?;
+    let (callable, active_parameter) = callable_for_node(sema, &calling_node, &token)?;
 
     let mut res =
         SignatureHelp { doc: None, signature: String::new(), parameters: vec![], active_parameter };
@@ -183,7 +197,7 @@ fn signature_help_for_call(
 
 fn signature_help_for_generics(
     sema: &Semantics<RootDatabase>,
-    token: &SyntaxToken,
+    token: SyntaxToken,
 ) -> Option<SignatureHelp> {
     let parent = token.parent()?;
     let arg_list = parent
@@ -691,6 +705,28 @@ fn foo(x: u32, y: u32) -> u32 {x + y}
         );
     }
 
+    #[test]
+    fn outside_of_arg_list() {
+        check(
+            r#"
+fn foo(a: u8) {}
+fn f() {
+    foo(123)$0
+}
+"#,
+            expect![[]],
+        );
+        check(
+            r#"
+fn foo<T>(a: u8) {}
+fn f() {
+    foo::<u32>$0()
+}
+"#,
+            expect![[]],
+        );
+    }
+
     #[test]
     fn test_nested_method_in_lambda() {
         check(