8986: Add go to type definition for struct fields within struct r=matklad a=lf-

Example:

```rust
struct A;

struct B {
    a/*<- cursor*/: A,
}
```

Go to type definition used to not work on this position. It now goes to
`A` as expected.

Co-authored-by: Jade <software@lfcode.ca>
This commit is contained in:
bors[bot] 2021-05-25 11:25:00 +00:00 committed by GitHub
commit b7414fa14a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,3 +1,4 @@
use ide_db::base_db::Upcast;
use ide_db::RootDatabase;
use syntax::{ast, match_ast, AstNode, SyntaxKind::*, SyntaxToken, TokenAtOffset, T};
@ -31,6 +32,7 @@ pub(crate) fn goto_type_definition(
ast::Pat(it) => sema.type_of_pat(&it)?,
ast::SelfParam(it) => sema.type_of_self(&it)?,
ast::Type(it) => sema.resolve_type(&it)?,
ast::RecordField(it) => sema.to_def(&it).map(|d| d.ty(db.upcast()))?,
_ => return None,
}
};
@ -161,4 +163,34 @@ impl Foo$0 {}
"#,
)
}
#[test]
fn goto_def_for_struct_field() {
check(
r#"
struct Bar;
//^^^
struct Foo {
bar$0: Bar,
}
"#,
);
}
#[test]
fn goto_def_for_enum_struct_field() {
check(
r#"
struct Bar;
//^^^
enum Foo {
Bar {
bar$0: Bar
},
}
"#,
);
}
}