Explicitly check for reference locals or fields in Name classification

This commit is contained in:
Lukas Wirth 2021-07-11 14:03:35 +02:00
parent 87621de2b9
commit c65bb7f8b9
11 changed files with 67 additions and 50 deletions

View file

@ -60,12 +60,11 @@ pub(crate) fn goto_definition(
reference_definition(&sema, Either::Right(&name_ref))
},
ast::Name(name) => {
let def = NameClass::classify(&sema, &name)?.referenced_or_defined();
try_find_trait_item_definition(sema.db, &def)
.or_else(|| def.try_to_nav(sema.db))
let def = NameClass::classify(&sema, &name)?.defined_or_referenced_local();
try_find_trait_item_definition(sema.db, &def).or_else(|| def.try_to_nav(sema.db))
},
ast::Lifetime(lt) => if let Some(name_class) = NameClass::classify_lifetime(&sema, &lt) {
let def = name_class.referenced_or_defined();
let def = name_class.defined_or_referenced_local();
def.try_to_nav(sema.db)
} else {
reference_definition(&sema, Either::Left(&lt))
@ -140,7 +139,7 @@ pub(crate) fn reference_definition(
|lifetime| NameRefClass::classify_lifetime(sema, lifetime),
|name_ref| NameRefClass::classify(sema, name_ref),
)?;
let def = name_kind.referenced();
let def = name_kind.referenced_local();
def.try_to_nav(sema.db)
}
@ -878,10 +877,11 @@ fn main() {
r#"
enum Foo {
Bar { x: i32 }
} //^
}
fn baz(foo: Foo) {
match foo {
Foo::Bar { x$0 } => x
//^
};
}
"#,