Skip to content

Commit 9b2e789

Browse files
author
José Valim
committed
Do not crash formatter on false positive sigils, closes #9123
Signed-off-by: José Valim <jose.valim@plataformatec.com.br>
1 parent 04794d5 commit 9b2e789

File tree

2 files changed

+25
-17
lines changed

2 files changed

+25
-17
lines changed

lib/elixir/lib/code/formatter.ex

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1365,26 +1365,26 @@ defmodule Code.Formatter do
13651365
## Sigils
13661366

13671367
defp maybe_sigil_to_algebra(fun, meta, args, state) do
1368-
case {Atom.to_string(fun), args} do
1369-
{<<"sigil_", name>>, [{:<<>>, _, entries}, modifiers]} ->
1370-
opening_terminator = Keyword.fetch!(meta, :terminator)
1371-
doc = <<?~, name, opening_terminator::binary>>
1368+
with <<"sigil_", name>> <- Atom.to_string(fun),
1369+
[{:<<>>, _, entries}, modifiers] when is_list(modifiers) <- args,
1370+
opening_terminator when not is_nil(opening_terminator) <- Keyword.get(meta, :terminator) do
1371+
doc = <<?~, name, opening_terminator::binary>>
13721372

1373-
if opening_terminator in [@double_heredoc, @single_heredoc] do
1374-
closing_terminator = concat(opening_terminator, List.to_string(modifiers))
1373+
if opening_terminator in [@double_heredoc, @single_heredoc] do
1374+
closing_terminator = concat(opening_terminator, List.to_string(modifiers))
13751375

1376-
{doc, state} =
1377-
entries
1378-
|> prepend_heredoc_line()
1379-
|> interpolation_to_algebra(:heredoc, state, doc, closing_terminator)
1380-
1381-
{force_unfit(doc), state}
1382-
else
1383-
escape = closing_sigil_terminator(opening_terminator)
1384-
closing_terminator = concat(escape, List.to_string(modifiers))
1385-
interpolation_to_algebra(entries, escape, state, doc, closing_terminator)
1386-
end
1376+
{doc, state} =
1377+
entries
1378+
|> prepend_heredoc_line()
1379+
|> interpolation_to_algebra(:heredoc, state, doc, closing_terminator)
13871380

1381+
{force_unfit(doc), state}
1382+
else
1383+
escape = closing_sigil_terminator(opening_terminator)
1384+
closing_terminator = concat(escape, List.to_string(modifiers))
1385+
interpolation_to_algebra(entries, escape, state, doc, closing_terminator)
1386+
end
1387+
else
13881388
_ ->
13891389
:error
13901390
end

lib/elixir/test/elixir/code_formatter/integration_test.exs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,14 @@ defmodule Code.Formatter.IntegrationTest do
461461
"""
462462
end
463463

464+
test "false positive sigil" do
465+
assert_same """
466+
def sigil_d(<<year::2-bytes, "-", month::2-bytes, "-", day::2-bytes>>, calendar) do
467+
ymd(year, month, day, calendar)
468+
end
469+
"""
470+
end
471+
464472
test "capture with operators" do
465473
assert_same """
466474
"this works" |> (&String.upcase/1) |> (&String.downcase/1)

0 commit comments

Comments
 (0)