From 7958ff20f2e4c7e7f8fc086e756529a2ec77d4ad Mon Sep 17 00:00:00 2001 From: Rin Date: Tue, 7 May 2024 01:33:54 +0800 Subject: [PATCH 1/3] fix: check if cursor is on definition(#1042) --- apps/language_server/lib/language_server/server.ex | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/apps/language_server/lib/language_server/server.ex b/apps/language_server/lib/language_server/server.ex index a3ef09fd7..46f1859a2 100644 --- a/apps/language_server/lib/language_server/server.ex +++ b/apps/language_server/lib/language_server/server.ex @@ -983,7 +983,18 @@ defmodule ElixirLS.LanguageServer.Server do fun = fn -> {line, character} = SourceFile.lsp_position_to_elixir(source_file.text, {line, character}) parser_context = Parser.parse_immediate(uri, source_file, {line, character}) - Definition.definition(uri, parser_context, line, character, state.project_dir) + + {:ok, result} = + Definition.definition(uri, parser_context, line, character, state.project_dir) + + if result.uri == uri && result.range["start"]["line"] == line - 1 do + case References.references(parser_context, uri, line, character, false, state.project_dir) do + [] -> {:ok, result} + refs -> {:ok, refs} + end + else + {:ok, result} + end end {:async, fun, state} From eaddd67f27c9c1526c230addedb75bfec50a7d11 Mon Sep 17 00:00:00 2001 From: Rin Date: Tue, 7 May 2024 01:52:04 +0800 Subject: [PATCH 2/3] check if result is nil --- apps/language_server/lib/language_server/server.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/language_server/lib/language_server/server.ex b/apps/language_server/lib/language_server/server.ex index 46f1859a2..cedd01bb7 100644 --- a/apps/language_server/lib/language_server/server.ex +++ b/apps/language_server/lib/language_server/server.ex @@ -987,7 +987,7 @@ defmodule ElixirLS.LanguageServer.Server do {:ok, result} = Definition.definition(uri, parser_context, line, character, state.project_dir) - if result.uri == uri && result.range["start"]["line"] == line - 1 do + if result != nil && result.uri == uri && result.range["start"]["line"] == line - 1 do case References.references(parser_context, uri, line, character, false, state.project_dir) do [] -> {:ok, result} refs -> {:ok, refs} From 0819a7bd289e5ea5b2b990a0fcb58f3f650890e1 Mon Sep 17 00:00:00 2001 From: Rin Date: Tue, 7 May 2024 15:57:07 +0800 Subject: [PATCH 3/3] add test --- apps/language_server/test/server_test.exs | 39 +++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/apps/language_server/test/server_test.exs b/apps/language_server/test/server_test.exs index 9c04ad05e..f3a49b7d5 100644 --- a/apps/language_server/test/server_test.exs +++ b/apps/language_server/test/server_test.exs @@ -1384,6 +1384,45 @@ defmodule ElixirLS.LanguageServer.ServerTest do wait_until_compiled(server) end) end + + test "find references if already on definition", %{server: server} do + in_fixture(__DIR__, "clean", fn -> + uri = "file:///file.ex" + code = ~S( + defmodule MyModule do + def func do + func(\) + func(\) + end + end + ) + fake_initialize(server) + Server.receive_packet(server, did_open(uri, "elixir", 1, code)) + Server.receive_packet(server, definition_req(1, uri, 2, 15)) + + assert_receive( + response(1, [ + %{ + "range" => %{ + "end" => %{"character" => 16, "line" => 3}, + "start" => %{"character" => 12, "line" => 3} + }, + "uri" => ^uri + }, + %{ + "range" => %{ + "end" => %{"character" => 16, "line" => 4}, + "start" => %{"character" => 12, "line" => 4} + }, + "uri" => ^uri + } + ]), + 3000 + ) + + wait_until_compiled(server) + end) + end end describe "textDocument/implementation" do