Skip to content

Commit

Permalink
Rename to only rename fn headers of correct arity
Browse files Browse the repository at this point in the history
  • Loading branch information
timgent committed Jan 24, 2023
1 parent 73f8178 commit b52042c
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 8 deletions.
20 changes: 13 additions & 7 deletions apps/language_server/lib/language_server/providers/rename.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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)

_ ->
Expand Down Expand Up @@ -78,15 +78,15 @@ 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

{:ok, result}
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

%{
Expand All @@ -99,7 +99,7 @@ defmodule ElixirLS.LanguageServer.Providers.Rename do
}
}
}
end
end)
end

defp parse_definition_source_code(%{file: file}) do
Expand All @@ -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()
Expand Down
2 changes: 1 addition & 1 deletion apps/language_server/test/providers/rename_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -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")

Expand Down
2 changes: 2 additions & 0 deletions apps/language_server/test/support/fixtures/rename_example.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit b52042c

Please sign in to comment.