diff --git a/apps/language_server/lib/language_server/protocol.ex b/apps/language_server/lib/language_server/protocol.ex index 7081e0d6..8141140b 100644 --- a/apps/language_server/lib/language_server/protocol.ex +++ b/apps/language_server/lib/language_server/protocol.ex @@ -156,6 +156,18 @@ defmodule ElixirLS.LanguageServer.Protocol do end end + defmacro macro_expansion(id, whole_buffer, selected_macro, macro_line) do + quote do + request(unquote(id), "elixirDocument/macroExpansion", %{ + "context" => %{"selection" => unquote(selected_macro)}, + "textDocument" => %{ + "text" => unquote(whole_buffer)}, + "position" => %{ "line" => unquote(macro_line) } + }) + end + end + + # Other utilities defmacro range(start_line, start_character, end_line, end_character) do diff --git a/apps/language_server/lib/language_server/server.ex b/apps/language_server/lib/language_server/server.ex index 3b3311e2..7419f86a 100644 --- a/apps/language_server/lib/language_server/server.ex +++ b/apps/language_server/lib/language_server/server.ex @@ -403,6 +403,11 @@ defmodule ElixirLS.LanguageServer.Server do {:async, fun, state} end + defp handle_request(macro_expansion(_id, whole_buffer, selected_macro, macro_line), state) do + x = ElixirSense.expand_full(whole_buffer, selected_macro, macro_line) + {:ok, x, state} + end + defp handle_request(request(_, _, _) = req, state) do IO.inspect(req, label: "Unmatched request") {:error, :invalid_request, nil, state} @@ -434,6 +439,7 @@ defmodule ElixirLS.LanguageServer.Server do defp server_capabilities do %{ + "macroExpansion" => true, "textDocumentSync" => 2, "hoverProvider" => true, "completionProvider" => %{"triggerCharacters" => Completion.trigger_characters()}, @@ -644,4 +650,5 @@ defmodule ElixirLS.LanguageServer.Server do defp set_project_dir(state, _) do state end + end