elixir-tools / next-ls

The language server for Elixir that just works. Ready for early adopters!
https://www.elixir-tools.dev/next-ls
MIT License
674 stars 40 forks source link

workspace command: extract an anonymous function to a private one #436

Open NJichev opened 4 months ago

NJichev commented 4 months ago

A workspace command that extracts an anonymous function to a private one.

Example:

defmodule Example do
  def run(list) do
    square = fn x -> x * x end
    Enum.map(list, square)
  end
end

Hovering the variable of the anonymous function or the anonymous function definition and using the workspace command should result in:

defmodule Example do
  def run(list) do
    Enum.map(list, &square/1)
  end

  defp square(x) do
    x * x
  end
end

Consider the following scenarios:

mhanberg commented 4 months ago

similar to #437 , i think i would expect this work work as follows

defmodule Example do
  def run(list) do
    square = fn x -> x * x end
    Enum.map(list, square)
  end
end

refactors to

defmodule Example do
  def run(list) do
    square = &square/1
    Enum.map(list, square)
  end

  defp square(x) do
    x * x
  end
end

this reduces complexity, and fits with the more intuitive (IMO) behavior if you were to transform an inline anonymous function, like this

defmodule Example do
  def run(list) do
    Enum.map(list, fn x -> x * x end)
  end
end

refactors to

defmodule Example do
  def run(list) do
    Enum.map(list, &square/1)
  end

  defp square(x) do
    x * x
  end
end