Skip to content

Commit 52f3e53

Browse files
committed
Formatter fix: next_break_fits respects line_length
1 parent 27b894c commit 52f3e53

File tree

3 files changed

+73
-47
lines changed

3 files changed

+73
-47
lines changed

lib/elixir/lib/inspect/algebra.ex

Lines changed: 65 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -973,20 +973,17 @@ defmodule Inspect.Algebra do
973973
#
974974
# * flat - represents a document with breaks as flats (a break may fit, as it may break)
975975
# * break - represents a document with breaks as breaks (a break always fits, since it breaks)
976-
#
977-
# The following modes are exclusive to fitting:
978-
#
979976
# * flat_no_break - represents a document with breaks as flat not allowed to enter in break mode
980977
# * break_no_flat - represents a document with breaks as breaks not allowed to enter in flat mode
981978
#
982979
@typep mode :: :flat | :flat_no_break | :break | :break_no_flat
983980

984-
@spec fits?(
981+
@spec fits(
985982
width :: non_neg_integer() | :infinity,
986983
column :: non_neg_integer(),
987984
break? :: boolean(),
988985
entries
989-
) :: boolean()
986+
) :: :fit | :no_fit | :break_next
990987
when entries:
991988
maybe_improper_list({integer(), mode(), t()}, {:tail, boolean(), entries} | [])
992989

@@ -995,63 +992,75 @@ defmodule Inspect.Algebra do
995992
#
996993
# In case we have groups and the group fits, we need to consider the group
997994
# parent without the child breaks, hence {:tail, b?, t} below.
998-
defp fits?(w, k, b?, _) when k > w and b?, do: false
999-
defp fits?(_, _, _, []), do: true
1000-
defp fits?(w, k, _, {:tail, b?, t}), do: fits?(w, k, b?, t)
995+
defp fits(w, k, b?, _) when k > w and b?, do: :no_fit
996+
defp fits(_, _, _, []), do: :fit
997+
defp fits(w, k, _, {:tail, b?, t}), do: fits(w, k, b?, t)
1001998

1002999
## Flat no break
10031000

1004-
defp fits?(w, k, b?, [{i, _, doc_fits(x, :disabled)} | t]),
1005-
do: fits?(w, k, b?, [{i, :flat_no_break, x} | t])
1001+
defp fits(w, k, b?, [{i, _, doc_fits(x, :disabled)} | t]),
1002+
do: fits(w, k, b?, [{i, :flat_no_break, x} | t])
10061003

1007-
defp fits?(w, k, b?, [{i, :flat_no_break, doc_fits(x, _)} | t]),
1008-
do: fits?(w, k, b?, [{i, :flat_no_break, x} | t])
1004+
defp fits(w, k, b?, [{i, :flat_no_break, doc_fits(x, _)} | t]),
1005+
do: fits(w, k, b?, [{i, :flat_no_break, x} | t])
10091006

10101007
## Breaks no flat
10111008

1012-
defp fits?(w, k, b?, [{i, _, doc_fits(x, :enabled)} | t]),
1013-
do: fits?(w, k, b?, [{i, :break_no_flat, x} | t])
1009+
defp fits(w, k, b?, [{i, _, doc_fits(x, :enabled)} | t]),
1010+
do: fits(w, k, b?, [{i, :break_no_flat, x} | t])
10141011

1015-
defp fits?(w, k, b?, [{i, :break_no_flat, doc_force(x)} | t]),
1016-
do: fits?(w, k, b?, [{i, :break_no_flat, x} | t])
1012+
defp fits(w, k, b?, [{i, :break_no_flat, doc_force(x)} | t]),
1013+
do: fits(w, k, b?, [{i, :break_no_flat, x} | t])
10171014

1018-
defp fits?(_, _, _, [{_, :break_no_flat, doc_break(_, _)} | _]), do: true
1019-
defp fits?(_, _, _, [{_, :break_no_flat, :doc_line} | _]), do: true
1015+
defp fits(w, k, b?, [{i, :break_no_flat, x} | t])
1016+
when x == :doc_line or (is_tuple(x) and elem(x, 0) == :doc_break) do
1017+
case fits(w, k, b?, [{i, :flat, x} | t]) do
1018+
:no_fit -> :break_next
1019+
fits -> fits
1020+
end
1021+
end
10201022

10211023
## Breaks
10221024

