Clarify the names one more time

This commit is contained in:
Aleksey Kladov 2020-10-15 17:33:32 +02:00
parent 56e67e3a39
commit c5868a4879
7 changed files with 26 additions and 17 deletions

View file

@ -232,8 +232,8 @@ pub(crate) fn external_docs(
let node = token.parent(); let node = token.parent();
let definition = match_ast! { let definition = match_ast! {
match node { match node {
ast::NameRef(name_ref) => NameRefClass::classify(&sema, &name_ref).map(|d| d.definition(sema.db)), ast::NameRef(name_ref) => NameRefClass::classify(&sema, &name_ref).map(|d| d.referenced(sema.db)),
ast::Name(name) => NameClass::classify(&sema, &name).map(|d| d.reference_or_definition(sema.db)), ast::Name(name) => NameClass::classify(&sema, &name).map(|d| d.referenced_or_defined(sema.db)),
_ => None, _ => None,
} }
}; };

View file

@ -40,7 +40,7 @@ pub(crate) fn goto_definition(
reference_definition(&sema, &name_ref).to_vec() reference_definition(&sema, &name_ref).to_vec()
}, },
ast::Name(name) => { ast::Name(name) => {
let def = NameClass::classify(&sema, &name)?.reference_or_definition(sema.db); let def = NameClass::classify(&sema, &name)?.referenced_or_defined(sema.db);
let nav = def.try_to_nav(sema.db)?; let nav = def.try_to_nav(sema.db)?;
vec![nav] vec![nav]
}, },
@ -83,7 +83,7 @@ pub(crate) fn reference_definition(
) -> ReferenceResult { ) -> ReferenceResult {
let name_kind = NameRefClass::classify(sema, name_ref); let name_kind = NameRefClass::classify(sema, name_ref);
if let Some(def) = name_kind { if let Some(def) = name_kind {
let def = def.definition(sema.db); let def = def.referenced(sema.db);
return match def.try_to_nav(sema.db) { return match def.try_to_nav(sema.db) {
Some(nav) => ReferenceResult::Exact(nav), Some(nav) => ReferenceResult::Exact(nav),
None => ReferenceResult::Approximate(Vec::new()), None => ReferenceResult::Approximate(Vec::new()),

View file

@ -107,8 +107,8 @@ pub(crate) fn hover(
let node = token.parent(); let node = token.parent();
let definition = match_ast! { let definition = match_ast! {
match node { match node {
ast::Name(name) => NameClass::classify(&sema, &name).and_then(|d| d.definition(sema.db)), ast::Name(name) => NameClass::classify(&sema, &name).and_then(|d| d.defined(sema.db)),
ast::NameRef(name_ref) => NameRefClass::classify(&sema, &name_ref).map(|d| d.definition(sema.db)), ast::NameRef(name_ref) => NameRefClass::classify(&sema, &name_ref).map(|d| d.referenced(sema.db)),
_ => None, _ => None,
} }
}; };

View file

@ -132,13 +132,13 @@ fn find_name(
opt_name: Option<ast::Name>, opt_name: Option<ast::Name>,
) -> Option<RangeInfo<Definition>> { ) -> Option<RangeInfo<Definition>> {
if let Some(name) = opt_name { if let Some(name) = opt_name {
let def = NameClass::classify(sema, &name)?.reference_or_definition(sema.db); let def = NameClass::classify(sema, &name)?.referenced_or_defined(sema.db);
let range = name.syntax().text_range(); let range = name.syntax().text_range();
return Some(RangeInfo::new(range, def)); return Some(RangeInfo::new(range, def));
} }
let name_ref = let name_ref =
sema.find_node_at_offset_with_descend::<ast::NameRef>(&syntax, position.offset)?; sema.find_node_at_offset_with_descend::<ast::NameRef>(&syntax, position.offset)?;
let def = NameRefClass::classify(sema, &name_ref)?.definition(sema.db); let def = NameRefClass::classify(sema, &name_ref)?.referenced(sema.db);
let range = name_ref.syntax().text_range(); let range = name_ref.syntax().text_range();
Some(RangeInfo::new(range, def)) Some(RangeInfo::new(range, def))
} }

View file

@ -91,7 +91,8 @@ pub enum NameClass {
} }
impl NameClass { impl NameClass {
pub fn definition(self, db: &dyn HirDatabase) -> Option<Definition> { /// `Definition` defined by this name.
pub fn defined(self, db: &dyn HirDatabase) -> Option<Definition> {
let res = match self { let res = match self {
NameClass::ExternCrate(krate) => Definition::ModuleDef(krate.root_module(db).into()), NameClass::ExternCrate(krate) => Definition::ModuleDef(krate.root_module(db).into()),
NameClass::Definition(it) => it, NameClass::Definition(it) => it,
@ -103,7 +104,8 @@ impl NameClass {
Some(res) Some(res)
} }
pub fn reference_or_definition(self, db: &dyn HirDatabase) -> Definition { /// `Definition` referenced or defined by this name.
pub fn referenced_or_defined(self, db: &dyn HirDatabase) -> Definition {
match self { match self {
NameClass::ExternCrate(krate) => Definition::ModuleDef(krate.root_module(db).into()), NameClass::ExternCrate(krate) => Definition::ModuleDef(krate.root_module(db).into()),
NameClass::Definition(it) | NameClass::ConstReference(it) => it, NameClass::Definition(it) | NameClass::ConstReference(it) => it,
@ -150,7 +152,7 @@ impl NameClass {
}) })
.and_then(|name_ref| NameRefClass::classify(sema, &name_ref))?; .and_then(|name_ref| NameRefClass::classify(sema, &name_ref))?;
Some(NameClass::Definition(name_ref_class.definition(sema.db))) Some(NameClass::Definition(name_ref_class.referenced(sema.db)))
} else { } else {
let extern_crate = it.syntax().parent().and_then(ast::ExternCrate::cast)?; let extern_crate = it.syntax().parent().and_then(ast::ExternCrate::cast)?;
let resolved = sema.resolve_extern_crate(&extern_crate)?; let resolved = sema.resolve_extern_crate(&extern_crate)?;
@ -233,15 +235,20 @@ impl NameClass {
pub enum NameRefClass { pub enum NameRefClass {
ExternCrate(Crate), ExternCrate(Crate),
Definition(Definition), Definition(Definition),
FieldShorthand { local: Local, field: Definition }, FieldShorthand { local_ref: Local, field_ref: Definition },
} }
impl NameRefClass { impl NameRefClass {
pub fn definition(self, db: &dyn HirDatabase) -> Definition { /// `Definition`, which this name refers to.
pub fn referenced(self, db: &dyn HirDatabase) -> Definition {
match self { match self {
NameRefClass::ExternCrate(krate) => Definition::ModuleDef(krate.root_module(db).into()), NameRefClass::ExternCrate(krate) => Definition::ModuleDef(krate.root_module(db).into()),
NameRefClass::Definition(def) => def, NameRefClass::Definition(def) => def,
NameRefClass::FieldShorthand { local, field: _ } => Definition::Local(local), NameRefClass::FieldShorthand { local_ref, field_ref: _ } => {
// FIXME: this is inherently ambiguous -- this name refers to
// two different defs....
Definition::Local(local_ref)
}
} }
} }
@ -272,7 +279,9 @@ impl NameRefClass {
let field = Definition::Field(field); let field = Definition::Field(field);
let res = match local { let res = match local {
None => NameRefClass::Definition(field), None => NameRefClass::Definition(field),
Some(local) => NameRefClass::FieldShorthand { field, local }, Some(local) => {
NameRefClass::FieldShorthand { field_ref: field, local_ref: local }
}
}; };
return Some(res); return Some(res);
} }

View file

@ -60,5 +60,5 @@ fn get_name_definition<'a>(
candidate_node candidate_node
}; };
let name = ast::Name::cast(candidate_name_node)?; let name = ast::Name::cast(candidate_name_node)?;
NameClass::classify(sema, &name)?.definition(sema.db) NameClass::classify(sema, &name)?.defined(sema.db)
} }

View file

@ -292,7 +292,7 @@ impl<'a> FindUsages<'a> {
}; };
sink(reference) sink(reference)
} }
Some(NameRefClass::FieldShorthand { local, field }) => { Some(NameRefClass::FieldShorthand { local_ref: local, field_ref: field }) => {
let reference = match self.def { let reference = match self.def {
Definition::Field(_) if &field == self.def => Reference { Definition::Field(_) if &field == self.def => Reference {
file_range: self.sema.original_range(name_ref.syntax()), file_range: self.sema.original_range(name_ref.syntax()),