SyntaxNode, SyntaxNodePtr, AstNode, SmolStr, TextRange, ast,
SyntaxKind::{self, NAME},
};
-use hir::{ModuleSource, FieldSource, Name};
+use hir::{ModuleSource, FieldSource, Name, ImplItem};
use crate::{FileSymbol, db::RootDatabase};
name: symbol.name.clone(),
kind: symbol.ptr.kind(),
full_range: symbol.ptr.range(),
- focus_range: None,
+ focus_range: symbol.name_range,
container_name: symbol.container_name.clone(),
}
}
let (file_id, node) = e.source(db);
NavigationTarget::from_named(file_id.original_file(db), &*node)
}
- hir::ModuleDef::Type(e) => {
+ hir::ModuleDef::TypeAlias(e) => {
let (file_id, node) = e.source(db);
NavigationTarget::from_named(file_id.original_file(db), &*node)
}
)
}
+ pub(crate) fn from_impl_item(db: &RootDatabase, impl_item: hir::ImplItem) -> NavigationTarget {
+ match impl_item {
+ ImplItem::Method(f) => NavigationTarget::from_function(db, f),
+ ImplItem::Const(c) => {
+ let (file_id, node) = c.source(db);
+ NavigationTarget::from_named(file_id.original_file(db), &*node)
+ }
+ ImplItem::TypeAlias(a) => {
+ let (file_id, node) = a.source(db);
+ NavigationTarget::from_named(file_id.original_file(db), &*node)
+ }
+ }
+ }
+
#[cfg(test)]
pub(crate) fn assert_match(&self, expected: &str) {
let actual = self.debug_render();
buf.push_str(&format!(" {:?}", focus_range))
}
if let Some(container_name) = self.container_name() {
- buf.push_str(&format!(" {:?}", container_name))
+ buf.push_str(&format!(" {}", container_name))
}
buf
}
- fn from_named(file_id: FileId, node: &impl ast::NameOwner) -> NavigationTarget {
+ /// Allows `NavigationTarget` to be created from a `NameOwner`
+ pub(crate) fn from_named(file_id: FileId, node: &impl ast::NameOwner) -> NavigationTarget {
let name = node.name().map(|it| it.text().clone()).unwrap_or_default();
let focus_range = node.name().map(|it| it.syntax().range());
NavigationTarget::from_syntax(file_id, name, focus_range, node.syntax())