From 3580a31162e396fd47ef0e94bec02a05b7617a6d Mon Sep 17 00:00:00 2001 From: Tom Crossland Date: Wed, 3 Mar 2021 18:21:59 +0100 Subject: [PATCH 1/3] build_result/4 extract line number from tuple --- .../language_server/providers/workspace_symbols.ex | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/apps/language_server/lib/language_server/providers/workspace_symbols.ex b/apps/language_server/lib/language_server/providers/workspace_symbols.ex index 12d732ad5..7de1234f8 100644 --- a/apps/language_server/lib/language_server/providers/workspace_symbols.ex +++ b/apps/language_server/lib/language_server/providers/workspace_symbols.ex @@ -477,7 +477,16 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbols do end) end - @spec build_result(key_t, symbol_t, String.t(), nil | non_neg_integer) :: symbol_information_t + @spec build_result( + key_t, + symbol_t, + String.t(), + nil | non_neg_integer | {non_neg_integer, non_neg_integer} + ) :: symbol_information_t + defp build_result(key, symbol, path, {line, _}) do + build_result(key, symbol, path, line) + end + defp build_result(key, symbol, path, line) do %{ kind: @symbol_codes |> Map.fetch!(key), From 9bd609614b86cea0342db11edd634d4ca399693e Mon Sep 17 00:00:00 2001 From: Tom Crossland Date: Thu, 4 Mar 2021 00:17:55 +0100 Subject: [PATCH 2/3] expandMacro command should be scoped to server instance --- .../lib/language_server/providers/execute_command.ex | 2 +- apps/language_server/lib/language_server/server.ex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/language_server/lib/language_server/providers/execute_command.ex b/apps/language_server/lib/language_server/providers/execute_command.ex index f87eb7832..fd490c4ba 100644 --- a/apps/language_server/lib/language_server/providers/execute_command.ex +++ b/apps/language_server/lib/language_server/providers/execute_command.ex @@ -10,7 +10,7 @@ defmodule ElixirLS.LanguageServer.Providers.ExecuteCommand do handler = case command do "spec:" <> _ -> ElixirLS.LanguageServer.Providers.ExecuteCommand.ApplySpec - "expandMacro" -> ElixirLS.LanguageServer.Providers.ExecuteCommand.ExpandMacro + "expandMacro:" <> _ -> ElixirLS.LanguageServer.Providers.ExecuteCommand.ExpandMacro _ -> nil end diff --git a/apps/language_server/lib/language_server/server.ex b/apps/language_server/lib/language_server/server.ex index bc4aa62fe..97bd5ac55 100644 --- a/apps/language_server/lib/language_server/server.ex +++ b/apps/language_server/lib/language_server/server.ex @@ -787,7 +787,7 @@ defmodule ElixirLS.LanguageServer.Server do "executeCommandProvider" => %{ "commands" => [ "spec:#{server_instance_id}", - "expandMacro" + "expandMacro:#{server_instance_id}" ] }, "workspace" => %{ From afac04bff98835d55f884b2ab27023470125422a Mon Sep 17 00:00:00 2001 From: Tom Crossland Date: Thu, 4 Mar 2021 10:31:46 +0100 Subject: [PATCH 3/3] typedef erl_location_t, rename line to location --- .../providers/workspace_symbols.ex | 47 +++++++++---------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/apps/language_server/lib/language_server/providers/workspace_symbols.ex b/apps/language_server/lib/language_server/providers/workspace_symbols.ex index 7de1234f8..ef28ff277 100644 --- a/apps/language_server/lib/language_server/providers/workspace_symbols.ex +++ b/apps/language_server/lib/language_server/providers/workspace_symbols.ex @@ -34,6 +34,10 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbols do location: location_t } + # Location in annotations from OTP 23 and previous contain only line number. + # OTP 24 annotations may also be {line, column}, depending on compiler + # options. + @typep erl_location_t :: non_neg_integer | {non_neg_integer, non_neg_integer} @typep key_t :: :modules | :functions | :types | :callbacks @typep symbol_t :: module | {module, atom, non_neg_integer} @typep state_t :: %{ @@ -223,7 +227,7 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbols do ## Helpers - defp find_module_line(module, path) do + defp find_module_location(module, path) do if String.ends_with?(path, ".erl") do ErlangSourceFile.module_line(path) else @@ -231,7 +235,7 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbols do end end - defp find_function_line(module, function, arity, path) do + defp find_function_location(module, function, arity, path) do if String.ends_with?(path, ".erl") do ErlangSourceFile.function_line(path, function) else @@ -360,8 +364,8 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbols do chunked_module_paths |> do_process_chunked(fn chunk -> for {module, path} <- chunk do - line = find_module_line(module, path) - build_result(:modules, module, path, line) + location = find_module_location(module, path) + build_result(:modules, module, path, location) end end) end) @@ -373,9 +377,9 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbols do Code.ensure_loaded?(module), {function, arity} <- module.module_info(:exports) do {function, arity} = SourceFile.strip_macro_prefix({function, arity}) - line = find_function_line(module, function, arity, path) + location = find_function_location(module, function, arity, path) - build_result(:functions, {module, function, arity}, path, line) + build_result(:functions, {module, function, arity}, path, location) end end) end) @@ -388,13 +392,13 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbols do {kind, {type, type_ast, args}} <- ElixirSense.Core.Normalized.Typespec.get_types(module), kind in [:type, :opaque] do - line = + location = case type_ast do - {_, line, _, _} -> line - {_, line, _} -> line + {_, location, _, _} -> location + {_, location, _} -> location end - build_result(:types, {module, type, length(args)}, path, line) + build_result(:types, {module, type, length(args)}, path, location) end end) end) @@ -405,11 +409,11 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbols do for {module, path} <- chunk, function_exported?(module, :behaviour_info, 1), # TODO: Don't call into here directly - {{callback, arity}, [{:type, line, _, _}]} <- + {{callback, arity}, [{:type, location, _, _}]} <- ElixirSense.Core.Normalized.Typespec.get_callbacks(module) do {callback, arity} = SourceFile.strip_macro_prefix({callback, arity}) - build_result(:callbacks, {module, callback, arity}, path, line) + build_result(:callbacks, {module, callback, arity}, path, location) end end) end) @@ -477,23 +481,14 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbols do end) end - @spec build_result( - key_t, - symbol_t, - String.t(), - nil | non_neg_integer | {non_neg_integer, non_neg_integer} - ) :: symbol_information_t - defp build_result(key, symbol, path, {line, _}) do - build_result(key, symbol, path, line) - end - - defp build_result(key, symbol, path, line) do + @spec build_result(key_t, symbol_t, String.t(), nil | erl_location_t) :: symbol_information_t + defp build_result(key, symbol, path, location) do %{ kind: @symbol_codes |> Map.fetch!(key), name: symbol_name(key, symbol), location: %{ uri: SourceFile.path_to_uri(path), - range: build_range(line) + range: build_range(location) } } end @@ -515,7 +510,7 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbols do "#{inspect(module)}.#{callback}/#{arity}" end - @spec build_range(nil | non_neg_integer) :: range_t + @spec build_range(nil | erl_location_t) :: range_t defp build_range(nil) do %{ start: %{line: 0, character: 0}, @@ -523,6 +518,8 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbols do } end + defp build_range({line, _column}), do: build_range(line) + defp build_range(line) do %{ start: %{line: max(line - 1, 0), character: 0},