dev: more accurate deref target (#104)

This commit is contained in:
Myriad-Dreamin 2024-03-26 11:40:20 +08:00 committed by GitHub
parent 876827d39b
commit 4d21026661
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 25 additions and 8 deletions

View file

@ -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);

View file

@ -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);

View file

@ -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())?;

View file

@ -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);

View file

@ -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())?;

View file

@ -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())?;

View file

@ -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()?;
}