Merge #8025
8025: Goto definition works for `S { a: }` case r=matklad a=matklad
bors r+
🤖
Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
commit
b4446cdd06
@ -24,7 +24,7 @@
|
||||
};
|
||||
use syntax::{
|
||||
ast::{self, AstNode},
|
||||
SyntaxNode, TextRange, TextSize,
|
||||
AstPtr, SyntaxNode, TextRange, TextSize,
|
||||
};
|
||||
|
||||
use crate::{
|
||||
@ -161,8 +161,27 @@ pub(crate) fn resolve_record_field(
|
||||
db: &dyn HirDatabase,
|
||||
field: &ast::RecordExprField,
|
||||
) -> Option<(Field, Option<Local>)> {
|
||||
let expr = field.expr()?;
|
||||
let expr_id = self.expr_id(db, &expr)?;
|
||||
let expr_id = {
|
||||
let record_lit = field.parent_record_lit();
|
||||
let record_lit_expr = self.expr_id(db, &ast::Expr::from(record_lit))?;
|
||||
let body = self.body.as_ref()?;
|
||||
let body_source_map = self.body_source_map.as_ref()?;
|
||||
match &body[record_lit_expr] {
|
||||
hir_def::expr::Expr::RecordLit { fields, .. } => {
|
||||
let field_ptr = InFile::new(self.file_id, AstPtr::new(field));
|
||||
fields.iter().enumerate().find_map(|(i, f)| {
|
||||
let ptr = body_source_map.field_syntax(record_lit_expr, i);
|
||||
if ptr == field_ptr {
|
||||
Some(f.expr)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})?
|
||||
}
|
||||
_ => return None,
|
||||
}
|
||||
};
|
||||
|
||||
let local = if field.name_ref().is_some() {
|
||||
None
|
||||
} else {
|
||||
|
@ -1158,6 +1158,17 @@ fn goto_def_for_intra_doc_link_inner() {
|
||||
|
||||
//- /m.rs
|
||||
//! [`super::S$0`]
|
||||
"#,
|
||||
)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn goto_incomplete_field() {
|
||||
check(
|
||||
r#"
|
||||
struct A { a: u32 }
|
||||
//^
|
||||
fn foo() { A { a$0: }; }
|
||||
"#,
|
||||
)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user