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},
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,
}
};
}
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>) {}
+}
"#,
);
}