This contains the syntax range of the name itself, allowing NavigationTarget to
properly set the focus_range. This should make it so that when using symbol
based navigation, we should always focus on the name, instead of the full range.
name: symbol.name.clone(),
kind: symbol.ptr.kind(),
full_range: symbol.ptr.range(),
name: symbol.name.clone(),
kind: symbol.ptr.kind(),
full_range: symbol.ptr.range(),
+ focus_range: symbol.name_range,
container_name: symbol.container_name.clone(),
}
}
container_name: symbol.container_name.clone(),
}
}
SyntaxKind::{self, *},
ast::{self, NameOwner},
WalkEvent,
SyntaxKind::{self, *},
ast::{self, NameOwner},
WalkEvent,
};
use ra_db::{
SourceRootId, SourceDatabase,
};
use ra_db::{
SourceRootId, SourceDatabase,
let node = find_covering_node(source_file.syntax(), text_range);
let ptr = SyntaxNodePtr::new(node);
// TODO: Should we get container name for macro symbols?
let node = find_covering_node(source_file.syntax(), text_range);
let ptr = SyntaxNodePtr::new(node);
// TODO: Should we get container name for macro symbols?
- symbols.push(FileSymbol { file_id, name, ptr, container_name: None })
+ symbols.push(FileSymbol { file_id, name, ptr, name_range: None, container_name: None })
}
Arc::new(SymbolIndex::new(symbols))
}
Arc::new(SymbolIndex::new(symbols))
pub(crate) file_id: FileId,
pub(crate) name: SmolStr,
pub(crate) ptr: SyntaxNodePtr,
pub(crate) file_id: FileId,
pub(crate) name: SmolStr,
pub(crate) ptr: SyntaxNodePtr,
+ pub(crate) name_range: Option<TextRange>,
pub(crate) container_name: Option<SmolStr>,
}
pub(crate) container_name: Option<SmolStr>,
}
-fn to_symbol(node: &SyntaxNode) -> Option<(SmolStr, SyntaxNodePtr)> {
- fn decl<N: NameOwner>(node: &N) -> Option<(SmolStr, SyntaxNodePtr)> {
- let name = node.name()?.text().clone();
+fn to_symbol(node: &SyntaxNode) -> Option<(SmolStr, SyntaxNodePtr, TextRange)> {
+ fn decl<N: NameOwner>(node: &N) -> Option<(SmolStr, SyntaxNodePtr, TextRange)> {
+ let name = node.name()?;
+ let name_range = name.syntax().range();
+ let name = name.text().clone();
let ptr = SyntaxNodePtr::new(node.syntax());
let ptr = SyntaxNodePtr::new(node.syntax());
+ Some((name, ptr, name_range))
}
visitor()
.visit(decl::<ast::FnDef>)
}
visitor()
.visit(decl::<ast::FnDef>)
}
fn to_file_symbol(node: &SyntaxNode, file_id: FileId) -> Option<FileSymbol> {
}
fn to_file_symbol(node: &SyntaxNode, file_id: FileId) -> Option<FileSymbol> {
- to_symbol(node).map(move |(name, ptr)| FileSymbol { name, ptr, file_id, container_name: None })
+ to_symbol(node).map(move |(name, ptr, name_range)| FileSymbol {
+ name,
+ ptr,
+ file_id,
+ name_range: Some(name_range),
+ container_name: None,
+ })