Packages
igniter
0.5.17
0.8.2
0.8.1
0.8.0
0.7.9
0.7.8
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.30
0.6.29
0.6.28
0.6.27
0.6.26
0.6.25
0.6.24
0.6.23
0.6.22
0.6.21
0.6.20
0.6.19
0.6.18
0.6.17
0.6.16
0.6.15
0.6.14
0.6.13
0.6.12
0.6.11
0.6.10
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.52
0.5.51
0.5.50
0.5.49
0.5.48
0.5.47
0.5.46
0.5.45
0.5.44
0.5.43
0.5.42
0.5.41
0.5.40
0.5.39
0.5.38
0.5.37
0.5.36
0.5.35
0.5.34
0.5.33
0.5.32
0.5.31
0.5.30
0.5.29
0.5.28
0.5.27
0.5.26
0.5.25
0.5.24
0.5.23
0.5.22
0.5.21
0.5.20
0.5.19
0.5.18
0.5.17
0.5.16
0.5.15
0.5.14
0.5.13
0.5.12
0.5.11
0.5.10
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.78
0.3.77
0.3.76
0.3.75
0.3.74
0.3.73
0.3.72
0.3.71
0.3.70
0.3.69
0.3.68
0.3.67
0.3.66
0.3.65
0.3.64
0.3.63
0.3.62
0.3.61
0.3.60
0.3.59
0.3.58
0.3.57
0.3.56
0.3.55
0.3.54
0.3.53
0.3.52
0.3.51
0.3.50
0.3.49
0.3.48
0.3.47
0.3.46
0.3.45
0.3.44
0.3.43
0.3.42
0.3.41
0.3.40
0.3.39
0.3.38
0.3.37
0.3.36
0.3.35
0.3.34
0.3.33
0.3.32
0.3.31
0.3.30
0.3.29
0.3.28
0.3.27
0.3.26
0.3.25
0.3.24
0.3.23
0.3.22
0.3.21
0.3.20
0.3.19
0.3.18
0.3.17
0.3.16
0.3.15
0.3.14
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
A code generation and project patching framework
Current section
Files
Jump to
Current section
Files
lib/mix/tasks/igniter.refactor.rename_function.ex
defmodule Mix.Tasks.Igniter.Refactor.RenameFunction do
use Igniter.Mix.Task
@example "mix igniter.refactor.rename_function Mod.fun NewMod.new_fun"
@shortdoc "A short description of your task"
@moduledoc """
#{@shortdoc}
Rename a given function across a whole project.
This will remap definitions in addition to calls and references.
Keep in mind that it cannot detect 100% of cases, and will always
miss usage of `apply/3` for dynamic function calling.
If the new module is different than the old module, the function will be moved.
If the new module does not exist, it will be created.
Pass an arity to the first function to only rename a specific arity definition.
## Options
- `--deprecate` - `soft | hard` The old function will remain in place but deprecated. Soft deprecations,
only affect documentation, while hard deprecations will display a warning when the function is called.
## Example
```bash
#{@example}
```
"""
def info(_argv, _composing_task) do
%Igniter.Mix.Task.Info{
group: :igniter,
example: @example,
positional: [:old, :new],
schema: [
deprecate: :string
]
}
end
def igniter(igniter) do
arguments = igniter.args.positional
options = igniter.args.options
deprecate =
case options[:deprecate] do
nil ->
nil
"hard" ->
:hard
"soft" ->
:soft
other ->
Mix.shell().error("Invalid deprecation type: #{other}")
exit({:shutdown, 1})
end
{old_mod, old_fun, old_arity} = parse_fun(arguments[:old])
{new_mod, new_fun, new_arity} = parse_fun(arguments[:new])
arity =
cond do
is_integer(old_arity) and new_arity == :any ->
old_arity
old_arity != new_arity ->
Mix.shell().error(
"Arity must be the same between old and new function (or omitted for the new function)"
)
exit({:shutdown, 1})
true ->
old_arity
end
Igniter.Refactors.Rename.rename_function(
igniter,
{old_mod, old_fun},
{new_mod, new_fun},
arity: arity,
deprecate: deprecate
)
end
def parse_fun(input) do
with parts <- String.split(input, ".", trim: true),
fun <- List.last(parts),
parts <- :lists.droplast(parts),
mod <- Enum.join(parts, "."),
{fun, arity} <- fun_to_arity(fun),
fun <- String.to_atom(fun),
mod <- Igniter.Project.Module.parse(mod) do
{mod, fun, arity}
else
_ ->
Mix.shell().error("Invalid function format: #{input}")
exit({:shutdown, 1})
end
end
defp fun_to_arity(fun) do
case String.split(fun, "/", parts: 2, trim: true) do
[fun] ->
{fun, :any}
[fun, arity] ->
case Integer.parse(arity) do
{arity, ""} ->
{fun, arity}
_ ->
:error
end
_ ->
:error
end
end
end