From b52042cc5556713e9c36dee2282db19395601c58 Mon Sep 17 00:00:00 2001 From: Tim Gent Date: Tue, 15 Nov 2022 21:05:13 +0000 Subject: [PATCH] Rename to only rename fn headers of correct arity --- .../lib/language_server/providers/rename.ex | 20 ++++++++++++------- .../test/providers/rename_test.exs | 2 +- .../test/support/fixtures/rename_example.ex | 2 ++ 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/apps/language_server/lib/language_server/providers/rename.ex b/apps/language_server/lib/language_server/providers/rename.ex index 98d8bc732..d4588009b 100644 --- a/apps/language_server/lib/language_server/providers/rename.ex +++ b/apps/language_server/lib/language_server/providers/rename.ex @@ -22,12 +22,12 @@ defmodule ElixirLS.LanguageServer.Providers.Rename do case definition do %{file: nil, type: :function} -> parse_definition_source_code(source_file.text) - |> get_all_fn_header_positions(char_ident) + |> get_all_fn_header_positions(char_ident, definition) |> positions_to_references(start_uri, length_old) %{file: separate_file_path, type: :function} -> parse_definition_source_code(definition) - |> get_all_fn_header_positions(char_ident) + |> get_all_fn_header_positions(char_ident, definition) |> positions_to_references(SourceFile.Path.to_uri(separate_file_path), length_old) _ -> @@ -78,7 +78,7 @@ defmodule ElixirLS.LanguageServer.Providers.Rename do } else _ -> - # Not a variable or local call, skipping for now + # Not a variable or function call, skipping nil end @@ -86,7 +86,7 @@ defmodule ElixirLS.LanguageServer.Providers.Rename do end defp repack_references(references, start_uri) do - for reference <- references do + Enum.map(references, fn reference -> uri = if reference.uri, do: SourceFile.Path.to_uri(reference.uri), else: start_uri %{ @@ -99,7 +99,7 @@ defmodule ElixirLS.LanguageServer.Providers.Rename do } } } - end + end) end defp parse_definition_source_code(%{file: file}) do @@ -110,10 +110,16 @@ defmodule ElixirLS.LanguageServer.Providers.Rename do ElixirSense.Core.Parser.parse_string(source_text, true, true, nil) end - defp get_all_fn_header_positions(parsed_source, char_ident) do + defp get_all_fn_header_positions( + parsed_source, + definition_name, + %{column: column, line: line} = _definition + ) do parsed_source.mods_funs_to_positions |> Map.filter(fn - {{_, fn_name, _}, _} -> Atom.to_charlist(fn_name) == char_ident + {{_, fn_name, fn_arity}, %{positions: fn_positions}} -> + Atom.to_charlist(fn_name) === definition_name and not is_nil(fn_arity) and + Enum.member?(fn_positions, {line, column}) end) |> Enum.flat_map(fn {_, %{positions: positions}} -> positions end) |> Enum.uniq() diff --git a/apps/language_server/test/providers/rename_test.exs b/apps/language_server/test/providers/rename_test.exs index 8f63d26f7..62f97f235 100644 --- a/apps/language_server/test/providers/rename_test.exs +++ b/apps/language_server/test/providers/rename_test.exs @@ -186,7 +186,7 @@ defmodule ElixirLS.LanguageServer.Providers.RenameTest do expected_edits = [ target_range, - %{line: 13, start_char: 7, end_char: 15} + %{line: 15, start_char: 7, end_char: 15} ] |> get_expected_edits("new_subtract") diff --git a/apps/language_server/test/support/fixtures/rename_example.ex b/apps/language_server/test/support/fixtures/rename_example.ex index 2110e22a3..2ee17656f 100644 --- a/apps/language_server/test/support/fixtures/rename_example.ex +++ b/apps/language_server/test/support/fixtures/rename_example.ex @@ -11,5 +11,7 @@ defmodule ElixirLS.Test.RenameExample do defp add(a, b) when is_integer(a) and is_integer(b), do: a + b defp add(a, b) when is_binary(a) and is_binary(b), do: a <> b + def add(a, b, c), do: a + b + c + defp subtract(a, b), do: a - b end