As of today, in many cases we got inspection of functions wrong. For example,
Macro.to_string/2 failed to properly escape functions resulting in cases like:
iex> Macro.to_string(quote(do: Foo."42"()))
"Foo.42()"
where we output a representation of the code that is not syntactically valid. A
similar scenario happened with Exception.format_mfa/3 (which prints functions as
well) and the implementation of the Inspect protocol for functions. With this
commit, we:
* introduce the exported but hidden Macro.classify_identifier/1 function to
classify an identifier (atom or binary) as one of :callable, :non_callable,
:alias, or other
* rework the implementation of Inspect.Function.inspect/1,
Exception.format_mfa/1, and Macro.to_string/2 to properly inspect functions