Code.require_file "../helpers/module_info.exs", __DIR__
|
|
Code.require_file "../helpers/complete.exs", __DIR__
|
|
|
|
defmodule Alchemist.API.Info do
|
|
|
|
@moduledoc false
|
|
|
|
import IEx.Helpers, warn: false
|
|
|
|
alias Alchemist.Helpers.ModuleInfo
|
|
alias Alchemist.Helpers.Complete
|
|
|
|
def request(args) do
|
|
args
|
|
|> normalize
|
|
|> process
|
|
end
|
|
|
|
def process(:modules) do
|
|
modules = ModuleInfo.all_applications_modules
|
|
|> Enum.uniq
|
|
|> Enum.reject(&is_nil/1)
|
|
|> Enum.filter(&ModuleInfo.moduledoc?/1)
|
|
|
|
functions = Complete.run('')
|
|
|
|
modules ++ functions
|
|
|> Enum.uniq
|
|
|> Enum.map(&IO.puts/1)
|
|
|
|
IO.puts "END-OF-INFO"
|
|
end
|
|
|
|
def process(:mixtasks) do
|
|
# append things like hex or phoenix archives to the load_path
|
|
Mix.Local.append_archives
|
|
|
|
:code.get_path
|
|
|> Mix.Task.load_tasks
|
|
|> Enum.map(&Mix.Task.task_name/1)
|
|
|> Enum.sort
|
|
|> Enum.map(&IO.puts/1)
|
|
|
|
IO.puts "END-OF-INFO"
|
|
end
|
|
|
|
def process({:info, arg}) do
|
|
try do
|
|
Code.eval_string("i(#{arg})", [], __ENV__)
|
|
rescue
|
|
_e -> nil
|
|
end
|
|
|
|
IO.puts "END-OF-INFO"
|
|
end
|
|
|
|
def process({:types, arg}) do
|
|
try do
|
|
Code.eval_string("t(#{arg})", [], __ENV__)
|
|
rescue
|
|
_e -> nil
|
|
end
|
|
|
|
IO.puts "END-OF-INFO"
|
|
end
|
|
|
|
def process(nil) do
|
|
IO.puts "END-OF-INFO"
|
|
end
|
|
|
|
def normalize(request) do
|
|
try do
|
|
Code.eval_string(request)
|
|
rescue
|
|
_e -> nil
|
|
else
|
|
{{_, type }, _} -> type
|
|
{{_, type, arg}, _} ->
|
|
if Version.match?(System.version, ">=1.2.0-rc") do
|
|
{type, arg}
|
|
else
|
|
nil
|
|
end
|
|
end
|
|
end
|
|
end
|