Skip to content

Commit c73d9ab

Browse files
committed
render metadata in signature help
Fixes #1064
1 parent fd725b7 commit c73d9ab

File tree

7 files changed

+209
-120
lines changed

7 files changed

+209
-120
lines changed

apps/language_server/lib/language_server/providers/signature_help.ex

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ defmodule ElixirLS.LanguageServer.Providers.SignatureHelp do
44
"""
55
alias ElixirLS.LanguageServer.{SourceFile, Parser}
66
alias ElixirLS.LanguageServer.Providers.SignatureHelp.Signature
7+
alias ElixirLS.LanguageServer.MarkdownUtils
78

89
def trigger_characters(), do: ["(", ","]
910

@@ -29,7 +30,13 @@ defmodule ElixirLS.LanguageServer.Providers.SignatureHelp do
2930
end
3031

3132
defp signature_response(
32-
%{documentation: documentation, name: name, params: params, spec: spec} = signature
33+
%{
34+
documentation: documentation,
35+
name: name,
36+
params: params,
37+
spec: spec,
38+
metadata: metadata
39+
} = signature
3340
) do
3441
params_info = for param <- params, do: %{"label" => param}
3542

@@ -47,18 +54,36 @@ defmodule ElixirLS.LanguageServer.Providers.SignatureHelp do
4754

4855
case {spec, documentation} do
4956
{"", ""} ->
50-
response
57+
put_metadata(response, metadata)
5158

5259
{"", _} ->
5360
put_documentation(response, documentation)
61+
|> put_metadata(metadata)
5462

5563
{_, _} ->
5664
spec_str = SourceFile.format_spec(spec, line_length: 42)
65+
5766
put_documentation(response, "#{documentation}\n#{spec_str}")
67+
|> put_metadata(metadata)
5868
end
5969
end
6070

6171
defp put_documentation(response, documentation) do
6272
Map.put(response, "documentation", %{"kind" => "markdown", "value" => documentation})
6373
end
74+
75+
defp put_metadata(response, metadata) do
76+
if metadata do
77+
metadata_md = MarkdownUtils.get_metadata_md(metadata)
78+
79+
if metadata_md != "" do
80+
current_docs = get_in(response, ["documentation", "value"]) || ""
81+
put_documentation(response, metadata_md <> "\n\n" <> current_docs)
82+
else
83+
response
84+
end
85+
else
86+
response
87+
end
88+
end
6489
end

apps/language_server/lib/language_server/providers/signature_help/signature.ex

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -121,20 +121,27 @@ defmodule ElixirLS.LanguageServer.Providers.SignatureHelp.Signature do
121121
|> Enum.reject(&String.starts_with?(&1, "@spec"))
122122
|> Enum.reverse()
123123

124-
callback_doc =
124+
{callback_doc, callback_meta} =
125125
case metadata.mods_funs_to_positions[{behaviour, fun, arity}] do
126126
nil ->
127-
spec_info.doc
127+
{spec_info.doc, spec_info.meta}
128128

129129
def_info ->
130130
# in case of protocol implementation get doc and meta from def
131-
def_info.doc
131+
{def_info.doc, def_info.meta}
132132
end
133133

134+
# Merge metadata from both the implementation and the behaviour
135+
metadata =
136+
callback_meta
137+
|> Map.merge(signature.metadata)
138+
|> Map.put(:implementing, behaviour)
139+
134140
%{
135141
signature
136142
| spec: specs |> Enum.join("\n"),
137-
documentation: Introspection.extract_summary_from_docs(callback_doc)
143+
documentation: Introspection.extract_summary_from_docs(callback_doc),
144+
metadata: metadata
138145
}
139146

140147
nil ->
@@ -151,7 +158,7 @@ defmodule ElixirLS.LanguageServer.Providers.SignatureHelp.Signature do
151158
State.ModFunInfo.get_category(fun_info)
152159
end
153160

154-
{spec, doc, _} =
161+
{spec, doc, callback_meta} =
155162
Metadata.get_doc_spec_from_behaviour(
156163
behaviour,
157164
fun,
@@ -162,7 +169,8 @@ defmodule ElixirLS.LanguageServer.Providers.SignatureHelp.Signature do
162169
%{
163170
signature
164171
| documentation: Introspection.extract_summary_from_docs(doc),
165-
spec: spec
172+
spec: spec,
173+
metadata: callback_meta |> Map.merge(signature.metadata)
166174
}
167175
end
168176
end

apps/language_server/test/providers/references/locator_test.exs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2330,7 +2330,7 @@ defmodule ElixirLS.LanguageServer.Providers.References.LocatorTest do
23302330

23312331
metadata = ElixirSense.Core.Parser.parse_file(file, false, false, {1, 1})
23322332

2333-
groupped_calls =
2333+
grouped_calls =
23342334
metadata.calls
23352335
|> Enum.flat_map(fn {_, list} ->
23362336
list
@@ -2347,7 +2347,7 @@ defmodule ElixirLS.LanguageServer.Providers.References.LocatorTest do
23472347
end)
23482348
|> Enum.group_by(fn item -> item.callee end)
23492349

2350-
assert groupped_calls == filtered_trace
2350+
assert grouped_calls == filtered_trace
23512351
end
23522352
end
23532353

0 commit comments

Comments
 (0)