diff --git a/lib/style/pipes.ex b/lib/style/pipes.ex index cb269a7..771fc51 100644 --- a/lib/style/pipes.ex +++ b/lib/style/pipes.ex @@ -43,7 +43,15 @@ defmodule Styler.Style.Pipes do case fix_pipe_start(zipper) do {{:|>, _, _}, _} = zipper -> case Zipper.traverse(zipper, fn {node, meta} -> {fix_pipe(node), meta} end) do - {{:|>, _, [{:|>, _, _}, _]}, _} = chain_zipper -> + # a |> f(...args) |> block(do ... end) + # => + # block f(a, ...args) do ... end + {{:|>, _, [{:|>, _, [a, {f, fm, args}]}, {b, bm, [[{{:__block__, dm, [:do]}, _} | _]] = ba}]}, _} = blockz -> + {:cont, Zipper.replace(blockz, {b, bm, [Style.set_line({f, fm, [a | args]}, dm[:line]) | ba]}), ctx} + + {{:|>, _, [{:|>,_, x}, _]}, _} = chain_zipper -> + IO.puts "chaining it up" + dbg(x) {:cont, find_pipe_start(chain_zipper), ctx} # don't un-pipe into unquotes, as some expressions are only valid as pipes diff --git a/test/style/pipes_test.exs b/test/style/pipes_test.exs index 3feae8e..a4e7c89 100644 --- a/test/style/pipes_test.exs +++ b/test/style/pipes_test.exs @@ -168,6 +168,72 @@ defmodule Styler.Style.PipesTest do ) end + test "block extraction: optimize the pipe!" do + assert_style(""" + foo + |> case do + nil -> nil + end + """, + """ + case foo do + nil -> nil + end + """) + + assert_style(""" + foo + |> bar(baz) + |> case do + nil -> nil + end + """, + """ + case bar(foo, baz) do + nil -> nil + end + """) + + assert_style(""" + foo + |> bar(baz) + |> if do + :horay + else + :boo + end + """, + """ + if bar(foo, baz) do + :horay + else + :boo + end + """) + end + + test "do block in the middle of a chain" do + assert_style(""" + foo + |> bar(baz) + |> case(do + nil -> nil + end) + |> bop() + |> nooo() + """, + """ + case_result = + case bar(foo, baz) do + nil -> nil + end + + case_result + |> bop() + |> nooo() + """) + end + test "macro with arg and do block" do assert_style(""" "baz"