diff --git a/apps/language_server/lib/language_server/server.ex b/apps/language_server/lib/language_server/server.ex index a3ef09fd7..cedd01bb7 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 != 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} + end + else + {:ok, result} + end end {:async, fun, state} 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