diff --git a/lib/ex_doc/formatter/html.ex b/lib/ex_doc/formatter/html.ex
index cd2088ccb..8f96ae8d2 100644
--- a/lib/ex_doc/formatter/html.ex
+++ b/lib/ex_doc/formatter/html.ex
@@ -98,6 +98,7 @@ defmodule ExDoc.Formatter.HTML do
[
id: id,
line: child_node.doc_line,
+ file: child_node.source_path,
current_kfa: {:function, child_node.name, child_node.arity}
]
@@ -115,6 +116,7 @@ defmodule ExDoc.Formatter.HTML do
[
id: id,
line: child_node.doc_line,
+ file: child_node.source_path,
current_kfa: {child_node.type, child_node.name, child_node.arity}
]
diff --git a/lib/ex_doc/retriever.ex b/lib/ex_doc/retriever.ex
index 4d6019757..b02f9ca4c 100644
--- a/lib/ex_doc/retriever.ex
+++ b/lib/ex_doc/retriever.ex
@@ -236,6 +236,7 @@ defmodule ExDoc.Retriever do
{:docs_v1, _, _, content_type, _, module_metadata, _} = module_data.docs
{{type, name, arity}, anno, signature, source_doc, metadata} = doc_element
doc_line = anno_line(anno)
+ source = anno_file(anno, source)
annotations =
annotations_for_docs.(metadata) ++
@@ -310,6 +311,7 @@ defmodule ExDoc.Retriever do
{:docs_v1, _, _, content_type, _, module_metadata, _} = module_data.docs
{{kind, name, arity}, anno, _signature, source_doc, metadata} = callback
doc_line = anno_line(anno)
+ source = anno_file(anno, source)
signature = signature(callback_data.signature)
specs = callback_data.specs
@@ -355,6 +357,7 @@ defmodule ExDoc.Retriever do
{:docs_v1, _, _, content_type, _, module_metadata, _} = module_data.docs
{{_, name, arity}, anno, _signature, source_doc, metadata} = type_entry
doc_line = anno_line(anno)
+ source = anno_file(anno, source)
annotations = annotations_from_metadata(metadata, module_metadata)
type_data = module_data.language.type_data(type_entry, module_data)
@@ -406,6 +409,15 @@ defmodule ExDoc.Retriever do
defp anno_line(line) when is_integer(line), do: abs(line)
defp anno_line(anno), do: anno |> :erl_anno.line() |> abs()
+ defp anno_file(anno, source) do
+ case :erl_anno.file(anno) do
+ :undefined ->
+ source
+ file ->
+ %{ url: source.url, path: Path.join(Path.dirname(source.path), file) }
+ end
+ end
+
defp source_link(%{path: _, url: nil}, _line), do: nil
defp source_link(source, line) do