mirror of
https://github.com/Myriad-Dreamin/tinymist.git
synced 2025-07-24 05:05:00 +00:00
dev: more accurate deref target (#104)
This commit is contained in:
parent
876827d39b
commit
4d21026661
7 changed files with 25 additions and 8 deletions
|
@ -44,7 +44,7 @@ impl SemanticRequest for GotoDeclarationRequest {
|
|||
|
||||
let ast_node = LinkedNode::new(source.root()).leaf_at(cursor)?;
|
||||
debug!("ast_node: {ast_node:?}", ast_node = ast_node);
|
||||
let deref_target = get_deref_target(ast_node)?;
|
||||
let deref_target = get_deref_target(ast_node, cursor)?;
|
||||
|
||||
let use_site = deref_target.node();
|
||||
let origin_selection_range = ctx.to_lsp_range(use_site.range(), &source);
|
||||
|
|
|
@ -47,7 +47,7 @@ impl SemanticRequest for GotoDefinitionRequest {
|
|||
let ast_node = LinkedNode::new(source.root()).leaf_at(cursor)?;
|
||||
debug!("ast_node: {ast_node:?}", ast_node = ast_node);
|
||||
|
||||
let deref_target = get_deref_target(ast_node)?;
|
||||
let deref_target = get_deref_target(ast_node, cursor)?;
|
||||
let use_site = deref_target.node().clone();
|
||||
let origin_selection_range = ctx.to_lsp_range(use_site.range(), &source);
|
||||
|
||||
|
|
|
@ -64,7 +64,7 @@ fn def_tooltip(
|
|||
) -> Option<LspHoverContents> {
|
||||
let leaf = LinkedNode::new(source.root()).leaf_at(cursor)?;
|
||||
|
||||
let deref_target = get_deref_target(leaf.clone())?;
|
||||
let deref_target = get_deref_target(leaf.clone(), cursor)?;
|
||||
|
||||
let lnk = find_definition(ctx, source.clone(), deref_target.clone())?;
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@ impl SemanticRequest for PrepareRenameRequest {
|
|||
let ast_node = LinkedNode::new(source.root()).leaf_at(cursor)?;
|
||||
debug!("ast_node: {ast_node:?}", ast_node = ast_node);
|
||||
|
||||
let deref_target = get_deref_target(ast_node)?;
|
||||
let deref_target = get_deref_target(ast_node, cursor)?;
|
||||
let use_site = deref_target.node().clone();
|
||||
let origin_selection_range = ctx.to_lsp_range(use_site.range(), &source);
|
||||
|
||||
|
|
|
@ -29,7 +29,7 @@ impl SemanticRequest for ReferencesRequest {
|
|||
|
||||
let ast_node = LinkedNode::new(source.root()).leaf_at(cursor)?;
|
||||
debug!("ast_node: {ast_node:?}", ast_node = ast_node);
|
||||
let deref_target = get_deref_target(ast_node)?;
|
||||
let deref_target = get_deref_target(ast_node, cursor)?;
|
||||
|
||||
let def_use = ctx.def_use(source.clone())?;
|
||||
let locations = find_references(ctx, def_use, deref_target, ctx.position_encoding())?;
|
||||
|
|
|
@ -33,7 +33,7 @@ impl SemanticRequest for RenameRequest {
|
|||
let ast_node = LinkedNode::new(source.root()).leaf_at(cursor)?;
|
||||
debug!("ast_node: {ast_node:?}", ast_node = ast_node);
|
||||
|
||||
let deref_target = get_deref_target(ast_node)?;
|
||||
let deref_target = get_deref_target(ast_node, cursor)?;
|
||||
|
||||
let lnk = find_definition(ctx, source.clone(), deref_target.clone())?;
|
||||
|
||||
|
|
|
@ -67,9 +67,26 @@ fn is_mark(sk: SyntaxKind) -> bool {
|
|||
)
|
||||
}
|
||||
|
||||
pub fn get_deref_target(node: LinkedNode) -> Option<DerefTarget> {
|
||||
pub fn get_deref_target(node: LinkedNode, cursor: usize) -> Option<DerefTarget> {
|
||||
fn same_line_skip(node: &LinkedNode, cursor: usize) -> bool {
|
||||
// (ancestor.kind().is_trivia() && ancestor.text())
|
||||
if !node.kind().is_trivia() {
|
||||
return false;
|
||||
}
|
||||
let pref = node.text();
|
||||
// slice
|
||||
let pref = if cursor < pref.len() {
|
||||
&pref[..cursor]
|
||||
} else {
|
||||
pref
|
||||
};
|
||||
// no newlines
|
||||
// todo: if we are in markup mode, we should check if we are at start of node
|
||||
!pref.contains('\n')
|
||||
}
|
||||
|
||||
let mut ancestor = node;
|
||||
if ancestor.kind().is_trivia() || is_mark(ancestor.kind()) {
|
||||
if same_line_skip(&ancestor, cursor) || is_mark(ancestor.kind()) {
|
||||
ancestor = ancestor.prev_sibling()?;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue