From da83b2e00f18c7e07bce12b3abac92601042833b Mon Sep 17 00:00:00 2001 From: abap34 Date: Thu, 12 Jun 2025 14:01:41 +0900 Subject: [PATCH] support Go to Definition at the right edge of identifiers --- src/definition.jl | 5 +++++ test/test_definition.jl | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/definition.jl b/src/definition.jl index 1ee3706d..e4680d39 100644 --- a/src/definition.jl +++ b/src/definition.jl @@ -41,6 +41,11 @@ refs: https://github.com/rust-lang/rust-analyzer/blob/6acff6c1f8306a0a1d29be8fd1 function select_target_node(st::JL.SyntaxTree, offset::Int) bas = byte_ancestors(st, offset) + # Support cases like `var│`, `func│(5)` + if length(bas) == 1 || kind(first(bas)) == K"call" && offset > 0 + bas = byte_ancestors(st, offset - 1) + end + (kind(first(bas)) !== K"Identifier") && return nothing for i in 2:length(bas) diff --git a/test/test_definition.jl b/test/test_definition.jl index e9238df4..1455f67b 100644 --- a/test/test_definition.jl +++ b/test/test_definition.jl @@ -121,6 +121,12 @@ include("setup.jl") #=44=# println("\$s, \$(hello.who)") #=45=# end #=46=# say_kwar│g + #=47=# + #=48=# func│(1.0) + #=49=# func(│1.0) + #=50=# │func(1.0) + #=51=# M.m_func│(1.0) + #=52=# M.│m_func(1.0) """ sin_cand_file, sin_cand_line = functionloc(first(methods(sin, (Float64,)))) @@ -204,6 +210,33 @@ include("setup.jl") (length(result) == 1) && # aggregation (first(result).uri == uri) && (first(result).range.start.line == 42) + + # func│(1.0) + (result, uri) -> + (length(result) == 1) && + (first(result).uri == uri) && + (first(result).range.start.line == 0) + + # func(│1.0) + (result, uri) -> (result === null) + + # │func(1.0) + (result, uri) -> + (length(result) == 1) && + (first(result).uri == uri) && + (first(result).range.start.line == 0) + + # M.m_func│(1.0) + (result, uri) -> + (length(result) == 1) && + (first(result).uri == uri) && + (first(result).range.start.line == 11) + + # M.│m_func(1.0) + (result, uri) -> + (length(result) == 1) && + (first(result).uri == uri) && + (first(result).range.start.line == 11) ] clean_code, positions = get_text_and_positions(script_code, r"│")