defmodule Alchemist.Source do
|
|
def find(nil, function) do
|
|
cond do
|
|
List.keymember?(get_module_funs(Kernel), function, 0) ->
|
|
IO.puts source(Kernel)
|
|
List.keymember?(get_module_funs(Kernel.SpecialForms), function, 0) ->
|
|
IO.puts source(Kernel.SpecialForms)
|
|
true ->
|
|
IO.puts ""
|
|
end
|
|
end
|
|
|
|
def find(module, function) do
|
|
cond do
|
|
Code.ensure_loaded?(module) ->
|
|
IO.puts source(module)
|
|
List.keymember?(Kernel.module_info[:exports], function, 0) ->
|
|
IO.puts source(Kernel)
|
|
List.keymember?(Kernel.SpecialForms.module_info[:exports], function, 0) ->
|
|
IO.puts source(Kernel.SpecialForms)
|
|
true ->
|
|
IO.puts ""
|
|
end
|
|
end
|
|
|
|
defp source(module) do
|
|
source = module.module_info(:compile)[:source]
|
|
|
|
case source do
|
|
nil -> nil
|
|
source -> "source-file-path:" <> List.to_string(source)
|
|
end
|
|
end
|
|
|
|
defp get_module_funs(mod) do
|
|
if function_exported?(mod, :__info__, 1) do
|
|
if docs = Code.get_docs(mod, :docs) do
|
|
for {tuple, _line, _kind, _sign, doc} <- docs, doc != false, do: tuple
|
|
else
|
|
(mod.__info__(:functions) -- [__info__: 1]) ++ mod.__info__(:macros)
|
|
end
|
|
else
|
|
mod.module_info(:exports)
|
|
end
|
|
end
|
|
end
|