Skip to content

Commit d99a162

Browse files
mattnenterprisejosevalim
authored andcommitted
Supply file and line to formatter plugins (#11591)
Allow formatter plugins to print errors with accurate file and line information. The line is only provided when a sigil is being formatted.
1 parent 1601b30 commit d99a162

File tree

4 files changed

+19
-7
lines changed

4 files changed

+19
-7
lines changed

lib/elixir/lib/code/formatter.ex

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ defmodule Code.Formatter do
177177
defp state(comments, opts) do
178178
force_do_end_blocks = Keyword.get(opts, :force_do_end_blocks, false)
179179
locals_without_parens = Keyword.get(opts, :locals_without_parens, [])
180+
file = Keyword.get(opts, :file, nil)
180181
sigils = Keyword.get(opts, :sigils, [])
181182

182183
sigils =
@@ -199,7 +200,8 @@ defmodule Code.Formatter do
199200
operand_nesting: 2,
200201
skip_eol: false,
201202
comments: comments,
202-
sigils: sigils
203+
sigils: sigils,
204+
file: file
203205
}
204206
end
205207

@@ -1320,7 +1322,14 @@ defmodule Code.Formatter do
13201322
entries =
13211323
case state.sigils do
13221324
%{^name => callback} ->
1323-
case callback.(hd(entries), sigil: List.to_atom([name]), modifiers: modifiers) do
1325+
metadata = [
1326+
file: state.file,
1327+
line: meta[:line],
1328+
sigil: List.to_atom([name]),
1329+
modifiers: modifiers
1330+
]
1331+
1332+
case callback.(hd(entries), metadata) do
13241333
binary when is_binary(binary) ->
13251334
[binary]
13261335

lib/elixir/test/elixir/code_formatter/general_test.exs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ defmodule Code.Formatter.GeneralTest do
126126
"""
127127

128128
formatter = fn content, opts ->
129-
assert opts == [sigil: :W, modifiers: []]
129+
assert opts == [file: nil, line: 1, sigil: :W, modifiers: []]
130130
content |> String.split(~r/ +/) |> Enum.join(" ")
131131
end
132132

@@ -141,7 +141,7 @@ defmodule Code.Formatter.GeneralTest do
141141
"""
142142

143143
formatter = fn content, opts ->
144-
assert opts == [sigil: :W, modifiers: 'abc']
144+
assert opts == [file: nil, line: 1, sigil: :W, modifiers: 'abc']
145145
content |> String.split(~r/ +/) |> Enum.join(" ")
146146
end
147147

@@ -162,7 +162,7 @@ defmodule Code.Formatter.GeneralTest do
162162
"""
163163

164164
formatter = fn content, opts ->
165-
assert opts == [sigil: :W, modifiers: []]
165+
assert opts == [file: nil, line: 1, sigil: :W, modifiers: []]
166166
content |> String.split(~r/ +/) |> Enum.join(" ")
167167
end
168168

@@ -189,7 +189,7 @@ defmodule Code.Formatter.GeneralTest do
189189
"""
190190

191191
formatter = fn content, opts ->
192-
assert opts == [sigil: :W, modifiers: 'abc']
192+
assert opts == [file: nil, line: 2, sigil: :W, modifiers: 'abc']
193193
content |> String.split(~r/ +/) |> Enum.join("\n")
194194
end
195195

lib/mix/lib/mix/tasks/format.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -504,7 +504,7 @@ defmodule Mix.Tasks.Format do
504504

505505
cond do
506506
plugin = find_plugin_for_extension(formatter_opts, ext) ->
507-
&plugin.format(&1, [extension: ext] ++ formatter_opts)
507+
&plugin.format(&1, [extension: ext, file: file] ++ formatter_opts)
508508

509509
ext in ~w(.ex .exs) ->
510510
&elixir_format(&1, [file: file] ++ formatter_opts)

lib/mix/test/mix/tasks/format_test.exs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,8 @@ defmodule Mix.Tasks.FormatTest do
206206
assert opts[:from_formatter_exs] == :yes
207207
assert opts[:sigil] == :W
208208
assert opts[:modifiers] == 'abc'
209+
assert opts[:line] == 2
210+
assert opts[:file] =~ ~r/\/a\.ex$/
209211
contents |> String.split(~r/\s/) |> Enum.join("\n")
210212
end
211213
end
@@ -253,6 +255,7 @@ defmodule Mix.Tasks.FormatTest do
253255
def format(contents, opts) do
254256
assert opts[:from_formatter_exs] == :yes
255257
assert opts[:extension] == ".w"
258+
assert opts[:file] =~ ~r/\/a\.w$/
256259
assert [W: sigil_fun] = opts[:sigils]
257260
assert is_function(sigil_fun, 2)
258261
contents |> String.split(~r/\s/) |> Enum.join("\n")

0 commit comments

Comments
 (0)