Skip to content

Commit 7930bec

Browse files
committed
return metadata from completions provider
Fixes #952
1 parent a22ccea commit 7930bec

File tree

3 files changed

+105
-93
lines changed

3 files changed

+105
-93
lines changed

apps/language_server/lib/language_server/markdown_utils.ex

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,99 @@ defmodule ElixirLS.LanguageServer.MarkdownUtils do
3838
|> String.replace_trailing("\n", "")
3939
end) <> "\n"
4040
end
41+
42+
def get_metadata_md(metadata) do
43+
text =
44+
metadata
45+
|> Enum.sort()
46+
|> Enum.map(&get_metadata_entry_md/1)
47+
|> Enum.reject(&is_nil/1)
48+
|> Enum.join("\n\n")
49+
50+
case text do
51+
"" -> ""
52+
not_empty -> not_empty <> "\n\n"
53+
end
54+
end
55+
56+
# erlang name
57+
defp get_metadata_entry_md({:name, _text}), do: nil
58+
59+
# erlang signature
60+
defp get_metadata_entry_md({:signature, _text}), do: nil
61+
62+
# erlang edit_url
63+
defp get_metadata_entry_md({:edit_url, _text}), do: nil
64+
65+
# erlang :otp_doc_vsn
66+
defp get_metadata_entry_md({:otp_doc_vsn, _text}), do: nil
67+
68+
# erlang :source
69+
defp get_metadata_entry_md({:source, _text}), do: nil
70+
71+
# erlang :types
72+
defp get_metadata_entry_md({:types, _text}), do: nil
73+
74+
# erlang :equiv
75+
defp get_metadata_entry_md({:equiv, {:function, name, arity}}) do
76+
"**Equivalent** #{name}/#{arity}"
77+
end
78+
79+
defp get_metadata_entry_md({:deprecated, text}) do
80+
"**Deprecated** #{text}"
81+
end
82+
83+
defp get_metadata_entry_md({:since, text}) do
84+
"**Since** #{text}"
85+
end
86+
87+
defp get_metadata_entry_md({:group, text}) do
88+
"**Group** #{text}"
89+
end
90+
91+
defp get_metadata_entry_md({:guard, true}) do
92+
"**Guard**"
93+
end
94+
95+
defp get_metadata_entry_md({:hidden, true}) do
96+
"**Hidden**"
97+
end
98+
99+
defp get_metadata_entry_md({:builtin, true}) do
100+
"**Built-in**"
101+
end
102+
103+
defp get_metadata_entry_md({:implementing, module}) do
104+
"**Implementing behaviour** #{inspect(module)}"
105+
end
106+
107+
defp get_metadata_entry_md({:implementing_module_app, app}) do
108+
"**Behaviour defined in application** #{inspect(app)}"
109+
end
110+
111+
defp get_metadata_entry_md({:optional, true}) do
112+
"**Optional**"
113+
end
114+
115+
defp get_metadata_entry_md({:optional, false}), do: nil
116+
117+
defp get_metadata_entry_md({:overridable, true}) do
118+
"**Overridable**"
119+
end
120+
121+
defp get_metadata_entry_md({:overridable, false}), do: nil
122+
123+
defp get_metadata_entry_md({:opaque, true}) do
124+
"**Opaque**"
125+
end
126+
127+
defp get_metadata_entry_md({:defaults, _}), do: nil
128+
129+
defp get_metadata_entry_md({:delegate_to, {m, f, a}}) do
130+
"**Delegates to** #{inspect(m)}.#{f}/#{a}"
131+
end
132+
133+
defp get_metadata_entry_md({key, value}) do
134+
"**#{key}** #{inspect(value)}"
135+
end
41136
end

apps/language_server/lib/language_server/providers/completion.ex

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
1212
import ElixirLS.LanguageServer.Protocol, only: [range: 4]
1313
alias ElixirSense.Providers.Suggestion.Matcher
1414
alias ElixirSense.Core.Normalized.Code, as: NormalizedCode
15+
alias ElixirLS.LanguageServer.MarkdownUtils
1516
require Logger
1617

1718
@enforce_keys [:label, :kind, :insert_text, :priority, :tags]
@@ -610,7 +611,7 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
610611
label: name,
611612
kind: kind,
612613
detail: detail,
613-
documentation: summary,
614+
documentation: summary <> "\n\n" <> MarkdownUtils.get_metadata_md(metadata),
614615
insert_text: insert_text,
615616
filter_text: name,
616617
label_details: label_details,
@@ -661,7 +662,7 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
661662
label: label,
662663
kind: :interface,
663664
detail: "#{origin} #{subtype}",
664-
documentation: summary,
665+
documentation: summary <> "\n\n" <> MarkdownUtils.get_metadata_md(metadata),
665666
insert_text: insert_text,
666667
priority: 12,
667668
filter_text: filter_text,
@@ -695,7 +696,7 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
695696
label: label,
696697
kind: :interface,
697698
detail: "#{origin} protocol function",
698-
documentation: summary,
699+
documentation: summary <> "\n\n" <> MarkdownUtils.get_metadata_md(metadata),
699700
insert_text: insert_text,
700701
priority: 12,
701702
filter_text: name,
@@ -842,7 +843,7 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
842843
"detail" => "(#{Enum.join(args_list, ", ")})",
843844
"description" => if(origin, do: "#{origin}.#{name}/#{arity}", else: "#{name}/#{arity}")
844845
},
845-
documentation: "#{doc}#{formatted_spec}",
846+
documentation: "#{doc}\n\n#{MarkdownUtils.get_metadata_md(metadata)}\n\n#{formatted_spec}",
846847
insert_text: snippet,
847848
priority: 10,
848849
kind: :class,
@@ -1307,7 +1308,8 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
13071308
"detail" => "(#{Enum.join(args_list, ", ")})",
13081309
"description" => "#{origin}.#{label}/#{arity}"
13091310
},
1310-
documentation: summary <> footer,
1311+
documentation:
1312+
summary <> "\n\n" <> MarkdownUtils.get_metadata_md(metadata) <> "\n\n" <> footer,
13111313
insert_text: insert_text,
13121314
priority: 17,
13131315
tags: metadata_to_tags(metadata),

