defmodule Inspector do
@moduledoc """
This is a simple module that allows a more friendly debugging experience
"""
@doc """
Prints the currenty file, location, and bindings
This macros allows an easy inspectable access to the
content where it is called.
Just place in your code:
require Inspector; Inspector.i
"""
defmacro i() do
quote do
Inspector.inspect(binding(), __ENV__)
end
end
@doc false
def inspect(binding, %Macro.Env{} = env) do
%{file: file, line: line, module: module, function: function_arity} = env
file = "#{Path.relative_to_cwd(file)}:#{line}"
location =
case function_arity do
{function, arity} ->
Exception.format_mfa(module, function, arity)
_ ->
nil
end
IO.inspect(
%{
file: file,
location: location,
binding: binding
},
label: :inspect
)
end
end