mirror of
https://github.com/Myriad-Dreamin/tinymist.git
synced 2025-11-25 21:37:32 +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)?;
|
let ast_node = LinkedNode::new(source.root()).leaf_at(cursor)?;
|
||||||
debug!("ast_node: {ast_node:?}", ast_node = ast_node);
|
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 use_site = deref_target.node();
|
||||||
let origin_selection_range = ctx.to_lsp_range(use_site.range(), &source);
|
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)?;
|
let ast_node = LinkedNode::new(source.root()).leaf_at(cursor)?;
|
||||||
debug!("ast_node: {ast_node:?}", ast_node = ast_node);
|
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 use_site = deref_target.node().clone();
|
||||||
let origin_selection_range = ctx.to_lsp_range(use_site.range(), &source);
|
let origin_selection_range = ctx.to_lsp_range(use_site.range(), &source);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@ fn def_tooltip(
|
||||||
) -> Option<LspHoverContents> {
|
) -> Option<LspHoverContents> {
|
||||||
let leaf = LinkedNode::new(source.root()).leaf_at(cursor)?;
|
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())?;
|
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)?;
|
let ast_node = LinkedNode::new(source.root()).leaf_at(cursor)?;
|
||||||
debug!("ast_node: {ast_node:?}", ast_node = ast_node);
|
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 use_site = deref_target.node().clone();
|
||||||
let origin_selection_range = ctx.to_lsp_range(use_site.range(), &source);
|
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)?;
|
let ast_node = LinkedNode::new(source.root()).leaf_at(cursor)?;
|
||||||
debug!("ast_node: {ast_node:?}", ast_node = ast_node);
|
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 def_use = ctx.def_use(source.clone())?;
|
||||||
let locations = find_references(ctx, def_use, deref_target, ctx.position_encoding())?;
|
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)?;
|
let ast_node = LinkedNode::new(source.root()).leaf_at(cursor)?;
|
||||||
debug!("ast_node: {ast_node:?}", ast_node = ast_node);
|
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())?;
|
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;
|
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()?;
|
ancestor = ancestor.prev_sibling()?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue