mirror of
https://github.com/ash-project/igniter.git
synced 2024-09-19 13:02:51 +12:00
Fix move to single child block (#69)
Some checks are pending
CI / ash-ci (push) Waiting to run
Some checks are pending
CI / ash-ci (push) Waiting to run
* fix: check for extendable_block? in maybe_move_to_single_child_block/1 * fix: properly compare values that live in blocks --------- Co-authored-by: Igor Barakaiev <ibarakaiev@gmail.com>
This commit is contained in:
parent
49d6725c83
commit
2733449bf8
4 changed files with 28 additions and 24 deletions
|
@ -384,15 +384,19 @@ defmodule Igniter.Code.Common do
|
|||
|
||||
def maybe_move_to_single_child_block(zipper) do
|
||||
case zipper.node do
|
||||
{:__block__, _, [_]} ->
|
||||
zipper
|
||||
|> Zipper.down()
|
||||
|> case do
|
||||
nil ->
|
||||
zipper
|
||||
{:__block__, _, [_]} = block ->
|
||||
if extendable_block?(block) do
|
||||
zipper
|
||||
|> Zipper.down()
|
||||
|> case do
|
||||
nil ->
|
||||
zipper
|
||||
|
||||
zipper ->
|
||||
maybe_move_to_single_child_block(zipper)
|
||||
zipper ->
|
||||
maybe_move_to_single_child_block(zipper)
|
||||
end
|
||||
else
|
||||
zipper
|
||||
end
|
||||
|
||||
_ ->
|
||||
|
@ -684,18 +688,18 @@ defmodule Igniter.Code.Common do
|
|||
def nodes_equal?(v, v), do: true
|
||||
|
||||
def nodes_equal?(l, r) do
|
||||
equal_strings?(l, r) || equal_modules?(l, r)
|
||||
equal_vals?(l, r) || equal_modules?(l, r)
|
||||
end
|
||||
|
||||
defp equal_strings?({:__block__, _, [value]} = block, value) when is_binary(value) do
|
||||
defp equal_vals?({:__block__, _, [value]} = block, value) do
|
||||
!extendable_block?(block)
|
||||
end
|
||||
|
||||
defp equal_strings?(value, {:__block__, _, [value]} = block) when is_binary(value) do
|
||||
defp equal_vals?(value, {:__block__, _, [value]} = block) do
|
||||
!extendable_block?(block)
|
||||
end
|
||||
|
||||
defp equal_strings?(_, _), do: false
|
||||
defp equal_vals?(_, _), do: false
|
||||
|
||||
@spec expand_alias(Zipper.t()) :: Zipper.t()
|
||||
def expand_alias(zipper) do
|
||||
|
|
|
@ -16,7 +16,7 @@ defmodule Igniter.Code.Keyword do
|
|||
if Igniter.Code.Tuple.tuple?(item) do
|
||||
case Igniter.Code.Tuple.tuple_elem(item, 0) do
|
||||
{:ok, first_elem} ->
|
||||
Common.node_matches_pattern?(first_elem, ^key)
|
||||
Common.nodes_equal?(first_elem, key)
|
||||
|
||||
:error ->
|
||||
false
|
||||
|
@ -48,7 +48,7 @@ defmodule Igniter.Code.Keyword do
|
|||
if Igniter.Code.Tuple.tuple?(item) do
|
||||
case Igniter.Code.Tuple.tuple_elem(item, 0) do
|
||||
{:ok, first_elem} ->
|
||||
Common.node_matches_pattern?(first_elem, ^key)
|
||||
Common.nodes_equal?(first_elem, key)
|
||||
|
||||
:error ->
|
||||
false
|
||||
|
@ -93,12 +93,12 @@ defmodule Igniter.Code.Keyword do
|
|||
end
|
||||
|
||||
defp do_put_in_keyword(zipper, [key | rest], value, updater) do
|
||||
if Common.node_matches_pattern?(zipper, value when is_list(value)) do
|
||||
if Igniter.Code.List.list?(zipper) do
|
||||
case Igniter.Code.List.move_to_list_item(zipper, fn item ->
|
||||
if Igniter.Code.Tuple.tuple?(item) do
|
||||
case Igniter.Code.Tuple.tuple_elem(item, 0) do
|
||||
{:ok, first_elem} ->
|
||||
Common.node_matches_pattern?(first_elem, ^key)
|
||||
Common.nodes_equal?(first_elem, key)
|
||||
|
||||
:error ->
|
||||
false
|
||||
|
@ -153,14 +153,14 @@ defmodule Igniter.Code.Keyword do
|
|||
) ::
|
||||
{:ok, Zipper.t()} | :error
|
||||
def set_keyword_key(zipper, key, value, updater) do
|
||||
if Common.node_matches_pattern?(zipper, value when is_list(value)) do
|
||||
if Igniter.Code.List.list?(zipper) do
|
||||
zipper = Common.maybe_move_to_single_child_block(zipper)
|
||||
|
||||
case Igniter.Code.List.move_to_list_item(zipper, fn item ->
|
||||
if Igniter.Code.Tuple.tuple?(item) do
|
||||
case Igniter.Code.Tuple.tuple_elem(item, 0) do
|
||||
{:ok, first_elem} ->
|
||||
Common.node_matches_pattern?(first_elem, ^key)
|
||||
Common.nodes_equal?(first_elem, key)
|
||||
|
||||
:error ->
|
||||
false
|
||||
|
@ -210,7 +210,7 @@ defmodule Igniter.Code.Keyword do
|
|||
@spec remove_keyword_key(Zipper.t(), atom()) :: {:ok, Zipper.t()} | :error
|
||||
def remove_keyword_key(zipper, key) do
|
||||
Common.within(zipper, fn zipper ->
|
||||
if Common.node_matches_pattern?(zipper, value when is_list(value)) do
|
||||
if Igniter.Code.List.list?(zipper) do
|
||||
case Igniter.Code.List.move_to_list_item(zipper, fn item ->
|
||||
if Igniter.Code.Tuple.tuple?(item) do
|
||||
case Igniter.Code.Tuple.tuple_elem(item, 0) do
|
||||
|
|
|
@ -43,7 +43,7 @@ defmodule Igniter.Code.Map do
|
|||
if Igniter.Code.Tuple.tuple?(item) do
|
||||
case Igniter.Code.Tuple.tuple_elem(item, 0) do
|
||||
{:ok, first_elem} ->
|
||||
Common.node_matches_pattern?(first_elem, ^key)
|
||||
Common.nodes_equal?(first_elem, key)
|
||||
|
||||
:error ->
|
||||
false
|
||||
|
|
|
@ -83,7 +83,7 @@ defmodule Igniter.Project.Deps do
|
|||
if Igniter.Code.Tuple.tuple?(item) do
|
||||
case Igniter.Code.Tuple.tuple_elem(item, 0) do
|
||||
{:ok, first_elem} ->
|
||||
Common.node_matches_pattern?(first_elem, ^name)
|
||||
Common.nodes_equal?(first_elem, name)
|
||||
|
||||
:error ->
|
||||
false
|
||||
|
@ -104,13 +104,13 @@ defmodule Igniter.Project.Deps do
|
|||
|> Igniter.update_elixir_file("mix.exs", fn zipper ->
|
||||
with {:ok, zipper} <- Igniter.Code.Module.move_to_module_using(zipper, Mix.Project),
|
||||
{:ok, zipper} <- Igniter.Code.Function.move_to_defp(zipper, :deps, 0),
|
||||
true <- Common.node_matches_pattern?(zipper, value when is_list(value)),
|
||||
true <- Igniter.Code.List.list?(zipper),
|
||||
current_declaration_index when not is_nil(current_declaration_index) <-
|
||||
Igniter.Code.List.find_list_item_index(zipper, fn item ->
|
||||
if Igniter.Code.Tuple.tuple?(item) do
|
||||
case Igniter.Code.Tuple.tuple_elem(item, 0) do
|
||||
{:ok, first_elem} ->
|
||||
Common.node_matches_pattern?(first_elem, ^name)
|
||||
Common.nodes_equal?(first_elem, name)
|
||||
|
||||
:error ->
|
||||
false
|
||||
|
@ -136,7 +136,7 @@ defmodule Igniter.Project.Deps do
|
|||
|> Igniter.update_elixir_file("mix.exs", fn zipper ->
|
||||
with {:ok, zipper} <- Igniter.Code.Module.move_to_module_using(zipper, Mix.Project),
|
||||
{:ok, zipper} <- Igniter.Code.Function.move_to_defp(zipper, :deps, 0),
|
||||
true <- Common.node_matches_pattern?(zipper, value when is_list(value)) do
|
||||
true <- Igniter.Code.List.list?(zipper) do
|
||||
quoted =
|
||||
if opts[:dep_opts] do
|
||||
quote do
|
||||
|
|
Loading…
Reference in a new issue