1023-
defp fits?(_, _, _, [{_, :break, doc_break(_, _)} | _]), do: true
1024-
defp fits?(_, _, _, [{_, :break, :doc_line} | _]), do: true
1025+
defp fits(_, _, _, [{_, :break, doc_break(_, _)} | _]), do: :fit
1026+
defp fits(_, _, _, [{_, :break, :doc_line} | _]), do: :fit
10251027

1026-
defp fits?(w, k, b?, [{i, :break, doc_group(x, _)} | t]),
1027-
do: fits?(w, k, b?, [{i, :flat, x} | {:tail, b?, t}])
1028+
defp fits(w, k, b?, [{i, :break, doc_group(x, _)} | t]),
1029+
do: fits(w, k, b?, [{i, :flat, x} | {:tail, b?, t}])
10281030

10291031
## Catch all
10301032

1031-
defp fits?(w, _, _, [{i, _, :doc_line} | t]), do: fits?(w, i, false, t)
1032-
defp fits?(w, k, b?, [{_, _, :doc_nil} | t]), do: fits?(w, k, b?, t)
1033-
defp fits?(w, _, b?, [{i, _, doc_collapse(_)} | t]), do: fits?(w, i, b?, t)
1034-
defp fits?(w, k, b?, [{i, m, doc_color(x, _)} | t]), do: fits?(w, k, b?, [{i, m, x} | t])
1035-
defp fits?(w, k, b?, [{_, _, doc_string(_, l)} | t]), do: fits?(w, k + l, b?, t)
1036-
defp fits?(w, k, b?, [{_, _, s} | t]) when is_binary(s), do: fits?(w, k + byte_size(s), b?, t)
1037-
defp fits?(_, _, _, [{_, _, doc_force(_)} | _]), do: false
1038-
defp fits?(w, k, _, [{_, _, doc_break(s, _)} | t]), do: fits?(w, k + byte_size(s), true, t)
1039-
defp fits?(w, k, b?, [{i, m, doc_nest(x, _, :break)} | t]), do: fits?(w, k, b?, [{i, m, x} | t])
1033+
defp fits(w, _, _, [{i, _, :doc_line} | t]), do: fits(w, i, false, t)
1034+
defp fits(w, k, b?, [{_, _, :doc_nil} | t]), do: fits(w, k, b?, t)
1035+
defp fits(w, _, b?, [{i, _, doc_collapse(_)} | t]), do: fits(w, i, b?, t)
1036+
defp fits(w, k, b?, [{i, m, doc_color(x, _)} | t]), do: fits(w, k, b?, [{i, m, x} | t])
1037+
defp fits(w, k, b?, [{_, _, doc_string(_, l)} | t]), do: fits(w, k + l, b?, t)
1038+
1039+
defp fits(w, k, b?, [{_, _, s} | t]) when is_binary(s),
1040+
do: fits(w, k + byte_size(s), b?, t)
1041+
1042+
defp fits(_, _, _, [{_, _, doc_force(_)} | _]), do: :no_fit
1043+
1044+
defp fits(w, k, _, [{_, _, doc_break(s, _)} | t]),
1045+
do: fits(w, k + byte_size(s), true, t)
1046+
1047+
defp fits(w, k, b?, [{i, m, doc_nest(x, _, :break)} | t]),
1048+
do: fits(w, k, b?, [{i, m, x} | t])
10401049

1041-
defp fits?(w, k, b?, [{i, m, doc_nest(x, j, _)} | t]),
1042-
do: fits?(w, k, b?, [{apply_nesting(i, k, j), m, x} | t])
1050+
defp fits(w, k, b?, [{i, m, doc_nest(x, j, _)} | t]),
1051+
do: fits(w, k, b?, [{apply_nesting(i, k, j), m, x} | t])
10431052

1044-
defp fits?(w, k, b?, [{i, m, doc_cons(x, y)} | t]),
1045-
do: fits?(w, k, b?, [{i, m, x}, {i, m, y} | t])
1053+
defp fits(w, k, b?, [{i, m, doc_cons(x, y)} | t]),
1054+
do: fits(w, k, b?, [{i, m, x}, {i, m, y} | t])
10461055

1047-
defp fits?(w, k, b?, [{i, m, doc_group(x, _)} | t]),
1048-
do: fits?(w, k, b?, [{i, m, x} | {:tail, b?, t}])
1056+
defp fits(w, k, b?, [{i, m, doc_group(x, _)} | t]),
1057+
do: fits(w, k, b?, [{i, m, x} | {:tail, b?, t}])
10491058

