mirror of
https://github.com/ash-project/igniter.git
synced 2024-09-21 05:52:52 +12:00
6831c4e7f9
This showcases how easy it is to write a source code patcher, and also acts as a useful little tool for phoenix users.
74 lines
2.2 KiB
Elixir
74 lines
2.2 KiB
Elixir
defmodule Mix.Tasks.Igniter.UpdateGettext do
|
|
use Igniter.Mix.Task
|
|
|
|
@shortdoc "Applies changes to resolve a warning introduced in gettext 0.26.0"
|
|
@moduledoc """
|
|
#{@shortdoc}
|
|
"""
|
|
|
|
def info(_argv, _source) do
|
|
%Igniter.Mix.Task.Info{}
|
|
end
|
|
|
|
def igniter(igniter, _argv) do
|
|
{igniter, modules} = find_use_gettext_modules(igniter)
|
|
|
|
Enum.reduce(modules, igniter, fn module, igniter ->
|
|
igniter
|
|
|> use_gettext_backend(module)
|
|
|> rewrite_imports(module)
|
|
end)
|
|
end
|
|
|
|
defp rewrite_imports(igniter, rewriting_module) do
|
|
{igniter, modules} =
|
|
Igniter.Code.Module.find_all_matching_modules(igniter, fn _module, zipper ->
|
|
match?(
|
|
{:ok, _},
|
|
Igniter.Code.Common.move_to(zipper, fn zipper ->
|
|
import?(zipper, rewriting_module)
|
|
end)
|
|
)
|
|
end)
|
|
|
|
Enum.reduce(modules, igniter, fn module, igniter ->
|
|
Igniter.Code.Module.find_and_update_module!(igniter, module, fn zipper ->
|
|
Igniter.Code.Common.update_all_matches(zipper, &import?(&1, rewriting_module), fn _ ->
|
|
{:code,
|
|
quote do
|
|
use Gettext, backend: unquote(rewriting_module)
|
|
end}
|
|
end)
|
|
end)
|
|
end)
|
|
end
|
|
|
|
defp find_use_gettext_modules(igniter) do
|
|
Igniter.Code.Module.find_all_matching_modules(igniter, fn _module, zipper ->
|
|
case Igniter.Code.Module.move_to_use(zipper, Gettext) do
|
|
{:ok, _zipper} -> true
|
|
_ -> false
|
|
end
|
|
end)
|
|
end
|
|
|
|
defp import?(zipper, module) do
|
|
Igniter.Code.Function.function_call?(zipper, :import, 1) &&
|
|
Igniter.Code.Function.argument_equals?(zipper, 0, module)
|
|
end
|
|
|
|
defp use_gettext_backend(igniter, module) do
|
|
Igniter.Code.Module.find_and_update_module!(igniter, module, fn zipper ->
|
|
with {:ok, zipper} <- Igniter.Code.Module.move_to_use(zipper, Gettext),
|
|
{:ok, zipper} <-
|
|
Igniter.Code.Function.update_nth_argument(zipper, 0, fn zipper ->
|
|
{:ok, Igniter.Code.Common.replace_code(zipper, Gettext.Backend)}
|
|
end) do
|
|
{:ok, zipper}
|
|
else
|
|
_ ->
|
|
{:warning, "Failed to update to Gettext.Backend in #{inspect(module)}"}
|
|
end
|
|
end)
|
|
end
|
|
end
|