From 22de3f67d536472428da6e98befce822e15dba6d Mon Sep 17 00:00:00 2001 From: Lukasz Samson Date: Tue, 14 Nov 2023 19:02:00 +0100 Subject: [PATCH] handle no signature on callback --- lib/elixir_sense/core/introspection.ex | 2 +- .../suggestion/reducers/callbacks.ex | 41 ++++++++++++++----- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/lib/elixir_sense/core/introspection.ex b/lib/elixir_sense/core/introspection.ex index f0c828f2..705cb256 100644 --- a/lib/elixir_sense/core/introspection.ex +++ b/lib/elixir_sense/core/introspection.ex @@ -429,7 +429,7 @@ defmodule ElixirSense.Core.Introspection do kind: kind, arity: arity, callback: "@#{kind} #{name}(#{args})", - signature: "", + signature: nil, doc: doc, metadata: metadata |> Map.put(:optional, key in optional_callbacks) } diff --git a/lib/elixir_sense/providers/suggestion/reducers/callbacks.ex b/lib/elixir_sense/providers/suggestion/reducers/callbacks.ex index 6af38b4d..720c2f7d 100644 --- a/lib/elixir_sense/providers/suggestion/reducers/callbacks.ex +++ b/lib/elixir_sense/providers/suggestion/reducers/callbacks.ex @@ -43,23 +43,44 @@ defmodule ElixirSense.Providers.Suggestion.Reducers.Callbacks do Introspection.get_callbacks_with_docs(mod), def_prefix?(hint, spec) or Matcher.match?("#{name}", hint) do desc = Introspection.extract_summary_from_docs(doc) - [_, args_str] = Regex.run(~r/.\(([^\)]*)\)/u, signature) - args_list = - args_str - |> String.split(",") - |> Enum.map(&String.trim/1) + {args, args_list} = + if signature do + match_res = Regex.run(~r/.\(([^\)]*)\)/u, signature) + + unless match_res do + raise "unable to get arguments from #{inspect(signature)}" + end + + [_, args_str] = match_res + + args_list = + args_str + |> String.split(",") + |> Enum.map(&String.trim/1) + + args = + args_str + |> String.replace("\n", " ") + |> String.split(",") + |> Enum.map_join(", ", &String.trim/1) + + {args, args_list} + else + if arity == 0 do + {"", []} + else + args_list = for _ <- 1..arity, do: "term" + {Enum.join(args_list, ", "), args_list} + end + end %{ type: :callback, subtype: kind, name: Atom.to_string(name), arity: arity, - args: - args_str - |> String.replace("\n", " ") - |> String.split(",") - |> Enum.map_join(", ", &String.trim/1), + args: args, args_list: args_list, origin: mod_name, summary: desc,