1050-
defp fits?(w, k, b?, [{i, m, doc_limit(x, :infinity)} | t]) when w != :infinity,
1051-
do: fits?(:infinity, k, b?, [{i, :flat, x}, {i, m, doc_limit(empty(), w)} | t])
1059+
defp fits(w, k, b?, [{i, m, doc_limit(x, :infinity)} | t]) when w != :infinity,
1060+
do: fits(:infinity, k, b?, [{i, :flat, x}, {i, m, doc_limit(empty(), w)} | t])
10521061

1053-
defp fits?(_w, k, b?, [{i, m, doc_limit(x, w)} | t]),
1054-
do: fits?(w, k, b?, [{i, m, x} | t])
1062+
defp fits(_w, k, b?, [{i, m, doc_limit(x, w)} | t]),
1063+
do: fits(w, k, b?, [{i, m, x} | t])
10551064

10561065
@spec format(
10571066
width :: non_neg_integer() | :infinity,
@@ -1066,14 +1075,18 @@ defmodule Inspect.Algebra do
10661075
defp format(w, k, [{_, _, doc_string(s, l)} | t]), do: [s | format(w, k + l, t)]
10671076
defp format(w, k, [{_, _, s} | t]) when is_binary(s), do: [s | format(w, k + byte_size(s), t)]
10681077
defp format(w, k, [{i, m, doc_force(x)} | t]), do: format(w, k, [{i, m, x} | t])
1078+
1079+
defp format(w, k, [{i, :flat_no_break, doc_fits(x, :enabled)} | t]),
1080+
do: format(w, k, [{i, :break_no_flat, x} | t])
1081+
10691082
defp format(w, k, [{i, m, doc_fits(x, _)} | t]), do: format(w, k, [{i, m, x} | t])
10701083
defp format(w, _, [{i, _, doc_collapse(max)} | t]), do: collapse(format(w, i, t), max, 0, i)
10711084

10721085
# Flex breaks are not conditional to the mode
10731086
defp format(w, k, [{i, m, doc_break(s, :flex)} | t]) do
10741087
k = k + byte_size(s)
10751088

1076-
if w == :infinity or m == :flat or fits?(w, k, true, t) do
1089+
if w == :infinity or m == :flat or fits(w, k, true, t) != :no_fit do
10771090
[s | format(w, k, t)]
10781091
else
10791092
[indent(i) | format(w, i, t)]
@@ -1103,11 +1116,17 @@ defmodule Inspect.Algebra do
11031116
format(w, k, [{i, :break, x} | t])
11041117
end
11051118

1119+
defp format(w, k, [{i, :break_no_flat, doc_group(x, _)} | t]) do
1120+
format(w, k, [{i, :break, x} | t])
1121+
end
1122+
11061123
defp format(w, k, [{i, _, doc_group(x, _)} | t]) do
1107-
if w == :infinity or fits?(w, k, false, [{i, :flat, x}]) do
1108-
format(w, k, [{i, :flat, x} | t])
1109-
else
1110-
format(w, k, [{i, :break, x} | t])
1124+
fits = if w == :infinity, do: :fit, else: fits(w, k, false, [{i, :flat, x}])
1125+
1126+
case fits do
1127+
:fit -> format(w, k, [{i, :flat, x} | t])
1128+
:no_fit -> format(w, k, [{i, :break, x} | t])
1129+
:break_next -> format(w, k, [{i, :flat_no_break, x} | t])
11111130
end
11121131
end
11131132

lib/elixir/test/elixir/code_formatter/calls_test.exs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,11 @@ defmodule Code.Formatter.CallsTest do
165165

166166
assert_format bad, good, @short_length
167167
end
168+
169+
test "for maps" do
170+
assert_same "a(%{x: 1})", @short_length
171+
assert_format "ab(%{x: 1})", "ab(%{\n x: 1\n})", @short_length
172+
end
168173
end
169174

170175
describe "local calls" do

lib/elixir/test/elixir/config/provider_test.exs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@ defmodule Config.ProviderTest do
4141
{:elixir, [:unknown, :nested, :key], {:ok, :value}}
4242
]) == :ok
4343

44-
assert Config.Provider.validate_compile_env([{:elixir, [:unknown, :nested, :unknown], :error}]) ==
44+
assert Config.Provider.validate_compile_env([
45+
{:elixir, [:unknown, :nested, :unknown], :error}
46+
]) ==
4547
:ok
4648

4749
assert {:error, msg} =

0 commit comments

Comments
 (0)