]> git.lizzy.rs Git - rust.git/commitdiff
Support goto definition for ADT-SelfParams
authorLukas Wirth <lukastw97@gmail.com>
Sat, 28 Nov 2020 15:07:07 +0000 (16:07 +0100)
committerLukas Wirth <lukastw97@gmail.com>
Sat, 28 Nov 2020 15:07:07 +0000 (16:07 +0100)
crates/ide/src/goto_definition.rs

index 15792f94725ccc9edc8055b6fc11e74fff366990..d41dd3d928ef6070763047b22ade1e9d61a878b1 100644 (file)
@@ -3,12 +3,7 @@
     defs::{NameClass, NameRefClass},
     symbol_index, RootDatabase,
 };
-use syntax::{
-    ast::{self},
-    match_ast, AstNode,
-    SyntaxKind::*,
-    SyntaxToken, TokenAtOffset, T,
-};
+use syntax::{ast, match_ast, AstNode, SyntaxKind::*, SyntaxToken, TokenAtOffset, T};
 
 use crate::{
     display::{ToNav, TryToNav},
@@ -44,6 +39,12 @@ pub(crate) fn goto_definition(
                 let nav = def.try_to_nav(sema.db)?;
                 vec![nav]
             },
+            ast::SelfParam(self_param) => {
+                let ty = sema.type_of_self(&self_param)?;
+                let adt_def = ty.autoderef(db).filter_map(|ty| ty.as_adt()).last()?;
+                let nav = adt_def.to_nav(db);
+                vec![nav]
+            },
             _ => return None,
         }
     };
@@ -981,6 +982,35 @@ trait Iterator {
 }
 
 fn g() -> <() as Iterator<A = (), B<|> = u8>>::A {}
+"#,
+        );
+    }
+
+    #[test]
+    fn todo_def_type_for_self() {
+        check(
+            r#"
+struct Foo {}
+     //^^^
+
+impl Foo {
+    fn bar(&self<|>) {}
+}
+"#,
+        );
+    }
+
+    #[test]
+    fn todo_def_type_for_arbitrary_self() {
+        check(
+            r#"
+struct Arc<T>(T);
+     //^^^
+struct Foo {}
+
+impl Foo {
+    fn bar(self<|>: Arc<Self>) {}
+}
 "#,
         );
     }