apps/language_server/lib/language_server/providers/hover.ex

Lines changed: 3 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ defmodule ElixirLS.LanguageServer.Providers.Hover do
113113
114114
*module* #{build_module_link(info.module)}
115115
116-
#{get_metadata_md(info.metadata)}
116+
#{MarkdownUtils.get_metadata_md(info.metadata)}
117117
118118
#{documentation_section(info.docs)}
119119
"""
@@ -150,7 +150,7 @@ defmodule ElixirLS.LanguageServer.Providers.Hover do
150150
151151
*#{kind}* #{build_function_link(info.module, info.function, info.arity)}
152152
153-
#{get_metadata_md(info.metadata)}
153+
#{MarkdownUtils.get_metadata_md(info.metadata)}
154154
155155
#{spec_text}
156156
@@ -178,7 +178,7 @@ defmodule ElixirLS.LanguageServer.Providers.Hover do
178178
179179
*type* #{build_type_link(info.module, info.type, info.arity)}
180180
181-
#{get_metadata_md(info.metadata)}
181+
#{MarkdownUtils.get_metadata_md(info.metadata)}
182182
183183
### Definition
184184
@@ -232,91 +232,6 @@ defmodule ElixirLS.LanguageServer.Providers.Hover do
232232
"""
233233
end
234234

235-
def get_metadata_md(metadata) do
236-
text =
237-
metadata
238-
|> Enum.sort()
239-
|> Enum.map(&get_metadata_entry_md/1)
240-
|> Enum.reject(&is_nil/1)
241-
|> Enum.join("\n\n")
242-
243-
case text do
244-
"" -> ""
245-
not_empty -> not_empty <> "\n\n"
246-
end
247-
end
248-
249-
# erlang name
250-
defp get_metadata_entry_md({:name, _text}), do: nil
251-
252-
# erlang signature
253-
defp get_metadata_entry_md({:signature, _text}), do: nil
254-
255-
# erlang edit_url
256-
defp get_metadata_entry_md({:edit_url, _text}), do: nil
257-
258-
# erlang :otp_doc_vsn
259-
defp get_metadata_entry_md({:otp_doc_vsn, _text}), do: nil
260-
261-
# erlang :source
262-
defp get_metadata_entry_md({:source, _text}), do: nil
263-
264-
# erlang :types
265-
defp get_metadata_entry_md({:types, _text}), do: nil
266-
267-
# erlang :equiv
268-
defp get_metadata_entry_md({:equiv, {:function, name, arity}}) do
269-
"**Equivalent** #{name}/#{arity}"
270-
end
271-
272-
defp get_metadata_entry_md({:deprecated, text}) do
273-
"**Deprecated** #{text}"
274-
end
275-
276-
defp get_metadata_entry_md({:since, text}) do
277-
"**Since** #{text}"
278-
end
279-
280-
defp get_metadata_entry_md({:group, text}) do
281-
"**Group** #{text}"
282-
end
283-
284-
defp get_metadata_entry_md({:guard, true}) do
285-
"**Guard**"
286-
end
287-
288-
defp get_metadata_entry_md({:hidden, true}) do
289-
"**Hidden**"
290-
end
291-
292-
defp get_metadata_entry_md({:builtin, true}) do
293-
"**Built-in**"
294-
end
295-
296-
defp get_metadata_entry_md({:implementing, module}) do
297-
"**Implementing behaviour** #{inspect(module)}"
298-
end
299-
300-
defp get_metadata_entry_md({:optional, true}) do
301-
"**Optional**"
302-
end
303-
304-
defp get_metadata_entry_md({:optional, false}), do: nil
305-
306-
defp get_metadata_entry_md({:opaque, true}) do
307-
"**Opaque**"
308-
end
309-
310-
defp get_metadata_entry_md({:defaults, _}), do: nil
311-
312-
defp get_metadata_entry_md({:delegate_to, {m, f, a}}) do
313-
"**Delegates to** #{inspect(m)}.#{f}/#{a}"
314-
end
315-
316-
defp get_metadata_entry_md({key, value}) do
317-
"**#{key}** #{inspect(value)}"
318-
end
319-
320235
defp format_header(text) do
321236
text
322237
|> Code.format_string!(line_length: 40)

0 commit comments

Comments
 (0)