Packages
igniter
0.5.5
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/igniter/upgrades/igniter.ex
defmodule Igniter.Upgrades.Igniter do
@moduledoc false
alias Igniter.Code.Common
alias Igniter.Code.Function
alias Igniter.Code.Module
alias Sourceror.Zipper
require Common
require Function
@doc """
Rewrites deprecated `igniter/2` callback to `igniter/1` if the module
is an `Igniter.Mix.Task`.
"""
@spec rewrite_deprecated_igniter_callback(Zipper.t()) :: {:ok, Zipper.t()} | :error
def rewrite_deprecated_igniter_callback(%Zipper{} = zipper) do
with {:ok, zipper} <- Module.move_to_module_using(zipper, [Igniter.Mix.Task]),
{:ok, zipper} <- Common.move_to_pattern(zipper, {:def, _, [{:igniter, _, [_, _]} | _]}) do
with :error <- remove_ignored_argv(zipper),
:error <- replace_generated_argv_usage(zipper) do
{:ok, zipper}
end
else
_ -> {:ok, zipper}
end
end
defp remove_ignored_argv(zipper) do
with %Zipper{node: {argv_var, _, nil}} <-
Zipper.search_pattern(zipper, "igniter(__, __cursor__())"),
"_" <> _ <- to_string(argv_var) do
remove_argv_arg(zipper)
else
_ -> :error
end
end
defp replace_generated_argv_usage(zipper) do
with {:ok, zipper} <- remove_argv_arg(zipper),
{:ok, zipper} <- Common.move_to_do_block(zipper),
zipper <- Common.maybe_move_to_block(zipper),
true <- generated_argv_usage?(zipper) do
zipper =
zipper
|> Zipper.remove()
|> Zipper.next()
|> Common.replace_code("""
arguments = igniter.args.positional
options = igniter.args.options
argv = igniter.args.argv_flags
""")
{:ok, zipper}
else
_ -> :error
end
end
defp generated_argv_usage?(zipper) do
with ^zipper <- Zipper.search_pattern(zipper, "{arguments, argv} = positional_args!(argv)"),
{:ok, zipper} <- Common.move_right(zipper, 1),
^zipper <- Zipper.search_pattern(zipper, "options = options!(argv)") do
true
else
_ -> false
end
end
defp remove_argv_arg(zipper) do
Common.within(zipper, fn zipper ->
case Zipper.search_pattern(zipper, "igniter(__, __cursor__())") do
%Zipper{} = zipper -> {:ok, Zipper.remove(zipper)}
_ -> :error
end
end)
end
end