Skip to content

Commit e402206

Browse files
authored
Use elixir 1.15 :root in formatter_for (#890)
* add a project_dir option to formatter_for, with root * use -dev
1 parent 15c0052 commit e402206

File tree

6 files changed

+22
-12
lines changed

6 files changed

+22
-12
lines changed

apps/language_server/lib/language_server/experimental/code_mod/format.ex

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ defmodule ElixirLS.LanguageServer.Experimental.CodeMod.Format do
2727
project_path = Conversions.ensure_path(project_path_or_uri)
2828

2929
with :ok <- check_current_directory(document, project_path),
30-
{:ok, formatter, options} <- formatter_for(document.path),
30+
{:ok, formatter, options} <- formatter_for(document.path, project_path),
3131
:ok <-
3232
check_inputs_apply(document, project_path, Keyword.get(options, :inputs)) do
3333
document
@@ -44,15 +44,21 @@ defmodule ElixirLS.LanguageServer.Experimental.CodeMod.Format do
4444
|> formatter.()
4545
end
4646

47-
@spec formatter_for(String.t()) ::
47+
@spec formatter_for(String.t(), String.t() | nil) ::
4848
{:ok, formatter_function, keyword()} | {:error, :no_formatter_available}
49-
defp formatter_for(uri_or_path) do
49+
defp formatter_for(uri_or_path, project_dir) do
5050
path = Conversions.ensure_path(uri_or_path)
5151

5252
try do
5353
true = Code.ensure_loaded?(Mix.Tasks.Format)
5454

55-
if function_exported?(Mix.Tasks.Format, :formatter_for_file, 1) do
55+
if project_dir && Version.match?(System.version(), ">= 1.15.0-dev") do
56+
{formatter_function, options} = Mix.Tasks.Format.formatter_for_file(path, root: project_dir)
57+
58+
wrapped_formatter_function = wrap_with_try_catch(formatter_function)
59+
60+
{:ok, wrapped_formatter_function, options}
61+
else if Version.match?(System.version(), ">= 1.13.0") do
5662
{formatter_function, options} = Mix.Tasks.Format.formatter_for_file(path)
5763

5864
wrapped_formatter_function = wrap_with_try_catch(formatter_function)
@@ -63,6 +69,7 @@ defmodule ElixirLS.LanguageServer.Experimental.CodeMod.Format do
6369
formatter = build_formatter(options)
6470
{:ok, formatter, Mix.Tasks.Format.formatter_opts_for_file(path)}
6571
end
72+
end
6673
rescue
6774
e ->
6875
message = Exception.message(e)

apps/language_server/lib/language_server/providers/execute_command/apply_spec.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ defmodule ElixirLS.LanguageServer.Providers.ExecuteCommand.ApplySpec do
5656
formatted =
5757
try do
5858
target_line_length =
59-
case SourceFile.formatter_for(uri) do
59+
case SourceFile.formatter_for(uri, state.project_dir) do
6060
{:ok, {_, opts}} -> Keyword.get(opts, :line_length, @default_target_line_length)
6161
:error -> @default_target_line_length
6262
end

apps/language_server/lib/language_server/providers/formatting.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ defmodule ElixirLS.LanguageServer.Providers.Formatting do
66
def format(%SourceFile{} = source_file, uri = "file:" <> _, project_dir)
77
when is_binary(project_dir) do
88
if can_format?(uri, project_dir) do
9-
case SourceFile.formatter_for(uri) do
9+
case SourceFile.formatter_for(uri, project_dir) do
1010
{:ok, {formatter, opts}} ->
1111
if should_format?(uri, project_dir, opts[:inputs]) do
1212
do_format(source_file, formatter, opts)

apps/language_server/lib/language_server/server.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -706,7 +706,7 @@ defmodule ElixirLS.LanguageServer.Server do
706706
!!get_in(state.client_capabilities, ["textDocument", "signatureHelp"])
707707

708708
locals_without_parens =
709-
case SourceFile.formatter_for(uri) do
709+
case SourceFile.formatter_for(uri, state.project_dir) do
710710
{:ok, {_, opts}} -> Keyword.get(opts, :locals_without_parens, [])
711711
:error -> []
712712
end

apps/language_server/lib/language_server/source_file.ex

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -232,18 +232,21 @@ defmodule ElixirLS.LanguageServer.SourceFile do
232232
"""
233233
end
234234

235-
@spec formatter_for(String.t()) :: {:ok, {function | nil, keyword()}} | :error
236-
def formatter_for(uri = "file:" <> _) do
235+
@spec formatter_for(String.t(), String.t() | nil) :: {:ok, {function | nil, keyword()}} | :error
236+
def formatter_for(uri = "file:" <> _, project_dir) do
237237
path = __MODULE__.Path.from_uri(uri)
238238

239239
try do
240240
true = Code.ensure_loaded?(Mix.Tasks.Format)
241241

242-
if Version.match?(System.version(), ">= 1.13.0") do
242+
if project_dir && Version.match?(System.version(), ">= 1.15.0-dev") do
243+
{:ok, apply(Mix.Tasks.Format, :formatter_for_file, [path, {:root, project_dir }])}
244+
else if Version.match?(System.version(), ">= 1.13.0") do
243245
{:ok, apply(Mix.Tasks.Format, :formatter_for_file, [path])}
244246
else
245247
{:ok, {nil, apply(Mix.Tasks.Format, :formatter_opts_for_file, [path])}}
246248
end
249+
end
247250
rescue
248251
e ->
249252
message = Exception.message(e)

apps/language_server/test/source_file/invalid_project_test.exs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ defmodule ElixirLS.LanguageServer.SourceFile.InvalidProjectTest do
2626

2727
output =
2828
capture_log(fn ->
29-
assert :error = SourceFile.formatter_for("file:///root.ex")
29+
assert :error = SourceFile.formatter_for("file:///root.ex", "")
3030
end)
3131

3232
assert String.contains?(output, "Unable to get formatter options")
@@ -39,7 +39,7 @@ defmodule ElixirLS.LanguageServer.SourceFile.InvalidProjectTest do
3939

4040
output =
4141
capture_log(fn ->
42-
assert :error = SourceFile.formatter_for("file:///root.ex")
42+
assert :error = SourceFile.formatter_for("file:///root.ex", "")
4343
end)
4444

4545
assert String.contains?(output, "Unable to get formatter options")

0 commit comments

Comments
 (0)