Skip to content

Commit 7a1d46a

Browse files
committed
Added clearer typing for requests and notifications
Prior, the lsp and elixir versions said they were the same type, this made it harder for users to tell which type they were dealing with.
1 parent 704f42f commit 7a1d46a

File tree

5 files changed

+42
-14
lines changed

5 files changed

+42
-14
lines changed

apps/language_server/lib/language_server/experimental/protocol/proto/macros/struct.ex

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ defmodule ElixirLS.LanguageServer.Experimental.Protocol.Proto.Macros.Struct do
2525
def new(opts \\ []) do
2626
struct(__MODULE__, opts)
2727
end
28+
29+
defoverridable new: 0, new: 1
2830
end
2931
end
3032
end

apps/language_server/lib/language_server/experimental/protocol/proto/notification.ex

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,23 @@ defmodule ElixirLS.LanguageServer.Experimental.Protocol.Proto.Notification do
1616

1717
quote location: :keep do
1818
defmodule LSP do
19-
unquote(Message.build(:notification, method, lsp_types, param_names))
19+
unquote(Message.build({:notification, :lsp}, method, lsp_types, param_names))
2020
end
2121

2222
alias ElixirLS.LanguageServer.Experimental.Protocol.Proto.Convert
2323

2424
unquote(
25-
Message.build(:notification, method, elixir_types, param_names, include_parse?: false)
25+
Message.build({:notification, :elixir}, method, elixir_types, param_names,
26+
include_parse?: false
27+
)
2628
)
2729

2830
unquote(build_parse(method))
2931

32+
def new(opts \\ []) do
33+
%__MODULE__{lsp: LSP.new(opts)}
34+
end
35+
3036
def to_elixir(%__MODULE__{} = request) do
3137
Convert.to_elixir(request)
3238
end

apps/language_server/lib/language_server/experimental/protocol/proto/request.ex

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,24 @@ defmodule ElixirLS.LanguageServer.Experimental.Protocol.Proto.Request do
2222

2323
quote location: :keep do
2424
defmodule LSP do
25-
unquote(Message.build(:request, method, lsp_types, param_names))
25+
unquote(Message.build({:request, :lsp}, method, lsp_types, param_names))
2626
end
2727

2828
alias ElixirLS.LanguageServer.Experimental.Protocol.Proto.Convert
2929
alias ElixirLS.LanguageServer.Experimental.Protocol.Types
3030

31-
unquote(Message.build(:request, method, elixir_types, param_names, include_parse?: false))
31+
unquote(
32+
Message.build({:request, :elixir}, method, elixir_types, param_names,
33+
include_parse?: false
34+
)
35+
)
3236

3337
unquote(build_parse(method))
3438

39+
def new(opts \\ []) do
40+
%__MODULE__{lsp: LSP.new(opts)}
41+
end
42+
3543
def to_elixir(%__MODULE__{} = request) do
3644
Convert.to_elixir(request)
3745
end

apps/language_server/lib/language_server/experimental/server/state.ex

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ defmodule ElixirLS.LanguageServer.Experimental.Server.State do
1717
%__MODULE__{}
1818
end
1919

20-
def apply(%__MODULE__{} = state, %DidChange{} = event) do
20+
def apply(%__MODULE__{} = state, %DidChange{lsp: event}) do
2121
uri = event.text_document.uri
2222
version = event.text_document.version
2323

@@ -30,7 +30,7 @@ defmodule ElixirLS.LanguageServer.Experimental.Server.State do
3030
end
3131
end
3232

33-
def apply(%__MODULE__{} = state, %DidOpen{} = event) do
33+
def apply(%__MODULE__{} = state, %DidOpen{lsp: event}) do
3434
%TextDocument{text: text, uri: uri, version: version} = text_document = event.text_document
3535

3636
case SourceFile.Store.open(uri, text, version) do
@@ -44,7 +44,7 @@ defmodule ElixirLS.LanguageServer.Experimental.Server.State do
4444
end
4545
end
4646

47-
def apply(%__MODULE__{} = state, %DidClose{} = event) do
47+
def apply(%__MODULE__{} = state, %DidClose{lsp: event}) do
4848
uri = event.text_document.uri
4949

5050
case SourceFile.Store.close(uri) do
@@ -57,7 +57,7 @@ defmodule ElixirLS.LanguageServer.Experimental.Server.State do
5757
end
5858
end
5959

60-
def apply(%__MODULE__{} = state, %DidSave{} = event) do
60+
def apply(%__MODULE__{} = state, %DidSave{lsp: event}) do
6161
uri = event.text_document.uri
6262

6363
case SourceFile.Store.save(uri) do

apps/language_server/test/support/fixtures/lsp_protocol.ex

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ defmodule ElixirLS.LanguageServer.Fixtures.LspProtocol do
2929
args
3030
end
3131

32-
{:ok, struct(type, args)}
32+
{:ok, type.new(args)}
3333

3434
{:error, _} = err ->
3535
err
@@ -51,24 +51,36 @@ defmodule ElixirLS.LanguageServer.Fixtures.LspProtocol do
5151
end
5252

5353
defp maybe_wrap_with_json_rpc(%proto_module{} = proto, opts) do
54+
proto_struct =
55+
case proto_module.__meta__(:type) do
56+
{message_type, :lsp} when message_type in [:notification, :request] ->
57+
proto
58+
59+
{message_type, :elixir} when message_type in [:notification, :request] ->
60+
proto.lsp
61+
62+
other ->
63+
other
64+
end
65+
5466
case proto_module.__meta__(:type) do
55-
:notification ->
67+
{:notification, _} ->
5668
%{
5769
jsonrpc: Keyword.get(opts, :jsonrpc, "2.0"),
5870
method: proto_module.__meta__(:method_name),
59-
params: extract_params(proto)
71+
params: extract_params(proto_struct)
6072
}
6173

62-
:request ->
74+
{:request, _} ->
6375
%{
6476
jsonrpc: Keyword.get(opts, :jsonrpc, "2.0"),
6577
method: proto_module.__meta__(:method_name),
66-
params: extract_params(proto),
78+
params: extract_params(proto_struct),
6779
id: Keyword.get(opts, :id, next_int())
6880
}
6981

7082
_other ->
71-
proto
83+
proto_struct
7284
end
7385
end
7486

0 commit comments

Comments
 (0)