# Copyright(c) 2015-2023 ACCESS CO., LTD. All rights reserved.
use Croma
defmodule Antikythera.CodeUtil do
@moduledoc """
Utilities involving `Code` module, used for metaprogramming.
"""
@doc """
Fetches function document from already existing module.
Used when annotating a function with the same doc attribute as that of another function.
"""
defun doc_by_mfa!(module :: v[module], function :: v[atom], arity :: v[non_neg_integer]) ::
String.t() do
{:docs_v1, _anno, _beam_lang, _format, _moduledoc, _meta, docs} = Code.fetch_docs(module)
case List.keyfind(docs, {:function, function, arity}, 0) do
{_tuple3, _anno, _signature, %{"en" => doc}, _meta} -> doc
_otherwise -> raise(ArgumentError, "Not found: #{inspect(module)}.#{function}/#{arity}")
end
end
end