mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-29 05:15:04 +00:00
Clarify the names one more time
This commit is contained in:
parent
56e67e3a39
commit
c5868a4879
7 changed files with 26 additions and 17 deletions
|
@ -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,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -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()),
|
||||||
|
|
|
@ -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,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -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))
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue