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.
 
 

86 lines
1.6 KiB

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