Skip to content

Commit 90f6591

Browse files
Elixir 1.13 support (#620)
* bump elixir_sense * fix deprecated api usage * migrate to Config * add compatibility with elixir 1.13 mix * fix test * fix test * fix test * call old version on elixir < 1.13 * add support for bin_heredoc token * fix compile on 1.12 * remove newlines in document outline * add support for list_heredoc token * Update apps/language_server/lib/language_server/mix_shell.ex Co-authored-by: Jason Axelson <[email protected]>
1 parent 4a6145d commit 90f6591

File tree

9 files changed

+69
-17
lines changed

9 files changed

+69
-17
lines changed

apps/language_server/lib/language_server/build.ex

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,7 @@ defmodule ElixirLS.LanguageServer.Build do
158158
# The project may override our logger config, so we reset it after loading their config
159159
logger_config = Application.get_all_env(:logger)
160160
Mix.Task.run("loadconfig")
161-
# NOTE: soft-deprecated in v1.10
162-
Mix.Config.persist(logger: logger_config)
161+
Application.put_all_env([logger: logger_config], persistent: true)
163162
end
164163

165164
{status, diagnostics}

apps/language_server/lib/language_server/mix_shell.ex

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ defmodule ElixirLS.LanguageServer.MixShell do
3838
end
3939

4040
@impl Mix.Shell
41-
def yes?(message) do
41+
def yes?(message, options \\ []) do
4242
if WireProtocol.io_intercepted?() do
4343
response =
4444
JsonRpc.show_message_request(:info, message, [
@@ -55,7 +55,12 @@ defmodule ElixirLS.LanguageServer.MixShell do
5555
true
5656
end
5757
else
58-
Mix.Shell.IO.yes?(message)
58+
# TODO convert to to normal call when we require elixir 1.13
59+
if Version.match?(System.version(), "< 1.13.0-rc.0") do
60+
apply(Mix.Shell.IO, :yes?, [message])
61+
else
62+
apply(Mix.Shell.IO, :yes?, [message, options])
63+
end
5964
end
6065
end
6166
end

apps/language_server/lib/language_server/providers/document_symbols.ex

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ defmodule ElixirLS.LanguageServer.Providers.DocumentSymbols do
151151
[{:when, _, [{:"::", _, [{_, _, _} = type_head, _]}, _]}] ->
152152
Macro.to_string(type_head)
153153
end
154+
|> String.replace("\n", "")
154155

155156
type = if type_kind in [:type, :typep, :opaque], do: :class, else: :event
156157

@@ -192,7 +193,7 @@ defmodule ElixirLS.LanguageServer.Providers.DocumentSymbols do
192193
{defname, _, [{:when, _, [{_, location, _} = fn_head, _]} | _]}
193194
)
194195
when defname in @defs do
195-
name = Macro.to_string(fn_head)
196+
name = Macro.to_string(fn_head) |> String.replace("\n", "")
196197

197198
%Info{
198199
type: :function,
@@ -205,7 +206,7 @@ defmodule ElixirLS.LanguageServer.Providers.DocumentSymbols do
205206
# Function, macro, delegate
206207
defp extract_symbol(_current_module, {defname, _, [{_, location, _} = fn_head | _]})
207208
when defname in @defs do
208-
name = Macro.to_string(fn_head)
209+
name = Macro.to_string(fn_head) |> String.replace("\n", "")
209210

210211
%Info{
211212
type: :function,

apps/language_server/lib/language_server/providers/folding_range/token.ex

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ defmodule ElixirLS.LanguageServer.Providers.FoldingRange.Token do
66
"""
77

88
alias ElixirSense.Core.Normalized.Tokenizer
9+
require Logger
910

1011
@type t :: {atom(), {non_neg_integer(), non_neg_integer(), any()}, any()}
1112

@@ -36,8 +37,15 @@ defmodule ElixirLS.LanguageServer.Providers.FoldingRange.Token do
3637
{:sigil, {b1, b2, b3}, _, _, _, delimiter} ->
3738
{:sigil, {b1 - 1, b2 - 1, b3}, delimiter}
3839

40+
{:bin_heredoc, {b1, b2, b3}, _, _} ->
41+
{:bin_heredoc, {b1 - 1, b2 - 1, b3}, nil}
42+
43+
{:list_heredoc, {b1, b2, b3}, _, _} ->
44+
{:list_heredoc, {b1 - 1, b2 - 1, b3}, nil}
45+
3946
# raise here?
40-
_ ->
47+
error ->
48+
Logger.warn("Unmatched token: #{inspect(error)}")
4149
:error
4250
end
4351

apps/language_server/test/providers/code_lens/type_spec/contract_translator_test.exs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,14 @@ defmodule ElixirLS.LanguageServer.Providers.CodeLens.TypeSpec.ContractTranslator
145145

146146
test "map with fields" do
147147
contract = '(any()) -> \#{integer()=>any(), 1:=atom(), abc:=4}'
148-
149-
assert "foo(any) :: %{optional(integer) => any, 1 => atom, :abc => 4}" ==
148+
149+
expected = if Version.match?(System.version(), "< 1.13.0-rc.0") do
150+
"foo(any) :: %{optional(integer) => any, 1 => atom, :abc => 4}"
151+
else
152+
"foo(any) :: %{optional(integer) => any, 1 => atom, abc: 4}"
153+
end
154+
155+
assert expected ==
150156
ContractTranslator.translate_contract(:foo, contract, false, Atom)
151157
end
152158

apps/language_server/test/providers/execute_command/expand_macro_test.exs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ defmodule ElixirLS.LanguageServer.Providers.ExecuteCommand.ExpandMacroTest do
6464
}
6565
})
6666

67+
if Version.match?(System.version(), "< 1.13.0-rc.0") do
6768
assert res == %{
6869
"expand" => """
6970
require(ElixirLS.Test.MacroA)
@@ -96,5 +97,39 @@ defmodule ElixirLS.LanguageServer.Providers.ExecuteCommand.ExpandMacroTest do
9697
)
9798
"""
9899
}
100+
else
101+
assert res == %{
102+
"expand" => """
103+
require ElixirLS.Test.MacroA
104+
ElixirLS.Test.MacroA.__using__([])
105+
""",
106+
"expandAll" => """
107+
require ElixirLS.Test.MacroA
108+
109+
(
110+
import ElixirLS.Test.MacroA
111+
112+
def macro_a_func do
113+
:ok
114+
end
115+
)
116+
""",
117+
"expandOnce" => """
118+
require ElixirLS.Test.MacroA
119+
ElixirLS.Test.MacroA.__using__([])
120+
""",
121+
"expandPartial" => """
122+
require ElixirLS.Test.MacroA
123+
124+
(
125+
import ElixirLS.Test.MacroA
126+
127+
def macro_a_func do
128+
:ok
129+
end
130+
)
131+
"""
132+
}
133+
end
99134
end
100135
end

apps/language_server/test/server_test.exs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -970,10 +970,8 @@ defmodule ElixirLS.LanguageServer.ServerTest do
970970
Inspects and writes the given `item` to the device.
971971
972972
```
973-
@spec inspect(item, keyword) :: item
974-
when item: var
975-
```
976-
"""
973+
@spec inspect\
974+
""" <> _
977975
},
978976
"label" => "inspect(item, opts \\\\ [])",
979977
"parameters" => [%{"label" => "item"}, %{"label" => "opts \\\\ []"}]
@@ -999,7 +997,7 @@ defmodule ElixirLS.LanguageServer.ServerTest do
999997
]
1000998
}
1001999
]
1002-
}) == resp
1000+
}) = resp
10031001
end
10041002

10051003
@tag :fixture

config/config.exs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# This file is responsible for configuring your application
2-
# and its dependencies with the aid of the Mix.Config module.
3-
use Mix.Config
2+
# and its dependencies with the aid of the Config module.
3+
import Config
44

55
# By default, the umbrella project as well as each child
66
# application will require this configuration file, ensuring

mix.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
%{
22
"dialyxir": {:hex, :dialyxir, "1.1.0", "c5aab0d6e71e5522e77beff7ba9e08f8e02bad90dfbeffae60eaf0cb47e29488", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "07ea8e49c45f15264ebe6d5b93799d4dd56a44036cf42d0ad9c960bc266c0b9a"},
33
"docsh": {:hex, :docsh, "0.7.2", "f893d5317a0e14269dd7fe79cf95fb6b9ba23513da0480ec6e77c73221cae4f2", [:rebar3], [{:providers, "1.8.1", [hex: :providers, repo: "hexpm", optional: false]}], "hexpm", "4e7db461bb07540d2bc3d366b8513f0197712d0495bb85744f367d3815076134"},
4-
"elixir_sense": {:git, "https://github.com/elixir-lsp/elixir_sense.git", "4a857f2c262b9f8ac2d72e31f4806cecc740192a", []},
4+
"elixir_sense": {:git, "https://github.com/elixir-lsp/elixir_sense.git", "3aff3709d78f79c641fc0df47b0976aa7217b45e", []},
55
"erl2ex": {:git, "https://github.com/dazuma/erl2ex.git", "244c2d9ed5805ef4855a491d8616b8842fef7ca4", []},
66
"erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"},
77
"getopt": {:hex, :getopt, "1.0.1", "c73a9fa687b217f2ff79f68a3b637711bb1936e712b521d8ce466b29cbf7808a", [:rebar3], [], "hexpm", "53e1ab83b9ceb65c9672d3e7a35b8092e9bdc9b3ee80721471a161c10c59959c"},

0 commit comments

Comments
 (0)