You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

46 lines
1.2 KiB

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