Fix move to single child block (#69)
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:
Zach Daniel 2024-08-03 19:16:27 -04:00 committed by GitHub
parent 49d6725c83
commit 2733449bf8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 28 additions and 24 deletions

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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