@@ -103,6 +103,31 @@ defmodule Macro do
103103 :elixir_clauses . extract_args ( expr )
104104 end
105105
106+ @ doc """
107+ Decomposes a local or remote call into its module alias (when a remote
108+ call is provided), function name and argument list.
109+ Returns :error when an invalid call syntax is provied.
110+
111+ ## Examples
112+
113+ decompose_call(quote do: foo) == { :foo, [] }
114+ decompose_call(quote do: foo()) == { :foo, [] }
115+ decompose_call(quote do: foo(1, 2, 3)) == { :foo, [1, 2, 3] }
116+ decompose_call(quote do: M.N.foo(1, 2, 3)) ==
117+ { { :__aliases__, [alias: false], [:M, :N] }, :foo, [1, 2, 3] }
118+ decompose_call(quote do: 42) == :error
119+
120+ """
121+ @ spec decompose_call ( Macro . t ) :: { atom , [ Macro . t ] } | { Macro . t , atom , [ Macro . t ] } | :error
122+ def decompose_call ( expr ) do
123+ case expr do
124+ { { :. , _ , [ { :__aliases__ , meta , atoms } , f ] } , _ , args } ->
125+ { { :__aliases__ , meta , atoms } , f , args }
126+ _local ->
127+ :elixir_clauses . extract_args ( expr )
128+ end
129+ end
130+
106131 @ doc """
107132 Recursively escapes a value so it can be inserted
108133 into a syntax tree.
0 commit comments